From cb07afb788418a3f52904ae8ac3b1221e3937813 Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jon.w.wilkes@gmail.com>
Date: Fri, 13 Mar 2015 19:34:23 -0400
Subject: [PATCH] added iemgui labels, graph ticks/labels

---
 pd/nw/pdcanvas.css    |  24 ++++-
 pd/nw/pdgui.js        | 143 ++++++++++++++++++++++--
 pd/nw/todo.txt        |  11 ++
 pd/src/g_all_guis.c   | 182 ++++++++++++++++++++-----------
 pd/src/g_bang.c       |  10 +-
 pd/src/g_canvas.c     |  24 ++++-
 pd/src/g_canvas.h     |   3 +-
 pd/src/g_editor.c     |  84 ++++++++-------
 pd/src/g_graph.c      | 246 ++++++++++++++++++++++++++++--------------
 pd/src/g_magicglass.c |  10 +-
 pd/src/g_mycanvas.c   |  25 ++---
 pd/src/g_numbox.c     |  26 ++---
 pd/src/g_radio.c      |  38 +++----
 pd/src/g_readwrite.c  |   2 +-
 pd/src/g_rtext.c      |  20 ++--
 pd/src/g_scalar.c     |  77 ++++++-------
 pd/src/g_slider.c     |  30 ++----
 pd/src/g_template.c   |  42 ++++----
 pd/src/g_text.c       |  28 ++---
 pd/src/g_toggle.c     |  23 ++--
 pd/src/g_vumeter.c    |  83 +++++---------
 pd/src/x_gui.c        |   6 +-
 22 files changed, 690 insertions(+), 447 deletions(-)

diff --git a/pd/nw/pdcanvas.css b/pd/nw/pdcanvas.css
index 7cabc5c0a..864a2fe81 100644
--- a/pd/nw/pdcanvas.css
+++ b/pd/nw/pdcanvas.css
@@ -41,7 +41,7 @@ text {
 .xlet_control {
     stroke: red;
     fill: gray;
-    stroke-width: 1;
+//    stroke-width: 1;
 }
 
 .xlet_signal {
@@ -56,8 +56,30 @@ text {
     stroke-width: 1;
 }
 
+.iemgui_label_selected {
+    fill: blue;
+}
+
+@-webkit-keyframes fizzle {
+    0% {
+        stroke-width: 1;
+        stroke-opacity: 1;
+        x: 0;
+        rx: 1;
+        ry: 1;
+    }
+    100% {
+        stroke-width: 20;
+        stroke-opacity: 0.2;
+        x: 100;
+        rx: 50;
+        ry: 50;
+    }
+}
+
 .xlet_selected {
     stroke: purple !important;
+    -webkit-animation: fizzle 0.5s linear 1;
 }
 
 //.xlet:hover {
diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js
index 3ea35b362..62d144132 100644
--- a/pd/nw/pdgui.js
+++ b/pd/nw/pdgui.js
@@ -2567,6 +2567,58 @@ function gui_iemgui_redraw_border(cid, tag, x1, y1, x2, y2) {
     });
 }
 
