diff options
-rw-r--r-- | getpatchname/doc/getpatchname-help.pd | 19 | ||||
-rw-r--r-- | getpatchname/src/getpatchname.c | 23 |
2 files changed, 34 insertions, 8 deletions
diff --git a/getpatchname/doc/getpatchname-help.pd b/getpatchname/doc/getpatchname-help.pd index a9ff019..178daea 100644 --- a/getpatchname/doc/getpatchname-help.pd +++ b/getpatchname/doc/getpatchname-help.pd @@ -1,4 +1,4 @@ -#N canvas 0 0 450 300 10; +#N canvas 0 22 426 546 10; #X obj 160 101 loadbang; #X symbolatom 160 170 20 0 0 0 - - -; #X obj 239 102 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 @@ -9,6 +9,23 @@ patch as a symbol when sent a 'bang' message; #X text 26 236 Note: at the moment it retains the name of the patch returned when the object was instantiated. This will be revised in future versions; +#X msg 87 359 bang; +#X obj 87 435 print; +#X msg 282 356 bang; +#X obj 282 432 print; +#X text 26 468 If there is no parent at that level \, it returns the +directory as if there was no argument \, i.e. level 0; +#X text 26 302 You can also get the name of the parent patch \, if +this patch is an object embedded in another patch. You use the argument +to set how many levels up to go:; +#X obj 87 397 getpatchname 1; +#X obj 282 394 getpatchname 2; +#X text 27 509 (thanks to Gunter Geiger for "parent" code and helptext) +; #X connect 0 0 4 0; #X connect 2 0 4 0; #X connect 4 0 1 0; +#X connect 6 0 12 0; +#X connect 8 0 13 0; +#X connect 12 0 7 0; +#X connect 13 0 9 0; diff --git a/getpatchname/src/getpatchname.c b/getpatchname/src/getpatchname.c index c9116a8..72df3cc 100644 --- a/getpatchname/src/getpatchname.c +++ b/getpatchname/src/getpatchname.c @@ -1,4 +1,3 @@ - /* getpatchname - Returns the filename of the current patch * * Copyright (C) 2006 Jamie Bullock @@ -27,28 +26,38 @@ typedef struct _getpatchname { t_object x_obj; t_symbol *patch_name; t_outlet *outlet; + t_canvas *x_canvas; + int x_level; } t_getpatchname; void getpatchname_bang(t_getpatchname *x) { /* At some point we need to be to get the new patch name if it changes, couldn't make this work though */ - outlet_symbol(x->outlet, x->patch_name); + int i = x->x_level; + t_canvas* last = x->x_canvas; + + while (i>0) { + i--; + if (last->gl_owner) last = last->gl_owner; + } + + outlet_symbol(x->outlet, last->gl_name); } -void *getpatchname_new(void) +void *getpatchname_new(t_floatarg level) { t_getpatchname *x = (t_getpatchname *)pd_new(getpatchname_class); x->patch_name = canvas_getcurrent()->gl_name; + x->x_canvas = canvas_getcurrent(); x->outlet = outlet_new(&x->x_obj, &s_symbol); + x->x_level = level; return (void *)x; } void getpatchname_setup(void) { getpatchname_class = class_new(gensym("getpatchname"), (t_newmethod)getpatchname_new, - 0, sizeof(t_getpatchname), - CLASS_DEFAULT, 0); + 0, sizeof(t_getpatchname), 0, + A_DEFFLOAT, 0); class_addbang(getpatchname_class, getpatchname_bang); } - - |