From 078d4d3de414a38fa2987a1aa1dc6c3ef3f11654 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Nov 2007 07:49:26 +0000 Subject: - renamed [scrollbar( to [scrollbars( since there should be a bottom one too - got full querying working, including C-side attributes - starting working on store/restore/save mechanism, but was stymied by how to trigger the store_options() callback so that the stuff can be saved. - removed [entry]'s old attribute storage where redundant svn path=/trunk/externals/tkwidgets/; revision=9004 --- text-help.pd | 82 ++++++++++++------------ text-test.pd | 75 ++++++++++------------ text.c | 205 +++++++++++++++++++++++++++++++++-------------------------- 3 files changed, 190 insertions(+), 172 deletions(-) diff --git a/text-help.pd b/text-help.pd index 92d83ed..245d7d0 100644 --- a/text-help.pd +++ b/text-help.pd @@ -1,11 +1,11 @@ #N canvas 343 45 785 704 10; -#X obj 52 -48 text 130 60; +#X obj 52 -48 text 130 60 0; #X obj 53 -198 bng 15 250 50 0 empty empty empty 0 -6 0 8 -262144 -1 -1; #X obj 12 60 print; #X msg 89 -183 clear; #X msg 107 -162 set one two three four five six; -#X obj 36 137 text 130 60; +#X obj 36 137 text 130 60 0; #X obj 231 -2 select return; #X obj 59 61 pddp/print; #X obj 198 -91 trigger bang bang; @@ -14,7 +14,7 @@ #X text 235 19 ^-- hit return to output; #X msg 118 -139 append seven eight nine; #X msg 122 -119 append ten eleven.; -#X obj 554 -176 text 130 60; +#X obj 554 -176 text 130 60 0; #X obj 581 -218 symbol; #X msg 479 -245 flat; #X msg 514 -245 groove; @@ -30,9 +30,9 @@ #X msg 680 251 disabled; #X msg 26 105 size 100 50; #X text 633 231 disable editing; -#X obj 582 -39 text 130 60; +#X obj 582 -39 text 130 60 0; #X obj 581 -84 symbol; -#X obj 513 147 text 130 60; +#X obj 513 147 text 130 60 0; #X obj 577 102 symbol; #X msg 539 -109 none; #X msg 574 -109 char; @@ -43,10 +43,10 @@ #X msg 707 69 magenta; #X obj 452 40 pddp/pddplink http://en.wikipedia.org/wiki/X11_color_names ; -#X obj 394 -39 text 130 60; +#X obj 394 -39 text 130 60 0; #X obj 396 -89 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 10 -262144 -1 -1 0 1; -#X obj 62 345 text 130 60; +#X obj 62 345 text 130 60 0; #X obj 61 300 symbol; #X obj 49 409 pddp/pddplink http://tcl.tk/man/tcl8.4/TkCmd/cursors.htm ; @@ -56,7 +56,6 @@ #X msg 205 265 gobbler; #X obj 404 -217 hsl 128 15 0 127 0 0 empty empty empty -2 -6 0 10 -262144 -1 -1 0 1; -#X msg 471 119 scrollbar \$1; #X obj 471 99 tgl 15 0 empty empty empty 0 -6 0 10 -262144 -1 -1 0 1; #X msg 109 -85 key a; @@ -65,8 +64,8 @@ #X msg 352 293 key \$1; #X floatatom 369 275 5 0 0 0 - - -; #X msg 249 -46 key 3322; -#X obj 560 330 text 130 60; -#X obj 352 328 text 130 60; +#X obj 560 330 text 130 60 0; +#X obj 352 328 text 130 60 0; #X text 347 232 type single chars:; #X msg 421 279 key a; #X msg 422 301 key 9; @@ -85,7 +84,7 @@ #X msg 113 105 size 200 100; #X msg 577 70 #00f; #X text 528 231 turn off undo; -#X obj 261 152 text 130 60; +#X obj 261 152 text 130 60 0; #X msg 285 128 font "Lucida Sans" 18 bold; #X msg 261 103 font Arial 16; #X obj 339 407 pddp/pddplink http://tcl.tk/man/tcl8.4/TkCmd/keysyms.htm @@ -96,6 +95,7 @@ TkWidget library; #X obj 186 -234 pddp/pddplink http://tcl.tk/man/tcl8.4/TkCmd/text.htm -text text; #X text 37 -234 This object is based on:; +#X msg 471 119 scrollbars \$1; #X connect 0 0 2 0; #X connect 0 0 7 0; #X connect 0 1 6 0; @@ -109,56 +109,56 @@ TkWidget library; #X connect 9 0 0 0; #X connect 12 0 0 0; #X connect 13 0 0 0; -#X connect 15 0 72 0; +#X connect 15 0 71 0; #X connect 16 0 15 0; #X connect 17 0 15 0; #X connect 18 0 15 0; #X connect 19 0 15 0; #X connect 20 0 15 0; #X connect 21 0 15 0; -#X connect 22 0 76 0; -#X connect 23 0 75 0; +#X connect 22 0 75 0; +#X connect 23 0 74 0; #X connect 24 0 23 0; #X connect 25 0 23 0; #X connect 26 0 22 0; #X connect 27 0 22 0; #X connect 28 0 5 0; -#X connect 31 0 73 0; -#X connect 33 0 70 0; +#X connect 31 0 72 0; +#X connect 33 0 69 0; #X connect 34 0 31 0; #X connect 35 0 31 0; #X connect 36 0 31 0; #X connect 38 0 33 0; #X connect 39 0 33 0; #X connect 40 0 33 0; -#X connect 43 0 74 0; -#X connect 45 0 69 0; +#X connect 43 0 73 0; +#X connect 45 0 68 0; #X connect 47 0 45 0; #X connect 48 0 45 0; #X connect 49 0 45 0; #X connect 50 0 45 0; -#X connect 51 0 71 0; -#X connect 52 0 32 0; -#X connect 53 0 52 0; +#X connect 51 0 70 0; +#X connect 52 0 87 0; +#X connect 53 0 0 0; #X connect 54 0 0 0; -#X connect 55 0 0 0; -#X connect 56 0 57 0; -#X connect 56 0 58 0; -#X connect 57 0 61 0; -#X connect 59 0 0 0; -#X connect 63 0 61 0; -#X connect 64 0 61 0; -#X connect 67 0 61 0; -#X connect 68 0 45 0; -#X connect 69 0 44 0; -#X connect 70 0 32 0; +#X connect 55 0 56 0; +#X connect 55 0 57 0; +#X connect 56 0 60 0; +#X connect 58 0 0 0; +#X connect 62 0 60 0; +#X connect 63 0 60 0; +#X connect 66 0 60 0; +#X connect 67 0 45 0; +#X connect 68 0 44 0; +#X connect 69 0 32 0; +#X connect 70 0 14 0; #X connect 71 0 14 0; -#X connect 72 0 14 0; -#X connect 73 0 30 0; -#X connect 74 0 42 0; -#X connect 75 0 60 0; -#X connect 76 0 60 0; -#X connect 77 0 5 0; -#X connect 78 0 33 0; -#X connect 81 0 80 0; -#X connect 82 0 80 0; +#X connect 72 0 30 0; +#X connect 73 0 42 0; +#X connect 74 0 59 0; +#X connect 75 0 59 0; +#X connect 76 0 5 0; +#X connect 77 0 33 0; +#X connect 80 0 79 0; +#X connect 81 0 79 0; +#X connect 87 0 32 0; diff --git a/text-test.pd b/text-test.pd index 649c63a..57f713c 100644 --- a/text-test.pd +++ b/text-test.pd @@ -1,50 +1,45 @@ -#N canvas 165 195 721 672 10; -#X obj 130 117 text 130 60; +#N canvas 171 184 721 672 10; +#X obj 256 77 text 400 200 1; #X msg 47 29 size 100 100; -#X obj 48 540 text 130 60; +#X obj 48 470 text 130 60 0; #X msg 130 30 size 400 200; -#X obj 310 11 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 0 +#X obj 310 11 tgl 15 0 empty empty empty 17 7 0 10 -262144 -1 -1 1 1; -#X msg 309 31 scrollbar \$1; -#X msg 376 479; -#X obj 310 269 hcs/sys_gui; -#X msg 310 221 puts stderr [concat [.x6a74d0.c.frame6a7af0.text6a7af0 -find all]]; -#X msg 23 315 highlightthickness \$1; -#X obj 26 289 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144 +#X msg 655 333; +#X msg 23 245 highlightthickness \$1; +#X obj 26 219 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 0 1; -#X msg 76 402 padx \$1; -#X obj 79 381 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144 +#X msg 49 290 padx \$1; +#X obj 52 269 hsl 128 15 0 127 0 0 empty empty empty -2 -8 0 10 -262144 -1 -1 0 1; -#X msg 132 515 font "Lucida Sans" 18 bold; -#X msg 272 425 size 200 50; -#X msg 89 490 font Arial 16; -#X obj 200 612 print QUERY; -#X floatatom 309 620 5 0 0 0 - - -; -#X obj 309 596 route highlightthickness font; -#X obj 396 624 pddp/print; -#X msg 421 372 width 8; -#X obj 309 642 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 +#X msg 110 405 font "Lucida Sans" 18 bold; +#X msg 124 429 font Arial 16; +#X obj 200 542 print QUERY; +#X floatatom 309 550 5 0 0 0 - - -; +#X obj 309 526 route highlightthickness font; +#X obj 396 554 pddp/print; +#X obj 309 572 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1 -1; -#X msg 114 435 query highlightthickness; -#X msg 143 458 query; -#X connect 0 1 6 0; +#X msg 68 321 query highlightthickness; +#X msg 78 345 query; +#X msg 309 31 scrollbars \$1; +#X msg 85 367 query size; +#X connect 0 1 5 0; #X connect 1 0 0 0; -#X connect 2 1 18 0; +#X connect 2 1 14 0; +#X connect 2 1 12 0; #X connect 3 0 0 0; -#X connect 4 0 5 0; -#X connect 5 0 0 0; -#X connect 8 0 7 0; -#X connect 9 0 2 0; -#X connect 10 0 9 0; +#X connect 4 0 19 0; +#X connect 6 0 2 0; +#X connect 7 0 6 0; +#X connect 8 0 2 0; +#X connect 9 0 8 0; +#X connect 10 0 2 0; #X connect 11 0 2 0; -#X connect 12 0 11 0; -#X connect 13 0 2 0; -#X connect 14 0 2 0; -#X connect 15 0 2 0; -#X connect 17 0 21 0; -#X connect 18 0 17 0; -#X connect 18 1 19 0; +#X connect 13 0 16 0; +#X connect 14 0 13 0; +#X connect 14 1 15 0; +#X connect 17 0 2 0; +#X connect 18 0 2 0; +#X connect 19 0 0 0; #X connect 20 0 2 0; -#X connect 22 0 2 0; -#X connect 23 0 2 0; diff --git a/text.c b/text.c index 0f34c5e..b62a251 100644 --- a/text.c +++ b/text.c @@ -25,6 +25,8 @@ /* TODO: get Ctrl-A working to select all */ /* TODO: set message doesnt work with a loadbang */ +/* TODO: add size to query and save */ +/* TODO: add scrollbars to query and save */ #define DEFAULT_COLOR "grey70" @@ -47,21 +49,14 @@ typedef struct _textwidget t_symbol* receive_name; - int optionc; - t_atom* optionv; + t_binbuf* options_binbuf; + + int size_x; + int size_y; + int x_have_scrollbars; - int x_height; - int x_width; int x_resizing; - - t_symbol* x_font_face; - t_int x_font_size; - t_symbol* x_font_weight; - - t_float x_border; - t_symbol* x_relief; - t_int x_have_scrollbar; - t_int x_selected; + int x_selected; /* IDs for Tk widgets */ char* tcl_namespace; @@ -119,6 +114,8 @@ static char *textwidget_tk_options[] = { /* move these to tkwidgets.c */ +static t_symbol *scrollbars_symbol; +static t_symbol *size_symbol; static t_symbol *backspace_symbol; static t_symbol *return_symbol; static t_symbol *space_symbol; @@ -140,8 +137,10 @@ static void textwidget_vis(t_gobj *z, t_glist *glist, int vis); //static int textwidget_click(t_gobj *z, t_glist *glist, int xpix, int ypix, int shift, int alt, int dbl, int doit); static void textwidget_save(t_gobj *z, t_binbuf *b); +static void textwidget_query_callback(t_textwidget *x, t_symbol *s, int argc, t_atom *argv); + -static t_widgetbehavior textwidget_widgetbehavior = { +static t_widgetbehavior textwidget_widgetbehavior = { w_getrectfn: textwidget_getrect, w_displacefn: textwidget_displace, w_selectfn: textwidget_select, @@ -153,30 +152,33 @@ w_clickfn: NULL, /* widget helper functions */ -static void save_options(t_textwidget *x, int argc, char** argv) +static void store_options(t_textwidget *x) { + // build list then send the whole shebang to store_callback int i; + int argc = sizeof(textwidget_tk_options)/sizeof(char *); post("total options: %d", argc); for(i = 0; i < argc; i++) { -// sys_vgui("lappend ::%s::optionsList %s \n", x->tcl_namespace, argv[i]); - sys_vgui("pd [concat %s query_callback %s [%s cget -%s] \\;]\n", - x->receive_name->s_name, argv[i], x->text_id, argv[i]); - post("option %d: %s", i, argv[i]); + sys_vgui("lappend ::%s::store_list -%s \n", + x->tcl_namespace, textwidget_tk_options[i]); + sys_vgui("lappend ::%s::store_list [%s cget -%s] \n", + x->tcl_namespace, x->text_id, textwidget_tk_options[i]); + post("option %d: %s", i, textwidget_tk_options[i]); } -/* sys_vgui("foreach ::%s::option $::%s::optionsList {\n",x->tcl_namespace,x->tcl_namespace); */ -/* sys_vgui("pd [concat %s query_callback $::%s::option [%s cget [format \"-%%s\" $::%s::option]] \\;]\n", */ -/* x->receive_name->s_name, x->tcl_namespace, x->text_id, x->tcl_namespace); */ -// sys_vgui("puts stderr [concat %s query_callback $::%s::option [%s cget [format \"-%%s\" $::%s::option]] \\;] \n", -// x->receive_name->s_name, x->tcl_namespace, x->text_id, x->tcl_namespace); -/* sys_gui("}\n"); */ -/* sys_vgui("unset ::%s::optionsList \n", x->tcl_namespace); */ + sys_vgui("pd [concat %s store_callback $::%s::store_list \\;]\n", + x->receive_name->s_name, x->tcl_namespace); + sys_vgui("unset ::%s::store_list \n", x->tcl_namespace); +} + +static void restore_options(t_textwidget *x) +{ + // TODO restore options from x->options_binbuf } static void query_options(t_textwidget *x, int argc, char** argv) { int i; - post("total options: %d", argc); for(i = 0; i < argc; i++) sys_vgui("pd [concat %s query_callback %s [%s cget -%s] \\;]\n", x->receive_name->s_name, argv[i], x->text_id, argv[i]); @@ -224,7 +226,7 @@ static int calculate_onset(t_textwidget *x, t_glist *glist, int current_iolet, int total_iolets) { post("calculate_onset"); - return(text_xpix(&x->x_obj, glist) + (x->x_width - IOWIDTH) \ + return(text_xpix(&x->x_obj, glist) + (x->size_x - IOWIDTH) \ * current_iolet / (total_iolets == 1 ? 1 : total_iolets - 1)); } @@ -246,8 +248,8 @@ static void textwidget_draw_inlets(t_textwidget *x, t_glist *glist, int firsttim { onset = calculate_onset(x, glist, i, total_outlets); sys_vgui("%s create rectangle %d %d %d %d -tags {%xo%d %xo %s}\n", - x->canvas_id, onset, text_ypix(&x->x_obj, glist) + x->x_height, - onset + IOWIDTH, text_ypix(&x->x_obj, glist) + x->x_height + 2, + x->canvas_id, onset, text_ypix(&x->x_obj, glist) + x->size_y, + onset + IOWIDTH, text_ypix(&x->x_obj, glist) + x->size_y + 2, x, i, x, x->all_tag); } } @@ -265,13 +267,13 @@ static void draw_scrollbar(t_textwidget *x) { sys_vgui("pack %s -side right -fill y -before %s \n", x->scrollbar_id, x->text_id); - x->x_have_scrollbar = 1; + x->x_have_scrollbars = 1; } static void erase_scrollbar(t_textwidget *x) { sys_vgui("pack forget %s \n", x->scrollbar_id); - x->x_have_scrollbar = 0; + x->x_have_scrollbars = 0; } static void bind_standard_keys(t_textwidget *x) @@ -326,11 +328,10 @@ static void create_widget(t_textwidget *x) /* Seems we have to delete the widget in case it already exists (Provided by Guenter)*/ sys_vgui("destroy %s\n", x->frame_id); sys_vgui("frame %s \n", x->frame_id); - sys_vgui("text %s -font {%s %d %s} -border 1 \ + sys_vgui("text %s -border 1 \ -highlightthickness 1 -relief sunken -bg \"%s\" -fg \"%s\" \ -yscrollcommand {%s set} \n", x->text_id, - x->x_font_face->s_name, x->x_font_size, x->x_font_weight->s_name, DEFAULT_COLOR, "black", x->scrollbar_id); sys_vgui("scrollbar %s -command {%s yview}\n", @@ -352,11 +353,11 @@ static void textwidget_drawme(t_textwidget *x, t_glist *glist, int firsttime) { create_widget(x); textwidget_draw_inlets(x, glist, firsttime, TOTAL_INLETS, TOTAL_OUTLETS); - if(x->x_have_scrollbar) draw_scrollbar(x); + if(x->x_have_scrollbars) draw_scrollbar(x); sys_vgui("%s create window %d %d -anchor nw -window %s \ -tags {%s %s} -width %d -height %d \n", x->canvas_id, text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist), - x->frame_id, x->window_tag, x->all_tag, x->x_width, x->x_height); + x->frame_id, x->window_tag, x->all_tag, x->size_x, x->size_y); } else { @@ -389,8 +390,8 @@ static void textwidget_getrect(t_gobj *z, t_glist *owner, t_textwidget *x = (t_textwidget*)z; *xp1 = text_xpix(&x->x_obj, owner); *yp1 = text_ypix(&x->x_obj, owner); - *xp2 = *xp1 + x->x_width; - *yp2 = *yp1 + x->x_height + 2; // add 2 to give space for outlets + *xp2 = *xp1 + x->size_x; + *yp2 = *yp1 + x->size_y + 2; // add 2 to give space for outlets } static void textwidget_displace(t_gobj *z, t_glist *glist, int dx, int dy) @@ -406,8 +407,8 @@ static void textwidget_displace(t_gobj *z, t_glist *glist, int dx, int dy) sys_vgui("%s move RSZ %d %d\n", x->canvas_id, dx, dy); /* sys_vgui("%s coords %s %d %d %d %d\n", x->canvas_id, x->all_tag, text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist)-1, - text_xpix(&x->x_obj, glist) + x->x_width, - text_ypix(&x->x_obj, glist) + x->x_height-2);*/ + text_xpix(&x->x_obj, glist) + x->size_x, + text_ypix(&x->x_obj, glist) + x->size_y-2);*/ // textwidget_drawme(x, glist, 0); canvas_fixlinesfor(glist_getcanvas(glist), (t_text*) x); } @@ -573,12 +574,7 @@ static void textwidget_set(t_textwidget* x, t_symbol *s, int argc, t_atom *argv textwidget_append(x, s, argc, argv); } -static void textwidget_output(t_textwidget* x, t_symbol *s, int argc, t_atom *argv) -{ - outlet_list(x->x_data_outlet, s, argc, argv ); -} - -/* Pass the contents of the text widget onto the textwidget_output fuction above */ +/* Pass the contents of the text widget onto the textwidget_output_callback fuction above */ static void textwidget_bang_output(t_textwidget* x) { /* With "," and ";" escaping thanks to JMZ */ @@ -587,6 +583,11 @@ static void textwidget_bang_output(t_textwidget* x) x->receive_name->s_name, x->text_id); } +static void textwidget_output_callback(t_textwidget* x, t_symbol *s, int argc, t_atom *argv) +{ + outlet_list(x->x_data_outlet, s, argc, argv ); +} + static void textwidget_keyup_callback(t_textwidget *x, t_float f) { /* DEBUG(post("textwidget_keyup_callback");); */ @@ -640,10 +641,10 @@ static void textwidget_save(t_gobj *z, t_binbuf *b) { t_textwidget *x = (t_textwidget *)z; - binbuf_addv(b, "ssiisii;", &s__X, gensym("obj"), + binbuf_addv(b, "ssiisiii;", &s__X, gensym("obj"), x->x_obj.te_xpix, x->x_obj.te_ypix, atom_getsymbol(binbuf_getvec(x->x_obj.te_binbuf)), - x->x_width, x->x_height); + x->size_x, x->size_y, x->x_have_scrollbars); } static void textwidget_option(t_textwidget *x, t_symbol *s, int argc, t_atom *argv) @@ -664,16 +665,41 @@ static void textwidget_option(t_textwidget *x, t_symbol *s, int argc, t_atom *ar } } +static void query_scrollbars(t_textwidget *x) +{ + t_atom state[2]; + SETSYMBOL(state, scrollbars_symbol); + SETFLOAT(state + 1, (t_float)x->x_have_scrollbars); + textwidget_query_callback(x, gensym("query_callback"), 2, state); +} + +static void query_size(t_textwidget *x) +{ + t_atom coords[3]; + SETSYMBOL(coords, size_symbol); + SETFLOAT(coords + 1, (t_float)x->size_x); + SETFLOAT(coords + 2, (t_float)x->size_y); + textwidget_query_callback(x, gensym("query_callback"), 3, coords); +} + static void textwidget_query(t_textwidget *x, t_symbol *s) { post("textwidget_query %s", s->s_name); if(s == &s_) + { query_options(x, sizeof(textwidget_tk_options)/sizeof(char *), textwidget_tk_options); + query_scrollbars(x); + query_size(x); + } + else if(s == scrollbars_symbol) + query_scrollbars(x); + else if(s == size_symbol) + query_size(x); else query_options(x, 1, &(s->s_name)); } -static void textwidget_scrollbar(t_textwidget *x, t_float f) +static void textwidget_scrollbars(t_textwidget *x, t_float f) { if(f > 0) draw_scrollbar(x); @@ -681,30 +707,15 @@ static void textwidget_scrollbar(t_textwidget *x, t_float f) erase_scrollbar(x); } -static void textwidget_fontsize(t_textwidget *x, t_float font_size) -{ - DEBUG(post("textwidget_fontsize");); - if(font_size > 8) - { - x->x_font_size = (t_int)font_size; - sys_vgui("%s configure -font {%s %d %s} \n", - x->text_id, - x->x_font_face->s_name, x->x_font_size, - x->x_font_weight->s_name); - } - else - pd_error(x,"textwidget: invalid font size: %f",font_size); -} - static void textwidget_size(t_textwidget *x, t_float width, t_float height) { DEBUG(post("textwidget_size");); - x->x_height = height; - x->x_width = width; + x->size_y = height; + x->size_x = width; if(glist_isvisible(x->x_glist)) { sys_vgui("%s itemconfigure %s -width %d -height %d\n", - x->canvas_id, x->window_tag, x->x_width, x->x_height); + x->canvas_id, x->window_tag, x->size_x, x->size_y); erase_inlets(x); textwidget_draw_inlets(x, x->x_glist, 1, TOTAL_INLETS, TOTAL_OUTLETS); canvas_fixlinesfor(x->x_glist, (t_text *)x); // 2nd inlet @@ -713,6 +724,12 @@ static void textwidget_size(t_textwidget *x, t_float width, t_float height) /* callback functions */ +static void textwidget_store_callback(t_textwidget *x, t_symbol *s, int argc, t_atom *argv) +{ + if(s != &s_) + binbuf_restore(x->options_binbuf, argc, argv); +} + static void textwidget_query_callback(t_textwidget *x, t_symbol *s, int argc, t_atom *argv) { t_symbol *tmp_symbol = atom_getsymbolarg(0, argc, argv); @@ -762,11 +779,11 @@ static void textwidget_resize_motion_callback(t_textwidget *x, t_floatarg f1, t_ int dx = (int)f1, dy = (int)f2; if (glist_isvisible(x->x_glist)) { - x->x_width += dx; - x->x_height += dy; + x->size_x += dx; + x->size_y += dy; sys_vgui("%s itemconfigure %s -width %d -height %d\n", x->canvas_id, x->window_tag, - x->x_width, x->x_height); + x->size_x, x->size_y); sys_vgui("%s move RSZ %d %d\n", x->canvas_id, dx, dy); } @@ -784,23 +801,28 @@ static void *textwidget_new(t_symbol *s, int argc, t_atom *argv) t_textwidget *x = (t_textwidget *)pd_new(textwidget_class); char buf[MAXPDSTRING]; - x->x_height = 1; - x->x_font_face = gensym("helvetica"); - x->x_font_size = 10; - x->x_font_weight = gensym("normal"); - x->x_have_scrollbar = 0; + x->options_binbuf = binbuf_new(); + x->x_selected = 0; + x->x_resizing = 0; - if (argc < 4) + if (argc < 3) { - post("textwidget: You must enter at least 4 arguments. Default values used."); - x->x_width = TEXT_DEFAULT_WIDTH; - x->x_height = TEXT_DEFAULT_HEIGHT; - - } else { - /* Copy args into structure */ - x->x_width = atom_getint(argv); - x->x_height = atom_getint(argv+1); + post("[text]: less than 3 arguments entered, default values used."); + x->size_x = TEXT_DEFAULT_WIDTH; + x->size_y = TEXT_DEFAULT_HEIGHT; + x->x_have_scrollbars = 0; + } + else + { + x->size_x = atom_getint(argv); + x->size_y = atom_getint(argv + 1); + x->x_have_scrollbars = atom_getint(argv + 2); + if(argc > 3) + { + binbuf_add(x->options_binbuf, argc - 3, argv + 3); + restore_options(x); + } } x->x_data_outlet = outlet_new(&x->x_obj, &s_float); @@ -828,17 +850,12 @@ void text_setup(void) { class_addbang(textwidget_class, (t_method)textwidget_bang_output); class_addanything(textwidget_class, (t_method)textwidget_option); - class_addmethod(textwidget_class, (t_method)textwidget_query, gensym("query"), A_DEFSYMBOL, 0); - class_addmethod(textwidget_class, (t_method)textwidget_scrollbar, - gensym("scrollbar"), A_DEFFLOAT, 0); + class_addmethod(textwidget_class, (t_method)textwidget_scrollbars, + gensym("scrollbars"), A_DEFFLOAT, 0); class_addmethod(textwidget_class, (t_method)textwidget_size, gensym("size"), A_DEFFLOAT, A_DEFFLOAT, 0); - class_addmethod(textwidget_class, (t_method)textwidget_fontsize, - gensym("fontsize"), A_DEFFLOAT, 0); - class_addmethod(textwidget_class, (t_method)textwidget_output, - gensym("output"), A_GIMME, 0); class_addmethod(textwidget_class, (t_method)textwidget_set, gensym("set"), A_GIMME, 0); class_addmethod(textwidget_class, (t_method)textwidget_append, @@ -848,8 +865,12 @@ void text_setup(void) { class_addmethod(textwidget_class, (t_method)textwidget_clear, gensym("clear"), 0); /* callbacks */ + class_addmethod(textwidget_class, (t_method)textwidget_store_callback, + gensym("store_callback"), A_GIMME, 0); class_addmethod(textwidget_class, (t_method)textwidget_query_callback, gensym("query_callback"), A_GIMME, 0); + class_addmethod(textwidget_class, (t_method)textwidget_output_callback, + gensym("output"), A_GIMME, 0); class_addmethod(textwidget_class, (t_method)textwidget_keyup_callback, gensym("keyup"), A_DEFFLOAT, 0); class_addmethod(textwidget_class, (t_method)textwidget_click_callback, @@ -863,6 +884,8 @@ void text_setup(void) { class_setsavefn(textwidget_class,&textwidget_save); /* commonly used symbols */ + size_symbol = gensym("size"); + scrollbars_symbol = gensym("scrollbars"); backspace_symbol = gensym("backspace"); return_symbol = gensym("return"); space_symbol = gensym("space"); -- cgit v1.2.1