+function gui_iemgui_label_new(cid, tag, x, y, color, text, font) {
+    var g = get_gobj(cid, tag);
+    var svg_text = create_item(cid, 'text', {
+        // x and y need to be relative to baseline instead of nw anchor
+        x: x,
+        y: y,
+//        'font-size': font + 'px',
+        id: tag + 'label'
+    });
+
+    var text_node = patchwin[cid].window.document.createTextNode(text);
+    svg_text.appendChild(text_node);
+    g.appendChild(svg_text);
+}
+
+function gui_iemgui_label_set(cid, tag, text) {
+    get_item(cid, tag + 'label').textContent = text;
+}
+
+function gui_iemgui_label_coords(cid, tag, x, y) {
+    var svg_text = get_item(cid, tag + 'label');
+    configure_item(svg_text, {
+        x: x,
+        y: y
+    });
+}
+
+function gui_iemgui_label_color(cid, tag, color) {
+    var svg_text = get_item(cid, tag + 'label');
+    configure_item(svg_text, {
+        fill: color
+    });
+}
+
+function gui_iemgui_label_select(cid, tag, is_selected) {
+    var svg_text = get_item(cid, tag + 'label');
+    if (is_selected) {
+        svg_text.classList.add('iemgui_label_selected'); 
+    } else {
+        svg_text.classList.remove('iemgui_label_selected'); 
+    }
+}
+
+function gui_iemgui_label_font(cid, tag, font) {
+    var svg_text = get_item(cid, tag + 'label');
+    // This has to wait until we remove the tcl formatting
+    // that Pd uses for font name/size
+//    configure_item(svg_text, {
+//        font: font
+//    });
+}
+
 function gui_create_mycanvas(cid,tag,color,x1,y1,x2_vis,y2_vis,x2,y2) {
     var rect_vis = create_item(cid,'rect', {
         width: x2_vis - x1,
@@ -2840,18 +2892,25 @@ exports.popup_action = popup_action;
 
 // Graphs and Arrays
 
-function gui_graph_drawborder(cid, tag, x1, y1, x2, y2) {
-    var svgelem = get_item(cid, 'patchsvg');
-    var b = create_item(cid, 'rect', {
-        x: x1,
-        y: y1,
-        width: x2 - x1,
-        height: y2 - y1,
-        stroke: 'black',
-        fill: 'none',
-        id: tag
+// Doesn't look like we needs this
+
+//function gui_graph_drawborder(cid, tag, x1, y1, x2, y2) {
+//    var g = get_gobj(cid, tag);
+//    var b = create_item(cid, 'rect', {
+//        width: x2 - x1,
+//        height: y2 - y1,
+//        stroke: 'black',
+//        fill: 'none',
+//        id: tag
+//    });
+//    g.appendChild(b);
+//}
+
+function gui_graph_fill_border(cid, tag) {
+    var b = get_item(cid, tag + 'border');
+    configure_item(b, {
+        fill: 'gray'
     });
-    svgelem.appendChild(b);
 }
 
 function gui_graph_deleteborder(cid, tag) {
@@ -2859,6 +2918,68 @@ function gui_graph_deleteborder(cid, tag) {
     b.parentNode.removeChild(b);
 }
 
+function gui_graph_label(cid, tag, y, array_name, font, font_size,
+    font_weight, is_selected) {
+//    var graph = get_item( 
+}
+
+function gui_graph_vtick(cid, tag, x, up_y, down_y, tick_pix, basex, basey) {
+    var g = get_gobj(cid, tag);
+    // Don't think these need an ID...
+    var up_tick = create_item(cid, 'line', {
+        stroke: 'black',
+        x1: x - basex,
+        y1: up_y - basey,
+        x2: x - basex,
+        y2: up_y - tick_pix - basey
+    });
+    var down_tick = create_item(cid, 'line', {
+        stroke: 'black',
+        x1: x - basex,
+        y1: down_y - basey,
+        x2: x - basex,
+        y2: down_y + tick_pix - basey
+    });
+    g.appendChild(up_tick);
+    g.appendChild(down_tick);
+}
+
+function gui_graph_htick(cid, tag, y, r_x, l_x, tick_pix, basex, basey) {
+    var g = get_gobj(cid, tag);
+    // Don't think these need an ID...
+    var left_tick = create_item(cid, 'line', {
+        stroke: 'black',
+        x1: l_x - basex,
+        y1: y - basey,
+        x2: l_x - tick_pix - basex,
+        y2: y - basey,
+        id: "fuckoff" + y
+    });
+    var right_tick = create_item(cid, 'line', {
+        stroke: 'black',
+        x1: r_x - basex,
+        y1: y - basey,
+        x2: r_x + tick_pix - basex,
+        y2: y - basey
+    });
+    g.appendChild(left_tick);
+    g.appendChild(right_tick);
+}
+
+function gui_graph_tick_label(cid, tag, x, y, text, font, font_size, font_weight, basex, basey) {
+    var g = get_gobj(cid, tag);
+    var svg_text = create_item(cid, 'text', {
+        // need a label "y" relative to baseline
+        x: x - basex,
+        y: y - basey,
+        'font-size': font_size,
+    });
+
+    var text_node = patchwin[cid].window.document.createTextNode(text);
+    svg_text.appendChild(text_node);
+    g.appendChild(svg_text);
+}
+
 function gui_canvas_drawredrect(cid, x1, y1, x2, y2) {
     var svgelem = get_item(cid, 'patchsvg');
     var b = create_item(cid, 'rect', {
diff --git a/pd/nw/todo.txt b/pd/nw/todo.txt
index b1b5f57b1..b6d02cf42 100644
--- a/pd/nw/todo.txt
+++ b/pd/nw/todo.txt
@@ -104,3 +104,14 @@ Everything else:
   conditionally fill the slots
 * fix font shits (can't use 'hanging' base-line dominant because it doesn't
   scale correctly)
+* iemgui font configuration -- de-tcl-ize the {fontface fontsize} tcl list,
+  then make it work
+* do msg box click animation in css
+* tgl 'X' doesn't show up
+* gui_graph_fill_border: use css class selectors instead of configuration
+* standardize javascript function names
+
+Crashers
+--------
+
+copy/paste from menu gives ECONN
diff --git a/pd/src/g_all_guis.c b/pd/src/g_all_guis.c
index a8020eda2..bb97505d1 100644
--- a/pd/src/g_all_guis.c
+++ b/pd/src/g_all_guis.c
@@ -233,6 +233,10 @@ void iemgui_label(t_iemgui *x, t_symbol *s)
         sys_vgui(".x%lx.c itemconfigure %lxLABEL -text {%s} \n",
             glist_getcanvas(x->x_glist), x,
             s!=s_empty?x->x_lab->s_name:"");
+        gui_vmess("gui_iemgui_label_set", "sss",
+            canvas_tag(glist_getcanvas(x->x_glist)),
+            gobj_tag(x),
+            s != s_empty ? x->x_lab->s_name : "");
         iemgui_shouldvis(x, IEM_GUI_DRAW_MODE_CONFIG);
     }
 }
@@ -243,10 +247,15 @@ void iemgui_label_pos(t_iemgui *x, t_symbol *s, int ac, t_atom *av)
     x->x_ldy = atom_getintarg(1, ac, av);
     if(glist_isvisible(x->x_glist))
     {
-        sys_vgui(".x%lx.c coords %lxLABEL %d %d\n",
-            glist_getcanvas(x->x_glist), x,
-            text_xpix((t_object *)x,x->x_glist)+x->x_ldx,
-            text_ypix((t_object *)x,x->x_glist)+x->x_ldy);
+        //sys_vgui(".x%lx.c coords %lxLABEL %d %d\n",
+        //    glist_getcanvas(x->x_glist), x,
+        //    text_xpix((t_object *)x,x->x_glist)+x->x_ldx,
+        //    text_ypix((t_object *)x,x->x_glist)+x->x_ldy);
+        gui_vmess("gui_iemgui_label_coords", "ssii",
+            canvas_tag(glist_getcanvas(x->x_glist)),
+            gobj_tag(x),
+            x->x_ldx,
+            x->x_ldy);
         iemgui_shouldvis(x, IEM_GUI_DRAW_MODE_CONFIG);
     }
 }
@@ -259,8 +268,12 @@ void iemgui_label_font(t_iemgui *x, t_symbol *s, int ac, t_atom *av)
     x->x_fontsize = maxi(atom_getintarg(1, ac, av),4);
     if(glist_isvisible(x->x_glist))
     {
-        sys_vgui(".x%lx.c itemconfigure %lxLABEL -font %s\n",
-            glist_getcanvas(x->x_glist), x, iemgui_font(x));
+        //sys_vgui(".x%lx.c itemconfigure %lxLABEL -font %s\n",
+        //    glist_getcanvas(x->x_glist), x, iemgui_font(x));
+        gui_vmess("gui_iemgui_label_font", "sss",
+            canvas_tag(glist_getcanvas(x->x_glist)),
+            gobj_tag(x),
+            iemgui_font(x));
         iemgui_shouldvis(x, IEM_GUI_DRAW_MODE_CONFIG);
     }
 }
@@ -496,9 +509,7 @@ void iemgui_displace_withtag(t_gobj *z, t_glist *glist, int dx, int dy)
 
 void iemgui_select(t_gobj *z, t_glist *glist, int selected)
 {
-    char tagbuf[MAXPDSTRING];
     t_iemgui *x = (t_iemgui *)z;
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     t_canvas *canvas=glist_getcanvas(glist);
     if (selected)
         x->x_selected = canvas;
@@ -506,7 +517,7 @@ void iemgui_select(t_gobj *z, t_glist *glist, int selected)
         x->x_selected = NULL;
     //sys_vgui(".x%lx.c itemconfigure {x%lx&&border} -stroke %s\n", canvas, x,
     //  x->x_selected && x->x_glist == canvas ? selection_color : border_color);
-    gui_vmess("gui_text_select_color", "ss", canvas_string(canvas), tagbuf);
+    gui_vmess("gui_text_select_color", "ss", canvas_tag(canvas), gobj_tag(x));
     x->x_draw((void *)z, glist, IEM_GUI_DRAW_MODE_SELECT);
     if (selected < 2)
     {
@@ -944,52 +955,96 @@ static void scalehandle_check_and_redraw(t_iemgui *x)
 // IEMGUI refactor (by Mathieu)
 
 void iemgui_tag_selected(t_iemgui *x) {
-    char tagbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     t_canvas *canvas=glist_getcanvas(x->x_glist);
     if(x->x_selected)
     {
         //sys_vgui(".x%lx.c addtag selected withtag x%lx\n", canvas, x);
-        gui_vmess("gui_text_select", "ss", canvas_string(canvas), tagbuf);
+        gui_vmess("gui_text_select", "ss", canvas_tag(canvas), gobj_tag(x));
     }
     else
     {
         //sys_vgui(".x%lx.c dtag x%lx selected\n", canvas, x);
-        gui_vmess("gui_text_deselect", "ss", canvas_string(canvas), tagbuf);
+        gui_vmess("gui_text_deselect", "ss", canvas_tag(canvas), gobj_tag(x));
     }
 }
 
 void iemgui_label_draw_new(t_iemgui *x) {
+    char col[8];
     t_canvas *canvas=glist_getcanvas(x->x_glist);
     int x1=text_xpix(&x->x_obj, x->x_glist);
     int y1=text_ypix(&x->x_obj, x->x_glist);
-    sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w "
-             "-font %s -fill #%6.6x -tags {%lxLABEL x%lx text iemgui}\n",
-         canvas, x1+x->x_ldx, y1+x->x_ldy,
-         x->x_lab!=s_empty?x->x_lab->s_name:"",
-         iemgui_font(x), x->x_lcol, x, x);
+    //sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor w "
+    //         "-font %s -fill #%6.6x -tags {%lxLABEL x%lx text iemgui}\n",
+    //     canvas, x1+x->x_ldx, y1+x->x_ldy,
+    //     x->x_lab!=s_empty?x->x_lab->s_name:"",
+    //     iemgui_font(x), x->x_lcol, x, x);
+    sprintf(col, "#%6.6x", x->x_lcol);
+    gui_vmess("gui_iemgui_label_new", "ssiisss",
+        canvas_tag(canvas),
+        gobj_tag(x),
+        x->x_ldx,
+        x->x_ldy,
+        col,
+        x->x_lab != s_empty ? x->x_lab->s_name : "",
+        iemgui_font(x));
 }
 
 void iemgui_label_draw_move(t_iemgui *x) {
     t_canvas *canvas=glist_getcanvas(x->x_glist);
     int x1=text_xpix(&x->x_obj, x->x_glist);
     int y1=text_ypix(&x->x_obj, x->x_glist);
-    sys_vgui(".x%lx.c coords %lxLABEL %d %d\n",
-        canvas, x, x1+x->x_ldx, y1+x->x_ldy);
+    //sys_vgui(".x%lx.c coords %lxLABEL %d %d\n",
+    //    canvas, x, x1+x->x_ldx, y1+x->x_ldy);
+    gui_vmess("gui_iemgui_label_coords", "ssii",
+        canvas_tag(glist_getcanvas(x->x_glist)),
+        gobj_tag(x),
+        x->x_ldx,
+        x->x_ldy);
 }
 
 void iemgui_label_draw_config(t_iemgui *x) {
+    char col[8];
     t_canvas *canvas=glist_getcanvas(x->x_glist);
     if (x->x_selected == canvas && x->x_glist == canvas)
-        sys_vgui(".x%lx.c itemconfigure %lxLABEL -font %s "
-                 "-fill $pd_colors(selection) -text {%s} \n",
-             canvas, x, iemgui_font(x), 
-             x->x_lab!=s_empty?x->x_lab->s_name:"");
+    {
+        //sys_vgui(".x%lx.c itemconfigure %lxLABEL -font %s "
+        //         "-fill $pd_colors(selection) -text {%s} \n",
+        //     canvas, x, iemgui_font(x), 
+        //     x->x_lab!=s_empty?x->x_lab->s_name:"");
+        gui_vmess("gui_iemgui_label_font", "sss",
+            canvas_tag(glist_getcanvas(x->x_glist)),
+            gobj_tag(x),
+            iemgui_font(x));
+        gui_vmess("gui_iemgui_label_set", "sss",
+            canvas_tag(glist_getcanvas(x->x_glist)),
+            gobj_tag(x),
+            x->x_lab != s_empty ? x->x_lab->s_name: "");
+        sprintf(col, "#%6.6x", x->x_lcol);
+        gui_vmess("gui_iemgui_label_color", "sss",
+            canvas_tag(canvas),
+            gobj_tag(x),
+            col);
+    }
     else
-        sys_vgui(".x%lx.c itemconfigure %lxLABEL -font %s "
-                 "-fill #%6.6x -text {%s} \n",
-             canvas, x, iemgui_font(x),
-             x->x_lcol, x->x_lab!=s_empty?x->x_lab->s_name:"");
+    {
+        //sys_vgui(".x%lx.c itemconfigure %lxLABEL -font %s "
+        //         "-fill #%6.6x -text {%s} \n",
+        //     canvas, x, iemgui_font(x),
+        //     x->x_lcol, x->x_lab!=s_empty?x->x_lab->s_name:"");
+        gui_vmess("gui_iemgui_label_font", "sss",
+            canvas_tag(glist_getcanvas(x->x_glist)),
+            gobj_tag(x),
+            iemgui_font(x));
+        gui_vmess("gui_iemgui_label_set", "sss",
+            canvas_tag(glist_getcanvas(x->x_glist)),
+            gobj_tag(x),
+            x->x_lab != s_empty ? x->x_lab->s_name: "");
+        sprintf(col, "#%6.6x", x->x_lcol);
+        gui_vmess("gui_iemgui_label_color", "sss",
+            canvas_tag(canvas),
+            gobj_tag(x),
+            col);
+    }
     if (x->x_selected == canvas && x->x_glist == canvas)
     {
         t_scalehandle *lh = (t_scalehandle *)(x->x_lhandle);
@@ -1003,11 +1058,23 @@ void iemgui_label_draw_config(t_iemgui *x) {
 void iemgui_label_draw_select(t_iemgui *x) {
     t_canvas *canvas=glist_getcanvas(x->x_glist);
     if (x->x_selected == canvas && x->x_glist == canvas)
-        sys_vgui(".x%lx.c itemconfigure %lxLABEL "
-            "-fill $pd_colors(selection)\n", canvas, x);
+    {
+        //sys_vgui(".x%lx.c itemconfigure %lxLABEL "
+        //    "-fill $pd_colors(selection)\n", canvas, x);
+        gui_vmess("gui_iemgui_label_select", "ssi",
+            canvas_tag(canvas),
+            gobj_tag(x),
+            1);
+    }
     else
-        sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill #%6.6x\n",
-            canvas, x, x->x_lcol);
+    {
+        //sys_vgui(".x%lx.c itemconfigure %lxLABEL -fill #%6.6x\n",
+        //    canvas, x, x->x_lcol);
+        gui_vmess("gui_iemgui_label_select", "ssi",
+            canvas_tag(canvas),
+            gobj_tag(x),
+            0);
+    }
 }
 
 extern t_class *my_numbox_class;
@@ -1015,6 +1082,7 @@ extern t_class *vu_class;
 extern t_class *my_canvas_class;
 void iemgui_draw_io(t_iemgui *x, int old_sr_flags)
 {
+    char tagbuf[MAXPDSTRING];
     t_canvas *canvas=glist_getcanvas(x->x_glist);
     if (x->x_glist != canvas) return; // is gop
     t_class *c = pd_class((t_pd *)x);
@@ -1044,12 +1112,9 @@ void iemgui_draw_io(t_iemgui *x, int old_sr_flags)
         //     canvas, x1+i*k, y2-1, x1+i*k + IOWIDTH, y2,
         //     iem_get_tag(canvas, x), i, x,
         //     x->x_selected == x->x_glist ? "iemgui selected" : "iemgui");
-        char parenttagbuf[MAXPDSTRING];
-        char tagbuf[MAXPDSTRING];
-        sprintf(parenttagbuf, "x%lx", (long unsigned int)x);
         sprintf(tagbuf, "%so%d", iem_get_tag(canvas, x), i);
-        gui_vmess("gui_canvas_drawio", "sssiiiiiisiii", canvas_string(canvas),
-            parenttagbuf, tagbuf,
+        gui_vmess("gui_canvas_drawio", "sssiiiiiisiii", canvas_tag(canvas),
+            gobj_tag(x), tagbuf,
             x1+i*k, y2-1, x1+i*k + IOWIDTH, y2, x1, y1, "o", i,
             0, 1);
     }
@@ -1058,10 +1123,9 @@ void iemgui_draw_io(t_iemgui *x, int old_sr_flags)
         {
             //sys_vgui(".x%lx.c delete %so%d\n",
             //    canvas, iem_get_tag(canvas, x), i);
-            char tagbuf[MAXPDSTRING];
             sprintf(tagbuf, "%so%d", iem_get_tag(canvas, x), i);
             gui_vmess("gui_eraseio", "ss",
-                canvas_string(canvas), tagbuf);
+                canvas_tag(canvas), tagbuf);
         }
 
     a = old_sr_flags & IEM_GUI_OLD_RCV_FLAG;
@@ -1077,12 +1141,9 @@ void iemgui_draw_io(t_iemgui *x, int old_sr_flags)
         //     canvas, x1+i*k, y1, x1+i*k + IOWIDTH, y1+1,
         //     iem_get_tag(canvas, x), i, x,
         //     x->x_selected == x->x_glist ? "iemgui selected" : "iemgui");
-        char parenttagbuf[MAXPDSTRING];
-        char tagbuf[MAXPDSTRING];
-        sprintf(parenttagbuf, "x%lx", (long unsigned int)x);
         sprintf(tagbuf, "%si%d", iem_get_tag(canvas, x), i);
-        gui_vmess("gui_canvas_drawio", "sssiiiiiisiii", canvas_string(canvas),
-            parenttagbuf, tagbuf,
+        gui_vmess("gui_canvas_drawio", "sssiiiiiisiii", canvas_tag(canvas),
+            gobj_tag(x), tagbuf,
             x1+i*k, y1, x1+i*k + IOWIDTH, y1+1, x1, y1, "i", i,
             0, 1);
     }
@@ -1091,14 +1152,14 @@ void iemgui_draw_io(t_iemgui *x, int old_sr_flags)
         {
             //sys_vgui(".x%lx.c delete %si%d\n",
             //    canvas, iem_get_tag(canvas, x), i);
-            char tagbuf[MAXPDSTRING];
             sprintf(tagbuf, "%si%d", iem_get_tag(canvas, x), i);
             gui_vmess("gui_eraseio", "ss",
-                canvas_string(canvas), tagbuf);
+                canvas_tag(canvas), tagbuf);
         }
 }
 
 void iemgui_io_draw_move(t_iemgui *x) {
+    char tagbuf[MAXPDSTRING];
     t_canvas *canvas=glist_getcanvas(x->x_glist);
     t_class *c = pd_class((t_pd *)x);
     int x1,y1,x2,y2;
@@ -1111,10 +1172,9 @@ void iemgui_io_draw_move(t_iemgui *x) {
     {
         //sys_vgui(".x%lx.c coords %so%d %d %d %d %d\n",
         //    canvas, iem_get_tag(canvas, x), i, x1+i*k, y2-1, x1+i*k+IOWIDTH, y2);
-        char tagbuf[MAXPDSTRING];
         sprintf(tagbuf, "%so%d", iem_get_tag(canvas, x), i);
         gui_start_vmess("gui_configure_item", "ss",
-            canvas_string(canvas), tagbuf);
+            canvas_tag(canvas), tagbuf);
         gui_start_array();
         gui_s("x");
         gui_i(i*k);
@@ -1125,12 +1185,11 @@ void iemgui_io_draw_move(t_iemgui *x) {
     }
     if(!iemgui_has_rcv(x) && canvas == x->x_glist) for (i=0; i<n; i++)
     {
-        sys_vgui(".x%lx.c coords %si%d %d %d %d %d\n",
-            canvas, iem_get_tag(canvas, x), i, x1+i*k, y1, x1+i*k+IOWIDTH, y1+1);
-        char tagbuf[MAXPDSTRING];
+        //sys_vgui(".x%lx.c coords %si%d %d %d %d %d\n",
+        //    canvas, iem_get_tag(canvas, x), i, x1+i*k, y1, x1+i*k+IOWIDTH, y1+1);
         sprintf(tagbuf, "%si%d", iem_get_tag(canvas, x), i);
         gui_start_vmess("gui_configure_item", "ss",
-            canvas_string(canvas), tagbuf);
+            canvas_tag(canvas), tagbuf);
         gui_start_array();
         gui_s("x");
         gui_i(i*k);
@@ -1141,8 +1200,6 @@ void iemgui_io_draw_move(t_iemgui *x) {
 }
 
 void iemgui_base_draw_new(t_iemgui *x) {
-    char tagbuf[MAXPDSTRING]; 
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     t_canvas *canvas=glist_getcanvas(x->x_glist);
     t_class *c = pd_class((t_pd *)x);
     int x1,y1,x2,y2,gr=gop_redraw; gop_redraw=0;
@@ -1152,11 +1209,12 @@ void iemgui_base_draw_new(t_iemgui *x) {
     //         "-stroke $pd_colors(iemgui_border) -fill #%6.6x "
     //         "-tags {%lxBASE x%lx text iemgui border}\n",
     //     canvas, x1,y1,x2,y2, x->x_bcol, x, x);
-    gui_vmess("gui_text_create_gobj", "ssii", canvas_string(canvas), tagbuf,
+    gui_vmess("gui_text_create_gobj", "ssii", canvas_tag(canvas), gobj_tag(x),
         x1, y1);
     char colorbuf[MAXPDSTRING];
     sprintf(colorbuf, "#%6.6x", x->x_bcol);
-    gui_vmess("gui_iemgui_drawborder", "sssiiii", canvas_string(canvas), tagbuf,
+    gui_vmess("gui_iemgui_drawborder", "sssiiii",
+        canvas_tag(canvas), gobj_tag(x),
         colorbuf, x1, y1, x2, y2);
 }
 
@@ -1167,10 +1225,8 @@ void iemgui_base_draw_move(t_iemgui *x) {
     c->c_wb->w_getrectfn((t_gobj *)x,x->x_glist,&x1,&y1,&x2,&y2);
     gop_redraw=gr;
     //sys_vgui(".x%lx.c coords %lxBASE %d %d %d %d\n", canvas, x, x1, y1, x2, y2);
-    char tagbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     gui_vmess("gui_iemgui_redraw_border", "ssiiii",
-        canvas_string(canvas), tagbuf, x1, y1, x2, y2);
+        canvas_tag(canvas), gobj_tag(x), x1, y1, x2, y2);
 }
 
 void iemgui_base_draw_config(t_iemgui *x) {
@@ -1181,7 +1237,7 @@ void iemgui_base_draw_config(t_iemgui *x) {
     char bcol[8]; sprintf(bcol, "#%6.6x", x->x_bcol);
     sprintf(tagbuf, "x%lxborder", (long unsigned int)x);
     gui_start_vmess("gui_configure_item", "ss",
-        canvas_string(canvas), tagbuf);
+        canvas_tag(canvas), tagbuf);
     gui_start_array();
     gui_s("fill");
     gui_s(bcol);
@@ -1215,10 +1271,8 @@ void iemgui_draw_move(t_iemgui *x) {
 
 void iemgui_draw_erase(t_iemgui *x) {
     t_canvas *canvas=glist_getcanvas(x->x_glist);
-    sys_vgui(".x%lx.c delete x%lx\n", canvas, x);
-    char tagbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
-    gui_vmess("gui_gobj_erase", "ss", canvas_string(canvas), tagbuf);
+    //sys_vgui(".x%lx.c delete x%lx\n", canvas, x);
+    gui_vmess("gui_gobj_erase", "ss", canvas_tag(canvas), gobj_tag(x));
     scalehandle_draw_erase2(x);
 }
 
diff --git a/pd/src/g_bang.c b/pd/src/g_bang.c
index 1c636b3ce..c4dd1e228 100644
--- a/pd/src/g_bang.c
+++ b/pd/src/g_bang.c
@@ -36,7 +36,7 @@ void bng_draw_update(t_gobj *xgobj, t_glist *glist)
         sprintf(flashcol, "#%6.6x",
             x->x_flashed ? x->x_gui.x_fcol : x->x_gui.x_bcol);
         gui_vmess("gui_bng_flash", "sss",
-            canvas_string(glist_getcanvas(glist)), tagbuf, flashcol);
+            canvas_tag(glist_getcanvas(glist)), tagbuf, flashcol);
     }
     x->x_gui.x_changed = x->x_flashed;
 }
@@ -58,7 +58,7 @@ void bng_draw_new(t_bng *x, t_glist *glist)
              "-tags {%lxBUT x%lx text iemgui border}\n",
          canvas, cx, cy, cr, x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol,
          x, x);
-    gui_vmess("gui_create_bng", "ssfff", canvas_string(canvas), tagbuf,
+    gui_vmess("gui_create_bng", "ssfff", canvas_tag(canvas), tagbuf,
         cx - x1 - 0.5, cy - y1 - 0.5, cr);
 }
 
@@ -81,7 +81,7 @@ void bng_draw_move(t_bng *x, t_glist *glist)
     char col[8];
     sprintf(col, "#%6.6x", x->x_flashed ? x->x_gui.x_fcol : x->x_gui.x_bcol);
     gui_start_vmess("gui_configure_item", "ss",
-        canvas_string(canvas), tagbuf);
+        canvas_tag(canvas), tagbuf);
     gui_start_array();
     gui_s("cx");
     gui_f(cx - x1 - 0.5); // 0.5 is fudge factor... might be better
@@ -97,16 +97,16 @@ void bng_draw_move(t_bng *x, t_glist *glist)
 
 void bng_draw_config(t_bng* x, t_glist* glist)
 {
+    char tagbuf[MAXPDSTRING];
     t_canvas *canvas=glist_getcanvas(glist);
     iemgui_base_draw_config(&x->x_gui);
     //sys_vgui(".x%lx.c itemconfigure %lxBUT -fill #%6.6x\n",
     //    canvas, x, x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol);
-    char tagbuf[MAXPDSTRING];
     sprintf(tagbuf, "x%lxbutton", (long unsigned int)x);
     char fcol[8];
     sprintf(fcol, "#%6.6x", x->x_flashed ? x->x_gui.x_fcol : x->x_gui.x_bcol);
     gui_start_vmess("gui_configure_item", "ss",
-        canvas_string(canvas), tagbuf);
+        canvas_tag(canvas), tagbuf);
     gui_start_array();
     gui_s("fill");
     gui_s(fcol);
diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c
index 778bb9ec4..62f94ca00 100644
--- a/pd/src/g_canvas.c
+++ b/pd/src/g_canvas.c
@@ -249,13 +249,26 @@ void canvas_makefilename(t_canvas *x, char *file, char *result, int resultsize)
 }
 
 // Generic tag format to use for the gui
-char *canvas_string(t_canvas *x)
+// Try removing the leading dot, since
+// we don't need it anymore
+// Both this and gobj_tag are static which
+// means you shouldn't send twice in the same
+// gui_vmess (and there shouldn't be a reason
+// for doing that anyway)
+char *canvas_tag(t_canvas *x)
 {
     static char s[MAXPDSTRING];
     sprintf(s, ".x%lx", (long unsigned int)x);
     return s;
 }
 
+char *gobj_tag(void *x)
+{
+    static char s[MAXPDSTRING];
+    sprintf(s, "x%lx", (long unsigned int)x);
+    return s;
+}
+
 void canvas_rename(t_canvas *x, t_symbol *s, t_symbol *dir)
 {
     canvas_unbind(x);
@@ -716,7 +729,8 @@ void canvas_reflecttitle(t_canvas *x)
     //sys_vgui("wm title .x%lx {%s%c%s - %s}\n", 
     //    x, x->gl_name->s_name, (x->gl_dirty? '*' : ' '), namebuf,
     //        canvas_getdir(x)->s_name);
-    gui_vmess("gui_canvas_set_title", "ssssi", canvas_string(x), x->gl_name->s_name,
+    gui_vmess("gui_canvas_set_title", "ssssi",
+        canvas_tag(x), x->gl_name->s_name,
         namebuf, canvas_getdir(x)->s_name, x->gl_dirty);
 //}
 #endif
@@ -791,7 +805,7 @@ void canvas_drawredrect(t_canvas *x, int doit)
         //    "%d %d %d %d %d %d %d %d %d %d -fill #ff8080 -tags GOP\n",
         //    glist_getcanvas(x), x1, y1, x2, y1, x2, y2, x1, y2, x1, y1);
         gui_vmess("gui_canvas_drawredrect", "siiii",
-            canvas_string(glist_getcanvas(x)),
+            canvas_tag(glist_getcanvas(x)),
             x1, y1, x2, y2);
         //dpsaha@vt.edu for drawing the GOP_blobs
         if (x->gl_goprect && x->gl_edit)
@@ -801,7 +815,7 @@ void canvas_drawredrect(t_canvas *x, int doit)
     {
         //sys_vgui(".x%lx.c delete GOP\n",  glist_getcanvas(x));
         gui_vmess("gui_canvas_deleteredrect", "s",
-            canvas_string(glist_getcanvas(x)));
+            canvas_tag(glist_getcanvas(x)));
     }
 }
 
@@ -1055,7 +1069,7 @@ void canvas_eraselinesfor(t_canvas *x, t_text *text)
                 char tagbuf[MAXPDSTRING];
                 sprintf(tagbuf, "l%lx", (long unsigned int)oc);
                 gui_vmess("gui_canvas_delete_line", "ss",
-                    canvas_string(glist_getcanvas(x)), tagbuf);
+                    canvas_tag(glist_getcanvas(x)), tagbuf);
             }
         }
     }
diff --git a/pd/src/g_canvas.h b/pd/src/g_canvas.h
index d6bdecee1..34d31f471 100644
--- a/pd/src/g_canvas.h
+++ b/pd/src/g_canvas.h
@@ -562,7 +562,8 @@ EXTERN t_gobj *canvas_findhitbox(t_canvas *x, int xpos, int ypos,
     int *x1p, int *y1p, int *x2p, int *y2p);
 EXTERN int canvas_setdeleting(t_canvas *x, int flag);
 EXTERN int canvas_hasarray(t_canvas *x);
-EXTERN char *canvas_string(t_canvas *x); /* canvas as string to send to gui */
+EXTERN char *canvas_tag(t_canvas *x); /* canvas as string to send to gui */
+EXTERN char *gobj_tag(void *x); /* gobj as string to send to gui */
 
 /* ---- for parsing @pd_extra and other sys paths in filenames  --------------------- */
 
diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c
index b9e6c8deb..df54b6a97 100644
--- a/pd/src/g_editor.c
+++ b/pd/src/g_editor.c
@@ -153,7 +153,7 @@ static void canvas_nlet_conf (t_canvas *x, int type) {
     /* this is rather confusing, but the canvas_cnct_[xlet]_tag already
        includes the type and index concatenated to the end. */
     gui_vmess("gui_configure_io", "ssiii",
-        canvas_string(x), type == 'o' ? x->gl_editor->canvas_cnct_outlet_tag :
+        canvas_tag(x), type == 'o' ? x->gl_editor->canvas_cnct_outlet_tag :
             x->gl_editor->canvas_cnct_inlet_tag,
         isiemgui, issignal, 1);
 }
@@ -429,6 +429,7 @@ void canvas_check_nlet_highlights(t_glist *x)
 void glist_selectline(t_glist *x, t_outconnect *oc, int index1,
     int outno, int index2, int inno)
 {
+    char tagbuf[MAXPDSTRING];
     if (x->gl_editor)
     {
         glist_noselect(x);
@@ -442,9 +443,8 @@ void glist_selectline(t_glist *x, t_outconnect *oc, int index1,
         //    x, x->gl_editor->e_selectline_tag);
         //sys_vgui(".x%lx.c addtag selected withtag l%lx\n",
         //    glist_getcanvas(x), x->gl_editor->e_selectline_tag);
-        char tagbuf[MAXPDSTRING];
         sprintf(tagbuf, "l%lx", (long unsigned int)oc);
-        gui_vmess("gui_canvas_select_line", "ss", canvas_string(x), tagbuf);
+        gui_vmess("gui_canvas_select_line", "ss", canvas_tag(x), tagbuf);
         c_selection = x;
         canvas_draw_gop_resize_hooks(x);
     }
@@ -452,6 +452,7 @@ void glist_selectline(t_glist *x, t_outconnect *oc, int index1,
 
 void glist_deselectline(t_glist *x)
 {
+    char tagbuf[MAXPDSTRING];
     if (x->gl_editor)
     {
         t_linetraverser t;
@@ -474,10 +475,8 @@ void glist_deselectline(t_glist *x)
         //    glist_getcanvas(x),
         //    glist_getcanvas(x)->gl_editor->e_selectline_tag);
         canvas_draw_gop_resize_hooks(x);
-
-        char tagbuf[MAXPDSTRING];
         sprintf(tagbuf, "l%lx", (long unsigned int)x->gl_editor->e_selectline_tag);
-        gui_vmess("gui_canvas_deselect_line", "ss", canvas_string(x), tagbuf);
+        gui_vmess("gui_canvas_deselect_line", "ss", canvas_tag(x), tagbuf);
     }    
 }
 
@@ -863,6 +862,7 @@ void canvas_disconnect(t_canvas *x,
     t_float index1, t_float outno, t_float index2, t_float inno)
 {
     //fprintf(stderr,"canvas_disconnect\n");
+    char tagbuf[MAXPDSTRING];
     t_linetraverser t;
     t_outconnect *oc;
     linetraverser_start(&t, x);
@@ -874,10 +874,9 @@ void canvas_disconnect(t_canvas *x,
             sinkno == index2 && t.tr_inno == inno)
         {
             //sys_vgui(".x%lx.c delete l%lx\n", x, oc);
-            char tagbuf[MAXPDSTRING];
             sprintf(tagbuf, "l%lx", (long unsigned int)oc);
             gui_vmess("gui_canvas_delete_line", "ss",
-                canvas_string(x), tagbuf);
+                canvas_tag(x), tagbuf);
             // jsarlo
             if(x->gl_editor && x->gl_editor->gl_magic_glass)
             {
@@ -2223,7 +2222,7 @@ void canvas_setcursor(t_canvas *x, unsigned int cursornum)
         if (xwas != x || cursorwas != cursornum)
         {
             //sys_vgui(".x%lx configure -cursor %s\n", x, cursorlist[cursornum]);
-            gui_vmess("gui_canvas_cursor", "ss", canvas_string(x),
+            gui_vmess("gui_canvas_cursor", "ss", canvas_tag(x),
                 cursorlist[cursornum]);
             xwas = x;
             cursorwas = cursornum;
@@ -2329,7 +2328,7 @@ static void canvas_rightclick(t_canvas *x, int xpos, int ypos, t_gobj *y_sel)
     //sys_vgui("pdtk_canvas_popup .x%lx %d %d %d %d %d\n",
     //    x, xpos, ypos, canprop, canopen, isobject);
     gui_vmess("gui_canvas_popup", "siiiii",
-        canvas_string(x), xpos, ypos, canprop, canopen, isobject);
+        canvas_tag(x), xpos, ypos, canprop, canopen, isobject);
 }
 
 /* ----  editors -- perhaps this and "vis" should go to g_editor.c ------- */
@@ -2442,7 +2441,7 @@ void canvas_vis(t_canvas *x, t_floatarg f)
             //sys_vgui("raise .x%lx\n", x);
             //sys_vgui("focus .x%lx.c\n", x);
             //sys_vgui("wm deiconify .x%lx\n", x);  
-            gui_vmess("gui_raise_window", "s", canvas_string(x));
+            gui_vmess("gui_raise_window", "s", canvas_tag(x));
         }
         else
         {
@@ -2457,7 +2456,7 @@ void canvas_vis(t_canvas *x, t_floatarg f)
             canvas_args_to_string(argsbuf, x);
 
             gui_vmess("gui_canvas_new", "siisissis",
-                canvas_string(x),
+                canvas_tag(x),
                 (int)(x->gl_screenx2 - x->gl_screenx1),
                 (int)(x->gl_screeny2 - x->gl_screeny1),
                 geobuf,
@@ -2555,7 +2554,7 @@ void canvas_vis(t_canvas *x, t_floatarg f)
         if (glist_isvisible(x))
             canvas_map(x, 0);
         canvas_destroy_editor(x);
-        gui_vmess("gui_close_window", "s", canvas_string(x));
+        gui_vmess("gui_close_window", "s", canvas_tag(x));
         // delete properties windows of objects in the patcher we're closing
         g = x->gl_list;
         while (g)
@@ -3340,7 +3339,7 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
                         //    "$pd_colors(control_cord_width)"),
                         //(issignal ? "signal" : "control"));
                         gui_vmess("gui_canvas_line", "ssiiiiiiiiii",
-                            canvas_string(x), "newcord",
+                            canvas_tag(x), "newcord",
                             xpos, ypos, xpos, ypos, xpos, ypos, xpos, ypos, xpos, ypos);
                     }   
                     else
@@ -3364,7 +3363,7 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
                             //         x->gl_editor->canvas_cnct_outlet_tag);
 
                             gui_vmess("gui_highlight_io", "ss",
-                                canvas_string(x),
+                                canvas_tag(x),
                                 x->gl_editor->canvas_cnct_outlet_tag);
 
                             //sys_vgui(".x%x.c raise %s\n",
@@ -3425,7 +3424,7 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
                         //    x, x->gl_editor->canvas_cnct_inlet_tag);
 
                         gui_vmess("gui_highlight_io", "ss",
-                            canvas_string(x),
+                            canvas_tag(x),
                             x->gl_editor->canvas_cnct_inlet_tag);
 
                         //sys_vgui(".x%x.c raise %s\n",
@@ -3653,7 +3652,7 @@ void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
         //sys_vgui(".x%lx.c create prect %d %d %d %d -tags x "
         //         "-stroke $pd_colors(selection_rectangle)\n",
         //    x, xpos, ypos, xpos, ypos);
-        gui_vmess("gui_create_selection_rectangle", "siiii", canvas_string(x),
+        gui_vmess("gui_create_selection_rectangle", "siiii", canvas_tag(x),
             xpos, ypos, xpos, ypos);
         x->gl_editor->e_xwas = xpos;
         x->gl_editor->e_ywas = ypos;
@@ -3794,7 +3793,7 @@ void canvas_drawconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2,
     //    tag, (issignal ? "signal" : "control"));
     sprintf(tagbuf, "l%lx", (long unsigned int)tag);
     gui_vmess("gui_canvas_line", "ssiiiiiiiiii",
-        canvas_string(x), tagbuf, lx1, ly1, lx1, ly1 + yoff,
+        canvas_tag(x), tagbuf, lx1, ly1, lx1, ly1 + yoff,
         lx1 + halfx, ly1 + halfy, lx2, ly2 - yoff, lx2, ly2);
 }
 
@@ -3839,7 +3838,8 @@ void canvas_updateconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2,
             //    lx1, ly1 + yoff, lx1 + halfx, ly1 + halfy,
             //    lx2, ly2 - yoff, lx2, ly2);
             sprintf(cord_tag, "l%lx", (long unsigned int)tag);
-            gui_vmess("gui_canvas_updateline", "ssiiiii", canvas_string(x), cord_tag,
+            gui_vmess("gui_canvas_updateline", "ssiiiii",
+                canvas_tag(x), cord_tag,
                 lx1, ly1, lx2, ly2, yoff);
 //                lx1, ly1, lx1, ly1 + yoff, lx1 + halfx, ly1 + halfy,
 //                lx2, ly2 - yoff, lx2, ly2);
@@ -3852,7 +3852,8 @@ void canvas_updateconnection(t_canvas *x, int lx1, int ly1, int lx2, int ly2,
             //    x, lx1, ly1,
             //    lx1, ly1 + yoff, lx1 + halfx, ly1 + halfy,
             //    lx2, ly2 - yoff, lx2, ly2);
-            gui_vmess("gui_canvas_updateline", "ssiiiii", canvas_string(x), "newcord",
+            gui_vmess("gui_canvas_updateline", "ssiiiii",
+                canvas_tag(x), "newcord",
                 lx1, ly1, lx2, ly2, yoff);
 //                lx1, ly1, lx1, ly1 + yoff, lx1 + halfx, ly1 + halfy, lx2, ly2 - yoff,
 //                lx2, ly2);
@@ -4452,7 +4453,7 @@ void canvas_doconnect(t_canvas *x, int xpos, int ypos, int which, int doit)
     if (doit && !glob_shift)
     {
         sys_vgui(".x%lx.c delete x\n", x);
-        gui_vmess("gui_canvas_delete_line", "ss", canvas_string(x), "newcord");
+        gui_vmess("gui_canvas_delete_line", "ss", canvas_tag(x), "newcord");
     }
     else
     {
@@ -4523,7 +4524,7 @@ void canvas_doconnect(t_canvas *x, int xpos, int ypos, int which, int doit)
                     //    x, x->gl_editor->canvas_cnct_inlet_tag);
 
                     gui_vmess("gui_highlight_io", "ss",
-                        canvas_string(x),
+                        canvas_tag(x),
                         x->gl_editor->canvas_cnct_inlet_tag);
 
                     //sys_vgui(".x%x.c raise %s\n",
@@ -4600,17 +4601,18 @@ static void canvas_doregion(t_canvas *x, int xpos, int ypos, int doit)
             loy = x->gl_editor->e_ywas, hiy = ypos;
         else hiy = x->gl_editor->e_ywas, loy = ypos;
         canvas_selectinrect(x, lox, loy, hix, hiy);
-        sys_vgui(".x%lx.c delete x\n", x);
-        gui_vmess("gui_hide_selection_rectangle", "s", canvas_string(x));
+        //sys_vgui(".x%lx.c delete x\n", x);
+        gui_vmess("gui_hide_selection_rectangle", "s", canvas_tag(x));
         x->gl_editor->e_onmotion = MA_NONE;
     }
     else
     {
-        sys_vgui(".x%lx.c coords x %d %d %d %d\n",
-            x, x->gl_editor->e_xwas,
-                x->gl_editor->e_ywas, xpos, ypos);
+        //sys_vgui(".x%lx.c coords x %d %d %d %d\n",
+        //    x, x->gl_editor->e_xwas,
+        //        x->gl_editor->e_ywas, xpos, ypos);
         gui_vmess("gui_move_selection_rectangle", "siiii",
-            canvas_string(x), x->gl_editor->e_xwas, x->gl_editor->e_ywas, xpos, ypos);
+            canvas_tag(x),
+            x->gl_editor->e_xwas, x->gl_editor->e_ywas, xpos, ypos);
     }
 }
 
@@ -4837,7 +4839,7 @@ void canvas_displaceselection(t_canvas *x, int dx, int dy)
     if (dx || dy)
     {
         sys_vgui("pdtk_canvas_displace_withtag .x%lx.c %d %d\n", x, dx, dy);
-        gui_vmess("gui_canvas_displace_withtag", "sii", canvas_string(x), dx, dy);
+        gui_vmess("gui_canvas_displace_withtag", "sii", canvas_tag(x), dx, dy);
         if (resortin) canvas_resortinlets(x);
         if (resortout) canvas_resortoutlets(x);
         //scrollbar_update(x);
@@ -5351,8 +5353,8 @@ void glob_verifyquit(void *dummy, t_floatarg f)
                 //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 3;}\n",
                 //     g2, g2);
                 gui_vmess("gui_canvas_menuclose", "ssi",
-                    canvas_string(g2),
-                    canvas_string(g2),
+                    canvas_tag(g2),
+                    canvas_tag(g2),
                     3);
             }
             else
@@ -5360,8 +5362,8 @@ void glob_verifyquit(void *dummy, t_floatarg f)
                 //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 3;}\n",
                 //     canvas_getrootfor(g2), g2);
                 gui_vmess("gui_canvas_menuclose", "ssi",
-                    canvas_string(canvas_getrootfor(g2)),
-                    canvas_string(g2),
+                    canvas_tag(canvas_getrootfor(g2)),
+                    canvas_tag(g2),
                     3);
             }
             //canvas_vis(g2, 1);
@@ -5429,8 +5431,8 @@ void canvas_menuclose(t_canvas *x, t_floatarg fforce)
                 //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;}\n",
                 //     g, g);
                 gui_vmess("gui_canvas_menuclose", "ssi",
-                    canvas_string(g),
-                    canvas_string(g),
+                    canvas_tag(g),
+                    canvas_tag(g),
                     2);
             }
             else
@@ -5438,8 +5440,8 @@ void canvas_menuclose(t_canvas *x, t_floatarg fforce)
                 //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;}\n",
                 //     canvas_getrootfor(g), g);
                 gui_vmess("gui_canvas_menuclose", "ssi",
-                    canvas_string(canvas_getrootfor(g)),
-                    canvas_string(g),
+                    canvas_tag(canvas_getrootfor(g)),
+                    canvas_tag(g),
                     2);
             }
             return;
@@ -5495,8 +5497,8 @@ post("farging...");
                 //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;}\n",
                 //     g, g);
                 gui_vmess("gui_canvas_menuclose", "ssi",
-                    canvas_string(g),
-                    canvas_string(g),
+                    canvas_tag(g),
+                    canvas_tag(g),
                     2);
             }
             else
@@ -5505,8 +5507,8 @@ post("dildo");
                 //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;}\n",
                 //     canvas_getrootfor(g), g);
                 gui_vmess("gui_canvas_menuclose", "ssi",
-                    canvas_string(canvas_getrootfor(g)),
-                    canvas_string(g),
+                    canvas_tag(canvas_getrootfor(g)),
+                    canvas_tag(g),
                     2);
             }
             //sys_vgui("pdtk_canvas_menuclose .x%lx {.x%lx menuclose 2;\n}\n",
diff --git a/pd/src/g_graph.c b/pd/src/g_graph.c
index b5771002a..9d1a8cca9 100644
--- a/pd/src/g_graph.c
+++ b/pd/src/g_graph.c
@@ -500,10 +500,18 @@ void canvas_resortinlets(t_canvas *x)
         t_rtext *rt = glist_findrtext(x->gl_owner, (t_text *)&ob->ob_g);
         for (i = 0; i < ninlets; i++)
         {
-            sys_vgui(".x%x.c itemconfigure %si%d -fill %s -width 1\n",
-                x, rtext_gettag(rt), i, 
-                (obj_issignalinlet(ob, i) ?
-                    "$signal_nlet" : "$pd_colors_control_nlet)"));
+            //sys_vgui(".x%x.c itemconfigure %si%d -fill %s -width 1\n",
+            //    x, rtext_gettag(rt), i, 
+            //    (obj_issignalinlet(ob, i) ?
+            //        "$signal_nlet" : "$pd_colors_control_nlet)"));
+            sprintf(xlet_tag, "%si%d", rtext_gettag(rt), i);
+            char xlet_tag[MAXPDSTRING];
+            gui_vmess("gui_configure_io", "ssiii",
+                canvas_tag(x),
+                xlet_tag,
+                0,
+                obj_issignalinlet(ob, i),
+                1);
         }
         */
 
@@ -890,7 +898,7 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis)
         xpix = text_xpix(&x->gl_obj, parent_glist);
         ypix = text_ypix(&x->gl_obj, parent_glist);
         gui_vmess("gui_text_create_gobj", "ssii",
-            canvas_string(glist_getcanvas(x->gl_owner)),
+            canvas_tag(glist_getcanvas(x->gl_owner)),
             tag, xpix, ypix);
         if (canvas_showtext(x))
             rtext_draw(glist_findrtext(parent_glist, &x->gl_obj));
@@ -922,24 +930,23 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis)
             //    glist_getcanvas(x->gl_owner),
                 ////parent_glist,
             //    x1, y1, x1, y2, x2, y2, x2, y1, x1, y1, tag);
-            char tagbuf[MAXPDSTRING];
-            sprintf(tagbuf, "%sfill", tag);
             gui_vmess("gui_text_drawborder", "ssiiiii",
-                canvas_string(glist_getcanvas(x->gl_owner)),
+                canvas_tag(glist_getcanvas(x->gl_owner)),
                 tag,
                 0, x1, y1, x2, y2);
             glist_noselect(x->gl_owner);
+            gui_vmess("gui_graph_fill_border", "ssi",
+                canvas_tag(glist_getcanvas(x->gl_owner)),
+                tag);
         }
         else if (gobj_shouldvis(gr, parent_glist))
         {
             //sys_vgui(".x%lx.c delete %sfill\n",
             //    glist_getcanvas(x->gl_owner), tag);
                ////parent_glist, tag);
-            char tagbuf2[MAXPDSTRING];
-            sprintf(tagbuf2, "%sfill", tag);
-            gui_vmess("gui_graph_deleteborder", "ss",
-                canvas_string(glist_getcanvas(x->gl_owner)),
-                tagbuf2);
+            gui_vmess("gui_gobj_erase", "ss",
+                canvas_tag(glist_getcanvas(x->gl_owner)),
+                tag);
         }
         return;
     }
