From afb189f426e1c21991d588eb790078f4c503ca8b Mon Sep 17 00:00:00 2001
From: Mathieu L Bouchard <matju@artengine.ca>
Date: Sun, 17 Aug 2014 00:52:58 -0400
Subject: [PATCH] remove canvas/glist arg in a bunch of recently added iemgui
 functions, and introduce iemgui_draw_move & iemgui_draw_config

---
 pd/src/g_all_guis.c | 228 +++++++++++++++++++++++++-------------------
 pd/src/g_all_guis.h |  39 ++++----
 pd/src/g_bang.c     |  19 ++--
 pd/src/g_canvas.c   |  12 +--
 pd/src/g_mycanvas.c |  13 +--
 pd/src/g_numbox.c   |  31 +++---
 pd/src/g_radio.c    |  26 +++--
 pd/src/g_slider.c   |  20 ++--
 pd/src/g_toggle.c   |  19 ++--
 pd/src/g_vumeter.c  |  23 ++---
 10 files changed, 220 insertions(+), 210 deletions(-)

diff --git a/pd/src/g_all_guis.c b/pd/src/g_all_guis.c
index e24577169..ca6b6a2f4 100644
--- a/pd/src/g_all_guis.c
+++ b/pd/src/g_all_guis.c
@@ -187,7 +187,7 @@ void iemgui_send(t_iemgui *x, t_symbol *s)
     x->x_snd_unexpanded = snd;
     x->x_snd = snd = canvas_realizedollar(x->x_glist, snd);
     iemgui_verify_snd_ne_rcv(x);
-    iemgui_draw_io(x, x->x_glist, oldsndrcvable);
+    iemgui_draw_io(x, oldsndrcvable);
 }
 
 void iemgui_receive(t_iemgui *x, t_symbol *s)
@@ -217,7 +217,7 @@ void iemgui_receive(t_iemgui *x, t_symbol *s)
         x->x_rcv = rcv;
     }
     iemgui_verify_snd_ne_rcv(x);
-    iemgui_draw_io(x, x->x_glist, oldsndrcvable);
+    iemgui_draw_io(x, oldsndrcvable);
 }
 
 void iemgui_label(t_iemgui *x, t_symbol *s)
@@ -352,6 +352,49 @@ void iemgui_label_getrect(t_iemgui x_gui, t_glist *x,
     }
 }
 
+#if 0 // future way of reordering stuff for iemgui_shouldvis
+/*
+    // some day when the object tagging is
+    // properly done for all GUI objects
+    glist_noselect(canvas);
+    glist_select(canvas, y);
+    t_gobj *yy = canvas->gl_list;
+    if (yy != y)
+    {
+        while (yy && yy->g_next != y)
+            yy = yy->g_next;
+        // now we have yy which is right before our y graph
+        t_rtext *yr = NULL;
+        if (yy)
+        {
+            yr = glist_findrtext(canvas, (t_text *)yy);
+        }
+        if (yr)
+        {
+            fprintf(stderr,"lower\n");
+            sys_vgui(".x%lx.c lower selected %s\n", canvas, rtext_gettag(yr));
+            sys_vgui(".x%lx.c raise selected %s\n", canvas, rtext_gettag(yr));
+            //canvas_raise_all_cords(canvas);
+        }
+        else
+        {
+            // fall back to legacy redraw for objects
+            //   that are not patchable
+            fprintf(stderr,"lower fallback redraw\n");
+            canvas_redraw(canvas);
+        }
+    }
+    else
+    {
+        // we get here if we are supposed to go
+        //   all the way to the bottom
+        fprintf(stderr,"lower to the bottom\n");
+        sys_vgui(".x%lx.c lower selected\n", canvas);
+    }
+    glist_noselect(canvas);
+*/
+#endif
+
 void iemgui_shouldvis(t_iemgui *x, int mode)
 {
     gop_redraw = 1;
@@ -360,7 +403,7 @@ void iemgui_shouldvis(t_iemgui *x, int mode)
         if (!x->x_vis)
         {
             //fprintf(stderr,"draw new %d\n", mode);
-            iemgui_draw_new(x, x->x_glist);
+            iemgui_draw_new(x);
             canvas_fixlinesfor(glist_getcanvas(x->x_glist), (t_text*)x);
             x->x_vis = 1;
             if (x->x_glist != glist_getcanvas(x->x_glist))
@@ -375,64 +418,20 @@ void iemgui_shouldvis(t_iemgui *x, int mode)
                 // reorder it visually
                 glist_redraw(canvas);
 
-                /*
-                    // some day when the object tagging is
-                    // properly done for all GUI objects
-                glist_noselect(canvas);
-                glist_select(canvas, y);
-                t_gobj *yy = canvas->gl_list;
-                if (yy != y)
-                {
-                    fprintf(stderr,"not bottom\n");
-                    while (yy && yy->g_next != y)
-                    {
-                        fprintf(stderr,"+\n");
-                        yy = yy->g_next;
-                    }
-                    // now we have yy which is right before our y graph
-                    t_object *ob = NULL;
-                    t_rtext *yr = NULL;
-                    if (yy)
-                    {
-                        yr = glist_findrtext(canvas, (t_text *)yy);
-                    }
-                    if (yr)
-                    {
-                        fprintf(stderr,"lower\n");
-                        sys_vgui(".x%lx.c lower selected %s\n",
-                            canvas, rtext_gettag(yr));
-                        sys_vgui(".x%lx.c raise selected %s\n",
-                            canvas, rtext_gettag(yr));
-                        //canvas_raise_all_cords(canvas);
-                    }
-                    else
-                    {
-                        // fall back to legacy redraw for objects
-                        //   that are not patchable
-                        fprintf(stderr,"lower fallback redraw\n");
-                        canvas_redraw(canvas);
-                    }
-                }
-                else
-                {
-                    // we get here if we are supposed to go
-                    //   all the way to the bottom
-                    fprintf(stderr,"lower to the bottom\n");
-                    sys_vgui(".x%lx.c lower selected\n", canvas);
-                }
-                glist_noselect(canvas);
-                */
             }
         }
         //fprintf(stderr,"draw move x->x_w=%d\n", x->x_w);
-        x->x_draw(x, x->x_glist, mode);
+        if      (mode==IEM_GUI_DRAW_MODE_NEW)    iemgui_draw_new(   x);
+        else if (mode==IEM_GUI_DRAW_MODE_MOVE)   iemgui_draw_move(  x);
+        else if (mode==IEM_GUI_DRAW_MODE_CONFIG) iemgui_draw_config(x);
+        else bug("iemgui_shouldvis");
         scalehandle_check_and_redraw(x);
         canvas_fixlinesfor(glist_getcanvas(x->x_glist), (t_text*)x);
     }
     else if (x->x_vis)
     {
         //fprintf(stderr,"draw erase %d\n", mode);
-        iemgui_draw_erase(x, x->x_glist);
+        iemgui_draw_erase(x);
         x->x_vis = 0;
     }
     gop_redraw = 0;
