From c00ea30f26399a1e94e923bcb5707434e745530a Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Sat, 24 Nov 2007 00:33:42 +0000 Subject: - created tkwidgets_list_options() to query which Tk options are supported - removed set_tk_widgets_ids() from places where it wasn't need AFAIK - minor renames and cleanups svn path=/trunk/externals/tkwidgets/; revision=9029 --- checkbutton.c | 12 ++++++------ shared/tkwidgets.c | 23 ++++++++++++++++++----- shared/tkwidgets.h | 5 ++--- text.c | 25 ++++++++++++++++++------- 4 files changed, 44 insertions(+), 21 deletions(-) diff --git a/checkbutton.c b/checkbutton.c index 75ec581..8764907 100644 --- a/checkbutton.c +++ b/checkbutton.c @@ -115,7 +115,6 @@ static void set_tkwidgets_ids(t_checkbutton* x, t_canvas* canvas) static void checkbutton_drawme(t_checkbutton *x, t_glist *glist) { - set_tkwidgets_ids(x,glist_getcanvas(glist)); sys_vgui("destroy %s\n", x->widget_id->s_name); /* just in case it exists */ sys_vgui("checkbutton %s\n", @@ -128,12 +127,13 @@ static void checkbutton_drawme(t_checkbutton *x, t_glist *glist) text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist), x->widget_id->s_name, x->window_tag->s_name, x->all_tag->s_name); + tkwidgets_bind_key_events(x->canvas_id, x->widget_id); + tkwidgets_bind_mouse_events(x->canvas_id, x->widget_id); } -static void checkbutton_erase(t_checkbutton* x, t_glist* glist) +static void checkbutton_erase(t_checkbutton* x) { - set_tkwidgets_ids(x, glist_getcanvas(glist)); sys_vgui("destroy %s\n", x->widget_id->s_name); sys_vgui("%s delete %s\n", x->canvas_id->s_name, x->all_tag->s_name); } @@ -185,8 +185,8 @@ static void checkbutton_displace(t_gobj *z, t_glist *glist, int dx, int dy) x->x_obj.te_ypix += dy; if (glist_isvisible(glist)) { - set_tkwidgets_ids(x,glist_getcanvas(glist)); - sys_vgui("%s move %s %d %d\n", x->canvas_id->s_name, x->all_tag->s_name, dx, dy); + sys_vgui("%s move %s %d %d\n", + x->canvas_id->s_name, x->all_tag->s_name, dx, dy); sys_vgui("%s move RSZ %d %d\n", x->canvas_id->s_name, dx, dy); canvas_fixlinesfor(glist_getcanvas(glist), (t_text*) x); } @@ -204,7 +204,7 @@ static void checkbutton_vis(t_gobj *z, t_glist *glist, int vis) if (vis) checkbutton_drawme(s, glist); else - checkbutton_erase(s, glist); + checkbutton_erase(s); } /* --------------------------- methods -------------------------------------- */ diff --git a/shared/tkwidgets.c b/shared/tkwidgets.c index eec524a..65dba8f 100644 --- a/shared/tkwidgets.c +++ b/shared/tkwidgets.c @@ -51,11 +51,11 @@ void tkwidgets_store_options(t_symbol *receive_name, t_symbol *tcl_namespace, int i; for(i = 0; i < argc; i++) { - sys_vgui("set ::%s::ret [%s cget -%s]\n", + sys_vgui("set ::%s::tmp [%s cget -%s]\n", tcl_namespace->s_name, widget_id->s_name, argv[i]); - sys_vgui("if {[string length $::%s::ret] > 0} {\n", + sys_vgui("if {[string length $::%s::tmp] > 0} {\n", tcl_namespace->s_name); - sys_vgui("lappend ::%s::list -%s; lappend ::%s::list $::%s::ret}\n", + sys_vgui("lappend ::%s::list -%s; lappend ::%s::list $::%s::tmp}\n", tcl_namespace->s_name, argv[i], tcl_namespace->s_name, tcl_namespace->s_name); } @@ -64,8 +64,7 @@ void tkwidgets_store_options(t_symbol *receive_name, t_symbol *tcl_namespace, sys_vgui("unset ::%s::list \n", tcl_namespace->s_name); } -void tkwidgets_restore_options(t_symbol *receive_name, t_symbol *tcl_namespace, - t_symbol *widget_id, t_binbuf *options_binbuf) +void tkwidgets_restore_options(t_symbol *widget_id, t_binbuf *options_binbuf) { int length; char *options; @@ -74,6 +73,20 @@ void tkwidgets_restore_options(t_symbol *receive_name, t_symbol *tcl_namespace, sys_vgui("%s configure %s\n", widget_id->s_name, options); } +/* output a list of available options for this widget */ +void tkwidgets_list_options(t_outlet *status_outlet, int argc, char** argv) +{ + int i; + t_binbuf *bb = binbuf_new(); + for(i = 0; i < argc; ++i) + { + binbuf_addv(bb, "s", gensym(argv[i])); + } + outlet_anything(status_outlet, gensym("options"), + binbuf_getnatom(bb), binbuf_getvec(bb)); +} + + /* -------------------- generate names for various elements ----------------- */ t_symbol* tkwidgets_gen_tcl_namespace(t_object* x, t_symbol* widget_name) diff --git a/shared/tkwidgets.h b/shared/tkwidgets.h index 342162e..fa444fa 100644 --- a/shared/tkwidgets.h +++ b/shared/tkwidgets.h @@ -71,11 +71,10 @@ void tkwidgets_setcallbackname(void *x, char *widget_name); /* handle options */ void tkwidgets_store_options(t_symbol *receive_name, t_symbol *tcl_namespace, t_symbol *widget_id, int argc, char **argv); -void tkwidgets_restore_options(t_symbol *receive_name, t_symbol *tcl_namespace, - t_symbol *widget_id, t_binbuf *options_binbuf); +void tkwidgets_restore_options(t_symbol *widget_id, t_binbuf *options_binbuf); void tkwidgets_query_options(t_symbol *receive_name, t_symbol *widget_id, int argc, char** argv); - +void tkwidgets_list_options(t_outlet *status_outlet, int argc, char** argv); /* generate ID and tag names for using in Tcl/Tk space */ t_symbol* tkwidgets_gen_tcl_namespace(t_object* x, t_symbol* widget_name); diff --git a/text.c b/text.c index 209951f..a9c8266 100644 --- a/text.c +++ b/text.c @@ -27,6 +27,7 @@ /* TODO: set message doesnt work with a loadbang */ /* TODO: window name "handle1376fc00" already exists in parent */ /* TODO: figure out window vs. text width/height */ +/* TODO: handle bg color on select/deselect */ #define DEFAULT_COLOR "grey70" @@ -193,8 +194,7 @@ static void textwidget_drawme(t_textwidget *x, t_glist *glist) text_xpix(&x->x_obj, glist), text_ypix(&x->x_obj, glist), x->frame_id->s_name, x->window_tag->s_name, x->all_tag->s_name, x->width, x->height); - tkwidgets_restore_options(x->receive_name, x->tcl_namespace, - x->widget_id, x->options_binbuf); + tkwidgets_restore_options(x->widget_id, x->options_binbuf); } static void textwidget_erase(t_textwidget* x) @@ -228,7 +228,7 @@ static void textwidget_displace(t_gobj *z, t_glist *glist, int dx, int dy) x->x_obj.te_ypix += dy; if (glist_isvisible(glist)) { - set_tkwidgets_ids(x,glist_getcanvas(glist)); +// set_tkwidgets_ids(x,glist_getcanvas(glist)); /* TODO is this needed here? */ sys_vgui("%s move %s %d %d\n", x->canvas_id->s_name, x->all_tag->s_name, dx, dy); sys_vgui("%s move RESIZE %d %d\n", x->canvas_id->s_name, dx, dy); canvas_fixlinesfor(glist_getcanvas(glist), (t_text*) x); @@ -471,7 +471,9 @@ static void textwidget_save(t_gobj *z, t_binbuf *b) binbuf_addv(b, ";"); } -static void textwidget_option(t_textwidget *x, t_symbol *s, int argc, t_atom *argv) +/* this function uses the selector as the Tk option and applies the whole + * message directly to the Tk widget itself using Tk's "configure" */ +static void textwidget_set_option(t_textwidget *x, t_symbol *s, int argc, t_atom *argv) { if(s != &s_list) { @@ -483,7 +485,6 @@ static void textwidget_option(t_textwidget *x, t_symbol *s, int argc, t_atom *ar binbuf_gettext(argument_binbuf, &argument_buffer, &buffer_length); binbuf_free(argument_binbuf); argument_buffer[buffer_length] = 0; - post("argument_buffer: %s", argument_buffer); sys_vgui("%s configure -%s {%s} \n", x->widget_id->s_name, s->s_name, argument_buffer); tkwidgets_store_options(x->receive_name, x->tcl_namespace, x->widget_id, @@ -492,6 +493,13 @@ static void textwidget_option(t_textwidget *x, t_symbol *s, int argc, t_atom *ar } } +static void textwidget_options(t_textwidget *x) +{ + tkwidgets_list_options(x->x_status_outlet, + sizeof(textwidget_tk_options)/sizeof(char *), + (char **)&textwidget_tk_options); +} + static void query_scrollbars(t_textwidget *x) { t_atom state[2]; @@ -665,7 +673,7 @@ static void *textwidget_new(t_symbol *s, int argc, t_atom *argv) pd_bind(&x->x_obj.ob_pd, x->receive_name); x->x_glist = canvas_getcurrent(); - set_tkwidgets_ids(x, x->x_glist); +// set_tkwidgets_ids(x, x->x_glist); /* TODO: is this needed here? */ x->iolets_tag = tkwidgets_gen_iolets_tag((t_object*)x); x->all_tag = tkwidgets_gen_all_tag((t_object*)x); @@ -681,7 +689,7 @@ void text_setup(void) { 0, A_GIMME, 0); class_addbang(textwidget_class, (t_method)textwidget_bang_output); - class_addanything(textwidget_class, (t_method)textwidget_option); + class_addanything(textwidget_class, (t_method)textwidget_set_option); class_addmethod(textwidget_class, (t_method)textwidget_append, gensym("append"), A_GIMME, 0); @@ -689,6 +697,8 @@ void text_setup(void) { gensym("clear"), 0); class_addmethod(textwidget_class, (t_method)textwidget_key, gensym("key"), A_GIMME, 0); + class_addmethod(textwidget_class, (t_method)textwidget_options, + gensym("options"), 0); class_addmethod(textwidget_class, (t_method)textwidget_query, gensym("query"), A_DEFSYMBOL, 0); class_addmethod(textwidget_class, (t_method)textwidget_scrollbars, @@ -697,6 +707,7 @@ void text_setup(void) { gensym("set"), A_GIMME, 0); class_addmethod(textwidget_class, (t_method)textwidget_size, gensym("size"), A_DEFFLOAT, A_DEFFLOAT, 0); + /* callbacks */ class_addmethod(textwidget_class, (t_method)textwidget_store_callback, gensym("store_callback"), A_GIMME, 0); -- cgit v1.2.1