@@ -951,19 +958,23 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis)
         t_gobj *g;
         t_symbol *arrayname;
             /* draw a rectangle around the graph */
+
         /*sys_vgui(".x%lx.c create polyline %d %d %d %d %d %d %d %d %d %d "
                    "-stroke $pd_colors(graph_border) -tags {%sR %s graph}\n",
             glist_getcanvas(x->gl_owner),
             x1, y1, x1, y2, x2, y2, x2, y1, x1, y1, tag, tag);*/
+
         //sys_vgui(".x%lx.c create prect %d %d %d %d "
         //         "-stroke $pd_colors(graph_border) -tags {%sR graph}\n",
         //         //REMOVED: -fill $pd_colors(graph) 
         //    glist_getcanvas(x->gl_owner),
         //    x1, y1, x2, y2, tag); // -fill $pd_colors(graph)
+
         char tagbuf[MAXPDSTRING];
         sprintf(tagbuf, "%sR", tag);
+
         gui_vmess("gui_text_drawborder", "ssiiiii",
-            canvas_string(glist_getcanvas(x->gl_owner)),
+            canvas_tag(glist_getcanvas(x->gl_owner)),
             tag,
             0, x1, y1, x2, y2);
             /* write garrays' names along the top */
@@ -976,13 +987,23 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis)
                 !garray_getname((t_garray *)g, &arrayname))
             {
                 //i++;
-                sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor nw "
-                         "-font {{%s} -%d %s} -tags {%s label graph} -fill %s\n",
-                    (long)glist_getcanvas(x),  x1+2, i, arrayname->s_name,
-                    sys_font, sys_hostfontsize(glist_getfont(x)), sys_fontweight,
+                //sys_vgui(".x%lx.c create text %d %d -text {%s} -anchor nw "
+                //         "-font {{%s} -%d %s} -tags {%s label graph} -fill %s\n",
+                //    (long)glist_getcanvas(x),  x1+2, i, arrayname->s_name,
+                //    sys_font, sys_hostfontsize(glist_getfont(x)), sys_fontweight,
+                //    tag,
+                //    (glist_isselected(x, gr) ?
+                //        "$pd_colors(selection)" : "$pd_colors(graph_border)"));
+                gui_vmess("gui_graph_label", "ssissisi",
+                    canvas_tag(glist_getcanvas(x)),
                     tag,
-                    (glist_isselected(x, gr) ?
-                        "$pd_colors(selection)" : "$pd_colors(graph_border)"));
+                    i,
+                    arrayname->s_name,
+                    sys_font,
+                    sys_hostfontsize(glist_getfont(x)),
+                    sys_fontweight,
+                    glist_isselected(x, gr));
+
                 i += sys_fontheight(glist_getfont(x));
             }
         }