@@ -487,7 +486,7 @@ void iemgui_displace_withtag(t_gobj *z, t_glist *glist, int dx, int dy)
     t_iemgui *x = (t_iemgui *)z;
     x->x_obj.te_xpix += dx;
     x->x_obj.te_ypix += dy;
-    //x->x_gui.x_draw((void *)z, glist, IEM_GUI_DRAW_MODE_MOVE);
+    //iemgui_draw_move(x);
     canvas_fixlinesfor(glist_getcanvas(glist), (t_text *)z);
 }
 
@@ -504,9 +503,9 @@ void iemgui_select(t_gobj *z, t_glist *glist, int selected)
     sys_vgui(".x%lx.c itemconfigure {x%lx&&border} -stroke %s\n", canvas, x,
         x->x_selected && x->x_glist == canvas ? selection_color : fcol);
     x->x_draw((void *)z, glist, IEM_GUI_DRAW_MODE_SELECT);
-    scalehandle_draw(x,glist);
-    iemgui_label_draw_select(x,canvas);
-    iemgui_tag_selected(x,canvas);
+    scalehandle_draw(x);
+    iemgui_label_draw_select(x);
+    iemgui_tag_selected(x);
 }
 
 void iemgui_delete(t_gobj *z, t_glist *glist)
@@ -520,10 +519,10 @@ void iemgui_vis(t_gobj *z, t_glist *glist, int vis)
     if (gobj_shouldvis(z, glist))
     {
         if (vis)
-            iemgui_draw_new(x, glist);
+            iemgui_draw_new(x);
         else
         {
-            iemgui_draw_erase(x, x->x_glist);
+            iemgui_draw_erase(x);
             sys_unqueuegui(z);
         }
         x->x_vis = vis;
@@ -640,9 +639,10 @@ void scalehandle_bind(t_scalehandle *h) {
 // in 18 cases only, because canvas does not fit the pattern below.
 // canvas has no label handle and has a motion handle
 // but in the case of canvas, the "iemgui" tag is added (it wasn't the case originally)
-void scalehandle_draw_select(t_scalehandle *h, t_glist *canvas, int px, int py) {
+void scalehandle_draw_select(t_scalehandle *h, int px, int py) {
     char tags[128]; // BNG may need up to 100 chars in 64-bit mode, for example
     t_iemgui *x = (t_iemgui *)h->h_master;
+    t_canvas *canvas=glist_getcanvas(x->x_glist);
 
     //int px,py;
     //t_class *c = pd_class((t_pd *)x);
@@ -659,7 +659,7 @@ void scalehandle_draw_select(t_scalehandle *h, t_glist *canvas, int px, int py)
     int sx = h->h_scale ? SCALEHANDLE_WIDTH  : LABELHANDLE_WIDTH;
     int sy = h->h_scale ? SCALEHANDLE_HEIGHT : LABELHANDLE_HEIGHT;
 
-    scalehandle_draw_erase(h,canvas);
+    scalehandle_draw_erase(h);
 
     if (!h->h_vis) {
         sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 "
@@ -676,17 +676,18 @@ void scalehandle_draw_select(t_scalehandle *h, t_glist *canvas, int px, int py)
             h->h_pathname, tags);
         scalehandle_bind(h);
         h->h_vis = 1;
-    /* not yet (this is not supported by current implementation)
-    } else {
+    /* not yet (this is not supported by current implementation) */
+    }/* else {
         sys_vgui(".x%x.c coords %s %d %d\n", canvas, h->h_pathname,
             x->x_obj.te_xpix+px-sx, x->x_obj.te_ypix+py-sy);
-        sys_vgui("raise %s\n", h->h_pathname); */
-    }
+        sys_vgui("raise %s\n", h->h_pathname);
+    }*/
 }
 
 extern t_class *my_canvas_class;
 
