diff options
Diffstat (limited to 'sys_gui.c')
-rw-r--r-- | sys_gui.c | 39 |
1 files changed, 34 insertions, 5 deletions
@@ -10,12 +10,27 @@ static t_class *sys_gui_class; typedef struct _sys_gui { t_object x_obj; + t_symbol* x_receive_symbol; + t_outlet* x_outlet; char *send_buffer; } t_sys_gui; +static void sys_gui_send_finished(t_sys_gui *x) +{ + char message[MAXPDSTRING]; + sprintf(message,"pdsend \"%s finished\";", x->x_receive_symbol->s_name ); + sys_gui(message); +} + static void sys_gui_bang(t_sys_gui *x) { sys_gui(x->send_buffer); + sys_gui_send_finished(x); +} + +static void sys_gui_finished(t_sys_gui *x) +{ + outlet_bang(x->x_outlet); } static void sys_gui_anything(t_sys_gui *x, t_symbol *s, int argc, t_atom *argv) @@ -33,6 +48,7 @@ static void sys_gui_anything(t_sys_gui *x, t_symbol *s, int argc, t_atom *argv) } strncat(x->send_buffer, " ;\n", 3); sys_gui(x->send_buffer); + sys_gui_send_finished(x); } static void sys_gui_list(t_sys_gui *x, t_symbol *s, int argc, t_atom *argv) @@ -47,20 +63,27 @@ static void sys_gui_list(t_sys_gui *x, t_symbol *s, int argc, t_atom *argv) strncat(x->send_buffer, buf, MAXPDSTRING - strlen(x->send_buffer)); strncat(x->send_buffer, " ", MAXPDSTRING - strlen(x->send_buffer)); } - strncat(x->send_buffer, " ;\n", 3); + strncat(x->send_buffer, " ;\n", MAXPDSTRING - strlen(x->send_buffer)); sys_gui(x->send_buffer); + sys_gui_send_finished(x); } static void sys_gui_free(t_sys_gui *x) { + pd_unbind(&x->x_obj.ob_pd, x->x_receive_symbol); freebytes(x->send_buffer,MAXPDSTRING); } static void *sys_gui_new(t_symbol *s) { t_sys_gui *x = (t_sys_gui *)pd_new(sys_gui_class); + x->x_outlet = outlet_new(&x->x_obj, &s_anything); + + char buf[MAXPDSTRING]; + sprintf(buf, "#%lx", (t_int)x); + x->x_receive_symbol = gensym(buf); + pd_bind(&x->x_obj.ob_pd, x->x_receive_symbol); - outlet_new(&x->x_obj, &s_anything); x->send_buffer = (char *)getbytes(MAXPDSTRING); return(x); @@ -68,11 +91,17 @@ static void *sys_gui_new(t_symbol *s) void sys_gui_setup(void) { - sys_gui_class = class_new(gensym("sys_gui"), - (t_newmethod)sys_gui_new, (t_method)sys_gui_free, - sizeof(t_sys_gui), 0, 0); + sys_gui_class = class_new( + gensym("sys_gui"), + (t_newmethod)sys_gui_new, + (t_method)sys_gui_free, + sizeof(t_sys_gui), + 0, + 0); class_addanything(sys_gui_class, (t_method)sys_gui_anything); class_addbang(sys_gui_class, (t_method)sys_gui_bang); class_addlist(sys_gui_class, (t_method)sys_gui_list); + class_addmethod(sys_gui_class, (t_method)sys_gui_finished, + gensym("finished"), 0); } |