@@ -999,28 +1020,46 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis)
                     f += x->gl_xtick.k_inc)
             {
                 int tickpix = (i % x->gl_xtick.k_lperb ? 2 : 4);
-                sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
-                    glist_getcanvas(x->gl_owner),
-                    (int)glist_xtopixels(x, f), (int)upix,
-                    (int)glist_xtopixels(x, f), (int)upix - tickpix, tag);
-                sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
-                    glist_getcanvas(x->gl_owner),
-                    (int)glist_xtopixels(x, f), (int)lpix,
-                    (int)glist_xtopixels(x, f), (int)lpix + tickpix, tag);
+                //sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
+                //    glist_getcanvas(x->gl_owner),
+                //    (int)glist_xtopixels(x, f), (int)upix,
+                //    (int)glist_xtopixels(x, f), (int)upix - tickpix, tag);
+                //sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
+                //    glist_getcanvas(x->gl_owner),
+                //    (int)glist_xtopixels(x, f), (int)lpix,
+                //    (int)glist_xtopixels(x, f), (int)lpix + tickpix, tag);
+                gui_vmess("gui_graph_vtick", "ssiiiiii",
+                    canvas_tag(glist_getcanvas(x->gl_owner)),
+                    tag,
+                    (int)glist_xtopixels(x, f),
+                    (int)upix,
+                    (int)lpix,
+                    (int)tickpix,
+                    x1,
+                    y1);
             }
             for (i = 1, f = x->gl_xtick.k_point - x->gl_xtick.k_inc;
                 f > 0.99 * x->gl_x1 + 0.01*x->gl_x2;
                     i++, f -= x->gl_xtick.k_inc)
             {
                 int tickpix = (i % x->gl_xtick.k_lperb ? 2 : 4);
-                sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
-                    glist_getcanvas(x->gl_owner),
-                    (int)glist_xtopixels(x, f), (int)upix,
-                    (int)glist_xtopixels(x, f), (int)upix - tickpix, tag);
-                sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
-                    glist_getcanvas(x->gl_owner),
-                    (int)glist_xtopixels(x, f), (int)lpix,
-                    (int)glist_xtopixels(x, f), (int)lpix + tickpix, tag);
+                //sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
+                //    glist_getcanvas(x->gl_owner),
+                //    (int)glist_xtopixels(x, f), (int)upix,
+                //    (int)glist_xtopixels(x, f), (int)upix - tickpix, tag);
+                //sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
+                //    glist_getcanvas(x->gl_owner),
+                //    (int)glist_xtopixels(x, f), (int)lpix,
+                //    (int)glist_xtopixels(x, f), (int)lpix + tickpix, tag);
+                gui_vmess("gui_graph_vtick", "ssiiiiii",
+                    canvas_tag(glist_getcanvas(x->gl_owner)),
+                    tag,
+                    (int)glist_xtopixels(x, f),
+                    (int)upix,
+                    (int)lpix,
+                    (int)tickpix,
+                    x1,
+                    y1);
             }
         }
 
@@ -1036,49 +1075,93 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis)
                     i++, f += x->gl_ytick.k_inc)
             {
                 int tickpix = (i % x->gl_ytick.k_lperb ? 2 : 4);
-                sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
-                    glist_getcanvas(x->gl_owner),
-                    x1, (int)glist_ytopixels(x, f), 
-                    x1 + tickpix, (int)glist_ytopixels(x, f), tag);
-                sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
-                    glist_getcanvas(x->gl_owner),
-                    x2, (int)glist_ytopixels(x, f), 
-                    x2 - tickpix, (int)glist_ytopixels(x, f), tag);
+                //sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
+                //    glist_getcanvas(x->gl_owner),
+                //    x1, (int)glist_ytopixels(x, f), 
+                //    x1 + tickpix, (int)glist_ytopixels(x, f), tag);
+                //sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
+                //    glist_getcanvas(x->gl_owner),
+                //    x2, (int)glist_ytopixels(x, f), 
+                //    x2 - tickpix, (int)glist_ytopixels(x, f), tag);
+                gui_vmess("gui_graph_htick", "ssiiiiii",
+                    canvas_tag(glist_getcanvas(x->gl_owner)),
+                    tag,
+                    (int)glist_ytopixels(x, f),
+                    x1,
+                    x2,
+                    (int)tickpix,
+                    x1,
+                    y1);
             }
             for (i = 1, f = x->gl_ytick.k_point - x->gl_ytick.k_inc;
                 f > 0.99 * lbound + 0.01 * ubound;
                     i++, f -= x->gl_ytick.k_inc)
             {
                 int tickpix = (i % x->gl_ytick.k_lperb ? 2 : 4);
-                sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
-                    glist_getcanvas(x->gl_owner),
-                    x1, (int)glist_ytopixels(x, f), 
-                    x1 + tickpix, (int)glist_ytopixels(x, f), tag);
-                sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
-                    glist_getcanvas(x->gl_owner),
-                    x2, (int)glist_ytopixels(x, f), 
-                    x2 - tickpix, (int)glist_ytopixels(x, f), tag);
+                //sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
+                //    glist_getcanvas(x->gl_owner),
+                //    x1, (int)glist_ytopixels(x, f), 
+                //    x1 + tickpix, (int)glist_ytopixels(x, f), tag);
+                //sys_vgui(".x%lx.c create polyline %d %d %d %d -tags %s\n",
+                //    glist_getcanvas(x->gl_owner),
+                //    x2, (int)glist_ytopixels(x, f), 
+                //    x2 - tickpix, (int)glist_ytopixels(x, f), tag);
+                gui_vmess("gui_graph_htick", "ssiiiiii",
+                    canvas_tag(glist_getcanvas(x->gl_owner)),
+                    tag,
+                    (int)glist_ytopixels(x, f),
+                    x1,
+                    x2,
+                    (int)tickpix,
+                    x1,
+                    y1);
             }
         }
             /* draw x labels */
         for (i = 0; i < x->gl_nxlabels; i++)
-            sys_vgui(".x%lx.c create text\
-        %d %d -text {%s} -font {{%s} %d %s} -tags {%s}\n",
-                glist_getcanvas(x),
+        {
+            //sys_vgui(".x%lx.c create text "
+            //    "%d %d -text {%s} -font {{%s} %d %s} -tags {%s}\n",
+            //    glist_getcanvas(x),
+            //    (int)glist_xtopixels(x, atof(x->gl_xlabel[i]->s_name)),
+            //    (int)glist_ytopixels(x, x->gl_xlabely),
+            //    x->gl_xlabel[i]->s_name, sys_font, 
+            //         glist_getfont(x), sys_fontweight, tag);
+            gui_vmess("gui_graph_tick_label", "ssiissisii",
+                canvas_tag(glist_getcanvas(x)),
+                tag,
                 (int)glist_xtopixels(x, atof(x->gl_xlabel[i]->s_name)),
                 (int)glist_ytopixels(x, x->gl_xlabely),
-                x->gl_xlabel[i]->s_name, sys_font, 
-                     glist_getfont(x), sys_fontweight, tag);
+                x->gl_xlabel[i]->s_name,
+                sys_font, 
+                glist_getfont(x),
+                sys_fontweight,
+                x1,
+                y1);
+        }
 
             /* draw y labels */
         for (i = 0; i < x->gl_nylabels; i++)
-            sys_vgui(".x%lx.c create text\
-        %d %d -text {%s} -font {{%s} %d %s} -tags {%s}\n",
-                glist_getcanvas(x),
+        {
+            //sys_vgui(".x%lx.c create text "
+            //    "%d %d -text {%s} -font {{%s} %d %s} -tags {%s}\n",
+            //    glist_getcanvas(x),
+            //    (int)glist_xtopixels(x, x->gl_ylabelx),
+            //    (int)glist_ytopixels(x, atof(x->gl_ylabel[i]->s_name)),
+            //    x->gl_ylabel[i]->s_name, sys_font,
+            //    glist_getfont(x), sys_fontweight, tag);
+            gui_vmess("gui_graph_tick_label", "ssiissisii",
+                canvas_tag(glist_getcanvas(x)),
+                tag,
                 (int)glist_xtopixels(x, x->gl_ylabelx),
                 (int)glist_ytopixels(x, atof(x->gl_ylabel[i]->s_name)),
-                x->gl_ylabel[i]->s_name, sys_font,
-                glist_getfont(x), sys_fontweight, tag);
+                x->gl_ylabel[i]->s_name,
+                sys_font, 
+                glist_getfont(x),
+                sys_fontweight,
+                x1,
+                y1);
+        }
 
             /* draw contents of graph as glist */
         for (g = x->gl_list; g; g = g->g_next)
@@ -1101,13 +1184,18 @@ static void graph_vis(t_gobj *gr, t_glist *parent_glist, int vis)
     }
     else
     {
-        sys_vgui(".x%lx.c delete %s\n",
-            glist_getcanvas(x->gl_owner), tag);
-        sys_vgui(".x%lx.c delete %sR\n",
-            glist_getcanvas(x->gl_owner), tag);
+        //sys_vgui(".x%lx.c delete %s\n",
+        //    glist_getcanvas(x->gl_owner), tag);
+        //sys_vgui(".x%lx.c delete %sR\n",
+        //    glist_getcanvas(x->gl_owner), tag);
         glist_eraseiofor(parent_glist, &x->gl_obj, tag);
         for (g = x->gl_list; g; g = g->g_next)
             gobj_vis(g, x, 0);
+
+        gui_vmess("gui_gobj_erase", "ss",
+            canvas_tag(glist_getcanvas(x->gl_owner)),
+            tag);
+
         // here we check for changes in scrollbar because of legacy
         // objects that can fall outside gop window, e.g. scalars
         canvas_getscroll(glist_getcanvas(x->gl_owner));
@@ -1398,28 +1486,28 @@ static void graph_select(t_gobj *z, t_glist *glist, int state)
         }
         if(glist_istoplevel(glist))
         {
-            sys_vgui(".x%lx.c itemconfigure %sR -stroke %s\n", canvas, 
-                 rtext_gettag(y),
-                 (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"));
+            //sys_vgui(".x%lx.c itemconfigure %sR -stroke %s\n", canvas, 
+            //     rtext_gettag(y),
+            //     (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"));
             /*
             sys_vgui(".x%lx.c itemconfigure graph%lx -fill %s\n",
                  glist_getcanvas(glist), z, 
                  (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"));
             */
-            sys_vgui(".x%lx.c itemconfigure %sT -fill %s\n",
-                 canvas, rtext_gettag(y), 
-                 (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"));
-
-            sys_vgui(".x%lx.c itemconfigure %sfill -stroke %s -fill %s\n",
-                 canvas, rtext_gettag(y), 
-                 (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"),
-                 (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"));
+            //sys_vgui(".x%lx.c itemconfigure %sT -fill %s\n",
+            //     canvas, rtext_gettag(y), 
+            //     (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"));
+
+            //sys_vgui(".x%lx.c itemconfigure %sfill -stroke %s -fill %s\n",
+            //     canvas, rtext_gettag(y), 
+            //     (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"),
+            //     (state? "$pd_colors(selection)" : "$pd_colors(graph_border)"));
             if (state)
                 gui_vmess("gui_text_select", "ss",
-                    canvas_string(canvas), rtext_gettag(y));
+                    canvas_tag(canvas), rtext_gettag(y));
             else
                 gui_vmess("gui_text_deselect", "ss",
-                    canvas_string(canvas), rtext_gettag(y));
+                    canvas_tag(canvas), rtext_gettag(y));
         }
 
         t_gobj *g;
diff --git a/pd/src/g_magicglass.c b/pd/src/g_magicglass.c
index 22cd07fe0..efacecd13 100644
--- a/pd/src/g_magicglass.c
+++ b/pd/src/g_magicglass.c
@@ -118,7 +118,7 @@ void magicGlass_updateText(t_magicGlass *x, int moved)
                  bgSize,
                  x->x_y + (int)(sys_fontheight(x->x_display_font)/2) + 3);
         gui_vmess("gui_cord_inspector_update", "ssiiiiii",
-            canvas_string(x->x_c), x->x_string,
+            canvas_tag(x->x_c), x->x_string,
             x->x_x, x->x_y, bgSize, 
             x->x_y - (int)(sys_fontheight(x->x_display_font)/2) - 3,
             x->x_y + (int)(sys_fontheight(x->x_display_font)/2) + 3,
@@ -145,9 +145,9 @@ void magicGlass_drawNew(t_magicGlass *x)
     sys_vgui(".x%x.c raise magicGlassText\n",
              x->x_c);
     gui_vmess("gui_text_create_gobj", "ssii",
-        canvas_string(x->x_c), "cord_inspector", 0, 0);
+        canvas_tag(x->x_c), "cord_inspector", 0, 0);
     gui_vmess("gui_create_cord_inspector", "s",
-        canvas_string(x->x_c)); 
+        canvas_tag(x->x_c)); 
     magicGlass_updateText(x, 0);
     clock_delay(x->x_flashClock, MG_CLOCK_FLASH_DELAY);
 }
@@ -159,7 +159,7 @@ void magicGlass_undraw(t_magicGlass *x)
     sys_vgui(".x%x.c delete magicGlassLine\n", x->x_c);
     sys_vgui(".x%x.c delete magicGlassText\n", x->x_c);
     gui_vmess("gui_erase_cord_inspector", "s",
-        canvas_string(x->x_c));
+        canvas_tag(x->x_c));
 }
 
 void magicGlass_flashText(t_magicGlass *x)
@@ -169,7 +169,7 @@ void magicGlass_flashText(t_magicGlass *x)
              "-fill $pd_colors(magic_glass_text)\n",
          x->x_c);
     gui_vmess("gui_cord_inspector_flash", "s",
-        canvas_string(x->x_c));
+        canvas_tag(x->x_c));
 }
 
 void magicGlass_clearText(t_magicGlass *x)
diff --git a/pd/src/g_mycanvas.c b/pd/src/g_mycanvas.c
index 801add84c..18c504bd5 100644
--- a/pd/src/g_mycanvas.c
+++ b/pd/src/g_mycanvas.c
@@ -33,14 +33,12 @@ void my_canvas_draw_new(t_my_canvas *x, t_glist *glist)
         "-tags {%lxBASE x%lx text iemgui}\n",
         canvas, x1, y1, x1+x->x_gui.x_w, y1+x->x_gui.x_h,
         x->x_gui.x_bcol, x, x);
-    char tagbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     char colorbuf[MAXPDSTRING];
     sprintf(colorbuf, "#%6.6x", x->x_gui.x_bcol);
-    gui_vmess("gui_text_create_gobj", "ssii", canvas_string(canvas),
-        tagbuf, x1, y1);
-    gui_vmess("gui_create_mycanvas", "sssiiiiii", canvas_string(canvas),
-        tagbuf, colorbuf, x1, y1, x1+x->x_vis_w, y1+x->x_vis_h,
+    gui_vmess("gui_text_create_gobj", "ssii", canvas_tag(canvas),
+        gobj_tag(x), x1, y1);
+    gui_vmess("gui_create_mycanvas", "sssiiiiii", canvas_tag(canvas),
+        gobj_tag(x), colorbuf, x1, y1, x1+x->x_vis_w, y1+x->x_vis_h,
         x1+x->x_gui.x_w, y1+x->x_gui.x_h);
 }
 
@@ -55,10 +53,8 @@ void my_canvas_draw_move(t_my_canvas *x, t_glist *glist)
         canvas, x, x1, y1, x1+x->x_vis_w, y1+x->x_vis_h);
     sys_vgui(".x%lx.c coords %lxBASE %d %d %d %d\n",
         canvas, x, x1, y1, x1+x->x_gui.x_w, y1+x->x_gui.x_h);
