Update of /cvsroot/pure-data/externals/bbogart/popup In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31995
Modified Files: popup.c Log Message: - removed the MAX_OPTIONS; we can now have an "infinite" number of options (without segfaulting !) - you can now specify less than 5 arguments: "popup [<w> <h> [<c> [<n> [<o1> ...]]]]"
Index: popup.c =================================================================== RCS file: /cvsroot/pure-data/externals/bbogart/popup/popup.c,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** popup.c 17 Jan 2005 21:06:59 -0000 1.11 --- popup.c 6 Jun 2005 15:13:43 -0000 1.12 *************** *** 45,49 **** t_glist * x_glist; t_outlet* out2; - t_inlet* in2; int x_rect_width; int x_rect_height; --- 45,48 ---- *************** *** 58,63 **** t_symbol* x_name; ! t_symbol* x_options[MAX_OPTIONS]; ! } t_popup;
--- 57,62 ---- t_symbol* x_name; ! t_symbol** x_options; ! int x_maxoptions; } t_popup;
*************** *** 387,390 **** --- 386,396 ---- sys_vgui(".x%x.c.s%x.menu delete 0 end \n", x->x_glist, x);
+ if(argc>x->x_maxoptions){ + /* resize the options-array */ + if(x->x_options)freebytes(x->x_options, sizeof(t_symbol*)*x->x_maxoptions); + x->x_maxoptions=argc; + x->x_options=(t_symbol**)getbytes(sizeof(t_symbol*)*x->x_maxoptions); + } + for(i=0 ; i<argc ; i++) { *************** *** 463,466 **** --- 469,488 ----
new_limit = x->x_num_options + argc; + if(new_limit>x->x_maxoptions){ + t_symbol**dummy; + int new_size=new_limit*2; + DEBUG(post("resizing options");) + dummy=(t_symbol**)getbytes(sizeof(t_symbol*)*new_size); + if(dummy) + { + memcpy(dummy, x->x_options, sizeof(t_symbol*)*x->x_maxoptions); + freebytes(x->x_options, sizeof(t_symbol*)*x->x_maxoptions); + x->x_maxoptions=new_size; + x->x_options=dummy; + } else { + error("popup: no memory for options"); + return; + } + }
for(i=x->x_num_options ; i<new_limit ; i++) *************** *** 480,483 **** --- 502,510 ---- static t_class *popup_class;
+ static void popup_free(t_popup*x) + { + if(x->x_options)freebytes(x->x_options, sizeof(t_symbol*)*x->x_maxoptions); + } +
static void *popup_new(t_symbol *s, int argc, t_atom *argv) *************** *** 493,529 **** x->x_height = 25; x->current_selection = -1; ! ! if (argc < 5) ! { ! post("popup: You must enter at least 5 arguments. Default values used.\n\nArguments:\npopup [width] [height] [colour] [name] [option-1] [option-2] ..."); ! x->x_width = 124; ! x->x_height = 25; ! x->x_num_options = 1; ! x->x_colour = gensym("#ffffff"); ! x->x_name = gensym("popup"); ! ! x->x_options[0] = gensym("option"); ! ! } else { ! /* Copy args into structure */ ! x->x_width = atom_getint(argv); ! x->x_height = atom_getint(argv+1); ! x->x_colour = atom_getsymbol(argv+2); ! x->x_name = atom_getsymbol(argv+3); ! ! x->x_num_options = argc-4; ! for(i=0 ; i<x->x_num_options ; i++) ! { ! x->x_options[i] = atom_getsymbol( argv+(i+4) ); ! } ! }
! /* Bind the recieve "popup%p" to the widget outlet*/ ! sprintf(buf,"popup%p",x); ! x->x_sym = gensym(buf); ! pd_bind(&x->x_obj.ob_pd, x->x_sym);
! /* define proc in tcl/tk where "popup%p" is the receive, "output" is the method, and "$index" is an argument. */ sys_vgui("proc popup_sel%x {index} {\n pd [concat popup%p output $index \;]\n }\n",x,x);
--- 520,565 ---- x->x_height = 25; x->current_selection = -1; ! ! x->x_maxoptions=MAX_OPTIONS; ! x->x_options=(t_symbol**)getbytes(sizeof(t_symbol*)*x->x_maxoptions); ! ! ! x->x_width = 124; ! x->x_height = 25; ! x->x_num_options = 1; ! x->x_colour = gensym("#ffffff"); ! x->x_name = gensym("popup"); ! ! x->x_options[0] = gensym("option"); ! ! switch(argc){ ! case 0: break; /* just use default values */ ! case 1: ! post("popup: You must enter at least 5 arguments. Default values used.\n\nArguments:\npopup [width] [height] [colour] [name] [option-1] [option-2] ..."); ! break; ! default: ! /* Copy args into structure */ ! x->x_num_options = argc-4; ! for(i=0 ; i<x->x_num_options ; i++) ! { ! x->x_options[i] = atom_getsymbol( argv+(i+4) ); ! } ! case 4: ! x->x_name = atom_getsymbol(argv+3); ! case 3: ! x->x_colour = atom_getsymbol(argv+2); ! case 2: ! x->x_width =atom_getint(argv+0); ! x->x_height=atom_getint(argv+1); ! break; ! }
! /* Bind the recieve "popup%p" to the widget outlet*/ ! sprintf(buf,"popup%p",x); ! x->x_sym = gensym(buf); ! pd_bind(&x->x_obj.ob_pd, x->x_sym);
! /* define proc in tcl/tk where "popup%p" is the receive, "output" is the method, and "$index" is an argument. */ sys_vgui("proc popup_sel%x {index} {\n pd [concat popup%p output $index \;]\n }\n",x,x);
*************** *** 542,546 **** DEBUG(post("setup start");)
! popup_class = class_new(gensym("popup"), (t_newmethod)popup_new, 0, sizeof(t_popup),0,A_GIMME,0); --- 578,582 ---- DEBUG(post("setup start");)
! popup_class = class_new(gensym("popup"), (t_newmethod)popup_new, (t_method)popup_free, sizeof(t_popup),0,A_GIMME,0); *************** *** 577,581 **** class_doaddfloat(popup_class, (t_method)popup_iselect);
! // class_addsymbol(popup_class, (t_method)popup_symselect);
class_setwidget(popup_class,&popup_widgetbehavior); --- 613,617 ---- class_doaddfloat(popup_class, (t_method)popup_iselect);
! //class_addsymbol(popup_class, (t_method)popup_symselect);
class_setwidget(popup_class,&popup_widgetbehavior);