-void scalehandle_draw_select2(t_iemgui *x, t_glist *canvas) {
+void scalehandle_draw_select2(t_iemgui *x) {
+    t_canvas *canvas=glist_getcanvas(x->x_glist);
     t_class *c = pd_class((t_pd *)x);
     int sx,sy;
     if (c==my_canvas_class) {
@@ -697,12 +698,13 @@ void scalehandle_draw_select2(t_iemgui *x, t_glist *canvas) {
         c->c_wb->w_getrectfn((t_gobj *)x,canvas,&x1,&y1,&x2,&y2);
         sx=x2-x1; sy=y2-y1;
     }
-    scalehandle_draw_select(x->x_handle,canvas,sx-1,sy-1);
+    scalehandle_draw_select(x->x_handle,sx-1,sy-1);
     if (x->x_lab!=s_empty)
-        scalehandle_draw_select(x->x_lhandle,canvas,x->x_ldx,x->x_ldy);
+        scalehandle_draw_select(x->x_lhandle,x->x_ldx,x->x_ldy);
 }
 
-void scalehandle_draw_erase(t_scalehandle *h, t_glist *canvas) {
+void scalehandle_draw_erase(t_scalehandle *h) {
+    t_canvas *canvas=glist_getcanvas(h->h_glist);
     if (!h->h_vis) return;
     sys_vgui("destroy %s\n", h->h_pathname);
     sys_vgui(".x%lx.c delete %lx%s\n", canvas, h->h_master,
@@ -710,24 +712,25 @@ void scalehandle_draw_erase(t_scalehandle *h, t_glist *canvas) {
     h->h_vis = 0;
 }
 
-void scalehandle_draw_erase2(t_iemgui *x, t_glist *canvas) {
+void scalehandle_draw_erase2(t_iemgui *x) {
     t_scalehandle *sh = (t_scalehandle *)(x->x_handle);
     t_scalehandle *lh = (t_scalehandle *)(x->x_lhandle);
-    if (sh->h_vis) scalehandle_draw_erase(sh,canvas);
-    if (lh->h_vis) scalehandle_draw_erase(lh,canvas);
+    if (sh->h_vis) scalehandle_draw_erase(sh);
+    if (lh->h_vis) scalehandle_draw_erase(lh);
 }
 
-void scalehandle_draw(t_iemgui *x, t_glist *glist) {
-    if (x->x_glist == glist_getcanvas(glist)) {
-        if(x->x_selected == x->x_glist) scalehandle_draw_select2(x,glist);
-        else scalehandle_draw_erase2(x,glist);
+void scalehandle_draw(t_iemgui *x) {
+    if (x->x_glist == glist_getcanvas(x->x_glist)) {
+        if(x->x_selected == x->x_glist) scalehandle_draw_select2(x);
+        else scalehandle_draw_erase2(x);
     }
 }
 
-t_scalehandle *scalehandle_new(t_class *c, t_iemgui *x, int scale) {
+t_scalehandle *scalehandle_new(t_class *c, t_gobj *x, t_glist *glist, int scale) {
     t_scalehandle *h = (t_scalehandle *)pd_new(c);
     char buf[64];
     h->h_master = (t_gobj*)x;
+    h->h_glist = glist;
     sprintf(buf, "_h%lx", (t_int)h);
     pd_bind((t_pd *)h, h->h_bindsym = gensym(buf));
     sprintf(h->h_outlinetag, "h%lx", (t_int)h);
@@ -736,7 +739,7 @@ t_scalehandle *scalehandle_new(t_class *c, t_iemgui *x, int scale) {
     //h->h_offset_x = 0; // unused (maybe keep for later)
     //h->h_offset_y = 0; // unused (maybe keep for later)
     h->h_vis = 0;
-    sprintf(h->h_pathname, ".x%lx.h%lx", (t_int)x->x_glist, (t_int)h);
+    sprintf(h->h_pathname, ".x%lx.h%lx", (t_int)h->h_glist, (t_int)h);
     return h;
 }
 
@@ -838,7 +841,7 @@ void scalehandle_click_scale(t_scalehandle *h) {
 void scalehandle_unclick_scale(t_scalehandle *h) {
     t_iemgui *x = (t_iemgui *)h->h_master;
     sys_vgui(".x%x.c delete %s\n", x->x_glist, h->h_outlinetag);
-    iemgui_io_draw_move(x, x->x_glist);
+    iemgui_io_draw_move(x);
     iemgui_select((t_gobj *)x, x->x_glist, 1);
     canvas_fixlinesfor(x->x_glist, (t_text *)x);
     sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", x->x_glist);
@@ -870,20 +873,22 @@ void iemgui__clickhook3(t_scalehandle *sh, int newstate) {
 static void scalehandle_check_and_redraw(t_iemgui *x)
 {
     if(x->x_selected == x->x_glist)
-        scalehandle_draw_select2(x,x->x_glist);
+        scalehandle_draw_select2(x);
 }
 
 //----------------------------------------------------------------
 // IEMGUI refactor (by Mathieu)
 
-void iemgui_tag_selected(t_iemgui *x, t_glist *canvas) {
+void iemgui_tag_selected(t_iemgui *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);
     else
         sys_vgui(".x%lx.c dtag x%lx selected\n", canvas, x);
 }
 
-void iemgui_label_draw_new(t_iemgui *x, t_glist *canvas) {
+void iemgui_label_draw_new(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 create text %d %d -text {%s} -anchor w "
@@ -893,14 +898,16 @@ void iemgui_label_draw_new(t_iemgui *x, t_glist *canvas) {
          iemgui_font(x), x->x_lcol, x, x);
 }
 
-void iemgui_label_draw_move(t_iemgui *x, t_glist *canvas) {
+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);
 }
 
-void iemgui_label_draw_config(t_iemgui *x, t_glist *canvas) {
+void iemgui_label_draw_config(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 -font %s "
                  "-fill $pd_colors(selection) -text {%s} \n",
@@ -915,13 +922,14 @@ void iemgui_label_draw_config(t_iemgui *x, t_glist *canvas) {
     {
         t_scalehandle *lh = (t_scalehandle *)(x->x_lhandle);
         if (x->x_lab==s_empty)    
-            scalehandle_draw_erase((t_scalehandle *)(x->x_lhandle),canvas);
+            scalehandle_draw_erase(x->x_lhandle);
         else if (lh->h_vis == 0)
-            scalehandle_draw_select(lh,canvas,x->x_ldx,x->x_ldy);
+            scalehandle_draw_select(lh,x->x_ldx,x->x_ldy);
     }
 }
 
-void iemgui_label_draw_select(t_iemgui *x, t_glist *canvas) {
+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);
@@ -930,12 +938,14 @@ void iemgui_label_draw_select(t_iemgui *x, t_glist *canvas) {
             canvas, x, x->x_lcol);
 }
 
+extern t_class *my_numbox_class;
 extern t_class *vu_class;
-void iemgui_draw_io(t_iemgui *x, t_glist *glist, int old_sr_flags)
+void iemgui_draw_io(t_iemgui *x, int old_sr_flags)
 {
-    t_canvas *canvas=glist_getcanvas(glist);
+    t_canvas *canvas=glist_getcanvas(x->x_glist);
     if (x->x_glist != canvas) return; // is gop
     t_class *c = pd_class((t_pd *)x);
+    if (c==my_numbox_class && ((t_my_numbox *)x)->x_hide_frame > 1) return; //sigh
 
     if (!(old_sr_flags&4) && (!glist_isvisible(canvas) || !(canvas == x->x_glist))) {
         return;
@@ -973,7 +983,8 @@ void iemgui_draw_io(t_iemgui *x, t_glist *glist, int old_sr_flags)
         sys_vgui(".x%lx.c delete x%lxi%d\n", canvas, x, i);
 }
 
-void iemgui_io_draw_move(t_iemgui *x, t_glist *canvas) {
+void iemgui_io_draw_move(t_iemgui *x) {
+    t_canvas *canvas=glist_getcanvas(x->x_glist);
     t_class *c = pd_class((t_pd *)x);
     int x1,y1,x2,y2;
     c->c_wb->w_getrectfn((t_gobj *)x,canvas,&x1,&y1,&x2,&y2);
@@ -986,7 +997,8 @@ void iemgui_io_draw_move(t_iemgui *x, t_glist *canvas) {
             canvas, x, i, x1+i*k, y1, x1+i*k+IOWIDTH, y1+1);
 }
 
-void iemgui_base_draw_new(t_iemgui *x, t_glist *canvas) {
+void iemgui_base_draw_new(t_iemgui *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;
     c->c_wb->w_getrectfn((t_gobj *)x,x->x_glist,&x1,&y1,&x2,&y2);
@@ -997,7 +1009,8 @@ void iemgui_base_draw_new(t_iemgui *x, t_glist *canvas) {
          canvas, x1,y1,x2,y2, x->x_bcol, x, x);
 }
 
-void iemgui_base_draw_move(t_iemgui *x, t_glist *canvas) {
+void iemgui_base_draw_move(t_iemgui *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;
     c->c_wb->w_getrectfn((t_gobj *)x,x->x_glist,&x1,&y1,&x2,&y2);
@@ -1005,21 +1018,40 @@ void iemgui_base_draw_move(t_iemgui *x, t_glist *canvas) {
     sys_vgui(".x%lx.c coords %lxBASE %d %d %d %d\n", canvas, x, x1, y1, x2, y2);
 }
 
-void iemgui_base_draw_config(t_iemgui *x, t_glist *canvas) {
+void iemgui_base_draw_config(t_iemgui *x) {
+    t_canvas *canvas=glist_getcanvas(x->x_glist);
     char fcol[8]; sprintf(fcol,"#%6.6x", x->x_fcol);
     sys_vgui(".x%lx.c itemconfigure %lxBASE -fill #%6.6x\n", canvas, x, x->x_bcol);
 }
 
-void iemgui_draw_new(t_iemgui *x, t_glist *glist) {
+void iemgui_draw_update(t_iemgui *x, t_glist *glist) {
+    x->x_draw(x, x->x_glist, IEM_GUI_DRAW_MODE_UPDATE);
+}
+
+void iemgui_draw_new(t_iemgui *x) {
     x->x_draw(x, x->x_glist, IEM_GUI_DRAW_MODE_NEW);
-    t_canvas *canvas=glist_getcanvas(glist);
-    iemgui_label_draw_new(x,canvas);
+    iemgui_label_draw_new(x);
+    iemgui_draw_io(x,7);
     canvas_raise_all_cords(glist_getcanvas(x->x_glist)); // used to be inside x_draw
 }
-void iemgui_draw_erase(t_iemgui *x, t_glist *glist) {
-    t_canvas *canvas=glist_getcanvas(glist);
+
+void iemgui_draw_config(t_iemgui *x) {
+    x->x_draw(x, x->x_glist, IEM_GUI_DRAW_MODE_CONFIG);
+    iemgui_label_draw_config(x);
+    //iemgui_base_draw_config(x); // can't
+}
+
+void iemgui_draw_move(t_iemgui *x) {
+    x->x_draw(x, x->x_glist, IEM_GUI_DRAW_MODE_MOVE);
+    iemgui_label_draw_move(x);
+    //iemgui_base_draw_move(x); // can't
+    iemgui_io_draw_move(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);
-    scalehandle_draw_erase2(x,glist);
+    scalehandle_draw_erase2(x);
 }
 
 void scrollbar_update(t_glist *glist) {
diff --git a/pd/src/g_all_guis.h b/pd/src/g_all_guis.h
index ea46360a0..0844d7ea9 100644
--- a/pd/src/g_all_guis.h
+++ b/pd/src/g_all_guis.h
@@ -38,6 +38,7 @@ typedef struct _scalehandle
 {
     t_pd       h_pd;
     t_gobj    *h_master;
+    t_glist   *h_glist;
     t_symbol  *h_bindsym;
     int        h_scale;
     char       h_pathname[64];
@@ -220,12 +221,12 @@ EXTERN void canvas_apply_setundo(t_canvas *x, t_gobj *y);
 
 // scalehandle code, as refactored by Mathieu
 EXTERN void scalehandle_bind(t_scalehandle *h);
-EXTERN void scalehandle_draw_select(t_scalehandle *h, t_glist *canvas, int px, int py);
-EXTERN void scalehandle_draw_select2(t_iemgui *x, t_glist *canvas);
-EXTERN void scalehandle_draw_erase(t_scalehandle *h, t_glist *canvas);
-EXTERN void scalehandle_draw_erase2(t_iemgui *x, t_glist *canvas);
-EXTERN void scalehandle_draw(t_iemgui *x, t_glist *glist);
-EXTERN t_scalehandle *scalehandle_new(t_class *c, t_iemgui *x, int scale);
+EXTERN void scalehandle_draw_select(t_scalehandle *h, int px, int py);
+EXTERN void scalehandle_draw_select2(t_iemgui *x);
+EXTERN void scalehandle_draw_erase(t_scalehandle *h);
+EXTERN void scalehandle_draw_erase2(t_iemgui *x);
+EXTERN void scalehandle_draw(t_iemgui *x);
+EXTERN t_scalehandle *scalehandle_new(t_class *c, t_gobj *x, t_glist *glist, int scale);
 EXTERN void scalehandle_free(t_scalehandle *h);
 EXTERN void properties_set_field_int(long props, const char *gui_field, int value);
 EXTERN void scalehandle_dragon_label(t_scalehandle *h, float f1, float f2);
@@ -242,18 +243,20 @@ EXTERN float minf(float a, float b);
 EXTERN float maxf(float a, float b);
 
 // other refactor by Mathieu
-EXTERN void iemgui_tag_selected(     t_iemgui *x, t_glist *canvas);
-EXTERN void iemgui_label_draw_new(   t_iemgui *x, t_glist *canvas);
-EXTERN void iemgui_label_draw_move(  t_iemgui *x, t_glist *canvas);
-EXTERN void iemgui_label_draw_config(t_iemgui *x, t_glist *canvas);
-EXTERN void iemgui_label_draw_select(t_iemgui *x, t_glist *canvas);
-EXTERN void iemgui_io_draw_move(t_iemgui *x, t_glist *canvas);
-EXTERN void iemgui_draw_io(t_iemgui *x, t_glist *glist, int old_sr_flags);
-EXTERN void iemgui_base_draw_new(t_iemgui *x, t_glist *canvas);
-EXTERN void iemgui_base_draw_move(t_iemgui *x, t_glist *canvas);
-EXTERN void iemgui_base_draw_config(t_iemgui *x, t_glist *canvas);
-EXTERN void iemgui_draw_new(t_iemgui *x, t_glist *glist);
-EXTERN void iemgui_draw_erase(t_iemgui *x, t_glist* glist);
+EXTERN void iemgui_tag_selected(     t_iemgui *x);
+EXTERN void iemgui_label_draw_new(   t_iemgui *x);
+EXTERN void iemgui_label_draw_move(  t_iemgui *x);
+EXTERN void iemgui_label_draw_config(t_iemgui *x);
+EXTERN void iemgui_label_draw_select(t_iemgui *x);
+EXTERN void iemgui_io_draw_move(t_iemgui *x);
+EXTERN void iemgui_draw_io(t_iemgui *x, int old_sr_flags);
+EXTERN void iemgui_base_draw_new(t_iemgui *x);
+EXTERN void iemgui_base_draw_move(t_iemgui *x);
+EXTERN void iemgui_base_draw_config(t_iemgui *x);
+EXTERN void iemgui_draw_new(t_iemgui *x);
+EXTERN void iemgui_draw_config(t_iemgui *x);
+EXTERN void iemgui_draw_move(t_iemgui *x);
+EXTERN void iemgui_draw_erase(t_iemgui *x);
 EXTERN void wb_init(t_widgetbehavior *wb, t_getrectfn gr, t_clickfn cl); // rename this to iemgui_wb_init
 
 extern t_symbol *s_empty;
diff --git a/pd/src/g_bang.c b/pd/src/g_bang.c
index 0fe25302f..a12d4ef46 100644
--- a/pd/src/g_bang.c
+++ b/pd/src/g_bang.c
@@ -41,7 +41,7 @@ void bng_draw_new(t_bng *x, t_glist *glist)
     int x1=text_xpix(&x->x_gui.x_obj, glist);
     int y1=text_ypix(&x->x_gui.x_obj, glist);
 
-    iemgui_base_draw_new(&x->x_gui, canvas);
+    iemgui_base_draw_new(&x->x_gui);
     t_float cr = (x->x_gui.x_w-2)/2.0;
     t_float cx = x1+cr+1.5;
     t_float cy = y1+cr+1.5;
@@ -59,22 +59,19 @@ void bng_draw_move(t_bng *x, t_glist *glist)
     int x1=text_xpix(&x->x_gui.x_obj, glist);
     int y1=text_ypix(&x->x_gui.x_obj, glist);
 
-    iemgui_base_draw_move(&x->x_gui, canvas);
+    iemgui_base_draw_move(&x->x_gui);
     t_float cr = (x->x_gui.x_w-2)/2.0;
     t_float cx = x1+cr+1.5;
     t_float cy = y1+cr+1.5;
     sys_vgui(".x%lx.c coords %lxBUT %f %f\n", canvas, x, cx, cy);
     sys_vgui(".x%lx.c itemconfigure %lxBUT -fill #%6.6x -r %f\n",
         canvas, x, x->x_flashed?x->x_gui.x_fcol:x->x_gui.x_bcol, cr);
-    iemgui_label_draw_move(&x->x_gui,canvas);
-    iemgui_io_draw_move(&x->x_gui,canvas);
 }
 
 void bng_draw_config(t_bng* x, t_glist* glist)
 {
     t_canvas *canvas=glist_getcanvas(glist);
-    iemgui_label_draw_config(&x->x_gui,canvas);
-    iemgui_base_draw_config(&x->x_gui,canvas);
+    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);
 }
@@ -243,10 +240,10 @@ static void bng_dialog(t_bng *x, t_symbol *s, int argc, t_atom *argv)
     int ftbreak = atom_getintarg(3, argc, argv);
     int sr_flags = iemgui_dialog(&x->x_gui, argc, argv);
     bng_check_minmax(x, ftbreak, fthold);
-    x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG);
-    iemgui_draw_io(&x->x_gui, x->x_gui.x_glist, sr_flags);
+    iemgui_draw_config(&x->x_gui);
+    iemgui_draw_io(&x->x_gui, sr_flags);
     iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
-    scalehandle_draw(&x->x_gui, x->x_gui.x_glist);
+    scalehandle_draw(&x->x_gui);
     scrollbar_update(x->x_gui.x_glist);
 }
 
@@ -371,8 +368,8 @@ static void *bng_new(t_symbol *s, int argc, t_atom *argv)
     x->x_clock_lck = clock_new(x, (t_method)bng_tick_lck);
     outlet_new(&x->x_gui.x_obj, &s_bang);
 
-    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_iemgui *)x,1);
-    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_iemgui *)x,0);
+    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,1);
+    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,0);
     x->x_gui.x_obj.te_iemgui = 1;
     x->x_gui.x_changed = 0;
 
diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c
index bffd220d9..1590020bc 100644
--- a/pd/src/g_canvas.c
+++ b/pd/src/g_canvas.c
@@ -441,8 +441,8 @@ t_canvas *canvas_new(void *dummy, t_symbol *sel, int argc, t_atom *argv)
     pd_pushsym(&x->gl_pd);
 
     //dpsaha@vt.edu gop resize (refactored by mathieu)
-    x-> x_handle = scalehandle_new(scalehandle_class,(t_iemgui *)x,1);
-    x->x_mhandle = scalehandle_new(scalehandle_class,(t_iemgui *)x,0);
+    x-> x_handle = scalehandle_new(scalehandle_class,(t_gobj *)x,x,1);
+    x->x_mhandle = scalehandle_new(scalehandle_class,(t_gobj *)x,x,0);
 
     x->u_queue = canvas_undo_init(x);
     return(x);
@@ -711,18 +711,18 @@ void canvas_draw_gop_resize_hooks(t_canvas* x)
         sprintf(sh->h_pathname, ".x%lx.h%lx", (t_int)x, (t_int)sh);
         sprintf(mh->h_pathname, ".x%lx.h%lx", (t_int)x, (t_int)mh);
 
-        scalehandle_draw_select(sh,x,
+        scalehandle_draw_select(sh,
             -1-x->gl_obj.te_xpix+x->gl_xmargin + x->gl_pixwidth,
             -1-x->gl_obj.te_ypix+x->gl_ymargin + x->gl_pixheight/*,GOP_resblob*/);
-        scalehandle_draw_select(mh,x,
+        scalehandle_draw_select(mh,
             2+SCALEHANDLE_WIDTH -x->gl_obj.te_xpix+x->gl_xmargin,
             2+SCALEHANDLE_HEIGHT-x->gl_obj.te_ypix+x->gl_ymargin /*,"GOP_movblob"*/);
     }
     else
     {
         //fprintf(stderr,"draw_gop_resize_hooks ERASE\n");
-        scalehandle_draw_erase(sh,x);
-        scalehandle_draw_erase(mh,x);
+        scalehandle_draw_erase(sh);
+        scalehandle_draw_erase(mh);
     }
     canvas_check_nlet_highlights(x);
 }
diff --git a/pd/src/g_mycanvas.c b/pd/src/g_mycanvas.c
index ceb7542c0..675851b7d 100644
--- a/pd/src/g_mycanvas.c
+++ b/pd/src/g_mycanvas.c
@@ -47,7 +47,6 @@ 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);
-    iemgui_label_draw_move(&x->x_gui,canvas);
 }
 
 void my_canvas_draw_config(t_my_canvas* x, t_glist* glist)
@@ -59,7 +58,6 @@ void my_canvas_draw_config(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);
-    iemgui_label_draw_config(&x->x_gui,canvas);
 }
 
 void my_canvas_draw_select(t_my_canvas* x, t_glist* glist)
@@ -216,9 +214,9 @@ static void my_canvas_dialog(t_my_canvas *x, t_symbol *s, int argc, t_atom *argv
     x->x_vis_h = maxi(atom_getintarg(3, argc, argv),1);
     iemgui_dialog(&x->x_gui, argc, argv);
     x->x_gui.x_loadinit = 0;
-    x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG);
+    iemgui_draw_config(&x->x_gui);
     iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
-    scalehandle_draw(&x->x_gui, x->x_gui.x_glist);
+    scalehandle_draw(&x->x_gui);
     scrollbar_update(x->x_gui.x_glist);
 }
 
@@ -248,8 +246,7 @@ static void my_canvas_vis_size(t_my_canvas *x, t_symbol *s, int ac, t_atom *av)
             i = 1;
     }
     x->x_vis_h = i;
-    if(glist_isvisible(x->x_gui.x_glist))
-        x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE);
+    if(glist_isvisible(x->x_gui.x_glist)) iemgui_draw_move(&x->x_gui);
 }
 
 static void *my_canvas_new(t_symbol *s, int argc, t_atom *argv)
@@ -323,8 +320,8 @@ static void *my_canvas_new(t_symbol *s, int argc, t_atom *argv)
     x->x_at[1].a_type = A_FLOAT;
     iemgui_verify_snd_ne_rcv(&x->x_gui);
 
-    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_iemgui *)x,1);
-    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_iemgui *)x,0);
+    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,1);
+    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,0);
     x->x_gui.x_obj.te_iemgui = 1;
 
     return (x);
diff --git a/pd/src/g_numbox.c b/pd/src/g_numbox.c
index 9d0750584..49c2b7f1a 100644
--- a/pd/src/g_numbox.c
+++ b/pd/src/g_numbox.c
@@ -19,7 +19,7 @@ static void my_numbox_draw_select(t_my_numbox *x, t_glist *glist);
 static void my_numbox_key(void *z, t_floatarg fkey);
 static void my_numbox_draw_update(t_gobj *client, t_glist *glist);
 t_widgetbehavior my_numbox_widgetbehavior;
-static t_class *my_numbox_class;
+/*static*/ t_class *my_numbox_class;
 
 static void my_numbox_tick_reset(t_my_numbox *x)
 {
@@ -162,7 +162,6 @@ static void my_numbox_draw_new(t_my_numbox *x, t_glist *glist)
         x->x_hide_frame <= 1 ? "$pd_colors(iemgui_border)" : bcol,
         bcol, x, x);
 
-    if (x->x_hide_frame <= 1) iemgui_draw_io(&x->x_gui,glist,7);
     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",
@@ -186,11 +185,10 @@ static void my_numbox_draw_move(t_my_numbox *x, t_glist *glist)
     sys_vgui(".x%lx.c coords %lxBASE1 %d %d %d %d %d %d %d %d %d %d\n",
         canvas, x, x1, y1, x2-4, y1, x2, y1+4, x2, y2, x1, y2);
     if (x->x_hide_frame <= 1)
-        iemgui_io_draw_move(&x->x_gui,canvas);
+        iemgui_io_draw_move(&x->x_gui);
     if (!x->x_hide_frame || x->x_hide_frame == 2)
         sys_vgui(".x%lx.c coords %lxBASE2 %d %d %d %d %d %d\n",
             canvas, x, x1, y1, x1 + half, y1 + half, x1, y2);
-    iemgui_label_draw_move(&x->x_gui,canvas);
     sys_vgui(".x%lx.c coords %lxNUMBER %d %d\n",
         canvas, x, x1+half+2, y1+half+d);
 }