-    char tagbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     gui_vmess("gui_mycanvas_coords", "ssiiii",
-        canvas_string(canvas), tagbuf,
+        canvas_tag(canvas), gobj_tag(x),
         x->x_vis_w, x->x_vis_h, x->x_gui.x_w, x->x_gui.x_h);
 }
 
@@ -73,10 +69,8 @@ void my_canvas_draw_config(t_my_canvas* x, t_glist* glist)
     //    x->x_gui.x_selected == canvas && x->x_gui.x_glist == canvas ?
     //    "$pd_colors(selection)" : bcol);
     isselected = x->x_gui.x_selected == canvas && x->x_gui.x_glist == canvas;
-    char tagbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     gui_vmess("gui_update_mycanvas", "sssi",
-        canvas_string(canvas), tagbuf, bcol, isselected);
+        canvas_tag(canvas), gobj_tag(x), bcol, isselected);
 }
 
 void my_canvas_draw_select(t_my_canvas* x, t_glist* glist)
@@ -87,10 +81,9 @@ void my_canvas_draw_select(t_my_canvas* x, t_glist* glist)
     sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke %s\n", canvas, x,
         x->x_gui.x_selected == canvas && x->x_gui.x_glist == canvas ?
         "$pd_colors(selection)" : bcol);
-    char tagbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
-    gui_vmess("gui_mycanvas_select_color", "sss", canvas_string(canvas),
-        tagbuf, x->x_gui.x_selected == canvas && x->x_gui.x_glist == canvas ?
+    gui_vmess("gui_mycanvas_select_color", "sss",
+        canvas_tag(canvas), gobj_tag(x),
+        x->x_gui.x_selected == canvas && x->x_gui.x_glist == canvas ?
             "blue" : bcol); 
 }
 
diff --git a/pd/src/g_numbox.c b/pd/src/g_numbox.c
index e421cf85a..517fbf7dd 100644
--- a/pd/src/g_numbox.c
+++ b/pd/src/g_numbox.c
@@ -140,10 +140,8 @@ static void my_numbox_draw_update(t_gobj *client, t_glist *glist)
         //sys_vgui(
         //    ".x%lx.c itemconfigure %lxNUMBER -fill #%6.6x -text {%s}\n",
         //        glist_getcanvas(glist), x, IEM_GUI_COLOR_EDITED, cp);
-        char tagbuf[MAXPDSTRING];
-        sprintf(tagbuf, "x%lx", (long unsigned int)x);
-        gui_vmess("gui_text_set", "sss", canvas_string(glist_getcanvas(glist)),
-            tagbuf, cp);
+        gui_vmess("gui_text_set", "sss", canvas_tag(glist_getcanvas(glist)),
+            gobj_tag(x), cp);
             
         x->x_buf[sl] = 0;
     }
@@ -158,10 +156,8 @@ static void my_numbox_draw_update(t_gobj *client, t_glist *glist)
         //    glist_getcanvas(glist), x,
         //    x->x_gui.x_selected == glist_getcanvas(glist) && 
         //        !x->x_gui.x_change ? selection_color : fcol, x->x_buf);
-        char tagbuf[MAXPDSTRING];
-        sprintf(tagbuf, "x%lx", (long unsigned int)x);
-        gui_vmess("gui_text_set", "sss", canvas_string(glist_getcanvas(glist)),
-            tagbuf, x->x_buf);
+        gui_vmess("gui_text_set", "sss", canvas_tag(glist_getcanvas(glist)),
+            gobj_tag(x), x->x_buf);
         x->x_buf[0] = 0;
     }
 }
@@ -180,10 +176,9 @@ static void my_numbox_draw_new(t_my_numbox *x, t_glist *glist)
     //    canvas, x1, y1, x2-4, y1, x2, y1+4, x2, y2, x1, y2,
     //    x->x_hide_frame <= 1 ? "$pd_colors(iemgui_border)" : bcol,
     //    bcol, x, x);
-    char tagbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
-    gui_vmess("gui_create_numbox", "isssiiiiiiiiiiiii", x->x_numwidth, canvas_string(canvas),
-        tagbuf, bcol, x1, y1, x2-4, y1, x2, y1+4, x2, y2, x1, y2, x1, y1, half);
+    gui_vmess("gui_create_numbox", "isssiiiiiiiiiiiii", x->x_numwidth,
+        canvas_tag(canvas), gobj_tag(x),
+        bcol, x1, y1, x2-4, y1, x2, y1+4, x2, y2, x1, y2, x1, y1, half);
     if (!x->x_hide_frame || x->x_hide_frame == 2)
         sys_vgui(".x%lx.c create polyline %d %d %d %d %d %d -stroke #%6.6x "
             "-tags {%lxBASE2 x%lx text iemgui}\n",
@@ -196,7 +191,8 @@ static void my_numbox_draw_new(t_my_numbox *x, t_glist *glist)
     //    x->x_gui.x_fcol, x, x);
     char colorbuf[MAXPDSTRING];
     sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol);
-    gui_vmess("gui_numbox_drawtext", "sssisiiii", canvas_string(canvas), tagbuf,
+    gui_vmess("gui_numbox_drawtext", "sssisiiii",
+        canvas_tag(canvas), gobj_tag(x),
         x->x_buf, x->x_gui.x_fontsize, colorbuf, x1+half+2, y1+half+d, x1, y1);
 }
 
@@ -230,13 +226,11 @@ static void my_numbox_draw_config(t_my_numbox* x,t_glist* glist)
     //    canvas, x, issel ? selection_color : fcol);
     //sys_vgui(".x%lx.c itemconfigure %lxBASE1 -fill #%6.6x\n", canvas,
     //         x, x->x_gui.x_bcol);
-    char tagbuf[MAXPDSTRING];
     char bgcol[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     sprintf(bgcol, "#%6.6x", x->x_gui.x_bcol);
     
     gui_vmess("gui_update_numbox", "sssssii",
-        canvas_string(canvas), tagbuf,
+        canvas_tag(canvas), gobj_tag(x),
         fcol, bgcol, iemgui_typeface, x->x_gui.x_fontsize, sys_fontweight);
 }
 
diff --git a/pd/src/g_radio.c b/pd/src/g_radio.c
index 2b08249f1..3fa7b6adf 100644
--- a/pd/src/g_radio.c
+++ b/pd/src/g_radio.c
@@ -32,13 +32,11 @@ void radio_draw_update(t_gobj *client, t_glist *glist)
         canvas, x, x->x_drawn, x->x_gui.x_bcol, x->x_gui.x_bcol);
     sys_vgui(".x%lx.c itemconfigure %lxBUT%d -fill #%6.6x -stroke #%6.6x\n",
         canvas, x, x->x_on,    x->x_gui.x_fcol, x->x_gui.x_fcol);
-    char tagbuf[MAXPDSTRING];
     char fcol[8], bcol[8];
     sprintf(fcol, "#%6.6x", x->x_gui.x_fcol);
     sprintf(bcol, "#%6.6x", x->x_gui.x_bcol);
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
-    gui_vmess("gui_radio_update", "sssii", canvas_string(canvas),
-        tagbuf, fcol, x->x_drawn, x->x_on);
+    gui_vmess("gui_radio_update", "sssii", canvas_tag(canvas),
+        gobj_tag(x), fcol, x->x_drawn, x->x_on);
     x->x_drawn = x->x_on;
 }
 
@@ -57,10 +55,8 @@ void radio_draw_new(t_radio *x, t_glist *glist)
             "-stroke $pd_colors(iemgui_border) "
             "-tags {%lxBASE%d %lxBASE x%lx text iemgui border}\n",
             canvas, x1, yi, x1+d, yi, x, i, x, x);
-            char tagbuf[MAXPDSTRING];
-            sprintf(tagbuf, "x%lx", (long unsigned int)x);
             gui_vmess("gui_create_radio", "ssiiiiiii",
-              canvas_string(canvas), tagbuf, x1, yi, x1+d, yi, i, x1, y1);
+              canvas_tag(canvas), gobj_tag(x), x1, yi, x1+d, yi, i, x1, y1);
         }
         sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x "
             "-stroke #%6.6x -tags {%lxBUT%d x%lx text iemgui}\n",
@@ -72,8 +68,9 @@ void radio_draw_new(t_radio *x, t_glist *glist)
         sprintf(tagbuf, "x%lx", (long unsigned int)x);
         char colorbuf[MAXPDSTRING];
         sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol);
-        gui_vmess("gui_create_radio_buttons", "sssiiiiiiii", canvas_string(canvas),
-            tagbuf, colorbuf, x1+s, yi+s, x1+d-s, yi+d-s, x1, y1, i, x->x_on==i);
+        gui_vmess("gui_create_radio_buttons", "sssiiiiiiii",
+            canvas_tag(canvas), gobj_tag(x),
+            colorbuf, x1+s, yi+s, x1+d-s, yi+d-s, x1, y1, i, x->x_on==i);
         yi += d;
         x->x_drawn = x->x_on;
     } else {
@@ -83,10 +80,8 @@ void radio_draw_new(t_radio *x, t_glist *glist)
             "-stroke $pd_colors(iemgui_border) "
             "-tags {%lxBASE%d %lxBASE x%lx text iemgui border}\n",
             canvas, xi, y1, xi, y1+d, x, i, x, x);
-            char tagbuf[MAXPDSTRING];
-            sprintf(tagbuf, "x%lx", (long unsigned int)x);
-            gui_vmess("gui_create_radio", "ssiiiiiii", canvas_string(canvas),
-                tagbuf, xi, y1, xi, y1+d, i, x1, y1);
+            gui_vmess("gui_create_radio", "ssiiiiiii", canvas_tag(canvas),
+                gobj_tag(x), xi, y1, xi, y1+d, i, x1, y1);
         }
         sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x "
             "-stroke #%6.6x -tags {%lxBUT%d x%lx text iemgui}\n",
@@ -94,12 +89,11 @@ void radio_draw_new(t_radio *x, t_glist *glist)
             (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol,
             (x->x_on==i)?x->x_gui.x_fcol:x->x_gui.x_bcol,
             x, i, x);
-        char tagbuf[MAXPDSTRING];
-        sprintf(tagbuf, "x%lx", (long unsigned int)x);
         char colorbuf[MAXPDSTRING];
         sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol);
-        gui_vmess("gui_create_radio_buttons", "sssiiiiiiii", canvas_string(canvas),
-            tagbuf, colorbuf, xi+s, y1+s, xi+d-s, yi+d-s, x1, y1, i, x->x_on==i);
+        gui_vmess("gui_create_radio_buttons", "sssiiiiiiii",
+            canvas_tag(canvas), gobj_tag(x),
+            colorbuf, xi+s, y1+s, xi+d-s, yi+d-s, x1, y1, i, x->x_on==i);
         xi += d;
         x->x_drawn = x->x_on;
     }
@@ -112,8 +106,6 @@ void radio_draw_move(t_radio *x, t_glist *glist)
     int n=x->x_number, i, d=x->x_gui.x_w, s=d/4;
     int x1=text_xpix(&x->x_gui.x_obj, glist), xi=0;
     int y1=text_ypix(&x->x_gui.x_obj, glist), yi=0;
-    char tagbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     iemgui_base_draw_move(&x->x_gui);
     for(i=0; i<n; i++) if (x->x_orient) {
         //sys_vgui(".x%lx.c coords %lxBASE%d %d %d %d %d\n",
@@ -121,7 +113,7 @@ void radio_draw_move(t_radio *x, t_glist *glist)
         //sys_vgui(".x%lx.c coords %lxBUT%d %d %d %d %d\n",
         //    canvas, x, i, x1+s, yi+s, x1+d-s, yi+d-s);
         gui_vmess("gui_radio_button_coords", "ssiiiiiiii",
-            canvas_string(canvas), tagbuf,
+            canvas_tag(canvas), gobj_tag(x),
             x1, y1, xi, yi, i, s, d, x->x_orient);
         yi += d;
     } else {
@@ -130,7 +122,7 @@ void radio_draw_move(t_radio *x, t_glist *glist)
         //sys_vgui(".x%lx.c coords %lxBUT%d %d %d %d %d\n",
         //    canvas, x, i, xi+s, y1+s, xi+d-s, y1+d-s);
         gui_vmess("gui_radio_button_coords", "ssiiiiiiii",
-            canvas_string(canvas), tagbuf,
+            canvas_tag(canvas), gobj_tag(x),
             x1, y1, xi, yi, i, s, d, x->x_orient);
         xi += d;
     }
@@ -148,12 +140,10 @@ void radio_draw_config(t_radio *x, t_glist *glist)
         //    (x->x_on==i) ? x->x_gui.x_fcol : x->x_gui.x_bcol,
         //    (x->x_on==i) ? x->x_gui.x_fcol : x->x_gui.x_bcol);
     }
-        char tagbuf[MAXPDSTRING];
         char col[8];
-        sprintf(tagbuf, "x%lx", (long unsigned int)x);
         sprintf(col, "#%6.6x", x->x_gui.x_fcol);
         gui_vmess("gui_radio_update", "sssii",
-            canvas_string(canvas), tagbuf, col, 0, x->x_on);
+            canvas_tag(canvas), gobj_tag(x), col, 0, x->x_on);
 
 }
 
diff --git a/pd/src/g_readwrite.c b/pd/src/g_readwrite.c
index 5dd095180..fce016454 100644
--- a/pd/src/g_readwrite.c
+++ b/pd/src/g_readwrite.c
@@ -776,7 +776,7 @@ static void canvas_savetofile(t_canvas *x, t_symbol *filename, t_symbol *dir)
 static void canvas_menusaveas(t_canvas *x)
 {
     t_canvas *x2 = canvas_getrootfor(x);
-    gui_vmess("gui_canvas_saveas", "sss", canvas_string(x2), x2->gl_name->s_name, canvas_getdir(x2)->s_name);
+    gui_vmess("gui_canvas_saveas", "sss", canvas_tag(x2), x2->gl_name->s_name, canvas_getdir(x2)->s_name);
 //    sys_vgui("pdtk_canvas_saveas .x%lx \"%s\" \"%s\"\n", x2,
 //        x2->gl_name->s_name, canvas_getdir(x2)->s_name);
 }
diff --git a/pd/src/g_rtext.c b/pd/src/g_rtext.c
index 76b0fea02..116f01ed1 100644
--- a/pd/src/g_rtext.c
+++ b/pd/src/g_rtext.c
@@ -356,14 +356,14 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp,
         if (action == SEND_FIRST)
         {
             //fprintf(stderr,"send_first rtext=%lx t_text=%lx\n", x, x->x_text);
-            sys_vgui("pdtk_text_new .x%lx.c {%s %s text %s} %f %f {%.*s} %d %s\n",
-                canvas, x->x_tag, rtext_gettype(x)->s_name,
-                (glist_isselected(x->x_glist, ((t_gobj*)x->x_text)) ? "selected" : ""),
-                dispx + LMARGIN, dispy + TMARGIN,
-                outchars_b, tempbuf, sys_hostfontsize(font),
-                (glist_isselected(x->x_glist, ((t_gobj*)x->x_text)) ? "$pd_colors(selection)" : "$pd_colors(text)"));
+            //sys_vgui("pdtk_text_new .x%lx.c {%s %s text %s} %f %f {%.*s} %d %s\n",
+            //    canvas, x->x_tag, rtext_gettype(x)->s_name,
+            //    (glist_isselected(x->x_glist, ((t_gobj*)x->x_text)) ? "selected" : ""),
+            //    dispx + LMARGIN, dispy + TMARGIN,
+            //    outchars_b, tempbuf, sys_hostfontsize(font),
+            //    (glist_isselected(x->x_glist, ((t_gobj*)x->x_text)) ? "$pd_colors(selection)" : "$pd_colors(text)"));
             gui_vmess("gui_text_new", "sssiiisi",
-                canvas_string(canvas), x->x_tag, rtext_gettype(x)->s_name,
+                canvas_tag(canvas), x->x_tag, rtext_gettype(x)->s_name,
                 glist_isselected(x->x_glist, ((t_gobj*)x->x_text)),
                 LMARGIN,
                 TMARGIN,
@@ -375,9 +375,9 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp,
         }
         else if (action == SEND_UPDATE)
         {
-            sys_vgui("pdtk_text_set .x%lx.c %s {%.*s}\n",
-                canvas, x->x_tag, outchars_b, tempbuf);
-            gui_vmess("gui_text_set", "sss", canvas_string(canvas), x->x_tag, tempbuf);
+            //sys_vgui("pdtk_text_set .x%lx.c %s {%.*s}\n",
+            //    canvas, x->x_tag, outchars_b, tempbuf);
+            gui_vmess("gui_text_set", "sss", canvas_tag(canvas), x->x_tag, tempbuf);
 
             if (pixwide != x->x_drawnwidth || pixhigh != x->x_drawnheight) 
                 text_drawborder(x->x_text, x->x_glist, x->x_tag,
diff --git a/pd/src/g_scalar.c b/pd/src/g_scalar.c
index baebc17ae..cc4616c7c 100644
--- a/pd/src/g_scalar.c
+++ b/pd/src/g_scalar.c
@@ -426,13 +426,13 @@ void scalar_drawselectrect(t_scalar *x, t_glist *glist, int state)
         x1--; x2++; y1--; y2++;
         if (glist_istoplevel(glist))
         {
-            sys_vgui(".x%lx.c create prect %d %d %d %d "
-                     "-strokewidth 1 -stroke $pd_colors(selection) "
-                     "-tags {select%lx selected}\n",
-                    glist_getcanvas(glist), x1, y1, x2, y2,
-                    x);
+            //sys_vgui(".x%lx.c create prect %d %d %d %d "
+            //         "-strokewidth 1 -stroke $pd_colors(selection) "
+            //         "-tags {select%lx selected}\n",
+            //        glist_getcanvas(glist), x1, y1, x2, y2,
+            //        x);
             gui_vmess("gui_scalar_draw_select_rect", "ssiiiiiff",
-                canvas_string(glist_getcanvas(glist)), tagbuf,
+                canvas_tag(glist_getcanvas(glist)), tagbuf,
                 state,
                 x1, y1, x2, y2, basex, basey);
         }
@@ -440,11 +440,13 @@ void scalar_drawselectrect(t_scalar *x, t_glist *glist, int state)
     else
     {
         if (glist_istoplevel(glist))
-            sys_vgui(".x%lx.c delete select%lx\n", glist_getcanvas(glist), x);
-        gui_vmess("gui_scalar_draw_select_rect", "ssiiiiiii",
-            canvas_string(glist_getcanvas(glist)), tagbuf,
-            state,
-            0, 0, 0, 0, 0, 0);
+        {
+            //sys_vgui(".x%lx.c delete select%lx\n", glist_getcanvas(glist), x);
+            gui_vmess("gui_scalar_draw_select_rect", "ssiiiiiii",
+                canvas_tag(glist_getcanvas(glist)), tagbuf,
+                state,
+                0, 0, 0, 0, 0, 0);
+        }
     }
 }
 
@@ -485,7 +487,7 @@ void scalar_select(t_gobj *z, t_glist *owner, int state)
         sys_vgui(".x%lx.c addtag scalar_selected withtag {.scalar%lx}\n",
             glist_getcanvas(owner), x->sc_vec);
         gui_vmess("gui_text_select", "ss",
-            canvas_string(glist_getcanvas(owner)), tagbuf);
+            canvas_tag(glist_getcanvas(owner)), tagbuf);
     }
     else
     {
@@ -495,7 +497,7 @@ void scalar_select(t_gobj *z, t_glist *owner, int state)
         sys_vgui(".x%lx.c dtag .scalar%lx scalar_selected\n",
             glist_getcanvas(owner), x->sc_vec);
         gui_vmess("gui_text_deselect", "ss",
-            canvas_string(glist_getcanvas(owner)), tagbuf);
+            canvas_tag(glist_getcanvas(owner)), tagbuf);
     }
     //sys_vgui("pdtk_select_all_gop_widgets .x%lx %lx %d\n",
     //    glist_getcanvas(owner), owner, state);
