From 0aa52cf06bbdf0983159ad63661680d8ce617e65 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sun, 23 Oct 2011 03:46:41 +0000 Subject: allow getting canvas name using names or depth, via args or the inlet svn path=/trunk/externals/hcs/; revision=15642 --- canvas_name.c | 105 ++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 66 insertions(+), 39 deletions(-) (limited to 'canvas_name.c') diff --git a/canvas_name.c b/canvas_name.c index 4f2f88c..cf27875 100644 --- a/canvas_name.c +++ b/canvas_name.c @@ -3,65 +3,91 @@ #include #include "g_canvas.h" +/* TODO make the query level settable by 2nd inlet */ + #define DEBUG(x) static t_class *canvas_name_class; -static t_canvas *canvas; typedef struct _canvas_name { - t_object x_obj; - t_atom x_atom; - t_symbol *x_canvas_name; - t_symbol *x_remote_name; + t_object x_obj; + t_canvas *x_canvas; + t_symbol *receive_name; + t_int depth; } t_canvas_name; -static void canvas_name_bang(t_canvas_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.c", (long unsigned int)canvas); - x->x_canvas_name = gensym(buf); - } - outlet_symbol(x->x_obj.ob_outlet,x->x_canvas_name); + return gensym(buf); } -static void *canvas_name_new(t_symbol *s, int argc, t_atom *argv) +static t_symbol* get_canvas_by_depth(t_canvas_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_canvas_name *x = (t_canvas_name *)pd_new(canvas_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_canvas_name *x) +{ + return make_canvas_symbol((t_canvas *)pd_findbyclass(x->receive_name, canvas_class)); +} - snprintf(buf, MAXPDSTRING, ".x%lx.c", (long unsigned int)canvas); - x->x_canvas_name = gensym(buf); - } +static t_symbol* get_canvas_name(t_canvas_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 canvas_name_bang(t_canvas_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_canvas_name(x)); +} + +static void canvas_name_anything(t_canvas_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; + canvas_name_bang(x); +} + +static void *canvas_name_new(t_symbol *s, int argc, t_atom *argv) +{ + t_canvas_name *x = (t_canvas_name *)pd_new(canvas_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); } @@ -73,4 +99,5 @@ void canvas_name_setup(void) sizeof(t_canvas_name), 0, A_GIMME, 0); class_addbang(canvas_name_class, (t_method)canvas_name_bang); + class_addanything(canvas_name_class, (t_method)canvas_name_anything); } -- cgit v1.2.1