/***************************************************** * * receivecanvas - implementation file * * copyleft (c) IOhannes m zmölnig * * 2007:forum::für::umläute:2007 * * institute of electronic music and acoustics (iem) * ****************************************************** * * license: GNU General Public License v.2 * ******************************************************/ /* * this object provides a way to send messages to upstream canvases * by default it sends messages to the containing canvas, but you can give the * "depth" as argument; * e.g. [receivecanvas 1] will send messages to the parent of the containing canvas */ #include "m_pd.h" #include "g_canvas.h" #include int glist_getindex(t_glist *x, t_gobj *y); /* ------------------------- receivecanvas ---------------------------- */ static t_class *receivecanvas_class; typedef struct _receivecanvas { t_object x_obj; t_symbol *x_sym; } t_receivecanvas; static void receivecanvas_anything(t_receivecanvas *x, t_symbol*s, int argc, t_atom*argv) { outlet_anything(x->x_obj.ob_outlet, s, argc, argv); } static void receivecanvas_free(t_receivecanvas *x) { if(x->x_sym) pd_unbind(&x->x_obj.ob_pd, x->x_sym); } static void *receivecanvas_new(t_floatarg f) { t_receivecanvas *x = (t_receivecanvas *)pd_new(receivecanvas_class); t_glist *glist=(t_glist *)canvas_getcurrent(); t_canvas *canvas=(t_canvas*)glist_getcanvas(glist); int depth=(int)f; if(depth<0)depth=0; while(depth && canvas) { canvas=canvas->gl_owner; depth--; } x->x_sym=NULL; if(canvas) { char buf[40]; snprintf(buf, 40, ".x%lx", (t_int)canvas); x->x_sym=gensym(buf); pd_bind(&x->x_obj.ob_pd, x->x_sym); } outlet_new(&x->x_obj, 0); return (x); } void receivecanvas_setup(void) { receivecanvas_class = class_new(gensym("receivecanvas"), (t_newmethod)receivecanvas_new, (t_method)receivecanvas_free, sizeof(t_receivecanvas), CLASS_NOINLET, A_DEFFLOAT, 0); class_addanything(receivecanvas_class, (t_method)receivecanvas_anything); }