From 2ea6389b03afd2b315cab28ade3414cfcf939f74 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sun, 23 Oct 2011 04:16:53 +0000 Subject: made window_name from new canvas_name svn path=/trunk/externals/hcs/; revision=15643 --- window_name.c | 107 ++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 66 insertions(+), 41 deletions(-) (limited to 'window_name.c') diff --git a/window_name.c b/window_name.c index b6ccd3d..0528e9f 100644 --- a/window_name.c +++ b/window_name.c @@ -6,71 +6,96 @@ #define DEBUG(x) static t_class *window_name_class; -static t_canvas *canvas; typedef struct _window_name { - t_object x_obj; - t_atom x_atom; - t_symbol *x_window_name; - t_symbol *x_remote_name; + t_object x_obj; + t_canvas *x_canvas; + t_symbol *receive_name; + t_int depth; } t_window_name; -static void window_name_bang(t_window_name *x) +static t_symbol* make_canvas_symbol(t_canvas* canvas) { - if (x->x_atom.a_type == A_SYMBOL) - { - canvas=(t_canvas *)pd_findbyclass(x->x_remote_name, canvas_class); char buf[MAXPDSTRING]; - snprintf(buf, MAXPDSTRING, ".x%lx", (long unsigned int)canvas); - x->x_window_name = gensym(buf); - } - outlet_symbol(x->x_obj.ob_outlet,x->x_window_name); + return gensym(buf); } -static void *window_name_new(t_symbol *s, int argc, t_atom *argv) +static t_symbol* get_canvas_by_depth(t_window_name *x) { - t_atom a; - if (argc == 0) + t_canvas *canvas = x->x_canvas; + int depth = x->depth; + if(depth<0)depth=0; + while(depth && canvas) { - argc = 1; - SETFLOAT(&a, 0); - argv = &a; + canvas = canvas->gl_owner; + depth--; } - t_window_name *x = (t_window_name *)pd_new(window_name_class); - x->x_atom = *argv; - if (argv->a_type == A_FLOAT) - { // thx to IOhannes's iemguts: - t_glist *glist=(t_glist *)canvas_getcurrent(); - canvas=(t_canvas *)glist_getcanvas(glist); - int depth=(int)atom_getint(&x->x_atom); + return make_canvas_symbol(canvas); +} - if(depth<0)depth=0; - while(depth && canvas) { - canvas=canvas->gl_owner; - depth--; - } - char buf[MAXPDSTRING]; +static t_symbol* get_canvas_by_name(t_window_name *x) +{ + return make_canvas_symbol((t_canvas *)pd_findbyclass(x->receive_name, canvas_class)); +} - snprintf(buf, MAXPDSTRING, ".x%lx", (long unsigned int)canvas); - x->x_window_name = gensym(buf); - } +static t_symbol* get_window_name(t_window_name *x) +{ + if(x->receive_name == &s_) + return get_canvas_by_depth(x); else - { - x->x_remote_name = (t_symbol *)atom_getsymbol(&x->x_atom); - } + return get_canvas_by_name(x); +} + +static void window_name_bang(t_window_name *x) +{ + /* actually get the canvas name each time to make sure we get + * accurate info in case of changes. If we cache the result, a + * canvas could have been deleted or renamed. */ + outlet_symbol(x->x_obj.ob_outlet, get_window_name(x)); +} + +static void window_name_anything(t_window_name *x, t_symbol *s, int argc, t_atom *argv) +{ + t_symbol *first_symbol = atom_getsymbolarg(0,argc,argv); + x->depth = 0; + x->receive_name = &s_; + if(s == &s_float) + x->depth = (t_int) atom_getfloatarg(0,argc,argv); + else if (first_symbol == &s_) + x->receive_name = s; + else + x->receive_name = first_symbol; + window_name_bang(x); +} + +static void *window_name_new(t_symbol *s, int argc, t_atom *argv) +{ + t_window_name *x = (t_window_name *)pd_new(window_name_class); + + t_glist* glist = (t_glist *)canvas_getcurrent(); + x->x_canvas = (t_canvas *)glist_getcanvas(glist); + + t_symbol *tmp = atom_getsymbolarg(0,argc,argv); + x->depth = 0; + x->receive_name = &s_; + if(tmp == &s_) + x->depth = (t_int) atom_getfloatarg(0,argc,argv); + else + x->receive_name = tmp; - outlet_new(&x->x_obj, &s_symbol); + outlet_new(&x->x_obj, &s_symbol); return(x); } void window_name_setup(void) { - window_name_class = class_new(gensym("window_name"), - (t_newmethod)window_name_new, NULL, + window_name_class = class_new(gensym("window_name"), + (t_newmethod)window_name_new, NULL, sizeof(t_window_name), 0, A_GIMME, 0); class_addbang(window_name_class, (t_method)window_name_bang); + class_addanything(window_name_class, (t_method)window_name_anything); } -- cgit v1.2.1