@@ -204,7 +202,6 @@ static void my_numbox_draw_config(t_my_numbox* x,t_glist* glist)
         canvas, x, iemgui_font(&x->x_gui), issel ? selection_color : fcol);
     sys_vgui(".x%lx.c itemconfigure %lxBASE2 -stroke %s\n",
         canvas, x, issel ? selection_color : fcol);
-    iemgui_label_draw_config(&x->x_gui,canvas);
     sys_vgui(".x%lx.c itemconfigure %lxBASE1 -fill #%6.6x\n", canvas,
              x, x->x_gui.x_bcol);
 }
@@ -229,9 +226,9 @@ static void my_numbox_draw_select(t_my_numbox *x, t_glist *glist)
     sys_vgui(".x%lx.c itemconfigure %lxNUMBER -fill %s\n", canvas, x,
         issel ? selection_color : fcol);
     if(issel) 
-        scalehandle_draw_select2(&x->x_gui,glist);
+        scalehandle_draw_select2(&x->x_gui);
     else
-        scalehandle_draw_erase2(&x->x_gui,glist);
+        scalehandle_draw_erase2(&x->x_gui);
 }
 
 static void my_numbox__clickhook(t_scalehandle *sh, t_floatarg f,
@@ -468,15 +465,13 @@ static void my_numbox_dialog(t_my_numbox *x, t_symbol *s, int argc,
     iemgui_dialog(&x->x_gui, argc, argv);
     x->x_numwidth = my_numbox_calc_fontwidth(x);
     my_numbox_check_minmax(x, min, max);
-    iemgui_draw_erase(&x->x_gui, x->x_gui.x_glist);
-    iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_NEW);
-    scalehandle_draw(&x->x_gui, x->x_gui.x_glist);
-    iemgui_label_draw_new(&x->x_gui, x->x_gui.x_glist);
-    if (x->x_gui.x_selected)
-    {
-        scalehandle_draw(&x->x_gui,x->x_gui.x_glist);
-        iemgui_select((t_gobj *)x,x->x_gui.x_glist,1);
-    }
+    // normally, you'd do move+config, but here you have to do erase+new
+    // because iemgui_draw_io does not support changes to x_hide_frame.
+    iemgui_draw_erase(&x->x_gui);
+    iemgui_draw_new(&x->x_gui);
+    //iemgui_draw_move(&x->x_gui);
+    //iemgui_draw_config(&x->x_gui);
+    scalehandle_draw(&x->x_gui);
     //canvas_restore_original_position(x->x_gui.x_glist, (t_gobj *)x,"bogus",-1);
     scrollbar_update(x->x_gui.x_glist);
 }