@@ -646,7 +648,7 @@ static void scalar_group_configure(t_scalar *x, t_glist *owner,
     sprintf(parentbuf, "dgroup%lx.%lx", (long unsigned int)parent,
         (long unsigned int)x->sc_vec);
     gui_start_vmess("gui_draw_configure_all", "ss",
-        canvas_string(glist_getcanvas(owner)), tagbuf);
+        canvas_tag(glist_getcanvas(owner)), tagbuf);
     svg_grouptogui(gl, template, x->sc_vec);
     gui_end_vmess();
     for (y = gl->gl_list; y; y = y->g_next)
@@ -685,7 +687,7 @@ void scalar_configure(t_scalar *x, t_glist *owner)
         char tagbuf[MAXPDSTRING];
         sprintf(tagbuf, "scalar%lx", (long unsigned int)x->sc_vec);
         gui_vmess("gui_scalar_configure_gobj", "ssiffffii",
-            canvas_string(glist_getcanvas(owner)), 
+            canvas_tag(glist_getcanvas(owner)), 
             tagbuf,
             glist_isselected(owner, &x->sc_gobj),
             xscale, 0.0, 0.0, yscale,
@@ -702,7 +704,7 @@ void scalar_configure(t_scalar *x, t_glist *owner)
         //sprintf(groupbuf, "dgroup%lx.%lx", (long unsigned int)templatecanvas,
         //    (long unsigned int)x->sc_vec);
         //gui_vmess("gui_create_scalar_group", "sss",
-        //    canvas_string(glist_getcanvas(owner)), groupbuf, tagbuf); 
+        //    canvas_tag(glist_getcanvas(owner)), groupbuf, tagbuf); 
         //sys_vgui("pdtk_bind_scalar_mouseover "
         //         ".x%lx.c .x%lx.x%lx.template%lx {.x%lx}\n",
         //    glist_getcanvas(owner), glist_getcanvas(owner),
@@ -744,10 +746,10 @@ static void scalar_groupvis(t_scalar *x, t_glist *owner, t_template *template,
     t_gobj *y;
     if (vis)
     {
-        sys_vgui(".x%lx.c create group -tags {.dgroup%lx.%lx} "
-                 "-parent {.dgroup%lx.%lx}\\\n",
-            glist_getcanvas(owner), gl, x->sc_vec,
-            parent, x->sc_vec);
+        //sys_vgui(".x%lx.c create group -tags {.dgroup%lx.%lx} "
+        //         "-parent {.dgroup%lx.%lx}\\\n",
+        //    glist_getcanvas(owner), gl, x->sc_vec,
+        //    parent, x->sc_vec);
         char tagbuf[MAXPDSTRING];
         sprintf(tagbuf, "dgroup%lx.%lx", (long unsigned int)gl,
             (long unsigned int)x->sc_vec);
@@ -755,7 +757,7 @@ static void scalar_groupvis(t_scalar *x, t_glist *owner, t_template *template,
         sprintf(parentbuf, "dgroup%lx.%lx", (long unsigned int)parent,
             (long unsigned int)x->sc_vec);
         gui_start_vmess("gui_create_scalar_group", "sss",
-            canvas_string(glist_getcanvas(owner)), tagbuf, parentbuf);
+            canvas_tag(glist_getcanvas(owner)), tagbuf, parentbuf);
         svg_grouptogui(gl, template, x->sc_vec);
         gui_end_vmess();
         //sys_gui("\n");
@@ -849,26 +851,26 @@ static void scalar_vis(t_gobj *z, t_glist *owner, int vis)
            To fix these, we set the correct fill/stroke/strokelinjoin options
            here on the .scalar%lx group. (Notice also that tkpath doesn't
            understand "None"-- instead we must send an empty symbol.) */
-        sys_vgui(".x%lx.c create group -tags {.scalar%lx %s} "
-            "-matrix { {%g %g} {%g %g} {%d %d} } "
-            "-stroke \"\" -fill black -strokelinejoin miter\n",
-            glist_getcanvas(owner), x->sc_vec,
-            (glist_isselected(owner, &x->sc_gobj) ? "scalar_selected" : ""),
-            xscale, 0.0, 0.0, yscale, (int)glist_xtopixels(owner, basex),
-            (int)glist_ytopixels(owner, basey)
-            );
+        //sys_vgui(".x%lx.c create group -tags {.scalar%lx %s} "
+        //    "-matrix { {%g %g} {%g %g} {%d %d} } "
+        //    "-stroke \"\" -fill black -strokelinejoin miter\n",
+        //    glist_getcanvas(owner), x->sc_vec,
+        //    (glist_isselected(owner, &x->sc_gobj) ? "scalar_selected" : ""),
+        //    xscale, 0.0, 0.0, yscale, (int)glist_xtopixels(owner, basex),
+        //    (int)glist_ytopixels(owner, basey)
+        //    );
         char tagbuf[MAXPDSTRING];
         sprintf(tagbuf, "scalar%lx", (long unsigned int)x->sc_vec);
         gui_vmess("gui_create_scalar", "ssiffffii",
-            canvas_string(glist_getcanvas(owner)), 
+            canvas_tag(glist_getcanvas(owner)), 
             tagbuf,
             glist_isselected(owner, &x->sc_gobj),
             xscale, 0.0, 0.0, yscale,
             (int)glist_xtopixels(owner, basex),
             (int)glist_ytopixels(owner, basey));
-        sys_vgui(".x%lx.c create group -tags {.dgroup%lx.%lx} "
-                 "-parent {.scalar%lx}\n",
-            glist_getcanvas(owner), templatecanvas, x->sc_vec, x->sc_vec);
+        //sys_vgui(".x%lx.c create group -tags {.dgroup%lx.%lx} "
+        //         "-parent {.scalar%lx}\n",
+        //    glist_getcanvas(owner), templatecanvas, x->sc_vec, x->sc_vec);
         char groupbuf[MAXPDSTRING];
         // Quick hack to make gui_create_scalar_group more general (so we
         // don't have to tack on "gobj" manually)
@@ -876,7 +878,8 @@ static void scalar_vis(t_gobj *z, t_glist *owner, int vis)
         sprintf(groupbuf, "dgroup%lx.%lx", (long unsigned int)templatecanvas,
             (long unsigned int)x->sc_vec);
         gui_vmess("gui_create_scalar_group", "sss",
-            canvas_string(glist_getcanvas(owner)), groupbuf, tagbuf);
+            canvas_tag(glist_getcanvas(owner)), groupbuf, tagbuf);
+
         sys_vgui("pdtk_bind_scalar_mouseover "
                  ".x%lx.c .x%lx.x%lx.template%lx {.x%lx}\n",
             glist_getcanvas(owner), glist_getcanvas(owner),
@@ -904,12 +907,12 @@ static void scalar_vis(t_gobj *z, t_glist *owner, int vis)
     }
     if (!vis)
     {
-        sys_vgui(".x%lx.c delete .scalar%lx\n", glist_getcanvas(owner),
-            x->sc_vec);
+        //sys_vgui(".x%lx.c delete .scalar%lx\n", glist_getcanvas(owner),
+        //    x->sc_vec);
         char tagbuf[MAXPDSTRING];
         sprintf(tagbuf, "scalar%lx", (long unsigned int)x->sc_vec);
         gui_vmess("gui_scalar_erase", "ss",
-            canvas_string(glist_getcanvas(owner)), tagbuf);
+            canvas_tag(glist_getcanvas(owner)), tagbuf);
     }
 
     sys_unqueuegui(x);
diff --git a/pd/src/g_slider.c b/pd/src/g_slider.c
index 0a615569f..09167f16b 100644
--- a/pd/src/g_slider.c
+++ b/pd/src/g_slider.c
@@ -33,19 +33,15 @@ static void slider_draw_update(t_gobj *client, t_glist *glist)
         r=y2-3 - (x->x_val+50)/100;
         //sys_vgui(".x%lx.c coords %lxKNOB %d %d %d %d\n",
         //    canvas, x, x1+2, r, x2-2, r);
-        char tagbuf[MAXPDSTRING];
-        sprintf(tagbuf, "x%lx", (long unsigned int)x);
         gui_vmess("gui_slider_update", "ssiiiiii",
-            canvas_string(canvas), tagbuf, x1+2, r, x2-2, r,
+            canvas_tag(canvas), gobj_tag(x), x1+2, r, x2-2, r,
             x1, y1);
     } else {
         r=x1+3 + (x->x_val+50)/100;
         //sys_vgui(".x%lx.c coords %lxKNOB %d %d %d %d\n",
         //    canvas, x, r, y1+2, r, y2-2);
-        char tagbuf[MAXPDSTRING];
-        sprintf(tagbuf, "x%lx", (long unsigned int)x);
         gui_vmess("gui_slider_update", "ssiiiiii",
-            canvas_string(canvas), tagbuf, r, y1+2, r, y2-2,
+            canvas_tag(canvas), gobj_tag(x), r, y1+2, r, y2-2,
             x1, y1);
     }
     int t = x->x_thick;
@@ -74,21 +70,19 @@ static void slider_draw_new(t_slider *x, t_glist *glist)
         //sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth 3 "
         //    "-stroke #%6.6x -tags {%lxKNOB x%lx text iemgui}\n",
         //    canvas, x1+2, r, x2-2, r, x->x_gui.x_fcol, x, x);
-        char tagbuf[MAXPDSTRING];
-        sprintf(tagbuf, "x%lx", (long unsigned int)x);
         char colorbuf[MAXPDSTRING];
         sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol);
-        gui_vmess("gui_create_slider", "sssiiiiii", canvas_string(canvas), tagbuf,
+        gui_vmess("gui_create_slider", "sssiiiiii",
+            canvas_tag(canvas), gobj_tag(x),
             colorbuf, x1+2, r, x2-2, r, x1, y1);
     } else {
         //sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth 3 "
         //    "-stroke #%6.6x -tags {%lxKNOB x%lx text iemgui}\n",
         //    canvas, r, y1+2, r, y2-2, x->x_gui.x_fcol, x, x);
-        char tagbuf[MAXPDSTRING];
-        sprintf(tagbuf, "x%lx", (long unsigned int)x);
         char colorbuf[MAXPDSTRING];
         sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol);
-        gui_vmess("gui_create_slider", "sssiiiiii", canvas_string(canvas), tagbuf,
+        gui_vmess("gui_create_slider", "sssiiiiii",
+            canvas_tag(canvas), gobj_tag(x),
             colorbuf, r, y1+2, r, y2-2, x1, y1);
     }
 }
@@ -108,20 +102,16 @@ static void slider_draw_move(t_slider *x, t_glist *glist)
     {
         //sys_vgui(".x%lx.c coords %lxKNOB %d %d %d %d\n",
         //    canvas, x, x1+2, r, x2-2, r);
-        char tagbuf[MAXPDSTRING];
-        sprintf(tagbuf, "x%lx", (long unsigned int)x);
         gui_vmess("gui_slider_update", "ssiiiiii",
-            canvas_string(canvas), tagbuf,
+            canvas_tag(canvas), gobj_tag(x),
             x1+2, r, x2-2, r, x1, y1);
     }
     else
     {
         //sys_vgui(".x%lx.c coords %lxKNOB %d %d %d %d\n",
         //    canvas, x, r, y1+2, r, y2-2);
-        char tagbuf[MAXPDSTRING];
-        sprintf(tagbuf, "x%lx", (long unsigned int)x);
         gui_vmess("gui_slider_update", "ssiiiiii",
-            canvas_string(canvas), tagbuf,
+            canvas_tag(canvas), gobj_tag(x),
             r, y1+2, r, y2-2, x1, y1);
     }
 }
@@ -132,12 +122,10 @@ static void slider_draw_config(t_slider *x, t_glist *glist)
     iemgui_base_draw_config(&x->x_gui);
     //sys_vgui(".x%lx.c itemconfigure %lxKNOB -stroke #%6.6x\n",
     //    canvas, x, x->x_gui.x_fcol);
-    char tagbuf[MAXPDSTRING];
     char colorbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol);
     gui_vmess("gui_slider_indicator_color", "sss",
-        canvas_string(canvas), tagbuf, colorbuf); 
+        canvas_tag(canvas), gobj_tag(x), colorbuf); 
 }
 
 void slider_check_minmax(t_slider *x, double min, double max);
diff --git a/pd/src/g_template.c b/pd/src/g_template.c
index bb7a21526..bf5bdf153 100644
--- a/pd/src/g_template.c
+++ b/pd/src/g_template.c
@@ -1502,7 +1502,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
         //sys_vgui(".x%lx.c itemconfigure %s -fill %s\n",
         //    glist_getcanvas(c), tag, fill->s_name);
         gui_vmess("gui_draw_configure", "ssss",
-            canvas_string(glist_getcanvas(c)), tag, s->s_name, fill->s_name);
+            canvas_tag(glist_getcanvas(c)), tag, s->s_name, fill->s_name);
     }
     else if (s == gensym("stroke"))
     {
@@ -1521,14 +1521,14 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
         //sys_vgui(".x%lx.c itemconfigure %s -stroke %s\n",
         //    glist_getcanvas(c), tag, stroke->s_name);
         gui_vmess("gui_draw_configure", "ssss",
-            canvas_string(glist_getcanvas(c)), tag, s->s_name, stroke->s_name);
+            canvas_tag(glist_getcanvas(c)), tag, s->s_name, stroke->s_name);
     }
     else if (s == gensym("fill-opacity"))
         //sys_vgui(".x%lx.c itemconfigure %s -fillopacity %g\n",
         //    glist_getcanvas(c), tag,
         //    fielddesc_getcoord(&x->x_fillopacity.a_attr, template, data, 1));
         gui_vmess("gui_draw_configure", "sssf",
-            canvas_string(glist_getcanvas(c)), tag, "fill-opacity",
+            canvas_tag(glist_getcanvas(c)), tag, "fill-opacity",
             fielddesc_getcoord(&x->x_fillopacity.a_attr, template, data, 1));
     else if (s == gensym("fill-rule"))
         //sys_vgui(".x%lx.c itemconfigure %s -fillrule %s\n",
