diff -u -P src/g_canvas.c ../../pd-0.37-1/src/g_canvas.c --- src/g_canvas.c 2004-01-16 13:57:12.000000000 -0800 +++ ../../pd-0.37-1/src/g_canvas.c 2004-03-22 23:15:44.000000000 -0800 @@ -27,6 +27,26 @@ #include #include "g_all_guis.h" +// jsarlo +typedef struct _magicGlass +{ + t_object x_obj; + t_object *x_connectedObj; + int x_connectedOutno; + int x_visible; + char x_string[4096]; + int x_x; + int x_y; + int x_c; + float x_sigF; + int x_dspOn; + int x_viewOn; + float x_maxSample; + int x_sampleCount; + t_clock *x_clearClock; +}; +// end jsarlo + struct _canvasenvironment { t_symbol *ce_dir; /* directory patch lives in */ @@ -63,6 +83,12 @@ static void canvas_takeofflist(t_canvas *x); static void canvas_pop(t_canvas *x, t_floatarg fvis); void canvas_create_editor(t_glist *x, int createit); +// jsarlo +void canvas_lower_all_lines(t_canvas *x); +// end jsarlo + + + /* --------- functions to handle the canvas environment ----------- */ @@ -283,7 +309,7 @@ { t_gobj *y; t_object *ob = 0; - if (!t->tr_ob) y = t->tr_x->gl_list; + if (!t->tr_ob) y = t->tr_x->gl_list; else y = t->tr_ob->ob_g.g_next; for (; y; y = y->g_next) if (ob = pd_checkobject(&y->g_pd)) break; @@ -324,7 +350,6 @@ t->tr_x21 = t->tr_y21 = t->tr_x22 = t->tr_y22 = 0; t->tr_lx1 = t->tr_ly1 = t->tr_lx2 = t->tr_ly2 = 0; } - return (rval); } @@ -350,6 +375,7 @@ /* make a new glist. It will either be a "root" canvas or else its parent will be a "text" object in another window... we don't know which yet. */ + t_canvas *canvas_new(void *dummy, t_symbol *sel, int argc, t_atom *argv) { t_canvas *x = (t_canvas *)pd_new(canvas_class); @@ -358,7 +384,11 @@ int vis = 0, width = GLIST_DEFCANVASWIDTH, height = GLIST_DEFCANVASHEIGHT; int xloc = 0, yloc = GLIST_DEFCANVASYLOC; int font = (owner ? owner->gl_font : sys_defaultfont); + glist_init(x); + // jsarlo + x->gl_magic_glass = magicGlass_new((int)x); + // end jsarlo x->gl_obj.te_type = T_OBJECT; if (!owner) canvas_addtolist(x); @@ -641,6 +671,12 @@ x->gl_mapped = 0; } } + // jsarlo + if (!sys_dropshadow) + { + canvas_lower_all_lines(x); + } + // end jsarlo } void canvas_redraw(t_canvas *x) @@ -702,7 +738,7 @@ for (y = x->gl_list; y; y = y->g_next) if (ob = pd_checkobject(&y->g_pd)) rtext_free(glist_findrtext(x, ob)); - editor_free(x->gl_editor, x); + editor_free(x->gl_editor, x); x->gl_editor = 0; } } @@ -831,6 +867,10 @@ { t_gobj *y; int dspstate = canvas_suspend_dsp(); + // jsarlo + if (x->gl_magic_glass) + magicGlass_free(x->gl_magic_glass); + // end jsarlo canvas_noundo(x); if (canvas_editing == x) canvas_editing = 0; @@ -864,11 +904,17 @@ { linetraverser_start(&t, x); while (oc = linetraverser_next(&t)) - sys_vgui(".x%x.c create line %d %d %d %d -width %d -tags l%x\n", + // jsarlo + sys_vgui(".x%x.c create line %d %d %d %d -width %d -fill %s -tags l%x\n", glist_getcanvas(x), t.tr_lx1, t.tr_ly1, t.tr_lx2, t.tr_ly2, (outlet_getsymbol(t.tr_outlet) == &s_signal ? 2:1), + (outlet_getsymbol(t.tr_outlet) == &s_signal ? sys_signal_line_color:sys_control_line_color), oc); + sys_vgui(".x%x.c lower l%x\n", + glist_getcanvas(x), + oc); + // end jsarlo } } @@ -882,12 +928,28 @@ { if (t.tr_ob == text || t.tr_ob2 == text) { - sys_vgui(".x%x.c coords l%x %d %d %d %d\n", + sys_vgui(".x%x.c coords l%x %d %d %d %d\n", glist_getcanvas(x), oc, t.tr_lx1, t.tr_ly1, t.tr_lx2, t.tr_ly2); - } + } + } +} + +// jsarlo +void canvas_lower_all_lines(t_canvas *x) +{ + t_linetraverser t; + t_outconnect *oc; + + linetraverser_start(&t, x); + while (oc = linetraverser_next(&t)) + { + sys_vgui(".x%x.c lower l%x\n", + glist_getcanvas(x), + oc); } } +// end jsarlo /* kill all lines for the object */ void canvas_deletelinesfor(t_canvas *x, t_text *text) @@ -1232,12 +1294,17 @@ obj_nsigoutlets(&x->gl_obj)); /* find all the "dsp" boxes and add them to the graph */ - + // jsarlo + ob = &x->gl_magic_glass->x_obj; + if (ob) + ugen_add(dc, ob); // this t_canvas could be an array, hence no gl_magic_glass + // end jsarlo for (y = x->gl_list; y; y = y->g_next) - if ((ob = pd_checkobject(&y->g_pd)) && zgetfn(&y->g_pd, dspsym)) + { + if ((ob = pd_checkobject(&y->g_pd)) && zgetfn(&y->g_pd, dspsym)) ugen_add(dc, ob); - /* ... and all dsp interconnections */ + } linetraverser_start(&t, x); while (oc = linetraverser_next(&t)) if (obj_issignaloutlet(t.tr_ob, t.tr_outno)) diff -u -P src/g_canvas.h ../../pd-0.37-1/src/g_canvas.h --- src/g_canvas.h 2003-08-27 09:24:18.000000000 -0700 +++ ../../pd-0.37-1/src/g_canvas.h 2004-03-20 15:00:04.000000000 -0800 @@ -40,6 +40,7 @@ extern "C" { #endif + /* --------------------- geometry ---------------------------- */ #define IOWIDTH 7 /* width of an inlet/outlet in pixels */ #define IOMIDDLE ((IOWIDTH-1)/2) @@ -73,6 +74,12 @@ EXTERN_STRUCT _canvasenvironment; #define t_canvasenvironment struct _canvasenvironment +// jsarlo +EXTERN_STRUCT _magicGlass; +#define t_magicGlass struct _magicGlass +#include "g_magicglass.h" +// end jsarlo + typedef struct _selection { t_gobj *sel_what; @@ -177,6 +184,9 @@ unsigned int gl_isdeleting:1; /* we're inside glist_delete -- hack! */ unsigned int gl_stretch:1; /* stretch contents on resize */ unsigned int gl_isgraph:1; /* show as graph on parent */ + // jsarlo + t_magicGlass *gl_magic_glass; /* magic glass object */ + // end jsarlo }; #define gl_gobj gl_obj.te_g diff -u -P src/g_editor.c ../../pd-0.37-1/src/g_editor.c --- src/g_editor.c 2004-01-11 19:39:01.000000000 -0800 +++ ../../pd-0.37-1/src/g_editor.c 2004-03-22 22:19:29.000000000 -0800 @@ -26,6 +26,18 @@ static void canvas_clearline(t_canvas *x); static t_binbuf *copy_binbuf; +// jsarlo +static char canvas_cnct_inlet_tag[4096]; +static char canvas_cnct_outlet_tag[4096]; +struct _outlet +{ + t_object *o_owner; + struct _outlet *o_next; + t_outconnect *o_connections; + t_symbol *o_sym; +}; +// end jsarlo + /* ---------------- generic widget behavior ------------------------- */ void gobj_getrect(t_gobj *x, t_glist *glist, int *x1, int *y1, @@ -95,11 +107,23 @@ void glist_deselectline(t_glist *x) { + // jsarlo + t_linetraverser t; + t_outconnect *oc; + // end jsarlo if (x->gl_editor) { x->gl_editor->e_selectedline = 0; - sys_vgui(".x%x.c itemconfigure l%x -fill black\n", - x, x->gl_editor->e_selectline_tag); + // jsarlo + linetraverser_start(&t, glist_getcanvas(x)); + do { + oc = linetraverser_next(&t); + } while (oc && oc != x->gl_editor->e_selectline_tag); + sys_vgui(".x%x.c itemconfigure l%x -fill %s\n", + x, + x->gl_editor->e_selectline_tag, + (outlet_getsymbol(t.tr_outlet) == &s_signal ? sys_signal_line_color:sys_control_line_color) + ); } } @@ -375,6 +399,10 @@ { sys_vgui(".x%x.c delete l%x\n", x, oc); obj_disconnect(t.tr_ob, t.tr_outno, t.tr_ob2, t.tr_inno); + // jsarlo + magicGlass_unbind(x->gl_magic_glass); + magicGlass_hide(x->gl_magic_glass); + // end jsarlo break; } } @@ -724,7 +752,7 @@ "plus", /* CURSOR_RUNMODE_ADDPOINT */ "hand2", /* CURSOR_EDITMODE_NOTHING */ "circle", /* CURSOR_EDITMODE_CONNECT */ - "X_cursor" /* CURSOR_EDITMODE_DISCONNECT */ + "X_cursor", /* CURSOR_EDITMODE_DISCONNECT */ }; void canvas_setcursor(t_canvas *x, unsigned int cursornum) @@ -1075,13 +1103,50 @@ x->gl_editor->e_onmotion = MA_CONNECT; x->gl_editor->e_xwas = xpos; x->gl_editor->e_ywas = ypos; - sys_vgui( - ".x%x.c create line %d %d %d %d -width %d -tags x\n", - x, xpos, ypos, xpos, ypos, - (issignal ? 2 : 1)); - } - else canvas_setcursor(x, CURSOR_EDITMODE_CONNECT); - } + // jsarlo + sys_vgui(".x%x.c create line %d %d %d %d -width %d -fill %s -tags x\n", + x, xpos, ypos, xpos, ypos, + (issignal ? 2 : 1), + (issignal ? sys_signal_line_color:sys_control_line_color)); + if (!sys_dropshadow) + { + sys_vgui(".x%x.c lower x\n", x); + } + // end jsarlo + } + else + // jsarlo + { + t_rtext *y = glist_findrtext(x, (t_text *)&ob->ob_g); + if (canvas_cnct_outlet_tag[0] != 0) + { + sys_vgui(".x%x.c itemconfigure %s -outline black -width 1\n", + x, + canvas_cnct_outlet_tag); + } + if (y) + { + sprintf(canvas_cnct_outlet_tag, + "%so%d", + rtext_gettag(y), + closest); + sys_vgui(".x%x.c itemconfigure %s -outline %s -width %d\n", + x, + canvas_cnct_outlet_tag, + sys_iolet_select_color, + sys_iolet_select_width); + sys_vgui(".x%x.c raise %s\n", + x, + canvas_cnct_outlet_tag); + } + // jsarlo + magicGlass_unbind(x->gl_magic_glass); + magicGlass_hide(x->gl_magic_glass); + // end jaarlo + canvas_setcursor(x, CURSOR_EDITMODE_CONNECT); + } + // end jsarlo + } else if (doit) goto nooutletafterall; } @@ -1110,8 +1175,22 @@ x->gl_editor->e_onmotion = MA_MOVE; } } - else canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); - } + else + // jsarlo + { + if (canvas_cnct_outlet_tag[0] != 0) + { + sys_vgui(".x%x.c itemconfigure %s -outline black -width 1\n", + x, + canvas_cnct_outlet_tag); + canvas_cnct_outlet_tag[0] = 0; + } + magicGlass_unbind(x->gl_magic_glass); + magicGlass_hide(x->gl_magic_glass); + canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); + } + // end jsarlo + } return; } /* if right click doesn't hit any boxes, call rightclick @@ -1132,28 +1211,77 @@ t_linetraverser t; t_outconnect *oc; float fx = xpos, fy = ypos; - t_glist *glist2 = glist_getcanvas(x); + t_glist *glist2 = glist_getcanvas(x); + // jsarlo linetraverser_start(&t, glist2); - while (oc = linetraverser_next(&t)) - { + while (oc = linetraverser_next(&t)) + { + // jsarlo + int parseOutno; + t_object *parseOb = NULL; + t_outlet *parseOutlet = NULL; + // end jsarlo float lx1 = t.tr_lx1, ly1 = t.tr_ly1, lx2 = t.tr_lx2, ly2 = t.tr_ly2; float area = (lx2 - lx1) * (fy - ly1) - (ly2 - ly1) * (fx - lx1); float dsquare = (lx2-lx1) * (lx2-lx1) + (ly2-ly1) * (ly2-ly1); - if (area * area >= 50 * dsquare) continue; - if ((lx2-lx1) * (fx-lx1) + (ly2-ly1) * (fy-ly1) < 0) continue; - if ((lx2-lx1) * (lx2-fx) + (ly2-ly1) * (ly2-fy) < 0) continue; - if (doit) + if (area * area >= 50 * dsquare) continue; + if ((lx2-lx1) * (fx-lx1) + (ly2-ly1) * (fy-ly1) < 0) continue; + if ((lx2-lx1) * (lx2-fx) + (ly2-ly1) * (ly2-fy) < 0) continue; + if (doit) { glist_selectline(glist2, oc, canvas_getindex(glist2, &t.tr_ob->ob_g), t.tr_outno, canvas_getindex(glist2, &t.tr_ob2->ob_g), t.tr_inno); } - canvas_setcursor(x, CURSOR_EDITMODE_DISCONNECT); + // jsarlo + parseOutno = t.tr_outno; + parseOb = t.tr_ob; + for (parseOutlet = parseOb->ob_outlet; + parseOutlet && parseOutno; + parseOutlet = parseOutlet->o_next, parseOutno--); + if (parseOutlet) + { + magicGlass_bind(x->gl_magic_glass, + t.tr_ob, + t.tr_outno); + magicGlass_setDsp(x->gl_magic_glass, + obj_issignaloutlet(t.tr_ob, t.tr_outno)); + } + magicGlass_moveText(x->gl_magic_glass, xpos, ypos); + if (magicGlass_isOn(x->gl_magic_glass)) + magicGlass_show(x->gl_magic_glass); + if (canvas_cnct_inlet_tag[0] != 0) + { + sys_vgui(".x%x.c itemconfigure %s -outline black -width 1\n", + x, + canvas_cnct_inlet_tag); + canvas_cnct_inlet_tag[0] = 0; + } + if (canvas_cnct_outlet_tag[0] != 0) + { + sys_vgui(".x%x.c itemconfigure %s -outline black -width 1\n", + x, + canvas_cnct_outlet_tag); + canvas_cnct_outlet_tag[0] = 0; + } + // end jsarlo + canvas_setcursor(x, CURSOR_EDITMODE_DISCONNECT); return; } } + // jsarlo + if (canvas_cnct_outlet_tag[0] != 0) + { + sys_vgui(".x%x.c itemconfigure %s -outline black -width 1\n", + x, + canvas_cnct_outlet_tag); + canvas_cnct_outlet_tag[0] = 0; + } + magicGlass_unbind(x->gl_magic_glass); + magicGlass_hide(x->gl_magic_glass); + // end jsarlo canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); if (doit) { @@ -1236,15 +1364,23 @@ if (canvas_isconnected (x, ob1, closest1, ob2, closest2)) { - canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); + // jsarlo + magicGlass_unbind(x->gl_magic_glass); + magicGlass_hide(x->gl_magic_glass); + // end jsarlo + canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); return; } if (obj_issignaloutlet(ob1, closest1) && !obj_issignalinlet(ob2, closest2)) { if (doit) - error("can't connect signal outlet to control inlet"); - canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); + error("can't connect signal outlet to control inlet"); + // jsarlo + magicGlass_unbind(x->gl_magic_glass); + magicGlass_hide(x->gl_magic_glass); + // end jsarlo + canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); return; } if (doit) @@ -1258,20 +1394,80 @@ ((x22-x21-IOWIDTH) * closest2)/(ninlet2-1) : 0) + IOMIDDLE; ly2 = y21; - sys_vgui(".x%x.c create line %d %d %d %d -width %d -tags l%x\n", + // jsarlo + sys_vgui(".x%x.c create line %d %d %d %d -width %d -fill %s -tags l%x\n", glist_getcanvas(x), lx1, ly1, lx2, ly2, - (obj_issignaloutlet(ob1, closest1) ? 2 : 1), oc); - canvas_setundo(x, canvas_undo_connect, + (obj_issignaloutlet(ob1, closest1) ? 2 : 1), + (obj_issignaloutlet(ob1, closest1) ? sys_signal_line_color:sys_control_line_color), oc); + if (!sys_dropshadow) + { + sys_vgui(".x%x.c lower l%x\n", + x, + oc); + } + if (canvas_cnct_inlet_tag[0] != 0) + { + sys_vgui(".x%x.c itemconfigure %s -outline black -width 1\n", + x, + canvas_cnct_inlet_tag); + canvas_cnct_inlet_tag[0] = 0; + } + if (canvas_cnct_outlet_tag[0] != 0) + { + sys_vgui(".x%x.c itemconfigure %s -outline black -width 1\n", + x, + canvas_cnct_outlet_tag); + canvas_cnct_outlet_tag[0] = 0; + } + // end jsarlo + canvas_setundo(x, canvas_undo_connect, canvas_undo_set_connect(x, canvas_getindex(x, &ob1->ob_g), closest1, canvas_getindex(x, &ob2->ob_g), closest2), "connect"); } - else canvas_setcursor(x, CURSOR_EDITMODE_CONNECT); - return; - } - } + else + // jsarlo + { + t_rtext *y = glist_findrtext(x, (t_text *)&ob2->ob_g); + if (canvas_cnct_inlet_tag[0] != 0) + { + sys_vgui(".x%x.c itemconfigure %s -outline black -width 1\n", + x, + canvas_cnct_inlet_tag); + } + if (y) + { + sprintf(canvas_cnct_inlet_tag, + "%si%d", + rtext_gettag(y), + closest2); + sys_vgui(".x%x.c itemconfigure %s -outline %s -width %d\n", + x, + canvas_cnct_inlet_tag, + sys_iolet_select_color, + sys_iolet_select_width); + sys_vgui(".x%x.c raise %s\n", + x, + canvas_cnct_inlet_tag); + } + canvas_setcursor(x, CURSOR_EDITMODE_CONNECT); + } + // end jsarlo + return; + } + } + // jsarlo + if (canvas_cnct_inlet_tag[0] != 0) + { + sys_vgui(".x%x.c itemconfigure %s -outline black -width 1\n", + x, + canvas_cnct_inlet_tag); + } + magicGlass_unbind(x->gl_magic_glass); + magicGlass_hide(x->gl_magic_glass); + // end jsarlo canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); } @@ -1967,9 +2163,12 @@ if (!(oc = obj_connect(objsrc, outno, objsink, inno))) goto bad; if (glist_isvisible(x)) { - sys_vgui(".x%x.c create line %d %d %d %d -width %d -tags l%x\n", + // jsarlo + sys_vgui(".x%x.c create line %d %d %d %d -width %d -fill %s -tags l%x\n", glist_getcanvas(x), 0, 0, 0, 0, - (obj_issignaloutlet(objsrc, outno) ? 2 : 1),oc); + (obj_issignaloutlet(objsrc, outno) ? 2 : 1), + (obj_issignaloutlet(objsrc, outno) ? sys_signal_line_color:sys_control_line_color), oc); + // jsarlo canvas_fixlinesfor(x, objsrc); } return; @@ -2114,17 +2313,62 @@ return; x->gl_edit = !x->gl_edit; if (x->gl_edit && glist_isvisible(x) && glist_istoplevel(x)) - canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); + { + canvas_setcursor(x, CURSOR_EDITMODE_NOTHING); + } else { glist_noselect(x); if (glist_isvisible(x) && glist_istoplevel(x)) + { + // jsarlo + if (canvas_cnct_inlet_tag[0] != 0) + { + sys_vgui(".x%x.c itemconfigure %s -outline black -width 1\n", + x, + canvas_cnct_inlet_tag); + canvas_cnct_inlet_tag[0] = 0; + } + if (canvas_cnct_outlet_tag[0] != 0) + { + sys_vgui(".x%x.c itemconfigure %s -outline black -width 1\n", + x, + canvas_cnct_outlet_tag); + canvas_cnct_outlet_tag[0] = 0; + } + magicGlass_unbind(x->gl_magic_glass); + magicGlass_hide(x->gl_magic_glass); + // end jsarlo canvas_setcursor(x, CURSOR_RUNMODE_NOTHING); + } } sys_vgui("pdtk_canvas_editval .x%x %d\n", glist_getcanvas(x), x->gl_edit); } +// jsarlo +void canvas_magicglass(t_canvas *x, t_floatarg fyesplease) +{ + int yesplease = fyesplease; + if (yesplease && magicGlass_isOn(x->gl_magic_glass)) + return; + if (!magicGlass_isOn(x->gl_magic_glass)) { + magicGlass_setOn(x->gl_magic_glass, 1); + if (magicGlass_bound(x->gl_magic_glass)) + { + magicGlass_show(x->gl_magic_glass); + } + } + else { + magicGlass_setOn(x->gl_magic_glass, 0); + magicGlass_hide(x->gl_magic_glass); + } + sys_vgui("pdtk_canvas_magicglassval .x%x %d\n", + glist_getcanvas(x), magicGlass_isOn(x->gl_magic_glass)); +} +// end jsarlo + + /* called by canvas_font below */ static void canvas_dofont(t_canvas *x, t_floatarg font, t_floatarg xresize, t_floatarg yresize) @@ -2224,6 +2468,10 @@ gensym("texteditor"), A_NULL); class_addmethod(canvas_class, (t_method)canvas_editmode, gensym("editmode"), A_DEFFLOAT, A_NULL); + // jsarlo + class_addmethod(canvas_class, (t_method)canvas_magicglass, + gensym("magicglass"), A_DEFFLOAT, A_NULL); + //end jsarlo class_addmethod(canvas_class, (t_method)canvas_print, gensym("print"), A_SYMBOL, A_NULL); class_addmethod(canvas_class, (t_method)canvas_menufont, diff -u -P src/g_magicglass.c ../../pd-0.37-1/src/g_magicglass.c --- src/g_magicglass.c 1969-12-31 16:00:00.000000000 -0800 +++ ../../pd-0.37-1/src/g_magicglass.c 2004-03-22 22:12:53.000000000 -0800 @@ -0,0 +1,349 @@ +#include "m_pd.h" +#include +#include "string.h" +#include "m_pd.h" +#include "m_imp.h" +#define MG_CLOCK_CLEAR_DELAY 500 +#define MG_SAMPLE_COUNT 2205 + +t_class *magicGlass_class; + +typedef struct _magicGlass +{ + t_object x_obj; + t_object *x_connectedObj; + int x_connectedOutno; + int x_visible; + char x_string[4096]; + int x_x; + int x_y; + int x_c; + float x_sigF; + int x_dspOn; + int x_viewOn; + float x_maxSample; + int x_sampleCount; + t_clock *x_clearClock; +} t_magicGlass; + +void magicGlass_bind(t_magicGlass *x, t_object *obj, int outno) +{ + if (x->x_connectedObj != obj) + { + if (x->x_connectedObj != NULL) + { + obj_disconnect(x->x_connectedObj, + x->x_connectedOutno, + &x->x_obj, + 0); + } + obj_connect(obj, outno, &x->x_obj, 0); + x->x_connectedObj = obj; + x->x_connectedOutno = outno; + } +} + +void magicGlass_unbind(t_magicGlass *x) +{ + if (x->x_connectedObj != NULL) + { + obj_disconnect(x->x_connectedObj, + x->x_connectedOutno, + &x->x_obj, + 0); + } + x->x_dspOn = 0; + x->x_maxSample = 0; + x->x_sampleCount = 0; + x->x_connectedObj = NULL; + x->x_connectedOutno = 0; +} + +void magicGlass_updateText(t_magicGlass *x) +{ + int bgSize; + + if (x->x_visible) + { + sys_vgui(".x%x.c itemconfigure magicGlassText -text {%s}\n", + x->x_c, + x->x_string); + if (strlen(x->x_string) > 0) + { + bgSize = x->x_x + 30 + (strlen(x->x_string) * 6); + } + else + { + bgSize = x->x_x + 36; + } + sys_vgui(".x%x.c coords magicGlassText %d %d\n", + x->x_c, + x->x_x + 20, + x->x_y); + sys_vgui(".x%x.c coords magicGlassLine %d %d %d %d\n", + x->x_c, + x->x_x, + x->x_y + 1, + x->x_x + 13, + x->x_y + 1); + sys_vgui(".x%x.c coords magicGlassBg %d %d %d %d\n", + x->x_c, + x->x_x + 13, + x->x_y - 12, + bgSize, + x->x_y + 12); + } +} + +void magicGlass_drawNew(t_magicGlass *x) +{ + sys_vgui(".x%x.c create rectangle 0 0 0 0 -outline #ffffff -fill #000000 -tags magicGlassBg\n", + x->x_c); + sys_vgui(".x%x.c create line 0 0 0 0 -fill #000000 -width 4 -tags magicGlassLine\n", + x->x_c); + sys_vgui(".x%x.c create text 0 0 -text {} -anchor w -fill #ffffff -tags magicGlassText\n", + x->x_c); + sys_vgui(".x%x.c raise magicGlassBg\n", + x->x_c); + sys_vgui(".x%x.c raise magicGlassText\n", + x->x_c); + magicGlass_updateText(x); +} + +void magicGlass_undraw(t_magicGlass *x) +{ + sys_vgui(".x%x.c delete magicGlassBg\n", x->x_c); + sys_vgui(".x%x.c delete magicGlassLine\n", x->x_c); + sys_vgui(".x%x.c delete magicGlassText\n", x->x_c); +} + + +void magicGlass_clearText(t_magicGlass *x) +{ + x->x_string[0] = 0; + magicGlass_updateText(x); +} + +void magicGlass_bang(t_magicGlass *x) +{ + strcpy(x->x_string, "bang"); + magicGlass_updateText(x); + clock_delay(x->x_clearClock, MG_CLOCK_CLEAR_DELAY); +} + +void magicGlass_float(t_magicGlass *x, t_float f) +{ + sprintf(x->x_string, "%g", f); + magicGlass_updateText(x); + clock_delay(x->x_clearClock, MG_CLOCK_CLEAR_DELAY); +} + +void magicGlass_symbol(t_magicGlass *x, t_symbol *sym) +{ + sprintf(x->x_string, "symbol %s", sym->s_name); + magicGlass_updateText(x); + clock_delay(x->x_clearClock, MG_CLOCK_CLEAR_DELAY); +} + +void magicGlass_anything(t_magicGlass *x, t_symbol *sym, int argc, t_atom *argv) +{ + char aString[4096]; + char valueString[4096]; + int i; + + strcpy(aString, sym->s_name); + valueString[0] = 0; + for (i = 0; i < argc; i++) + { + if (argv[i].a_type == A_SYMBOL) + { + sprintf(valueString, " %s", argv[i].a_w.w_symbol->s_name); + strcat(aString, valueString); + } + else if (argv[i].a_type == A_FLOAT) + { + sprintf(valueString, " %g", argv[i].a_w.w_float); + strcat(aString, valueString); + } + } + strcpy(x->x_string, aString); + magicGlass_updateText(x); + clock_delay(x->x_clearClock, MG_CLOCK_CLEAR_DELAY); +} + +void magicGlass_list(t_magicGlass *x, t_symbol *sym, int argc, t_atom *argv) +{ + char aString[4096]; + char valueString[4096]; + int i; + + aString[0] = 0; + valueString[0] = 0; + for (i = 0; i < argc; i++) + { + if (argv[i].a_type == A_SYMBOL) + { + sprintf(valueString, " %s", argv[i].a_w.w_symbol->s_name); + strcat(aString, valueString); + } + else if (argv[i].a_type == A_FLOAT) + { + sprintf(valueString, " %g", argv[i].a_w.w_float); + strcat(aString, valueString); + } + } + strcpy(x->x_string, aString); + magicGlass_updateText(x); + clock_delay(x->x_clearClock, MG_CLOCK_CLEAR_DELAY); +} + +void magicGlass_setCanvas(t_magicGlass *x, int c) +{ + x->x_c = c; +} + +void magicGlass_show(t_magicGlass *x) +{ + x->x_sampleCount = 0; + x->x_maxSample = 0; + x->x_string[0] = 0; + if (!x->x_visible) + { + x->x_visible = 1; + magicGlass_drawNew(x); + } +} + +void magicGlass_hide(t_magicGlass *x) +{ + if (x->x_visible) + magicGlass_undraw(x); + x->x_sampleCount = 0; + x->x_maxSample = 0; + x->x_string[0] = 0; + x->x_visible = 0; +} + +void magicGlass_moveText(t_magicGlass *x, int pX, int pY) +{ + int bgSize; + + x->x_x = pX; + x->x_y = pY; + magicGlass_updateText(x); +} + +int magicGlass_bound(t_magicGlass *x) +{ + if (x->x_connectedObj) + return 1; + else + return 0; +} + +int magicGlass_isOn(t_magicGlass *x) +{ + if (x->x_viewOn) + return 1; + else + return 0; +} + +void magicGlass_setOn(t_magicGlass *x, int i) +{ + if (i) + { + x->x_viewOn = 1; + } + else + { + x->x_viewOn = 0; + } +} + +void magicGlass_setDsp(t_magicGlass *x, int i) +{ + if (i) + { + x->x_dspOn = 1; + x->x_sampleCount = 0; + x->x_maxSample = 0; + } + else + { + x->x_dspOn = 0; + } +} + +t_int *magicGlass_perform(t_int *w) +{ + t_magicGlass *x = (t_magicGlass *)(w[1]); + float *in = (float *)(w[2]); + int N = (int)(w[3]); + int i; + if (x->x_dspOn) + { + for (i = 0; i < N; i++) + { + if (in[i] > x->x_maxSample) + x->x_maxSample = in[i]; + x->x_sampleCount++; + if (x->x_sampleCount >= MG_SAMPLE_COUNT) + { + sprintf(x->x_string, "%g", x->x_maxSample); + magicGlass_updateText(x); + x->x_maxSample = 0; + x->x_sampleCount = 0; + } + } + } + return (w + 4); +} + +void magicGlass_dsp(t_magicGlass *x, t_signal **sp) +{ + dsp_add(magicGlass_perform, 3, x, sp[0]->s_vec, sp[0]->s_n); +} + +void *magicGlass_new(int c) +{ + t_magicGlass *x = (t_magicGlass *)pd_new(magicGlass_class); + x->x_connectedObj= NULL; + x->x_connectedOutno = 0; + x->x_visible = 0; + x->x_c = c; + x->x_sigF = 0; + x->x_dspOn = 0; + x->x_viewOn = 0; + x->x_maxSample = 0; + x->x_sampleCount = 0; + x->x_clearClock = clock_new(x, (t_method)magicGlass_clearText); + return x; +} + +void magicGlass_free(t_magicGlass *x) +{ + x->x_dspOn = 0; + clock_free(x->x_clearClock); +} + +void magicGlass_setup(void) +{ + magicGlass_class = class_new(gensym("magicGlass"), + (t_newmethod)magicGlass_new, + (t_method)magicGlass_free, + sizeof(t_magicGlass), + 0, + A_DEFFLOAT, + 0); + CLASS_MAINSIGNALIN(magicGlass_class, t_magicGlass, x_sigF); + class_addmethod(magicGlass_class, + (t_method)magicGlass_dsp, + gensym("dsp"), + 0); + class_addbang(magicGlass_class, (t_method)magicGlass_bang); + class_addfloat(magicGlass_class, (t_method)magicGlass_float); + class_addsymbol(magicGlass_class, (t_method)magicGlass_symbol); + class_addanything(magicGlass_class, (t_method)magicGlass_anything); + class_addlist(magicGlass_class, (t_method)magicGlass_list); +} diff -u -P src/g_magicglass.h ../../pd-0.37-1/src/g_magicglass.h --- src/g_magicglass.h 1969-12-31 16:00:00.000000000 -0800 +++ ../../pd-0.37-1/src/g_magicglass.h 2004-03-22 22:11:34.000000000 -0800 @@ -0,0 +1,20 @@ +EXTERN void magicGlass_bind(t_magicGlass *x, t_object *obj, int outno); +EXTERN void magicGlass_unbind(t_magicGlass *x); +EXTERN void magicGlass_bang(t_magicGlass *x); +EXTERN void magicGlass_float(t_magicGlass *x, t_float f); +EXTERN void magicGlass_symbol(t_magicGlass *x, t_symbol *sym); +EXTERN void magicGlass_anything(t_magicGlass *x, t_symbol *sym, int argc, t_atom *argv); +EXTERN void magicGlass_list(t_magicGlass *x, t_symbol *sym, int argc, t_atom *argv); +EXTERN void magicGlass_setCanvas(t_magicGlass *x, int c); +EXTERN void magicGlass_show(t_magicGlass *x); +EXTERN void magicGlass_hide(t_magicGlass *x); +EXTERN void magicGlass_moveText(t_magicGlass *x, int pX, int pY); +EXTERN int magicGlass_bound(t_magicGlass *x); +EXTERN int magicGlass_isOn(t_magicGlass *x); +EXTERN void magicGlass_setOn(t_magicGlass *x, int i); +EXTERN void magicGlass_setDsp(t_magicGlass *x, int i); +EXTERN void *magicGlass_new(int c); +EXTERN void magicGlass_free(t_magicGlass *x); +EXTERN void magicGlass_setup(void); + + diff -u -P src/g_text.c ../../pd-0.37-1/src/g_text.c --- src/g_text.c 2004-01-18 12:30:47.000000000 -0800 +++ ../../pd-0.37-1/src/g_text.c 2004-03-21 21:53:29.000000000 -0800 @@ -888,7 +888,13 @@ flag because we might be within the vis() routine and not have set that yet. So we check directly whether the "rtext" list has been built. LATER reconsider when "vis" flag should be on and off? */ - + // jsarlo + else if (strcmp("magicGlass", class_getname(x->ob_pd)) == 0) + { + width = 0; + height = 0; + } + // end jsarlo else if (glist->gl_editor && glist->gl_editor->e_rtext) { t_rtext *y = glist_findrtext(glist, x); @@ -1122,6 +1128,12 @@ glist_getcanvas(glist), tag, i, onset, y2 - 1, onset + IOWIDTH, y2); + // jsarlo + sys_vgui(".x%x.c raise %so%d\n", + glist_getcanvas(glist), + tag, + i); + // end jsarlo } n = obj_ninlets(ob); nplus = (n == 1 ? 1 : n-1); @@ -1139,6 +1151,12 @@ glist_getcanvas(glist), tag, i, onset, y1, onset + IOWIDTH, y1 + EXTRAPIX); + // jsarlo + sys_vgui(".x%x.c raise %si%d\n", + glist_getcanvas(glist), + tag, + i); + // end jsarlo } } @@ -1152,47 +1170,116 @@ height = y2 - y1; if (x->te_type == T_OBJECT) { + // jsarlo if (firsttime) + { sys_vgui(".x%x.c create line\ %d %d %d %d %d %d %d %d %d %d -tags %sR\n", glist_getcanvas(glist), x1, y1, x2, y1, x2, y2, x1, y2, x1, y1, tag); - else + if (sys_dropshadow) + { + sys_vgui(".x%x.c create line\ + %d %d %d %d %d %d -fill #b9b9b9 -width 2 -tags %sRB\n", + glist_getcanvas(glist), + x2+2, y1+2, x2+2, y2+2, x1+2, y2+2, tag); + sys_vgui(".x%x.c lower %sRB\n", glist_getcanvas(glist), tag); + } + } + else + { sys_vgui(".x%x.c coords %sR\ %d %d %d %d %d %d %d %d %d %d\n", glist_getcanvas(glist), tag, x1, y1, x2, y1, x2, y2, x1, y2, x1, y1); + if (sys_dropshadow) + { + sys_vgui(".x%x.c coords %sRB\ + %d %d %d %d %d %d\n", + glist_getcanvas(glist), tag, + x2+2, y1+2, x2+2, y2+2, x1+2, y2+2); + } + } } else if (x->te_type == T_MESSAGE) { if (firsttime) + { sys_vgui(".x%x.c create line\ %d %d %d %d %d %d %d %d %d %d %d %d %d %d -tags %sR\n", glist_getcanvas(glist), x1, y1, x2+4, y1, x2, y1+4, x2, y2-4, x2+4, y2, x1, y2, x1, y1, tag); - else + if (sys_dropshadow) + { + sys_vgui(".x%x.c create line\ + %d %d %d %d %d %d -fill #b9b9b9 -width 2 -tags %sRB\n", + glist_getcanvas(glist), + x2+4, y1+2, x2+2, y1+4, x2+2, y2-2, tag); + sys_vgui(".x%x.c lower %sRB\n", glist_getcanvas(glist), tag); + sys_vgui(".x%x.c create line\ + %d %d %d %d -fill #b9b9b9 -width 2 -tags %sRB2\n", + glist_getcanvas(glist), + x2+6, y2+2, x1+2, y2+2, tag); + sys_vgui(".x%x.c lower %sRB2\n", glist_getcanvas(glist), tag); + } + } + else + { sys_vgui(".x%x.c coords %sR\ %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n", glist_getcanvas(glist), tag, x1, y1, x2+4, y1, x2, y1+4, x2, y2-4, x2+4, y2, x1, y2, x1, y1); + if (sys_dropshadow) + { + sys_vgui(".x%x.c coords %sRB\ + %d %d %d %d %d %d\n", + glist_getcanvas(glist), tag, + x2+4, y1+2, x2+2, y1+4, x2+2, y2-2); + sys_vgui(".x%x.c coords %sRB2\ + %d %d %d %d\n", + glist_getcanvas(glist), tag, + x2+6, y2+2, x1+2, y2+2); + } + } } else if (x->te_type == T_ATOM) { if (firsttime) + { sys_vgui(".x%x.c create line\ %d %d %d %d %d %d %d %d %d %d %d %d -tags %sR\n", glist_getcanvas(glist), x1, y1, x2-4, y1, x2, y1+4, x2, y2, x1, y2, x1, y1, tag); - else + if (sys_dropshadow) + { + sys_vgui(".x%x.c create line\ + %d %d %d %d %d %d -fill #b9b9b9 -width 2 -tags %sRB\n", + glist_getcanvas(glist), + x2+2, y1+6, x2+2, y2+2, x1+2, y2+2, tag); + sys_vgui(".x%x.c lower %sRB\n", glist_getcanvas(glist), tag); + } + } + else + { sys_vgui(".x%x.c coords %sR\ %d %d %d %d %d %d %d %d %d %d %d %d\n", glist_getcanvas(glist), tag, x1, y1, x2-4, y1, x2, y1+4, x2, y2, x1, y2, x1, y1); - } + + if (sys_dropshadow) + { + sys_vgui(".x%x.c coords %sRB\ + %d %d %d %d %d %d\n", + glist_getcanvas(glist), tag, + x2+2, y1+6, x2+2, y2+2, x1+2, y2+2); + } + } + // jsarlo + } /* draw inlets/outlets */ if (ob = pd_checkobject(&x->te_pd)) @@ -1217,6 +1304,15 @@ if (x->te_type == T_TEXT) return; sys_vgui(".x%x.c delete %sR\n", glist_getcanvas(glist), tag); + // jsarlo + if (sys_dropshadow) + { + sys_vgui(".x%x.c delete %sRB\n", + glist_getcanvas(glist), tag); + sys_vgui(".x%x.c delete %sRB2\n", + glist_getcanvas(glist), tag); + } + // end jsarlo glist_eraseiofor(glist, x, tag); } @@ -1249,7 +1345,7 @@ { int xwas = x->te_xpix, ywas = x->te_ypix; glist_delete(glist, &x->te_g); - canvas_objtext(glist, xwas, ywas, 0, b); + canvas_objtext(glist, xwas, ywas, 0, b); /* if it's an abstraction loadbang it here */ if (newest && pd_class(newest) == canvas_class) canvas_loadbang((t_canvas *)newest); diff -u -P src/makefile.in ../../pd-0.37-1/src/makefile.in --- src/makefile.in 2004-01-22 16:11:35.000000000 -0800 +++ ../../pd-0.37-1/src/makefile.in 2004-03-22 23:40:02.000000000 -0800 @@ -33,7 +33,7 @@ SRC = g_canvas.c g_graph.c g_text.c g_rtext.c g_array.c g_template.c g_io.c \ g_scalar.c g_traversal.c g_guiconnect.c g_readwrite.c g_editor.c \ g_all_guis.c g_bang.c g_hdial.c g_hslider.c g_mycanvas.c g_numbox.c \ - g_toggle.c g_vdial.c g_vslider.c g_vumeter.c \ + g_toggle.c g_vdial.c g_vslider.c g_vumeter.c g_magicglass.c \ m_pd.c m_class.c m_obj.c m_atom.c m_memory.c m_binbuf.c \ m_conf.c m_glob.c m_sched.c \ s_main.c s_inter.c s_file.c s_print.c \ diff -u -P src/m_obj.c ../../pd-0.37-1/src/m_obj.c --- src/m_obj.c 2003-04-01 15:11:39.000000000 -0800 +++ ../../pd-0.37-1/src/m_obj.c 2004-03-21 11:42:40.000000000 -0800 @@ -451,7 +451,6 @@ t_outlet *o; t_pd *to; t_outconnect *oc, *oc2; - for (o = source->ob_outlet; o && outno; o = o->o_next, outno--) if (!o) return; if (sink->ob_pd->c_firstin) diff -u -P src/m_pd.h ../../pd-0.37-1/src/m_pd.h --- src/m_pd.h 2003-09-30 21:05:28.000000000 -0700 +++ ../../pd-0.37-1/src/m_pd.h 2004-03-22 22:48:23.000000000 -0800 @@ -618,6 +618,14 @@ #define typedmess pd_typedmess #define vmess pd_vmess +// jsarlo +EXTERN char sys_signal_line_color[8]; +EXTERN char sys_control_line_color[8]; +EXTERN char sys_iolet_select_color[8]; +EXTERN int sys_iolet_select_width; +EXTERN int sys_dropshadow; +// end jsarlo + /* A definition to help gui objects straddle 0.34-0.35 changes. If this is defined, there is a "te_xpix" field in objects, not a "te_xpos" as before: */ diff -u -P src/s_main.c ../../pd-0.37-1/src/s_main.c --- src/s_main.c 2004-02-25 15:44:43.000000000 -0800 +++ ../../pd-0.37-1/src/s_main.c 2004-03-22 22:56:29.000000000 -0800 @@ -81,6 +81,13 @@ int sys_choutlist[MAXAUDIOOUTDEV]; /* } IOhannes */ +// jsarlo +char sys_signal_line_color[8] = "#000000"; +char sys_control_line_color[8] = "#000000"; +char sys_iolet_select_color[8] = "#0000ff"; +int sys_iolet_select_width = 4; +int sys_dropshadow = 0; +// end jsarlo typedef struct _fontinfo { @@ -334,6 +341,9 @@ #ifdef UNIX "-rt or -realtime -- use real-time priority\n", "-nrt -- don't use real-time priority\n", +"-scolor -- signal patch cord color ( is a 6 digit hex)\n", +"-ccolor -- control patch cord color ( is a 6 digit hex)\n", +"-dropshadows -- turn drop shadows on\n" #endif }; @@ -765,6 +775,38 @@ goto usage; argc -= 2; argv += 2; } +// jsarlo + else if (!strcmp(*argv, "-scolor")) + { + if (argv[1]) + { + strncpy(sys_signal_line_color + 1, argv[1], 7); + sys_signal_line_color[0] = '#'; + argc -= 2; argv += 2; + } + else + { + argc--; argv++; + } + } + else if (!strcmp(*argv, "-ccolor")) + { + if (argv[1]) + { + strncpy(sys_control_line_color + 1, argv[1], 7); + sys_control_line_color[0] = '#'; + argc -= 2; argv += 2; + } + else + { + argc--; argv++; + } + } + else if (!strcmp(*argv, "-dropshadows")) + { + sys_dropshadow = 1; + argc--; argv++; + } else { unsigned int i; diff -u -P src/u_main.tk ../../pd-0.37-1/src/u_main.tk --- src/u_main.tk 2003-10-29 12:06:07.000000000 -0800 +++ ../../pd-0.37-1/src/u_main.tk 2004-03-22 22:17:33.000000000 -0800 @@ -460,6 +460,12 @@ pd [concat $name tidy \;] } +## jsarlo +proc menu_magicglass {name} { + pd [concat $name magicglass 0 \;] +} +## end jsarlo + proc menu_editmode {name} { pd [concat $name editmode 0 \;] } @@ -759,7 +765,19 @@ -command [concat menu_tidyup $name] $name.m.edit add separator - + +## jsarlo + $name.m.edit add checkbutton -label "Patch Cord Viewer" \ + -indicatoron false -selectcolor grey85 \ + -command [concat menu_magicglass $name] \ + -accelerator [accel_munge "Ctrl+r"] + + #if { $editable == 0 } { + # $name.m.edit entryconfigure "Patch Cord Viewer" -indicatoron false } + + $name.m.edit add separator +## end jsarlo + ############iemlib################## # instead of "red = #BC3C60" we take "grey85", so there is no difference, # if widget is selected or not. @@ -1136,6 +1154,9 @@ if {$key == "slash"} {menu_audio 1} if {$key == "period"} {menu_audio 0} if {$key == "e" || $key == "E"} {menu_editmode $topname} + ## jsarlo + if {$key == "r" || $key == ""} {menu_magicglass $topname} + ## end jsarlo } proc pdtk_canvas_motion {name x y mods} { @@ -2588,6 +2609,16 @@ } #####################iemlib####################### +## jsarlo +proc pdtk_canvas_magicglassval {name value} { + if { $value } { + $name.m.edit entryconfigure "Patch Cord Viewer" -indicatoron true + } else { + $name.m.edit entryconfigure "Patch Cord Viewer" -indicatoron false + } +} +## end jsarlo + ############ pdtk_text_new -- create a new text object #2########### proc pdtk_text_new {canvasname myname x y text font color} { # if {$font < 13} {set fontname [format -*-courier-bold----%d-* $font]} diff -u -P src/x_gui.c ../../pd-0.37-1/src/x_gui.c --- src/x_gui.c 2003-07-31 13:38:42.000000000 -0700 +++ ../../pd-0.37-1/src/x_gui.c 2004-03-20 15:12:35.000000000 -0800 @@ -11,6 +11,9 @@ #ifdef UNIX #include #endif +// jsarlo +EXTERN void magicGlass_setup(void); +// end jsarlo /* --------------------- graphics responder ---------------- */ @@ -370,4 +373,7 @@ openpanel_setup(); savepanel_setup(); key_setup(); + // jsarlo + magicGlass_setup(); + // end jsarlo }