@@ -762,8 +757,8 @@ static void *my_numbox_new(t_symbol *s, int argc, t_atom *argv)
     x->x_gui.x_change = 0;
     outlet_new(&x->x_gui.x_obj, &s_float);
 
-    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_iemgui *)x,1);
-    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_iemgui *)x,0);
+    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,1);
+    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,0);
     x->x_scalewidth = 0;
     x->x_scaleheight = 0;
     x->x_tmpfontsize = 0;
diff --git a/pd/src/g_radio.c b/pd/src/g_radio.c
index 886b0f157..1e86ef059 100644
--- a/pd/src/g_radio.c
+++ b/pd/src/g_radio.c
@@ -42,7 +42,7 @@ void radio_draw_new(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=x1;
     int y1=text_ypix(&x->x_gui.x_obj, glist), yi=y1; 
-    iemgui_base_draw_new(&x->x_gui, canvas);
+    iemgui_base_draw_new(&x->x_gui);
 
     for(i=0; i<n; i++) if (x->x_orient) {
         if (i) sys_vgui(".x%lx.c create pline %d %d %d %d "
@@ -80,7 +80,7 @@ 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=x1;
     int y1=text_ypix(&x->x_gui.x_obj, glist), yi=y1;
-    iemgui_base_draw_move(&x->x_gui, canvas);
+    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",
             canvas, x, i, x1, yi, x1+d, yi);
@@ -94,16 +94,13 @@ void radio_draw_move(t_radio *x, t_glist *glist)
             canvas, x, i, xi+s, y1+s, xi+d-s, y1+d-s);
         xi += d;
     }