@@ -1536,7 +1536,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
         //        &x->x_fillrule.a_attr, template, data, 1) ?
         //            "evenodd" : "nonzero");
         gui_vmess("gui_draw_configure", "sssi",
-            canvas_string(glist_getcanvas(c)), tag, "fill-rule", (int)fielddesc_getcoord(
+            canvas_tag(glist_getcanvas(c)), tag, "fill-rule", (int)fielddesc_getcoord(
                 &x->x_fillrule.a_attr, template, data, 1) ?
                     "evenodd" : "nonzero");
     else if (s == gensym("pointer-events"))
@@ -1547,7 +1547,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
         //        (int)fielddesc_getcoord(&x->x_strokelinecap.a_attr,
         //            template, data, 1)));
         gui_vmess("gui_draw_configure", "ssss",
-            canvas_string(glist_getcanvas(c)), tag, "stroke-linecap", get_strokelinecap(
+            canvas_tag(glist_getcanvas(c)), tag, "stroke-linecap", get_strokelinecap(
                 (int)fielddesc_getcoord(&x->x_strokelinecap.a_attr,
                     template, data, 1)));
     else if (s == gensym("stroke-linejoin"))
@@ -1556,7 +1556,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
         //        (int)fielddesc_getcoord(&x->x_strokelinejoin.a_attr,
         //            template, data, 1)));
         gui_vmess("gui_draw_configure", "ssss",
-            canvas_string(glist_getcanvas(c)), tag, "stroke-linejoin", get_strokelinejoin(
+            canvas_tag(glist_getcanvas(c)), tag, "stroke-linejoin", get_strokelinejoin(
                 (int)fielddesc_getcoord(&x->x_strokelinejoin.a_attr,
                     template, data, 1)));
     else if (s == gensym("stroke-miterlimit"))
@@ -1564,14 +1564,14 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
         //    glist_getcanvas(c), tag, fielddesc_getcoord(
         //        &x->x_strokemiterlimit.a_attr, template, data, 1));
         gui_vmess("gui_draw_configure", "sssf",
-            canvas_string(glist_getcanvas(c)), tag, "stroke-miterlimit", fielddesc_getcoord(
+            canvas_tag(glist_getcanvas(c)), tag, "stroke-miterlimit", fielddesc_getcoord(
                 &x->x_strokemiterlimit.a_attr, template, data, 1));
     else if (s == gensym("stroke-opacity"))
         //sys_vgui(".x%lx.c itemconfigure %s -strokeopacity %g\n",
         //    glist_getcanvas(c), tag, fielddesc_getcoord(
         //        &x->x_strokeopacity.a_attr, template, data, 1));
         gui_vmess("gui_draw_configure", "sssg",
-            canvas_string(glist_getcanvas(c)), tag, "stroke-opacity", fielddesc_getcoord(
+            canvas_tag(glist_getcanvas(c)), tag, "stroke-opacity", fielddesc_getcoord(
                 &x->x_strokeopacity.a_attr, template, data, 1));
     else if (s == gensym("stroke-width"))
     {
@@ -1579,7 +1579,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
         //    glist_getcanvas(c), tag, fielddesc_getcoord(
         //        &x->x_strokewidth.a_attr, template, data, 1));
         gui_vmess("gui_draw_configure", "sssf",
-            canvas_string(glist_getcanvas(c)), tag, "stroke-width", fielddesc_getcoord(
+            canvas_tag(glist_getcanvas(c)), tag, "stroke-width", fielddesc_getcoord(
                 &x->x_strokewidth.a_attr, template, data, 1));
         *predraw_bbox = 1;
     }
@@ -1590,7 +1590,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
         //fielddesc_getcoord(x->x_vec+2, template, data, 1),
         //fielddesc_getcoord(x->x_vec+2, template, data, 1));
         gui_vmess("gui_draw_configure", "sssf",
-            canvas_string(glist_getcanvas(c)), tag, s->s_name,
+            canvas_tag(glist_getcanvas(c)), tag, s->s_name,
             fielddesc_getcoord(x->x_vec+2, template, data, 1));
         *predraw_bbox = 1;
     }
@@ -1601,7 +1601,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
             //    glist_getcanvas(c), tag, (int)fielddesc_getcoord(
             //        &x->x_rx.a_attr, template, data, 1));
             gui_vmess("gui_draw_configure", "sssi",
-                canvas_string(glist_getcanvas(c)), tag, s->s_name, (int)fielddesc_getcoord(
+                canvas_tag(glist_getcanvas(c)), tag, s->s_name, (int)fielddesc_getcoord(
                     &x->x_rx.a_attr, template, data, 1));
         else
         {
@@ -1609,7 +1609,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
             //    glist_getcanvas(c), tag, fielddesc_getcoord(
             //    x->x_vec+2, template, data, 1));
             gui_vmess("gui_draw_configure", "sssf",
-                canvas_string(glist_getcanvas(c)), tag, s->s_name, fielddesc_getcoord(
+                canvas_tag(glist_getcanvas(c)), tag, s->s_name, fielddesc_getcoord(
                     x->x_vec+2, template, data, 1));
             *predraw_bbox = 1;
         }
@@ -1621,7 +1621,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
             //    glist_getcanvas(c), tag, (int)fielddesc_getcoord(
             //    &x->x_ry.a_attr, template, data, 1));
             gui_vmess("gui_draw_configure", "sssi",
-                canvas_string(glist_getcanvas(c)), tag, s->s_name, (int)fielddesc_getcoord(
+                canvas_tag(glist_getcanvas(c)), tag, s->s_name, (int)fielddesc_getcoord(
                     &x->x_ry.a_attr, template, data, 1));
         else
         {
@@ -1629,7 +1629,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
             //    glist_getcanvas(c), tag, fielddesc_getcoord(
             //    x->x_vec+3, template, data, 1));
             gui_vmess("gui_draw_configure", "sssf",
-                canvas_string(glist_getcanvas(c)), tag, fielddesc_getcoord(
+                canvas_tag(glist_getcanvas(c)), tag, fielddesc_getcoord(
                     x->x_vec+3, template, data, 1));
             *predraw_bbox = 1;
         }
@@ -1657,7 +1657,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
         char mbuf[MAXPDSTRING];
         sprintf(mbuf, "matrix(%g %g %g %g %g %g)", m1, m2, m3, m4, m5, m6);
         gui_vmess("gui_draw_configure", "ssss",
-            canvas_string(glist_getcanvas(c)), tag, s->s_name,
+            canvas_tag(glist_getcanvas(c)), tag, s->s_name,
             mbuf);
         *predraw_bbox = 1;
     }
@@ -1667,7 +1667,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
         //    glist_getcanvas(c), tag, (int)fielddesc_getcoord(
         //    &x->x_vis.a_attr, template, data, 1) ? "normal" : "hidden");
         gui_vmess("gui_draw_configure", "ssss",
-            canvas_string(glist_getcanvas(c)), tag, "visibility", (int)fielddesc_getcoord(
+            canvas_tag(glist_getcanvas(c)), tag, "visibility", (int)fielddesc_getcoord(
             &x->x_vis.a_attr, template, data, 1) ? "visible" : "hidden");
         *predraw_bbox = 1;
     }
@@ -1681,7 +1681,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
             //sys_vgui(".x%lx.c itemconfigure %s -strokedasharray {",
             //    glist_getcanvas(c), tag);
             gui_start_vmess("gui_draw_configure", "sss",
-                canvas_string(glist_getcanvas(c)), tag, s->s_name);
+                canvas_tag(glist_getcanvas(c)), tag, s->s_name);
             gui_start_array();
             for (i = 0; i < x->x_ndash; i++)
             {
@@ -1700,7 +1700,7 @@ void svg_sendupdate(t_svg *x, t_canvas *c, t_symbol *s,
         char tagbuf[MAXPDSTRING];
         sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)parent, (long unsigned int)data);
         gui_start_vmess("gui_draw_configure", "sss",
-            canvas_string(glist_getcanvas(c)), tagbuf, "d"); 
+            canvas_tag(glist_getcanvas(c)), tagbuf, "d"); 
         /* let's turn off bbox caching so we can recalculate the bbox */
         if (x->x_pathrect_cache != -1)
            x->x_pathrect_cache = 0;
@@ -3757,7 +3757,7 @@ void svg_parentwidgettogui(t_gobj *z, t_glist *owner, t_word *data,
         sprintf(tagbuf, "draw%lx.%lx", (long unsigned int)x,
             (long unsigned int)data);
         gui_start_vmess("gui_draw_configure_all", "ss",
-            canvas_string(glist_getcanvas(owner)), tagbuf);
+            canvas_tag(glist_getcanvas(owner)), tagbuf);
         svg_togui((t_svg *)x->x_attr, template, data);
         gui_end_vmess();
     }
@@ -3843,7 +3843,7 @@ static void draw_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
                arrays) */
             //sys_vgui("nn gui_draw_vis \".x%lx\",\"%s\",\"", glist_getcanvas(glist),
             //    sa->x_type->s_name);
-            gui_start_vmess("gui_draw_vis", "ss", canvas_string(glist_getcanvas(glist)),
+            gui_start_vmess("gui_draw_vis", "ss", canvas_tag(glist_getcanvas(glist)),
                 sa->x_type->s_name);
 
             /* next send the gui drawing arguments: commands and points
@@ -4016,7 +4016,7 @@ static void draw_vis(t_gobj *z, t_glist *glist, t_glist *parentglist,
             char itemtagbuf[MAXPDSTRING];
             sprintf(itemtagbuf, "draw%lx.%lx", (long unsigned int)x,
                 (long unsigned int)data);
-            gui_vmess("gui_draw_erase_item", "ss", canvas_string(glist_getcanvas(glist)),
+            gui_vmess("gui_draw_erase_item", "ss", canvas_tag(glist_getcanvas(glist)),
                 itemtagbuf);
         }
                 
diff --git a/pd/src/g_text.c b/pd/src/g_text.c
index c19bbd42a..ffcca0418 100644
--- a/pd/src/g_text.c
+++ b/pd/src/g_text.c
@@ -710,7 +710,7 @@ static void message_click(t_message *x,
         sys_vgui(".x%lx.c itemconfigure %sR -strokewidth 5\n", 
             glist_getcanvas(x->m_glist), rtext_gettag(y));
         gui_vmess("gui_message_flash", "ssi",
-            canvas_string(glist_getcanvas(x->m_glist)),
+            canvas_tag(glist_getcanvas(x->m_glist)),
             rtext_gettag(y), 1);
         clock_delay(x->m_clock, 120);
     }
@@ -724,7 +724,7 @@ static void message_tick(t_message *x)
         sys_vgui(".x%lx.c itemconfigure %sR -strokewidth 1\n",
             glist_getcanvas(x->m_glist), rtext_gettag(y));
         gui_vmess("gui_message_flash", "ssi",
-            canvas_string(glist_getcanvas(x->m_glist)),
+            canvas_tag(glist_getcanvas(x->m_glist)),
             rtext_gettag(y), 0);
     }
 }
@@ -1566,7 +1566,7 @@ static void text_select(t_gobj *z, t_glist *glist, int state)
                 glist_getcanvas(glist), rtext_gettag(y),
                 (state? "$pd_colors(selection)" : outline));
             gui_vmess("gui_text_select_color", "ss",
-                canvas_string(glist_getcanvas(glist)), rtext_gettag(y));
+                canvas_tag(glist_getcanvas(glist)), rtext_gettag(y));
             if (z->g_pd == gatom_class)
             {
                 sys_vgui(".x%lx.c itemconfigure %lx.l -fill %s\n",
@@ -1587,7 +1587,7 @@ static void text_select(t_gobj *z, t_glist *glist, int state)
                 sys_vgui(".x%lx.c addtag selected withtag %sR \n",
                     glist_getcanvas(glist), rtext_gettag(y));
                 gui_vmess("gui_text_select", "ss",
-                    canvas_string(glist_getcanvas(glist)), rtext_gettag(y));
+                    canvas_tag(glist_getcanvas(glist)), rtext_gettag(y));
 
                 if (pd_class(&x->te_pd) == text_class && x->te_type != T_TEXT && glist_istoplevel(glist))
                     sys_vgui(".x%lx.c itemconfigure %sR -strokewidth 1 -strokedasharray {} "
@@ -1619,7 +1619,7 @@ static void text_select(t_gobj *z, t_glist *glist, int state)
                 sys_vgui(".x%lx.c dtag %sR selected\n",
                     glist_getcanvas(glist), rtext_gettag(y));
                 gui_vmess("gui_text_deselect", "ss",
-                    canvas_string(glist_getcanvas(glist)),
+                    canvas_tag(glist_getcanvas(glist)),
                     rtext_gettag(y));
 
                 if (pd_class(&x->te_pd) == text_class && x->te_type != T_TEXT)
@@ -1693,7 +1693,7 @@ static void text_vis(t_gobj *z, t_glist *glist, int vis)
                 // make a group
                 text_getrect(&x->te_g, glist, &x1, &y1, &x2, &y2);
                 gui_vmess("gui_text_create_gobj", "ssii",
-                    canvas_string(glist), rtext_gettag(y), x1, y1);
+                    canvas_tag(glist), rtext_gettag(y), x1, y1);
 
                 if (x->te_type == T_ATOM)
                     glist_retext(glist, x);
@@ -1913,7 +1913,7 @@ void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime,
 
 
             gui_vmess("gui_canvas_drawio", "sssiiiiiisiii",
-                canvas_string(glist_getcanvas(glist)), rtext_gettag(y), tag,
+                canvas_tag(glist_getcanvas(glist)), rtext_gettag(y), tag,
                 onset, y2 - 2, onset + IOWIDTH, y2, x1, y1, "o", i,
                 issignal, 0);
         }
@@ -1953,7 +1953,7 @@ void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime,
             //    (issignal ? "signal" : "control"),
             //    (selected ? "selected" : ""));
             gui_vmess("gui_canvas_drawio", "sssiiiiiisiii",
-                canvas_string(glist_getcanvas(glist)), rtext_gettag(y), tag,
+                canvas_tag(glist_getcanvas(glist)), rtext_gettag(y), tag,
                 onset, y1, onset + IOWIDTH, y1 + EXTRAPIX, x1, y1, "i", i,
                 issignal, 0);
         }
@@ -2111,7 +2111,7 @@ void text_drawborder(t_text *x, t_glist *glist,
                     (selected ? "selected" : ""));
             */
             gui_vmess("gui_text_drawborder", "ssiiiii",
-                canvas_string(glist_getcanvas(glist)), tag, broken, x1, y1, x2, y2);
+                canvas_tag(glist_getcanvas(glist)), tag, broken, x1, y1, x2, y2);
                
                 //-dash %s -> pattern disabled for tkpath
         }
@@ -2123,7 +2123,7 @@ void text_drawborder(t_text *x, t_glist *glist,
                 glist_getcanvas(glist), tag,
                     x1, y1,  x2, y1,  x2, y2,  x1, y2,  x1, y1);
             gui_vmess("gui_text_redraw_border", "ssiiii",
-                canvas_string(glist_getcanvas(glist)), tag, x1, y1, x2, y2);
+                canvas_tag(glist_getcanvas(glist)), tag, x1, y1, x2, y2);
 /* this seems to be totally extraneous  hans@at.or.at
              sys_vgui(".x%lx.c itemconfigure %sR -dash %s -outline %s\n", 
                      glist_getcanvas(glist), tag, pattern, outline); */
@@ -2148,7 +2148,7 @@ void text_drawborder(t_text *x, t_glist *glist,
             // coords are a quick hack to separate gobj's x/y from the polygon's coords
             // which of course can be greatly simplified
             gui_vmess("gui_message_drawborder", "ssii",
-                canvas_string(glist_getcanvas(glist)), tag, x2 - x1, y2 - y1);
+                canvas_tag(glist_getcanvas(glist)), tag, x2 - x1, y2 - y1);
 //                x1-x1, y1-y1, x2+4-x1, y1-y1, x2-x1,
 //                y1+4-y1, x2-x1, y2-4-y1, x2+4-x1, y2-y1, x1-x1, y2-y1, x1-x1, y1-y1);
         }
@@ -2160,7 +2160,7 @@ void text_drawborder(t_text *x, t_glist *glist,
                 x1, y1,  x2+4, y1,  x2, y1+4,  x2, y2-4,  x2+4, y2,
                 x1, y2,  x1, y1);
             gui_vmess("gui_message_redraw_border", "ssiiiiiiiiiiiiii",
-                canvas_string(glist_getcanvas(glist)), tag,
+                canvas_tag(glist_getcanvas(glist)), tag,
                 x1-x1, y1-y1,  x2+4-x1, y1-y1,  x2-x1, y1+4-y1, x2-x1, y2-4-y1,  x2+4-x1, y2-y1,
                 x1-x1, y2-y1,  x1-x1, y1-y1);
         }
@@ -2180,7 +2180,7 @@ void text_drawborder(t_text *x, t_glist *glist,
                     tag, tag, (selected ? "selected" : ""));
 
             gui_vmess("gui_atom_drawborder", "ssiiiiiiiiiiii",
-                canvas_string(glist_getcanvas(glist)), tag,
+                canvas_tag(glist_getcanvas(glist)), tag,
                 x1-x1, y1-y1, x2-4-x1, y1-y1, x2-x1,
                 y1+4-y1, x2-x1, y2-y1, x1-x1, y2-y1, x1-x1, y1-y1);
         }
@@ -2350,7 +2350,7 @@ void glist_eraseiofor(t_glist *glist, t_object *ob, char *tag)
 void text_erase_gobj(t_text *x, t_glist *glist, char *tag)
 {
     if (x->te_type == T_TEXT && !glist->gl_edit) return;
-    gui_vmess("gui_gobj_erase", "ss", canvas_string(glist_getcanvas(glist)), tag);
+    gui_vmess("gui_gobj_erase", "ss", canvas_tag(glist_getcanvas(glist)), tag);
 }
 
 void text_eraseborder(t_text *x, t_glist *glist, char *tag)
diff --git a/pd/src/g_toggle.c b/pd/src/g_toggle.c
index 4cd25d449..6c10974db 100644
--- a/pd/src/g_toggle.c
+++ b/pd/src/g_toggle.c
@@ -30,12 +30,10 @@ void toggle_draw_update(t_gobj *xgobj, t_glist *glist)
             //         (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol);
             //sys_vgui(".x%lx.c itemconfigure %lxX2 -stroke #%6.6x\n", canvas, x,
             //         (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol);
-            char tagbuf[MAXPDSTRING];
             char colorbuf[MAXPDSTRING];
-            sprintf(tagbuf, "x%lx", (long unsigned int)x);
             sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol);
-            gui_vmess("gui_toggle_update", "ssis", canvas_string(canvas),
-                tagbuf, x->x_on != 0.0, colorbuf);
+            gui_vmess("gui_toggle_update", "ssis", canvas_tag(canvas),
+                gobj_tag(x), x->x_on != 0.0, colorbuf);
         }
         x->x_gui.x_changed = 0;
     }
