From 79e8d7562ba24a72da70830d10e759902e889e26 Mon Sep 17 00:00:00 2001 From: Luke Iannini Date: Mon, 22 Sep 2008 07:29:39 +0000 Subject: parent and remote-subpatch access for window_name and canvas_name svn path=/trunk/externals/hcs/; revision=10306 --- window_name.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 11 deletions(-) (limited to 'window_name.c') diff --git a/window_name.c b/window_name.c index 04e551b..9e71460 100644 --- a/window_name.c +++ b/window_name.c @@ -6,36 +6,71 @@ #define DEBUG(x) static t_class *window_name_class; +static t_canvas *canvas; typedef struct _window_name { t_object x_obj; - t_symbol *windowname; + t_atom x_atom; + t_symbol *x_window_name; + t_symbol *x_remote_name; } t_window_name; static void window_name_bang(t_window_name *x) { - outlet_symbol(x->x_obj.ob_outlet,x->windowname); + 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); } -static void *window_name_new(void) +static void *window_name_new(t_symbol *s, int argc, t_atom *argv) { + t_atom a; + if (argc == 0) + { + argc = 1; + SETFLOAT(&a, 0); + argv = &a; + } t_window_name *x = (t_window_name *)pd_new(window_name_class); - char buf[MAXPDSTRING]; - - snprintf(buf, MAXPDSTRING, ".x%lx", (long unsigned int)canvas_getcurrent()); - x->windowname = gensym(buf); + 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); + + if(depth<0)depth=0; + while(depth && canvas) { + canvas=canvas->gl_owner; + depth--; + } + char buf[MAXPDSTRING]; + + snprintf(buf, MAXPDSTRING, ".x%lx", (long unsigned int)canvas); + x->x_window_name = gensym(buf); + } + else + { + x->x_remote_name = (t_symbol *)atom_getsymbol(&x->x_atom); + } - 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, - sizeof(t_window_name), 0, 0); + 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); } -- cgit v1.2.1