aboutsummaryrefslogtreecommitdiff
path: root/window_name.c
diff options
context:
space:
mode:
authorHans-Christoph Steiner <eighthave@users.sourceforge.net>2011-10-23 04:16:53 +0000
committerHans-Christoph Steiner <eighthave@users.sourceforge.net>2011-10-23 04:16:53 +0000
commit2ea6389b03afd2b315cab28ade3414cfcf939f74 (patch)
treefdaec0eaa6eb4c957e7fd866aaf90feaa31b577c /window_name.c
parent0aa52cf06bbdf0983159ad63661680d8ce617e65 (diff)
made window_name from new canvas_name
svn path=/trunk/externals/hcs/; revision=15643
Diffstat (limited to 'window_name.c')
-rw-r--r--window_name.c107
1 files changed, 66 insertions, 41 deletions
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);
}