@@ -43,8 +41,7 @@ void toggle_draw_update(t_gobj *xgobj, t_glist *glist)
 
 void toggle_draw_new(t_toggle *x, t_glist *glist)
 {
-    char tagbuf[MAXPDSTRING], colorbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
+    char colorbuf[8];
     t_canvas *canvas=glist_getcanvas(glist);
     int w=(x->x_gui.x_w+29)/30;
     int x1=text_xpix(&x->x_gui.x_obj, glist);
@@ -60,8 +57,8 @@ void toggle_draw_new(t_toggle *x, t_glist *glist)
     //sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %d "
     //    "-stroke #%6.6x -tags {%lxX2 x%lx text iemgui}\n",
     //    canvas, x1+w+1, y2-w-1, x2-w-1, y1+w+1, w, col, x, x);
-    gui_vmess("gui_create_toggle", "sssiiiiiiiiiiii", canvas_string(canvas),
-        tagbuf, colorbuf, w,
+    gui_vmess("gui_create_toggle", "sssiiiiiiiiiiii", canvas_tag(canvas),
+        gobj_tag(x), colorbuf, w,
         (x->x_on != 0.0),
         x1+w+1, y1+w+1, x2-w-1, y2-w-1,
         x1+w+1, y2-w-1, x2-w-1, y1+w+1, x1, y1);
@@ -81,10 +78,8 @@ void toggle_draw_move(t_toggle *x, t_glist *glist)
     //    canvas, x, x1+s, y1+s, x2-s, y2-s);
     //sys_vgui(".x%lx.c coords %lxX2 %d %d %d %d\n",
     //    canvas, x, x1+s, y2-s, x2-s, y1+s);
-    char tagbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     gui_vmess("gui_toggle_resize_cross", "ssiiiiiiiiiii",
-        canvas_string(canvas), tagbuf,
+        canvas_tag(canvas), gobj_tag(x),
         w,
         x1+s, y1+s, x2-s, y2-s,
         x1+s, y2-s, x2-s, y1+s,
@@ -97,12 +92,10 @@ void toggle_draw_config(t_toggle* x, t_glist* glist)
     iemgui_base_draw_config(&x->x_gui);
     //sys_vgui(".x%lx.c itemconfigure {%lxX1||%lxX2} -stroke #%6.6x\n",
     //    canvas, x, x, x->x_on?x->x_gui.x_fcol:x->x_gui.x_bcol);
-    char tagbuf[MAXPDSTRING];
     char colorbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     sprintf(colorbuf, "#%6.6x", x->x_gui.x_fcol);
-    gui_vmess("gui_toggle_update", "ssis", canvas_string(canvas),
-    tagbuf, x->x_on != 0.0, colorbuf);
+    gui_vmess("gui_toggle_update", "ssis", canvas_tag(canvas),
+    gobj_tag(x), x->x_on != 0.0, colorbuf);
 }
 
 static void toggle__clickhook(t_scalehandle *sh, int newstate)
diff --git a/pd/src/g_vumeter.c b/pd/src/g_vumeter.c
index adc304f4b..5d338fb9a 100644
--- a/pd/src/g_vumeter.c
+++ b/pd/src/g_vumeter.c
@@ -77,11 +77,9 @@ static void vu_update_rms(t_vu *x, t_glist *glist)
         //sys_vgui(".x%lx.c coords %lxRCOVER %d %d %d %d\n",
         //    glist_getcanvas(glist), x, quad1 + 1, off + 2, quad3 + 1,
         //    off + (x->x_led_size + 1) * (IEM_VU_STEPS - x->x_rms) + 2);
-        char tagbuf[MAXPDSTRING];
-        sprintf(tagbuf, "x%lx", (long unsigned int)x);
         gui_vmess("gui_vumeter_update_rms", "ssiiiiii",
-            canvas_string(glist_getcanvas(glist)),
-            tagbuf, quad1 + 1, off + 2, quad3 + 1, off + (x->x_led_size + 1) *
+            canvas_tag(glist_getcanvas(glist)), gobj_tag(x),
+            quad1 + 1, off + 2, quad3 + 1, off + (x->x_led_size + 1) *
             (IEM_VU_STEPS - x->x_rms) + 2, x1, y1);
     }
 }
@@ -103,12 +101,10 @@ static void vu_update_peak(t_vu *x, t_glist *glist)
 
             //sys_vgui(".x%lx.c coords %lxPLED %d %d %d %d\n",
             //    canvas, x, x1 + 1, j + 2, x1 + x->x_gui.x_w + 2, j + 2);
-            char tagbuf[MAXPDSTRING];
-            sprintf(tagbuf, "x%lx", (long unsigned int)x);
             char colorbuf[MAXPDSTRING];
             sprintf(colorbuf, "#%6.6x", iemgui_color_hex[i]);
             gui_vmess("gui_vumeter_update_peak", "sssiiiiii",
-                canvas_string(canvas), tagbuf, colorbuf,
+                canvas_tag(canvas), gobj_tag(x), colorbuf,
                 x1 + 1, j + 2, x1 + x->x_gui.x_w + 2, j + 2, x1, y1);
 
             //sys_vgui(".x%lx.c itemconfigure %lxPLED -stroke #%6.6x\n",
@@ -123,13 +119,11 @@ static void vu_update_peak(t_vu *x, t_glist *glist)
             //sys_vgui(".x%lx.c coords %lxPLED %d %d %d %d\n",
             //         canvas, x, mid+1, y1+22, mid+1, y1+22);
 
-            char tagbuf[MAXPDSTRING];
-            sprintf(tagbuf, "x%lx", (long unsigned int)x);
             char colorbuf[MAXPDSTRING];
             sprintf(colorbuf, "#%6.6x", x->x_gui.x_bcol);
 
             gui_vmess("gui_vumeter_update_peak", "sssiiiiii",
-                canvas_string(canvas), tagbuf, colorbuf,
+                canvas_tag(canvas), gobj_tag(x), colorbuf,
                 mid+1, y1+22, mid+1, y1+22, x1, y1);
         }
     }
@@ -171,13 +165,12 @@ static void vu_draw_new(t_vu *x, t_glist *glist)
             //    "-tags {%lxSCALEN %lxSCALE%d x%lx text iemgui}\n",
             //    canvas, end+1, yyy+k3+2, iemgui_vu_scale_str[i/4], 
             //    iemgui_font(&x->x_gui), x->x_gui.x_lcol, x, x, i, x);
-            char tagbuf[MAXPDSTRING];
-            sprintf(tagbuf, "x%lx", (long unsigned int)x);
             char colorbuf[MAXPDSTRING];
             sprintf(colorbuf, "#%6.6x", x->x_gui.x_lcol);
             // not handling font size yet
-            gui_vmess("gui_create_vumeter_text", "sssiisiii", canvas_string(canvas),
-                tagbuf, colorbuf, end+1, yyy+k3+2, iemgui_vu_scale_str[i/4],
+            gui_vmess("gui_create_vumeter_text", "sssiisiii",
+                canvas_tag(canvas), gobj_tag(x),
+                colorbuf, end+1, yyy+k3+2, iemgui_vu_scale_str[i/4],
                 i, x1, y1);
         }
         led_col = iemgui_vu_col[i];
@@ -188,12 +181,10 @@ static void vu_draw_new(t_vu *x, t_glist *glist)
             //"-tags {%lxRLED%d x%lx text iemgui}\n",
             //canvas, quad1+1, yyy+2, quad3, yyy+2,
             //x->x_led_size, iemgui_color_hex[led_col], x, i, x);
-            char tagbuf[MAXPDSTRING];
-            sprintf(tagbuf, "x%lx", (long unsigned int)x);
             char colorbuf[MAXPDSTRING];
             sprintf(colorbuf, "#%6.6x", iemgui_color_hex[led_col]);
             gui_vmess("gui_create_vumeter_steps", "sssiiiiiiiii",
-                canvas_string(canvas), tagbuf, colorbuf, quad1+1,
+                canvas_tag(canvas), gobj_tag(x), colorbuf, quad1+1,
                 yyy+2, quad3, yyy+2, x->x_led_size, index, x1, y1, i);
         }
     }
@@ -201,20 +192,20 @@ static void vu_draw_new(t_vu *x, t_glist *glist)
     //    "-stroke #%6.6x -tags {%lxRCOVER x%lx text iemgui}\n",
     //    canvas, quad1+1, y1+1, quad3, y1+1 + k1*IEM_VU_STEPS,
     //    x->x_gui.x_bcol, x->x_gui.x_bcol, x, x);
-    char tagbuf[MAXPDSTRING];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     char colorbuf[MAXPDSTRING];
     sprintf(colorbuf, "#%6.6x", x->x_gui.x_bcol);
-    gui_vmess("gui_create_vumeter_rect", "sssiiiiii", canvas_string(canvas),
-        tagbuf, colorbuf, quad1+1, y1+1, quad3, y1+1 + k1*IEM_VU_STEPS, x1, y1);
+    gui_vmess("gui_create_vumeter_rect", "sssiiiiii",
+        canvas_tag(canvas), gobj_tag(x),
+        colorbuf, quad1+1, y1+1, quad3, y1+1 + k1*IEM_VU_STEPS, x1, y1);
     //sys_vgui(".x%lx.c create polyline %d %d %d %d "
     //    "-strokewidth %d -fill #%6.6x "
     //    "-tags {%lxPLED x%lx text iemgui}\n",
     //    canvas, mid+1, y1+12,
     //    mid+1, y1+12, x->x_led_size, x->x_gui.x_bcol, x, x);
     sprintf(colorbuf, "#%6.6x", x->x_gui.x_bcol);
-    gui_vmess("gui_create_vumeter_peak", "sssiiiiiii", canvas_string(canvas),
-        tagbuf, colorbuf, mid+1, y1+12, mid+1, y1+12, x->x_led_size, x1, y1);
+    gui_vmess("gui_create_vumeter_peak", "sssiiiiiii",
+        canvas_tag(canvas), gobj_tag(x),
+        colorbuf, mid+1, y1+12, mid+1, y1+12, x->x_led_size, x1, y1);
     x->x_updaterms = x->x_updatepeak = 1;
     sys_queuegui(x, x->x_gui.x_glist, vu_draw_update);
 }
@@ -234,29 +225,23 @@ static void vu_draw_move(t_vu *x, t_glist *glist)
 
     //sys_vgui(".x%lx.c coords %lxBASE %d %d %d %d\n",
     //    canvas, x, x1, y1, x1+x->x_gui.x_w+2,y1+x->x_gui.x_h+4);
-    char tagbuffer[MAXPDSTRING];
-    sprintf(tagbuffer, "x%lx", (long unsigned int)x);
     gui_vmess("gui_vumeter_border_coords", "ssii",
-        canvas_string(canvas), tagbuffer, x->x_gui.x_w+2, x->x_gui.x_h+4);
+        canvas_tag(canvas), gobj_tag(x), x->x_gui.x_w+2, x->x_gui.x_h+4);
     for(i=1; i<=IEM_VU_STEPS; i++)
     {
         yyy = k4 + k1*(k2-i);
         //sys_vgui(".x%lx.c coords %lxRLED%d %d %d %d %d\n",
         //    canvas, x, i, quad1+1, yyy+2, quad3, yyy+2);
-        char tagbuf[MAXPDSTRING];
-        sprintf(tagbuf, "x%lx", (long unsigned int)x);
         gui_vmess("gui_update_vumeter_step_coords", "ssiiiiiii",
-            canvas_string(canvas), tagbuf, i, quad1+1, yyy+2, quad3, yyy+2,
+            canvas_tag(canvas), gobj_tag(x), i, quad1+1, yyy+2, quad3, yyy+2,
             x1, y1);
 //        if(((i+2)&3) && (x->x_scale))
         if((i&3)==1 && (x->x_scale))
         {
             //sys_vgui(".x%lx.c coords %lxSCALE%d %d %d\n",
             //    canvas, x, i, end+1, yyy+k3+2);
-            char tagbuf[MAXPDSTRING];
-            sprintf(tagbuf, "x%lx", (long unsigned int)x);
             gui_vmess("gui_vumeter_text_coords", "ssiiiii",
-                canvas_string(canvas), tagbuf, i,
+                canvas_tag(canvas), gobj_tag(x), i,
                 end+1, yyy+k3+2, x1, y1);
         }
     }
@@ -266,10 +251,8 @@ static void vu_draw_move(t_vu *x, t_glist *glist)
         yyy = k4 + k1*(k2-i);
         //sys_vgui(".x%lx.c coords %lxSCALE%d %d %d\n",
         //    canvas, x, i, end+1, yyy+k3+2);
-        char tagbuf[MAXPDSTRING];
-        sprintf(tagbuf, "x%lx", (long unsigned int)x);
         gui_vmess("gui_vumeter_text_coords", "ssiiiii",
-            canvas_string(canvas), tagbuf, i,
+            canvas_tag(canvas), gobj_tag(x), i,
             end+1, yyy+k3+2, x1, y1);
     }
     x->x_updaterms = x->x_updatepeak = 1;
@@ -287,10 +270,8 @@ static void vu_draw_config(t_vu* x, t_glist* glist)
         {
             //sys_vgui(".x%lx.c itemconfigure %lxRLED%d -strokewidth %d\n",
             //    canvas, x, i, x->x_led_size);
-            char tagbuf[MAXPDSTRING];
-            sprintf(tagbuf, "x%lx", (long unsigned int)x);
             gui_vmess("gui_update_vumeter_steps", "ssii",
-                canvas_string(canvas), tagbuf, i, x->x_led_size);
+                canvas_tag(canvas), gobj_tag(x), i, x->x_led_size);
         }
         //if((i&3)==1)
         if((i&3)==1)
@@ -302,10 +283,8 @@ static void vu_draw_config(t_vu* x, t_glist* glist)
 
             int isselected = x->x_gui.x_selected == canvas &&
                 x->x_gui.x_glist == canvas && x->x_scale;
-            char tagbuf[MAXPDSTRING];
-            sprintf(tagbuf, "x%lx", (long unsigned int)x);
             gui_vmess("gui_update_vumeter_text", "ssssisi",
-                canvas_string(canvas), tagbuf, iemgui_vu_scale_str[i/4],
+                canvas_tag(canvas), gobj_tag(x), iemgui_vu_scale_str[i/4],
                 iemgui_font(&x->x_gui), isselected, lcol, i);
         }
     }
@@ -313,14 +292,12 @@ static void vu_draw_config(t_vu* x, t_glist* glist)
     //         canvas, x, x->x_gui.x_bcol, x->x_gui.x_bcol);
     //sys_vgui(".x%lx.c itemconfigure %lxPLED -strokewidth %d\n",
     //         canvas, x, x->x_led_size);
-    char tagbuf[MAXPDSTRING];
     char bcol[8];
-    sprintf(tagbuf, "x%lx", (long unsigned int)x);
     sprintf(bcol, "#%6.6x", x->x_gui.x_bcol);
     gui_vmess("gui_update_vumeter_rect", "sss",
-        canvas_string(canvas), tagbuf, bcol);
+        canvas_tag(canvas), gobj_tag(x), bcol);
     gui_vmess("gui_update_vumeter_peak", "ssi",
-        canvas_string(canvas), tagbuf, x->x_led_size);
+        canvas_tag(canvas), gobj_tag(x), x->x_led_size);
     iemgui_base_draw_config(&x->x_gui);
 }
 
@@ -523,18 +500,14 @@ static void vu_scale(t_vu *x, t_floatarg fscale)
                 if((i&3)==1)
                 {
                     //sys_vgui(".x%lx.c delete %lxSCALE%d\n", canvas, x, i);
-                    char tagbuf[MAXPDSTRING];
-                    sprintf(tagbuf, "x%lx", (long unsigned int)x);
                     gui_vmess("gui_erase_vumeter_text", "ssi",
-                        canvas_string(canvas), tagbuf, i);
+                        canvas_tag(canvas), gobj_tag(x), i);
                 }
             }
             i=IEM_VU_STEPS+1;
-            char tagbuf[MAXPDSTRING];
-            sprintf(tagbuf, "x%lx", (long unsigned int)x);
             sys_vgui(".x%lx.c delete %lxSCALE%d\n", canvas, x, i);
             gui_vmess("gui_erase_vumeter_text", "ssi",
-                canvas_string(canvas), tagbuf, i);
+                canvas_tag(canvas), gobj_tag(x), i);
         }
     }
     if(!x->x_scale && scale)
@@ -557,12 +530,10 @@ static void vu_scale(t_vu *x, t_floatarg fscale)
                     //         "-font %s -fill #%6.6x -tags {%lxSCALE%d x%lx}\n",
                     //    canvas, end+1, yyy+k3+2, iemgui_vu_scale_str[i/4], 
                     //    iemgui_font(&x->x_gui), x->x_gui.x_lcol, x, i, x);
-                    char tagbuf[MAXPDSTRING];
                     char colorbuf[MAXPDSTRING];
-                    sprintf(tagbuf, "x%lx", (long unsigned int)x);
                     sprintf(colorbuf, "#%6.6x", x->x_gui.x_lcol);
                     gui_vmess("gui_create_vumeter_text", "sssiisiii",
-                        canvas_string(canvas), tagbuf, colorbuf,
+                        canvas_tag(canvas), gobj_tag(x), colorbuf,
                         end+1, yyy+k3+2, iemgui_vu_scale_str[i/4],
                         i, end, yyy);
                 }
@@ -573,12 +544,10 @@ static void vu_scale(t_vu *x, t_floatarg fscale)
             //         "-font %s -fill #%6.6x -tags {%lxSCALE%d x%lx}\n",
             //    canvas, end+1, yyy+k3+2, iemgui_vu_scale_str[i/4], 
             //    iemgui_font(&x->x_gui), x->x_gui.x_lcol, x, i, x);
-            char tagbuf[MAXPDSTRING];
             char colorbuf[MAXPDSTRING];
-            sprintf(tagbuf, "x%lx", (long unsigned int)x);
             sprintf(colorbuf, "#%6.6x", x->x_gui.x_lcol);
             gui_vmess("gui_create_vumeter_text", "sssiisiii",
-                canvas_string(canvas), tagbuf, colorbuf,
+                canvas_tag(canvas), gobj_tag(x), colorbuf,
                 end+1, yyy+k3+2, iemgui_vu_scale_str[i/4],
                 i, end, yyy);
         }
diff --git a/pd/src/x_gui.c b/pd/src/x_gui.c
index fd09cce3c..364bf29b0 100644
--- a/pd/src/x_gui.c
+++ b/pd/src/x_gui.c
@@ -253,13 +253,13 @@ static void *openpanel_new( void)
     return (x);
 }
 
-extern char *canvas_string(t_canvas *x);
+extern char *canvas_tag(t_canvas *x);
 static void openpanel_symbol(t_openpanel *x, t_symbol *s)
 {
     char *path = (s && s->s_name) ? s->s_name : "$pd_opendir";
     sys_vgui("pdtk_openpanel {%s} {%s}\n", x->x_s->s_name, path);
     gui_vmess("gui_openpanel", "sss",
-        canvas_string(x->x_canvas),
+        canvas_tag(x->x_canvas),
         x->x_s->s_name,
         path);
 }
@@ -319,7 +319,7 @@ static void savepanel_symbol(t_savepanel *x, t_symbol *s)
     char *path = (s && s->s_name) ? s->s_name : "$pd_opendir";
     sys_vgui("pdtk_savepanel {%s} {%s}\n", x->x_s->s_name, path);
     gui_vmess("gui_savepanel", "sss",
-        canvas_string(x->x_canvas),
+        canvas_tag(x->x_canvas),
         x->x_s->s_name,
         path);
 }
-- 
GitLab