-    iemgui_label_draw_move(&x->x_gui,canvas);
-    iemgui_io_draw_move(&x->x_gui,canvas);
 }
 
 void radio_draw_config(t_radio *x, t_glist *glist)
 {
     t_canvas *canvas=glist_getcanvas(glist);
     int n=x->x_number, i;
-    iemgui_label_draw_config(&x->x_gui,canvas);
-    iemgui_base_draw_config(&x->x_gui,canvas);
+    iemgui_base_draw_config(&x->x_gui);
     for(i=0; i<n; i++)
     {
         sys_vgui(".x%lx.c itemconfigure %lxBUT%d -fill #%6.6x -stroke #%6.6x\n",
@@ -250,7 +247,7 @@ static void radio_dialog(t_radio *x, t_symbol *s, int argc, t_atom *argv)
     int sr_flags = iemgui_dialog(&x->x_gui, argc, argv);
     if(x->x_number != num)
     {
-        iemgui_draw_erase(&x->x_gui, x->x_gui.x_glist);
+        iemgui_draw_erase(&x->x_gui);
         x->x_number = num;
         if(x->x_on >= x->x_number)
         {
@@ -261,11 +258,11 @@ static void radio_dialog(t_radio *x, t_symbol *s, int argc, t_atom *argv)
     }
     else
     {
-        x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG);
-        iemgui_draw_io(&x->x_gui, x->x_gui.x_glist, sr_flags);
+        iemgui_draw_config(&x->x_gui);
+        iemgui_draw_io(&x->x_gui, sr_flags);
         iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
     }
-    scalehandle_draw(&x->x_gui, x->x_gui.x_glist);
+    scalehandle_draw(&x->x_gui);
     scrollbar_update(x->x_gui.x_glist);
 }
 
@@ -390,12 +387,12 @@ static void radio_number(t_radio *x, t_floatarg num)
     int n=mini(maxi((int)num,1),IEM_RADIO_MAX);
     if(n != x->x_number)
     {
-        iemgui_draw_erase(&x->x_gui, x->x_gui.x_glist);
+        iemgui_draw_erase(&x->x_gui);
         x->x_number = n;
         if(x->x_on >= x->x_number)
             x->x_on = x->x_number - 1;
         x->x_on_old = x->x_on;
-        x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_NEW);
+        iemgui_draw_new(&x->x_gui);
     }
 }
 
