From 37881b6071aa37450507da72c46ea323231e6918 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Wed, 14 Nov 2007 02:53:03 +0000 Subject: working version of [text] from bbogart's [entry], which I heavily modified; got options working from the inlet, including using multiple atoms in one optiion svn path=/trunk/externals/tkwidgets/; revision=9000 --- text-help.pd | 164 ++++++++++++ text-test.pd | 34 +++ text.c | 824 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1022 insertions(+) create mode 100644 text-help.pd create mode 100644 text-test.pd create mode 100644 text.c diff --git a/text-help.pd b/text-help.pd new file mode 100644 index 0000000..92d83ed --- /dev/null +++ b/text-help.pd @@ -0,0 +1,164 @@ +#N canvas 343 45 785 704 10; +#X obj 52 -48 text 130 60; +#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 231 -2 select return; +#X obj 59 61 pddp/print; +#X obj 198 -91 trigger bang bang; +#X msg 198 -70 clear; +#X symbolatom 196 63 10 0 0 1 last_key_typed - -; +#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 581 -218 symbol; +#X msg 479 -245 flat; +#X msg 514 -245 groove; +#X msg 561 -245 raised; +#X msg 609 -246 ridge; +#X msg 650 -246 solid; +#X msg 691 -246 sunken; +#X obj 653 276 symbol; +#X obj 557 278 symbol; +#X msg 540 254 on; +#X msg 574 253 off; +#X msg 634 251 normal; +#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 581 -84 symbol; +#X obj 513 147 text 130 60; +#X obj 577 102 symbol; +#X msg 539 -109 none; +#X msg 574 -109 char; +#X msg 611 -109 word; +#X text 628 -85 word wrapping; +#X msg 612 70 purple; +#X msg 659 70 orange; +#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 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 61 300 symbol; +#X obj 49 409 pddp/pddplink http://tcl.tk/man/tcl8.4/TkCmd/cursors.htm +; +#X msg 59 265 boat; +#X msg 19 265 clock; +#X msg 162 265 gumby; +#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; +#X msg 150 -85 key 32; +#X obj 352 254 keyup; +#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 text 347 232 type single chars:; +#X msg 421 279 key a; +#X msg 422 301 key 9; +#X text 204 387 for more cursors:; +#X text 337 393 for more keynums:; +#X msg 413 260 key 65228; +#X msg 94 265 coffee_mug; +#X msg 62 321 cursor \$1; +#X msg 578 123 selectbackground \$1; +#X msg 401 -197 borderwidth \$1; +#X msg 582 -197 relief \$1; +#X msg 582 -63 wrap \$1; +#X msg 394 -62 insertwidth \$1; +#X msg 557 300 undo \$1; +#X msg 652 299 state \$1; +#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 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 +; +#X obj 140 -258 pddp/pddplink http://puredata.info/dev/TkWidget -text +TkWidget library; +#X text 22 -258 This is part of the; +#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 connect 0 0 2 0; +#X connect 0 0 7 0; +#X connect 0 1 6 0; +#X connect 0 1 10 0; +#X connect 1 0 0 0; +#X connect 3 0 0 0; +#X connect 4 0 0 0; +#X connect 6 0 8 0; +#X connect 8 0 9 0; +#X connect 8 1 0 0; +#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 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 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 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 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 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 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; diff --git a/text-test.pd b/text-test.pd new file mode 100644 index 0000000..9153a09 --- /dev/null +++ b/text-test.pd @@ -0,0 +1,34 @@ +#N canvas 165 195 721 672 10; +#X obj 130 117 text 130 60; +#X msg 47 29 size 100 100; +#X obj 73 543 text 200 50; +#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 +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 +-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 +-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 connect 0 1 6 0; +#X connect 1 0 0 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 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; diff --git a/text.c b/text.c new file mode 100644 index 0000000..b77ec5e --- /dev/null +++ b/text.c @@ -0,0 +1,824 @@ +/* text widget for Pd + + Copyright 2003 Guenter Geiger + Copyright 2004 Ben Bogart + Copyright 2007 Hans-Christoph Steiner + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include +#include "shared/tkwidgets.h" + +/* TODO: get Ctrl-A working to select all */ +/* TODO: set message doesnt work with a loadbang */ + + +#define DEFAULT_COLOR "grey70" + +#define TEXT_DEFAULT_WIDTH 130 +#define TEXT_DEFAULT_HEIGHT 60 +#define TEXT_MIN_WIDTH 40 +#define TEXT_MIN_HEIGHT 20 + +#define TOTAL_INLETS 1 +#define TOTAL_OUTLETS 2 + +#define DEBUG(x) x + +typedef struct _textwidget +{ + t_object x_obj; + t_canvas* x_canvas; + t_glist* x_glist; + + t_symbol* x_receive_name; + + 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; + + /* IDs for Tk widgets */ + char* tcl_namespace; + char* canvas_id; + char* frame_id; + char* text_id; + char* scrollbar_id; + char* handle_id; + char* window_tag; + char* all_tag; + + t_outlet* x_data_outlet; + t_outlet* x_status_outlet; +} t_textwidget; + +static t_class *textwidget_class; + +static char *tk_options[] = { + "autoseparators", + "background", + "borderwidth", + "cursor", + "exportselection", + "font", + "foreground", + "height", + "highlightbackground", + "highlightcolor", + "highlightthickness", + "insertbackground", + "insertborderwidth", + "insertofftime", + "insertontime", + "insertwidth", + "maxundo", + "padx", + "pady", + "relief", + "selectbackground", + "selectborderwidth", + "selectforeground", + "setgrid", + "spacing1", + "spacing2", + "spacing3", + "state", + "tabs", + "takefocus", + "undo", + "width", + "wrap", + "xscrollcommand", + "yscrollcommand" +}; + + +/* move these to tkwidgets.c */ +static t_symbol *backspace_symbol; +static t_symbol *return_symbol; +static t_symbol *space_symbol; +static t_symbol *tab_symbol; +static t_symbol *escape_symbol; +static t_symbol *left_symbol; +static t_symbol *right_symbol; +static t_symbol *up_symbol; +static t_symbol *down_symbol; + +/* function prototypes */ + +static void textwidget_getrect(t_gobj *z, t_glist *owner, int *xp1, int *yp1, int *xp2, int *yp2); +static void textwidget_displace(t_gobj *z, t_glist *glist, int dx, int dy); +static void textwidget_select(t_gobj *z, t_glist *glist, int state); +static void textwidget_activate(t_gobj *z, t_glist *glist, int state); +static void textwidget_delete(t_gobj *z, t_glist *glist); +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 t_widgetbehavior textwidget_widgetbehavior = { +w_getrectfn: textwidget_getrect, +w_displacefn: textwidget_displace, +w_selectfn: textwidget_select, +w_activatefn: textwidget_activate, +w_deletefn: textwidget_delete, +w_visfn: textwidget_vis, +w_clickfn: NULL, +}; + +/* widget helper functions */ +static void set_tk_widget_ids(t_textwidget *x, t_canvas *canvas) +{ + char buf[MAXPDSTRING]; + + x->x_canvas = canvas; + + /* Tk ID for the current canvas that this object is drawn in */ + sprintf(buf,".x%lx.c", (long unsigned int) canvas); + x->canvas_id = getbytes(strlen(buf)); + strcpy(x->canvas_id, buf); + + /* Tk ID for the "frame" the other things are drawn in */ + sprintf(buf,"%s.frame%lx", x->canvas_id, (long unsigned int)x); + x->frame_id = getbytes(strlen(buf)); + strcpy(x->frame_id, buf); + + sprintf(buf,"%s.text%lx", x->frame_id, (long unsigned int)x); + x->text_id = getbytes(strlen(buf)); + strcpy(x->text_id, buf); /* Tk ID for the "text", the meat! */ + + sprintf(buf,"%s.window%lx", x->canvas_id, (long unsigned int)x); + x->window_tag = getbytes(strlen(buf)); + strcpy(x->window_tag, buf); /* Tk ID for the resizing "window" */ + post(""); + + sprintf(buf,"%s.handle%lx", x->canvas_id, (long unsigned int)x); + x->handle_id = getbytes(strlen(buf)); + strcpy(x->handle_id, buf); /* Tk ID for the resizing "handle" */ + + sprintf(buf,"%s.scrollbar%lx", x->frame_id, (long unsigned int)x); + x->scrollbar_id = getbytes(strlen(buf)); + strcpy(x->scrollbar_id, buf); /* Tk ID for the optional "scrollbar" */ + + sprintf(buf,"all%lx", (long unsigned int)x); + x->all_tag = getbytes(strlen(buf)); + strcpy(x->all_tag, buf); /* Tk ID for the optional "scrollbar" */ +} + +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) \ + * current_iolet / (total_iolets == 1 ? 1 : total_iolets - 1)); +} + +static void textwidget_draw_inlets(t_textwidget *x, t_glist *glist, int firsttime, + int total_inlets, int total_outlets) +{ + DEBUG(post("textwidget_draw_inlets in: %d out: %d", total_inlets, total_outlets);); + int i, onset; + + for (i = 0; i < total_inlets; i++) /* inlets */ + { + onset = calculate_onset(x, glist, i, total_inlets); + sys_vgui("%s create rectangle %d %d %d %d -tags {%xi%d %xi %s}\n", + x->canvas_id, onset, text_ypix(&x->x_obj, glist) - 2, + onset + IOWIDTH, text_ypix(&x->x_obj, glist), + x, i, x, x->all_tag); + } + for (i = 0; i < total_outlets; i++) /* outlets */ + { + 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, i, x, x->all_tag); + } +} + +static void erase_inlets(t_textwidget *x) +{ + DEBUG(post("erase_inlets");); +/* Added tag for all inlets/outlets of one instance */ + sys_vgui("%s delete %xi\n", x->canvas_id, x); + sys_vgui("%s delete %xo\n", x->canvas_id, x); + +} + +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; +} + +static void erase_scrollbar(t_textwidget *x) +{ + sys_vgui("pack forget %s \n", x->scrollbar_id); + x->x_have_scrollbar = 0; +} + +static void bind_standard_keys(t_textwidget *x) +{ +#ifdef __APPLE__ + sys_vgui("bind %s {pdtk_canvas_ctrlkey %s %%K 0}\n", + x->text_id, x->canvas_id); + sys_vgui("bind %s {pdtk_canvas_ctrlkey %s %%K 1}\n", + x->text_id, x->canvas_id); +#else + sys_vgui("bind %s {pdtk_canvas_ctrlkey %s %%K 0}\n", + x->text_id, x->canvas_id); + sys_vgui("bind %s {pdtk_canvas_ctrlkey %s %%K 1}\n", + x->text_id, x->canvas_id); +#endif +} + +static void bind_button_events(t_textwidget *x) +{ + /* mouse buttons */ + sys_vgui("bind %s