@@ -463,9 +460,8 @@ static void *radio_new(t_symbol *s, int argc, t_atom *argv)
     iemgui_all_colfromload(&x->x_gui, bflcol);
     outlet_new(&x->x_gui.x_obj, &s_list);
 
-    t_class *sc = scalehandle_class;
-    x->x_gui. x_handle = scalehandle_new(sc,(t_iemgui *)x,1);
-    x->x_gui.x_lhandle = scalehandle_new(sc,(t_iemgui *)x,0);
+    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,1);
+    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,0);
     x->x_gui.x_obj.te_iemgui = 1;
 
     return (x);
diff --git a/pd/src/g_slider.c b/pd/src/g_slider.c
index 7b2e016cf..e2fcf4b51 100644
--- a/pd/src/g_slider.c
+++ b/pd/src/g_slider.c
@@ -55,7 +55,7 @@ static void slider_draw_new(t_slider *x, t_glist *glist)
     int r;
     if (x->x_orient) r = y2-3 - (x->x_val + 50)/100;
     else             r = x1+3 + (x->x_val + 50)/100;
-    iemgui_base_draw_new(&x->x_gui, canvas);
+    iemgui_base_draw_new(&x->x_gui);
     if (x->x_orient) {
         sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth 3 "
             "-stroke #%6.6x -tags {%lxKNOB x%lx text iemgui}\n",
@@ -77,22 +77,19 @@ static void slider_draw_move(t_slider *x, t_glist *glist)
     int r;
     if (x->x_orient) r = y2-3 - (x->x_val + 50)/100;
     else             r = x1+3 + (x->x_val + 50)/100;
-    iemgui_base_draw_move(&x->x_gui, canvas);
+    iemgui_base_draw_move(&x->x_gui);
     if (x->x_orient)
         sys_vgui(".x%lx.c coords %lxKNOB %d %d %d %d\n",
             canvas, x, x1+2, r, x2-2, r);
     else
         sys_vgui(".x%lx.c coords %lxKNOB %d %d %d %d\n",
             canvas, x, r, y1+2, r, y2-2);
-    iemgui_label_draw_move(&x->x_gui,canvas);
-    iemgui_io_draw_move(&x->x_gui,canvas);
 }
 
 static void slider_draw_config(t_slider *x, t_glist *glist)
 {
     t_canvas *canvas=glist_getcanvas(glist);
-    iemgui_label_draw_config(&x->x_gui,canvas);
-    iemgui_base_draw_config(&x->x_gui,canvas);
+    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);
 }
@@ -315,10 +312,10 @@ static void slider_dialog(t_slider *x, t_symbol *s, int argc, t_atom *argv)
             x->x_val *= ((double)x->x_gui.x_w/(double)oldl);
     }
     slider_check_minmax(x, min, max);
-    x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG);
-    iemgui_draw_io(&x->x_gui, x->x_gui.x_glist, sr_flags);
+    iemgui_draw_config(&x->x_gui);
+    iemgui_draw_io(&x->x_gui, sr_flags);
     iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
-    scalehandle_draw(&x->x_gui, x->x_gui.x_glist);
+    scalehandle_draw(&x->x_gui);
     scrollbar_update(x->x_gui.x_glist);
 }
 
@@ -536,9 +533,8 @@ static void *slider_new(t_symbol *s, int argc, t_atom *argv)
     iemgui_verify_snd_ne_rcv(&x->x_gui);
     outlet_new(&x->x_gui.x_obj, &s_float);
 
-    t_class *sc = scalehandle_class;
-    x->x_gui. x_handle = scalehandle_new(sc,(t_iemgui *)x,1);
-    x->x_gui.x_lhandle = scalehandle_new(sc,(t_iemgui *)x,0);
+    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,1);
+    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,0);
     x->x_gui.x_obj.te_iemgui = 1;
     x->x_gui.x_changed = 0;
 
diff --git a/pd/src/g_toggle.c b/pd/src/g_toggle.c
index 6e241b457..df56efc04 100644
--- a/pd/src/g_toggle.c
+++ b/pd/src/g_toggle.c
@@ -45,7 +45,7 @@ void toggle_draw_new(t_toggle *x, t_glist *glist)
     int x2=x1+x->x_gui.x_w, y2=y1+x->x_gui.x_h;
     int col = (x->x_on!=0.0)?x->x_gui.x_fcol:x->x_gui.x_bcol;
 
-    iemgui_base_draw_new(&x->x_gui, canvas);
+    iemgui_base_draw_new(&x->x_gui);
     sys_vgui(".x%lx.c create polyline %d %d %d %d -strokewidth %d "
         "-stroke #%6.6x -tags {%lxX1 x%lx text iemgui}\n",
         canvas, x1+w+1, y1+w+1, x2-w-1, y2-w-1, w, col, x, x);
@@ -62,21 +62,18 @@ void toggle_draw_move(t_toggle *x, t_glist *glist)
     int x1=text_xpix(&x->x_gui.x_obj, glist), x2=x1+x->x_gui.x_w;
     int y1=text_ypix(&x->x_gui.x_obj, glist), y2=y1+x->x_gui.x_h;
 
-    iemgui_base_draw_move(&x->x_gui, canvas);
+    iemgui_base_draw_move(&x->x_gui);
     sys_vgui(".x%lx.c itemconfigure {%lxX1||%lxX2} -strokewidth %d\n", canvas, x, x, w);
     sys_vgui(".x%lx.c coords %lxX1 %d %d %d %d\n",
         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);
-    iemgui_label_draw_move(&x->x_gui,canvas);
-    iemgui_io_draw_move(&x->x_gui,canvas);
 }
 
 void toggle_draw_config(t_toggle* x, t_glist* glist)
 {
     t_canvas *canvas=glist_getcanvas(glist);
-    iemgui_label_draw_config(&x->x_gui,canvas);
-    iemgui_base_draw_config(&x->x_gui,canvas);
+    iemgui_base_draw_config(&x->x_gui);
     sys_vgui(".x%lx.c itemconfigure {%lxX1||%lX2} -fill #%6.6x\n",
         canvas, x, x, x->x_on?x->x_gui.x_fcol:x->x_gui.x_bcol);
 }
@@ -203,10 +200,10 @@ static void toggle_dialog(t_toggle *x, t_symbol *s, int argc, t_atom *argv)
     if(x->x_on != 0.0)
         x->x_on = x->x_nonzero;
     int sr_flags = iemgui_dialog(&x->x_gui, argc, argv);
-    x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG);
-    iemgui_draw_io(&x->x_gui, x->x_gui.x_glist, sr_flags);
+    iemgui_draw_config(&x->x_gui);
+    iemgui_draw_io(&x->x_gui, sr_flags);
     iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
-    scalehandle_draw(&x->x_gui, x->x_gui.x_glist);
+    scalehandle_draw(&x->x_gui);
     scrollbar_update(x->x_gui.x_glist);
 }
 
@@ -321,8 +318,8 @@ static void *toggle_new(t_symbol *s, int argc, t_atom *argv)
     iemgui_verify_snd_ne_rcv(&x->x_gui);
     outlet_new(&x->x_gui.x_obj, &s_float);
 
-    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_iemgui *)x,1);
-    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_iemgui *)x,0);
+    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,1);
+    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,0);
     x->x_gui.x_obj.te_iemgui = 1;
     x->x_gui.x_changed = 1;
 
diff --git a/pd/src/g_vumeter.c b/pd/src/g_vumeter.c
index 34bba5576..effe67c0a 100644
--- a/pd/src/g_vumeter.c
+++ b/pd/src/g_vumeter.c
@@ -136,7 +136,7 @@ static void vu_draw_new(t_vu *x, t_glist *glist)
     int quad3=x2-w4, end=x2+4;
     int k1=x->x_led_size+1, k2=IEM_VU_STEPS+1, k3=k1/2;
     int led_col, yyy, i, k4=y1-k3;
-    iemgui_base_draw_new(&x->x_gui, canvas);
+    iemgui_base_draw_new(&x->x_gui);
 
     for(i = 1; i <= IEM_VU_STEPS+1; i++)
     {
@@ -164,7 +164,7 @@ static void vu_draw_new(t_vu *x, t_glist *glist)
         "-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);
-    iemgui_draw_io(&x->x_gui,glist,7);
+    iemgui_draw_io(&x->x_gui,7);
     x->x_updaterms = x->x_updatepeak = 1;
     sys_queuegui(x, x->x_gui.x_glist, vu_draw_update);
 }
@@ -201,8 +201,6 @@ static void vu_draw_move(t_vu *x, t_glist *glist)
     }
     x->x_updaterms = x->x_updatepeak = 1;
     sys_queuegui(x, glist, vu_draw_update);
-    iemgui_label_draw_move(&x->x_gui,canvas);
-    iemgui_io_draw_move(&x->x_gui,canvas);
 }
 
 static void vu_draw_config(t_vu* x, t_glist* glist)
@@ -220,12 +218,11 @@ static void vu_draw_config(t_vu* x, t_glist* glist)
             iemgui_font(&x->x_gui), x->x_gui.x_selected == canvas &&
             x->x_gui.x_glist == canvas && x->x_scale ? selection_color : lcol);
     }
-    iemgui_label_draw_config(&x->x_gui,canvas);
     sys_vgui(".x%lx.c itemconfigure %lxRCOVER -fill #%6.6x -stroke #%6.6x\n",
              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);
-    iemgui_base_draw_config(&x->x_gui,canvas);
+    iemgui_base_draw_config(&x->x_gui);
 }
 
 static void vu_draw_select(t_vu* x,t_glist* glist)
@@ -496,10 +493,10 @@ static void vu_dialog(t_vu *x, t_symbol *s, int argc, t_atom *argv)
     x->x_gui.x_w = iemgui_clip_size(w);
     vu_check_height(x, h);
     vu_scale(x, (t_float)scale);
-    x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG);
-    iemgui_draw_io(&x->x_gui, x->x_gui.x_glist, sr_flags);
+    iemgui_draw_config(&x->x_gui);
+    iemgui_draw_io(&x->x_gui, sr_flags);
     iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
-    scalehandle_draw(&x->x_gui, x->x_gui.x_glist);
+    scalehandle_draw(&x->x_gui);
     scrollbar_update(x->x_gui.x_glist);
 }
 
@@ -510,8 +507,8 @@ static void vu_size(t_vu *x, t_symbol *s, int ac, t_atom *av)
         vu_check_height(x, (int)atom_getintarg(1, ac, av));
     if(glist_isvisible(x->x_gui.x_glist))
     {
-        x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE);
-        x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG);
+        iemgui_draw_move(&x->x_gui);
+        iemgui_draw_config(&x->x_gui);
         canvas_fixlinesfor(glist_getcanvas(x->x_gui.x_glist), (t_text*)x);
     }
 }
@@ -620,8 +617,8 @@ static void *vu_new(t_symbol *s, int argc, t_atom *argv)
     x->x_out_rms = outlet_new(&x->x_gui.x_obj, &s_float);
     x->x_out_peak = outlet_new(&x->x_gui.x_obj, &s_float);
 
-    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_iemgui *)x,1);
-    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_iemgui *)x,0);
+    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,1);
+    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_gobj *)x,x->x_gui.x_glist,0);
     x->x_gui.x_obj.te_iemgui = 1;
 
     return (x);
-- 
GitLab