From 82ec6b1db025e1dfa56238ba9bebd672f26c4c54 Mon Sep 17 00:00:00 2001
From: Mathieu L Bouchard <matju@artengine.ca>
Date: Mon, 11 Aug 2014 17:42:47 -0400
Subject: [PATCH] =?UTF-8?q?big=20refactoring=20#9=C2=A0:=20merging=20of=20?=
 =?UTF-8?q?horizontal/vertical=20classes=20is=20completed?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pd/src/g_all_guis.c | 139 ++++--------
 pd/src/g_all_guis.h |   7 +-
 pd/src/g_bang.c     |  36 +--
 pd/src/g_canvas.c   |   2 -
 pd/src/g_mycanvas.c |   3 +-
 pd/src/g_numbox.c   |  10 +-
 pd/src/g_radio.c    | 542 +++++++++++---------------------------------
 pd/src/g_slider.c   | 528 ++++++++++--------------------------------
 pd/src/g_toggle.c   |  17 +-
 pd/src/g_vumeter.c  |  11 +-
 pd/src/m_conf.c     |  12 +-
 11 files changed, 330 insertions(+), 977 deletions(-)

diff --git a/pd/src/g_all_guis.c b/pd/src/g_all_guis.c
index 4c1d24c19..1db98d77a 100644
--- a/pd/src/g_all_guis.c
+++ b/pd/src/g_all_guis.c
@@ -14,22 +14,11 @@
 #include "m_pd.h"
 #include "g_canvas.h"
 #include "m_imp.h"
-#include "t_tk.h"
 #include "g_all_guis.h"
 #include <math.h>
 
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#ifdef HAVE_IO_H
-#include <io.h>
-#endif
-
 t_symbol *s_empty;
 
-/*------------------ global varaibles -------------------------*/
-
 int iemgui_color_hex[]=
 {
     16579836, 10526880, 4210752, 16572640, 16572608,
@@ -40,9 +29,6 @@ int iemgui_color_hex[]=
     7874580, 2641940, 17488, 5256, 5767248
 };
 
-/*------------------ global functions -------------------------*/
-
-
 int iemgui_clip_size(int size)
 {
     if(size < IEM_GUI_MINSIZE)
@@ -165,8 +151,7 @@ static void iemgui_init_sym2dollararg(t_iemgui *iemgui, t_symbol **symp,
     }
 }
 
-    /* get the unexpanded versions of the symbols; initialize them if
-    necessary. */
+/* get the unexpanded versions of the symbols; initialize them if necessary. */
 void iemgui_all_sym2dollararg(t_iemgui *iemgui, t_symbol **srlsym)
 {
     iemgui_init_sym2dollararg(iemgui, &iemgui->x_snd_unexpanded,
@@ -180,51 +165,30 @@ void iemgui_all_sym2dollararg(t_iemgui *iemgui, t_symbol **srlsym)
     srlsym[2] = iemgui->x_lab_unexpanded;
 }
 
+static int col2save(int col) {
+    return -1-(((0xfc0000 & col) >> 6)|((0xfc00 & col) >> 4)|((0xfc & col) >> 2));
+}
 void iemgui_all_col2save(t_iemgui *iemgui, int *bflcol)
 {
-    bflcol[0] = -1 - (((0xfc0000 & iemgui->x_bcol) >> 6)|
-                      ((0xfc00 & iemgui->x_bcol) >> 4)|((0xfc & iemgui->x_bcol) >> 2));
-    bflcol[1] = -1 - (((0xfc0000 & iemgui->x_fcol) >> 6)|
-                      ((0xfc00 & iemgui->x_fcol) >> 4)|((0xfc & iemgui->x_fcol) >> 2));
-    bflcol[2] = -1 - (((0xfc0000 & iemgui->x_lcol) >> 6)|
-                      ((0xfc00 & iemgui->x_lcol) >> 4)|((0xfc & iemgui->x_lcol) >> 2));
+    bflcol[0] = col2save(iemgui->x_bcol);
+    bflcol[1] = col2save(iemgui->x_fcol);
+    bflcol[2] = col2save(iemgui->x_lcol);
 }
 
-void iemgui_all_colfromload(t_iemgui *iemgui, int *bflcol)
-{
-    if(bflcol[0] < 0)
-    {
-        bflcol[0] = -1 - bflcol[0];
-        iemgui->x_bcol = ((bflcol[0] & 0x3f000) << 6)|((bflcol[0] & 0xfc0) << 4)|
-            ((bflcol[0] & 0x3f) << 2);
-    }
-    else
-    {
-        bflcol[0] = iemgui_modulo_color(bflcol[0]);
-        iemgui->x_bcol = iemgui_color_hex[bflcol[0]];
-    }
-    if(bflcol[1] < 0)
-    {
-        bflcol[1] = -1 - bflcol[1];
-        iemgui->x_fcol = ((bflcol[1] & 0x3f000) << 6)|((bflcol[1] & 0xfc0) << 4)|
-            ((bflcol[1] & 0x3f) << 2);
-    }
-    else
-    {
-        bflcol[1] = iemgui_modulo_color(bflcol[1]);
-        iemgui->x_fcol = iemgui_color_hex[bflcol[1]];
-    }
-    if(bflcol[2] < 0)
+static int colfromload(int col) {
+    if(col)
     {
-        bflcol[2] = -1 - bflcol[2];
-        iemgui->x_lcol = ((bflcol[2] & 0x3f000) << 6)|((bflcol[2] & 0xfc0) << 4)|
-            ((bflcol[2] & 0x3f) << 2);
+        col = -1-col;
+        return ((col & 0x3f000) << 6)|((col & 0xfc0) << 4)|((col & 0x3f) << 2);
     }
     else
-    {
-        bflcol[2] = iemgui_modulo_color(bflcol[2]);
-        iemgui->x_lcol = iemgui_color_hex[bflcol[2]];
-    }
+        return iemgui_color_hex[iemgui_modulo_color(col)];
+}
+void iemgui_all_colfromload(t_iemgui *iemgui, int *bflcol)
+{
+    iemgui->x_bcol = colfromload(bflcol[0]);
+    iemgui->x_fcol = colfromload(bflcol[1]);
+    iemgui->x_lcol = colfromload(bflcol[2]);
 }
 
 static int iemgui_compatible_col(int i)
@@ -370,30 +334,15 @@ void iemgui_label_getrect(t_iemgui x_gui, t_glist *x,
 
     if (x->gl_isgraph && !glist_istoplevel(x))
     {
-        //fprintf(stderr,"iemgui_label_getrect\n");
-
         if (x_gui.x_lab!=s_empty)
         {
             switch(x_gui.x_font_style)
             {
-                case 1:
-                    width_multiplier = 0.83333;
-                    break;
-                case 2:
-                    width_multiplier = 0.735;
-                    break;
-                default:
-                    width_multiplier = 1.0;
-                    break;
-            }
-            if (x_gui.x_fontsize % 2 == 0)
-            {
-                actual_fontsize = x_gui.x_fontsize;
-            }
-            else
-            {
-                actual_fontsize = x_gui.x_fontsize;
+                case 1:  width_multiplier = 0.83333; break;
+                case 2:  width_multiplier = 0.735;   break;
+                default: width_multiplier = 1.0;     break;
             }
+            actual_fontsize = x_gui.x_fontsize;
             actual_height = actual_fontsize;
             //exceptions
             if (x_gui.x_font_style == 0 &&
@@ -577,7 +526,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);
+    //x->x_gui.x_draw((void *)z, glist, IEM_GUI_DRAW_MODE_MOVE);
     canvas_fixlinesfor(glist_getcanvas(glist), (t_text *)z);
 }
 
@@ -587,7 +536,7 @@ void iemgui_select(t_gobj *z, t_glist *glist, int selected)
     t_iemgui *x = (t_iemgui *)z;
 
     x->x_selected = selected;
-    (*x->x_draw)((void *)z, glist, IEM_GUI_DRAW_MODE_SELECT);
+    x->x_draw((void *)z, glist, IEM_GUI_DRAW_MODE_SELECT);
 }
 
 void iemgui_delete(t_gobj *z, t_glist *glist)
@@ -602,15 +551,14 @@ void iemgui_vis(t_gobj *z, t_glist *glist, int vis)
     {
         if (vis)
         {
-            (*x->x_draw)((void *)z, glist, IEM_GUI_DRAW_MODE_NEW);
-            x->x_vis = 1;
+            x->x_draw((void *)z, glist, IEM_GUI_DRAW_MODE_NEW);
         }
         else
         {
-            (*x->x_draw)((void *)z, glist, IEM_GUI_DRAW_MODE_ERASE);
+            x->x_draw((void *)z, glist, IEM_GUI_DRAW_MODE_ERASE);
             sys_unqueuegui(z);
-            x->x_vis = 0;
         }
+        x->x_vis = vis;
     }
 }
 
@@ -771,12 +719,22 @@ 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,
-const char *nlet_tag) {
+void scalehandle_draw_select(t_scalehandle *h, t_glist *canvas, int px, int py, const char *nlet_tag) {
     char tags[128]; // BNG may need up to 100 chars in 64-bit mode, for example
-    t_text *x = (t_text *)h->h_master;
+    t_iemgui *x = (t_iemgui *)h->h_master;
     //if (!nlet_tag) nlet_tag = iem_get_tag(canvas, (t_iemgui *)x);
 
+    //int px,py;
+    //t_class *c = pd_class((t_pd *)x);
+    //if (h->h_scale) {
+    //    int x1,y1,x2,y2;
+    //    c->c_wb->w_getrectfn((t_gobj *)x,canvas,&x1,&y1,&x2,&y2);
+    //    px=x2-x1; py=y2-y1;
+    //} else if (c==canvas_class) {  
+    //} else {
+    //    px=x->x_ldx; py=x->x_ldy;
+    //}
+
     const char *cursor = h->h_scale ? "bottom_right_corner" : "crosshair";
     int sx = h->h_scale ? SCALEHANDLE_WIDTH  : LABELHANDLE_WIDTH;
     int sy = h->h_scale ? SCALEHANDLE_HEIGHT : LABELHANDLE_HEIGHT;
@@ -785,8 +743,8 @@ const char *nlet_tag) {
 
     if (h->h_vis) scalehandle_draw_erase(h,canvas);
 
-//    sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 "
-    sys_vgui("canvas %s -width %d -height %d -bg #0080ff -bd 0 "
+    sys_vgui("canvas %s -width %d -height %d -bg $pd_colors(selection) -bd 0 "
+//    sys_vgui("canvas %s -width %d -height %d -bg #0080ff -bd 0 "
         "-cursor %s\n", h->h_pathname, sx, sy, cursor);
     // there was a %lxBNG tag (or similar) in every scalehandle,
     // but it didn't seem to be used —mathieu
@@ -799,19 +757,20 @@ const char *nlet_tag) {
             (long)x,pd_class((t_pd *)x)==canvas_class?"MOVE":"LABELH",nlet_tag);
     }
     sys_vgui(".x%x.c create window %d %d -anchor nw -width %d -height %d "
-        "-window %s -tags {%s}\n", canvas, x->te_xpix+px-sx, x->te_ypix+py-sy,
+        "-window %s -tags {%s}\n", canvas, x->x_obj.te_xpix+px-sx, x->x_obj.te_ypix+py-sy,
         sx, sy, h->h_pathname, tags);
     scalehandle_bind(h);
     h->h_vis = 1;
 }
 
-void scalehandle_draw_select2(t_iemgui *x, t_glist *canvas, int sx, int sy) {
+void scalehandle_draw_select2(t_iemgui *x, t_glist *canvas) {
     char *nlet_tag = iem_get_tag(canvas, (t_iemgui *)x);
-    scalehandle_draw_select(x->x_handle,canvas,sx,sy,nlet_tag);
+    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);
+    scalehandle_draw_select(x->x_handle,canvas,x2-x1-1,y2-y1-1,nlet_tag);
     if (x->x_lab!=s_empty)
-    {
         scalehandle_draw_select(x->x_lhandle,canvas,x->x_ldx,x->x_ldy,nlet_tag);
-    }
 }
 
 void scalehandle_draw_erase(t_scalehandle *h, t_glist *canvas) {
@@ -1125,6 +1084,8 @@ const char *iemgui_font(t_iemgui *x) {
     return "invalid-font";
 }
 
+void iemgui_init(t_iemgui *x, t_floatarg f) {x->x_loadinit = f!=0.0;}
+
 void iemgui_class_addmethods(t_class *c) {
     class_addmethod(c, (t_method)iemgui_delta,
         gensym("delta"), A_GIMME, 0);
diff --git a/pd/src/g_all_guis.h b/pd/src/g_all_guis.h
index 748db131a..82c296e79 100644
--- a/pd/src/g_all_guis.h
+++ b/pd/src/g_all_guis.h
@@ -292,7 +292,7 @@ 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, const char *nlet_tag);
-EXTERN void scalehandle_draw_select2(t_iemgui *x, t_glist *canvas, int sx, int sy);
+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_new(t_scalehandle *x, t_glist *canvas);
@@ -334,9 +334,6 @@ static inline int iemgui_has_snd (t_iemgui *x) {return x->x_snd!=s_empty;}
 static inline int iemgui_has_rcv (t_iemgui *x) {return x->x_rcv!=s_empty;}
 EXTERN const char *iemgui_font(t_iemgui *x);
 EXTERN void iemgui_class_addmethods(t_class *c);
-
 EXTERN void scrollbar_update(t_glist *glist);
-
-
-EXTERN void radio_draw_update(t_gobj *client, t_glist *glist);
+EXTERN void iemgui_init(t_iemgui *x, t_floatarg f);
 
diff --git a/pd/src/g_bang.c b/pd/src/g_bang.c
index e9757a866..164634566 100644
--- a/pd/src/g_bang.c
+++ b/pd/src/g_bang.c
@@ -8,7 +8,6 @@
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
-#include <ctype.h>
 #include "m_pd.h"
 #include "g_canvas.h"
 #include "g_all_guis.h"
@@ -104,8 +103,7 @@ void bng_draw_select(t_bng* x, t_glist* glist)
         {
             sys_vgui(".x%lx.c itemconfigure %lxBUT "
                      "-stroke $pd_colors(selection)\n", canvas, x);
-            scalehandle_draw_select2(&x->x_gui,glist,
-                x->x_gui.x_w-1,x->x_gui.x_h-1);
+            scalehandle_draw_select2(&x->x_gui,glist);
         }
     }
     else
@@ -223,9 +221,7 @@ void bng_check_minmax(t_bng *x, int ftbreak, int fthold)
 {
     if(ftbreak > fthold)
     {
-        int h;
-
-        h = ftbreak;
+        int h = ftbreak;
         ftbreak = fthold;
         fthold = h;
     }
@@ -281,7 +277,6 @@ static void bng_set(t_bng *x)
 
 static void bng_bout1(t_bng *x)/*wird nur mehr gesendet, wenn snd != rcv*/
 {
-    fprintf(stderr,"bng_bout1: snd=%s rcv=%s\n",x->x_gui.x_snd->s_name,x->x_gui.x_rcv->s_name);
     if(!x->x_gui.x_put_in2out)
     {
         x->x_gui.x_locked = 1;
@@ -366,19 +361,10 @@ static int bng_newclick(t_gobj *z, struct _glist *glist, int xpix, int ypix,
     return (1);
 }
 
-static void bng_float(t_bng *x, t_floatarg f)
-{bng_bang2(x);}
-
-static void bng_symbol(t_bng *x, t_symbol *s)
-{bng_bang2(x);}
-
-static void bng_pointer(t_bng *x, t_gpointer *gp)
-{bng_bang2(x);}
-
-static void bng_list(t_bng *x, t_symbol *s, int ac, t_atom *av)
-{
-    bng_bang2(x);
-}
+static void bng_float(t_bng *x, t_floatarg f)                  {bng_bang2(x);}
+static void bng_symbol(t_bng *x, t_symbol *s)                  {bng_bang2(x);}
+static void bng_pointer(t_bng *x, t_gpointer *gp)              {bng_bang2(x);}
+static void bng_list(t_bng *x, t_symbol *s, int ac, t_atom *av){bng_bang2(x);}
 
 static void bng_anything(t_bng *x, t_symbol *s, int argc, t_atom *argv)
 {bng_bang2(x);}
@@ -394,8 +380,7 @@ static void bng_loadbang(t_bng *x)
 
 static void bng_size(t_bng *x, t_symbol *s, int ac, t_atom *av)
 {
-    x->x_gui.x_w = iemgui_clip_size((int)atom_getintarg(0, ac, av));
-    x->x_gui.x_h = x->x_gui.x_w;
+    x->x_gui.x_h = x->x_gui.x_w = iemgui_clip_size((int)atom_getintarg(0, ac, av));
     iemgui_size(&x->x_gui);
 }
 
@@ -405,11 +390,6 @@ static void bng_flashtime(t_bng *x, t_symbol *s, int ac, t_atom *av)
                      (int)atom_getintarg(1, ac, av));
 }
 
-static void bng_init(t_bng *x, t_floatarg f)
-{
-    x->x_gui.x_loadinit = (f==0.0)?0:1;
-}
-
 static void bng_tick_hld(t_bng *x)
 {
     x->x_flashed = 0;
@@ -529,7 +509,7 @@ void g_bang_setup(void)
     iemgui_class_addmethods(bng_class);
     class_addmethod(bng_class, (t_method)bng_flashtime, gensym("flashtime"),
         A_GIMME, 0);
-    class_addmethod(bng_class, (t_method)bng_init, gensym("init"), A_FLOAT, 0);
+    class_addmethod(bng_class, (t_method)iemgui_init, gensym("init"), A_FLOAT, 0);
  
     scalehandle_class = class_new(gensym("_scalehandle"), 0, 0,
                   sizeof(t_scalehandle), CLASS_PD, 0);
diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c
index 7fbb48b37..17fd068a1 100644
--- a/pd/src/g_canvas.c
+++ b/pd/src/g_canvas.c
@@ -1928,8 +1928,6 @@ void canvasgop__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx, t_flo
         /* done dragging */
         if(sh->h_scale) //enter if resize_gop hook
         {
-            /* first set up the undo apply */
-            //canvas_canvas_setundo(x);
             canvas_undo_add(x, 8, "apply", canvas_undo_set_canvas(x));
 
             if (sh->h_dragx || sh->h_dragy) 
diff --git a/pd/src/g_mycanvas.c b/pd/src/g_mycanvas.c
index 112986152..d82c1947b 100644
--- a/pd/src/g_mycanvas.c
+++ b/pd/src/g_mycanvas.c
@@ -89,8 +89,7 @@ void my_canvas_draw_select(t_my_canvas* x, t_glist* glist)
         {
             sys_vgui(".x%lx.c itemconfigure %lxBASE "
                      "-stroke $pd_colors(selection)\n", canvas, x);
-            scalehandle_draw_select2(&x->x_gui,glist,
-                x->x_vis_w,x->x_vis_h);
+            scalehandle_draw_select2(&x->x_gui,glist);
         }
         sys_vgui(".x%lx.c addtag selected withtag %lxOBJ\n", canvas, x);
     }
diff --git a/pd/src/g_numbox.c b/pd/src/g_numbox.c
index 3123e977f..aa5dbfc9c 100644
--- a/pd/src/g_numbox.c
+++ b/pd/src/g_numbox.c
@@ -254,8 +254,7 @@ 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,
-            x->x_numwidth-1,x->x_gui.x_h-1);
+        scalehandle_draw_select2(&x->x_gui,glist);
     else
         scalehandle_draw_erase2(&x->x_gui,glist);
     iemgui_label_draw_select(&x->x_gui,canvas);
@@ -704,11 +703,6 @@ static void my_numbox_lin(t_my_numbox *x)
     x->x_lin0_log1 = 0;
 }
 
-static void my_numbox_init(t_my_numbox *x, t_floatarg f)
-{
-    x->x_gui.x_loadinit = (f==0.0)?0:1;
-}
-
 static void my_numbox_loadbang(t_my_numbox *x)
 {
     if(!sys_noloadbang && x->x_gui.x_loadinit)
@@ -910,7 +904,7 @@ void g_numbox_setup(void)
         gensym("log"), 0);
     class_addmethod(my_numbox_class, (t_method)my_numbox_lin,
         gensym("lin"), 0);
-    class_addmethod(my_numbox_class, (t_method)my_numbox_init,
+    class_addmethod(my_numbox_class, (t_method)iemgui_init,
         gensym("init"), A_FLOAT, 0);
     class_addmethod(my_numbox_class, (t_method)my_numbox_log_height,
         gensym("log_height"), A_FLOAT, 0);
diff --git a/pd/src/g_radio.c b/pd/src/g_radio.c
index 0ad200a70..5f13d7d69 100644
--- a/pd/src/g_radio.c
+++ b/pd/src/g_radio.c
@@ -16,13 +16,10 @@
 #include "g_all_guis.h"
 #include <math.h>
 
-static t_class *hscalehandle_class;
-static t_class *vscalehandle_class;
+static t_class *scalehandle_class;
 extern int gfxstub_haveproperties(void *key);
-void hradio_draw_select(t_radio *x, t_glist *glist);
-void vradio_draw_select(t_radio *x, t_glist *glist);
-t_widgetbehavior hradio_widgetbehavior;
-t_widgetbehavior vradio_widgetbehavior;
+void radio_draw_select(t_radio *x, t_glist *glist);
+t_widgetbehavior radio_widgetbehavior;
 t_class *hradio_class, *hradio_old_class;
 t_class *vradio_class, *vradio_old_class;
 
@@ -43,108 +40,74 @@ void radio_draw_io(t_radio *x, t_glist *glist, int old_snd_rcv_flags)
     t_canvas *canvas=glist_getcanvas(glist);
     iemgui_io_draw(&x->x_gui,canvas,old_snd_rcv_flags);
 }
-void hradio_draw_new(t_radio *x, t_glist *glist)
+void radio_draw_new(t_radio *x, t_glist *glist)
 {
     t_canvas *canvas=glist_getcanvas(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); 
+    int y1=text_ypix(&x->x_gui.x_obj, glist), yi=y1; 
     char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
 
     iemgui_base_draw_new(&x->x_gui, canvas, nlet_tag);
     scalehandle_draw_new(x->x_gui. x_handle,canvas);
     scalehandle_draw_new(x->x_gui.x_lhandle,canvas);
 
-    for(i=0; i<n; i++)
-    {
+    for(i=0; i<n; i++) if (x->x_orient) {
         if (i) sys_vgui(".x%lx.c create pline %d %d %d %d "
             "-stroke $pd_colors(iemgui_border) "
             "-tags {%lxBASE%d %lxBASEL %lxOBJ %s text iemgui border}\n",
-            canvas, xi, y1, xi, y1+d, x, i, x, x, nlet_tag);
+            canvas, x1, yi, x1+d, yi, x, i, x, x, nlet_tag);
         sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x "
             "-stroke #%6.6x -tags {%lxBUT%d %lxOBJ %s text iemgui}\n",
-            canvas, xi+s, y1+s, xi+d-s, y1+d-s,
+            canvas, x1+s, yi+s, x1+d-s, yi+d-s,
             (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, nlet_tag);
-        xi += d;
+        yi += d;
         x->x_drawn = x->x_on;
-    }
-    iemgui_label_draw_new(&x->x_gui,canvas,x1,y1,nlet_tag);
-    radio_draw_io(x,glist,7);
-}
-void vradio_draw_new(t_radio *x, t_glist *glist)
-{
-    t_canvas *canvas=glist_getcanvas(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);
-    int y1=text_ypix(&x->x_gui.x_obj, glist), yi=y1;
-    char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
-
-    iemgui_base_draw_new(&x->x_gui, canvas, nlet_tag);
-    scalehandle_draw_new(x->x_gui. x_handle,canvas);
-    scalehandle_draw_new(x->x_gui.x_lhandle,canvas);
-
-    for(i=0; i<n; i++)
-    {
+    } else {
         if (i) sys_vgui(".x%lx.c create pline %d %d %d %d "
             "-stroke $pd_colors(iemgui_border) "
             "-tags {%lxBASE%d %lxBASEL %lxOBJ %s text iemgui border}\n",
-            canvas, x1, yi, x1+d, yi, x, i, x, x, nlet_tag);
+            canvas, xi, y1, xi, y1+d, x, i, x, x, nlet_tag);
         sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x "
             "-stroke #%6.6x -tags {%lxBUT%d %lxOBJ %s text iemgui}\n",
-            canvas, x1+s, yi+s, x1+d-s, yi+d-s,
+            canvas, xi+s, y1+s, xi+d-s, y1+d-s,
             (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, nlet_tag);
-        yi += d;
+        xi += d;
         x->x_drawn = x->x_on;
     }
     iemgui_label_draw_new(&x->x_gui,canvas,x1,y1,nlet_tag);
     radio_draw_io(x,glist,7);
 }
 
-void hradio_draw_move(t_radio *x, t_glist *glist)
+void radio_draw_move(t_radio *x, t_glist *glist)
 {
     t_canvas *canvas=glist_getcanvas(glist);
     if (!glist_isvisible(canvas)) return;
     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); 
-    char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
-    iemgui_base_draw_move(&x->x_gui, canvas, nlet_tag);
-    for(i=0; i<n; i++)
-    {
-        sys_vgui(".x%lx.c coords %lxBASE%d %d %d %d %d\n",
-            canvas, x, i, xi, y1, xi, y1+d);
-        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);
-        xi += d;
-    }
-    iemgui_label_draw_move(&x->x_gui,canvas,x1,y1);
-    iemgui_io_draw_move(&x->x_gui,canvas,nlet_tag);
-    if (x->x_gui.x_selected) hradio_draw_select(x, x->x_gui.x_glist);
-}
-void vradio_draw_move(t_radio *x, t_glist *glist)
-{
-    t_canvas *canvas=glist_getcanvas(glist);
-    if (!glist_isvisible(canvas)) return;
-    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);
     int y1=text_ypix(&x->x_gui.x_obj, glist), yi=y1;
     char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);
     iemgui_base_draw_move(&x->x_gui, canvas, nlet_tag);
-    for(i=0; i<n; i++)
-    {
+    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);
         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);
         yi += d;
+    } else {
+        sys_vgui(".x%lx.c coords %lxBASE%d %d %d %d %d\n",
+            canvas, x, i, xi, y1, xi, y1+d);
+        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);
+        xi += d;
     }
     iemgui_label_draw_move(&x->x_gui,canvas,x1,y1);
     iemgui_io_draw_move(&x->x_gui,canvas,nlet_tag);
-    if (x->x_gui.x_selected) vradio_draw_select(x, x->x_gui.x_glist);
+    if (x->x_gui.x_selected) radio_draw_select(x, x->x_gui.x_glist);
 }
 
 void radio_draw_config(t_radio *x, t_glist *glist)
@@ -162,127 +125,61 @@ void radio_draw_config(t_radio *x, t_glist *glist)
     }
 }
 
-void hradio_draw_select(t_radio *x, t_glist *glist)
-{
-    t_canvas *canvas=glist_getcanvas(glist);
-    iemgui_base_draw_config(&x->x_gui,canvas);
-    if(x->x_gui.x_selected)
-    {
-        if (x->x_gui.x_glist == glist_getcanvas(glist))
-            scalehandle_draw_select2(&x->x_gui,glist,
-                x->x_gui.x_w*x->x_number-1,x->x_gui.x_h-1);
-    }
-    else
-    {
-        scalehandle_draw_erase2(&x->x_gui,glist);
-    }
-    iemgui_label_draw_select(&x->x_gui,canvas);
-    iemgui_tag_selected(&x->x_gui,canvas);
-}
-void vradio_draw_select(t_radio *x, t_glist *glist)
+void radio_draw_select(t_radio *x, t_glist *glist)
 {
     t_canvas *canvas=glist_getcanvas(glist);
     iemgui_base_draw_config(&x->x_gui,canvas);
     if(x->x_gui.x_selected)
     {
         if (x->x_gui.x_glist == glist_getcanvas(glist))
-            scalehandle_draw_select2(&x->x_gui,glist,
-                x->x_gui.x_w-1,x->x_gui.x_h*x->x_number-1);
-    }
-    else
-    {
-        scalehandle_draw_erase2(&x->x_gui,glist);
+            scalehandle_draw_select2(&x->x_gui,glist);
     }
+    else scalehandle_draw_erase2(&x->x_gui,glist);
     iemgui_label_draw_select(&x->x_gui,canvas);
     iemgui_tag_selected(&x->x_gui,canvas);
 }
 
-static void hradio__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx,
-    t_floatarg yyy)
-{
-    t_radio *x = (t_radio *)(sh->h_master);
-    int newstate = (int)f;
-    if (sh->h_dragon && newstate == 0 && sh->h_scale)
-    {
-        canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
-        if (sh->h_dragx || sh->h_dragy)
-        {
-            x->x_gui.x_w += sh->h_dragy;
-            x->x_gui.x_h += sh->h_dragy;
-            canvas_dirty(x->x_gui.x_glist, 1);
-        }
-        if (glist_isvisible(x->x_gui.x_glist))
-        {
-            hradio_draw_move(x, x->x_gui.x_glist);
-            scalehandle_unclick_scale(sh);
-        }
-    }
-    else if (!sh->h_dragon && newstate && sh->h_scale)
-        scalehandle_click_scale(sh);
-    else if (sh->h_dragon && newstate == 0 && !sh->h_scale)
-        scalehandle_unclick_label(sh);
-    else if (!sh->h_dragon && newstate && !sh->h_scale)
-        scalehandle_click_label(sh);
-    sh->h_dragon = newstate;
-}
-static void vradio__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx,
+static void radio__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx,
     t_floatarg yyy)
 {
-    t_radio *x = (t_radio *)(sh->h_master);
     int newstate = (int)f;
     if (sh->h_dragon && newstate == 0 && sh->h_scale)
     {
+        t_radio *x = (t_radio *)(sh->h_master);
         canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
         if (sh->h_dragx || sh->h_dragy)
         {
-            x->x_gui.x_w += sh->h_dragx;
-            x->x_gui.x_h += sh->h_dragx;
+            if (x->x_orient) {
+                x->x_gui.x_w += sh->h_dragx;
+                x->x_gui.x_h += sh->h_dragx;
+            } else {
+                x->x_gui.x_w += sh->h_dragy;
+                x->x_gui.x_h += sh->h_dragy;
+            }
             canvas_dirty(x->x_gui.x_glist, 1);
         }
         if (glist_isvisible(x->x_gui.x_glist))
         {
-            vradio_draw_move(x, x->x_gui.x_glist);
+            radio_draw_move(x, x->x_gui.x_glist);
             scalehandle_unclick_scale(sh);
         }
     }
-    else if (!sh->h_dragon && newstate && sh->h_scale)
-        scalehandle_click_scale(sh);
-    else if (sh->h_dragon && newstate == 0 && !sh->h_scale)
-        scalehandle_unclick_label(sh);
-    else if (!sh->h_dragon && newstate && !sh->h_scale)
-        scalehandle_click_label(sh);
-    sh->h_dragon = newstate;
+    iemgui__clickhook3(sh,newstate);
 }
 
-static void hradio__motionhook(t_scalehandle *sh, t_floatarg f1, t_floatarg f2)
+static void radio__motionhook(t_scalehandle *sh, t_floatarg f1, t_floatarg f2)
 {
     if (sh->h_dragon && sh->h_scale)
     {
         t_radio *x = (t_radio *)(sh->h_master);
         int dx = (int)f1, dy = (int)f2;
-        dx = maxi(dx,(IEM_GUI_MINSIZE-x->x_gui.x_w)*x->x_number);
-        dy = dx/x->x_number;
-        sh->h_dragx = dx;
-        sh->h_dragy = dy;
-        scalehandle_drag_scale(sh);
-
-        int properties = gfxstub_haveproperties((void *)x);
-        if (properties)
-        {
-            int new_w = x->x_gui.x_w + sh->h_dragx;
-            properties_set_field_int(properties,"dim.w_ent",new_w);
+        if (x->x_orient) {
+            dy = maxi(dy,(IEM_GUI_MINSIZE-x->x_gui.x_h)*x->x_number);
+            dx = dy/x->x_number;
+        } else {
+            dx = maxi(dx,(IEM_GUI_MINSIZE-x->x_gui.x_w)*x->x_number);
+            dy = dx/x->x_number;
         }
-    }
-    scalehandle_dragon_label(sh,f1,f2);
-}
-static void vradio__motionhook(t_scalehandle *sh, t_floatarg f1, t_floatarg f2)
-{
-    if (sh->h_dragon && sh->h_scale)
-    {
-        t_radio *x = (t_radio *)(sh->h_master);
-        int dx = (int)f1, dy = (int)f2;
-        dy = maxi(dy,(IEM_GUI_MINSIZE-x->x_gui.x_h)*x->x_number);
-        dx = dy/x->x_number;
         sh->h_dragx = dx;
         sh->h_dragy = dy;
         scalehandle_drag_scale(sh);
@@ -290,100 +187,64 @@ static void vradio__motionhook(t_scalehandle *sh, t_floatarg f1, t_floatarg f2)
         int properties = gfxstub_haveproperties((void *)x);
         if (properties)
         {
-            int new_w = x->x_gui.x_h + sh->h_dragy;
-            properties_set_field_int(properties,"dim.w_ent",new_w);
+            properties_set_field_int(properties,"dim.w_ent", x->x_orient ?
+                x->x_gui.x_h + sh->h_dragy :
+                x->x_gui.x_w + sh->h_dragx);
         }
     }
     scalehandle_dragon_label(sh,f1,f2);
 }
 
-void hradio_draw(t_radio *x, t_glist *glist, int mode)
+void radio_draw(t_radio *x, t_glist *glist, int mode)
 {
     if(mode == IEM_GUI_DRAW_MODE_UPDATE)        sys_queuegui(x, glist, radio_draw_update);
-    else if(mode == IEM_GUI_DRAW_MODE_MOVE)     hradio_draw_move(x, glist);
-    else if(mode == IEM_GUI_DRAW_MODE_NEW)     {hradio_draw_new(x, glist); sys_vgui(".x%lx.c raise all_cords\n", glist_getcanvas(glist));}
-    else if(mode == IEM_GUI_DRAW_MODE_SELECT)   hradio_draw_select(x, glist);
-    else if(mode == IEM_GUI_DRAW_MODE_ERASE)    iemgui_draw_erase(&x->x_gui, glist);
-    else if(mode == IEM_GUI_DRAW_MODE_CONFIG)   radio_draw_config(x, glist);
-    else if(mode >= IEM_GUI_DRAW_MODE_IO)       radio_draw_io(x, glist, mode - IEM_GUI_DRAW_MODE_IO);
-}
-void vradio_draw(t_radio *x, t_glist *glist, int mode)
-{
-    if(mode == IEM_GUI_DRAW_MODE_UPDATE)        sys_queuegui(x, glist, radio_draw_update);
-    else if(mode == IEM_GUI_DRAW_MODE_MOVE)     vradio_draw_move(x, glist);
-    else if(mode == IEM_GUI_DRAW_MODE_NEW)     {vradio_draw_new(x, glist); sys_vgui(".x%lx.c raise all_cords\n", glist_getcanvas(glist));}
-    else if(mode == IEM_GUI_DRAW_MODE_SELECT)   vradio_draw_select(x, glist);
+    else if(mode == IEM_GUI_DRAW_MODE_MOVE)     radio_draw_move(x, glist);
+    else if(mode == IEM_GUI_DRAW_MODE_NEW)     {radio_draw_new(x, glist); sys_vgui(".x%lx.c raise all_cords\n", glist_getcanvas(glist));}
+    else if(mode == IEM_GUI_DRAW_MODE_SELECT)   radio_draw_select(x, glist);
     else if(mode == IEM_GUI_DRAW_MODE_ERASE)    iemgui_draw_erase(&x->x_gui, glist);
     else if(mode == IEM_GUI_DRAW_MODE_CONFIG)   radio_draw_config(x, glist);
     else if(mode >= IEM_GUI_DRAW_MODE_IO)       radio_draw_io(x, glist, mode - IEM_GUI_DRAW_MODE_IO);
 }
 
-static void hradio_getrect(t_gobj *z, t_glist *glist, int *xp1, int *yp1,
+static void radio_getrect(t_gobj *z, t_glist *glist, int *xp1, int *yp1,
     int *xp2, int *yp2)
 {
     t_radio *x = (t_radio *)z;
-
     *xp1 = text_xpix(&x->x_gui.x_obj, glist);
     *yp1 = text_ypix(&x->x_gui.x_obj, glist);
-    *xp2 = *xp1 + x->x_gui.x_w*x->x_number;
-    *yp2 = *yp1 + x->x_gui.x_h;
-
-    iemgui_label_getrect(x->x_gui, glist, xp1, yp1, xp2, yp2);
-}
-
-static void vradio_getrect(t_gobj *z, t_glist *glist, int *xp1, int *yp1,
-    int *xp2, int *yp2)
-{
-    t_radio *x = (t_radio *)z;
-
-    *xp1 = text_xpix(&x->x_gui.x_obj, glist);
-    *yp1 = text_ypix(&x->x_gui.x_obj, glist);
-    *xp2 = *xp1 + x->x_gui.x_w;
-    *yp2 = *yp1 + x->x_gui.x_h*x->x_number;
-
+    if (x->x_orient) {
+        *xp2 = *xp1 + x->x_gui.x_w;
+        *yp2 = *yp1 + x->x_gui.x_h*x->x_number;
+    } else {
+        *xp2 = *xp1 + x->x_gui.x_w*x->x_number;
+        *yp2 = *yp1 + x->x_gui.x_h;
+    }
     iemgui_label_getrect(x->x_gui, glist, xp1, yp1, xp2, yp2);
 }
 
-static void hradio_save(t_gobj *z, t_binbuf *b)
+static void radio_save(t_gobj *z, t_binbuf *b)
 {
     t_radio *x = (t_radio *)z;
     int bflcol[3];
     t_symbol *srl[3];
-
+    t_class *c = pd_class((t_pd *)x);
+    t_symbol *cname =
+        c == vradio_old_class ? gensym("vdl") :
+        c == hradio_old_class ? gensym("hdl") :
+        x->x_orient ? gensym("vradio") : gensym("hradio");
+    
     iemgui_save(&x->x_gui, srl, bflcol);
     binbuf_addv(b, "ssiisiiiisssiiiiiiii", gensym("#X"),gensym("obj"),
-                (int)x->x_gui.x_obj.te_xpix, (int)x->x_gui.x_obj.te_ypix,
-                (pd_class(&x->x_gui.x_obj.ob_pd) == hradio_old_class ?
-                    gensym("hdl") : gensym("hradio")),
-                x->x_gui.x_w,
-                x->x_change, iem_symargstoint(&x->x_gui), x->x_number,
-                srl[0], srl[1], srl[2],
-                x->x_gui.x_ldx, x->x_gui.x_ldy,
-                iem_fstyletoint(&x->x_gui), x->x_gui.x_fontsize,
-                bflcol[0], bflcol[1], bflcol[2], x->x_on);
+        (int)x->x_gui.x_obj.te_xpix, (int)x->x_gui.x_obj.te_ypix,
+        cname, x->x_gui.x_w,
+        x->x_change, iem_symargstoint(&x->x_gui), x->x_number,
+        srl[0], srl[1], srl[2], x->x_gui.x_ldx, x->x_gui.x_ldy,
+        iem_fstyletoint(&x->x_gui), x->x_gui.x_fontsize,
+        bflcol[0], bflcol[1], bflcol[2], x->x_on);
     binbuf_addv(b, ";");
 }
 
-static void vradio_save(t_gobj *z, t_binbuf *b)
-{
-    t_radio *x = (t_radio *)z;
-    int bflcol[3];
-    t_symbol *srl[3];
-
-    iemgui_save(&x->x_gui, srl, bflcol);
-    binbuf_addv(b, "ssiisiiiisssiiiiiiii", gensym("#X"),gensym("obj"),
-                (int)x->x_gui.x_obj.te_xpix, (int)x->x_gui.x_obj.te_ypix,
-                (pd_class(&x->x_gui.x_obj.ob_pd) == vradio_old_class ?
-                    gensym("vdl") : gensym("vradio")),
-                x->x_gui.x_w,
-                x->x_change, iem_symargstoint(&x->x_gui), x->x_number,
-                srl[0], srl[1], srl[2],
-                x->x_gui.x_ldx, x->x_gui.x_ldy,
-                iem_fstyletoint(&x->x_gui), x->x_gui.x_fontsize,
-                bflcol[0], bflcol[1], bflcol[2], x->x_on);
-    binbuf_addv(b, ";");
-}
-static void hradio_properties(t_gobj *z, t_glist *owner)
+static void radio_properties(t_gobj *z, t_glist *owner)
 {
     t_radio *x = (t_radio *)z;
     char buf[800];
@@ -391,12 +252,13 @@ static void hradio_properties(t_gobj *z, t_glist *owner)
     int hchange=-1;
 
     iemgui_properties(&x->x_gui, srl);
-    if (pd_class(&x->x_gui.x_obj.ob_pd) == hradio_old_class)
+    if (pd_class((t_pd *)x) == hradio_old_class || pd_class((t_pd *)x) == vradio_old_class)
         hchange = x->x_change;
-    sprintf(buf, "pdtk_iemgui_dialog %%s |hradio| \
+    sprintf(buf, "pdtk_iemgui_dialog %%s |%cradio| \
         ----------dimensions(pix):----------- %d %d size: 0 0 empty \
         empty 0.0 empty 0.0 empty %d %d new-only new&old %d %d number: %d \
         {%s} {%s} {%s} %d %d %d %d %d %d %d\n",
+        x->x_orient ? 'v' : 'h',
         x->x_gui.x_w, IEM_GUI_MINSIZE, 0,/*no_schedule*/
         hchange, x->x_gui.x_loadinit, -1, x->x_number,
         srl[0]->s_name, srl[1]->s_name,
@@ -406,31 +268,8 @@ static void hradio_properties(t_gobj *z, t_glist *owner)
         0xffffff & x->x_gui.x_lcol);
     gfxstub_new(&x->x_gui.x_obj.ob_pd, x, buf);
 }
-static void vradio_properties(t_gobj *z, t_glist *owner)
-{
-    t_radio *x = (t_radio *)z;
-    char buf[800];
-    t_symbol *srl[3];
-    int hchange=-1;
 
-    iemgui_properties(&x->x_gui, srl);
-    if (pd_class(&x->x_gui.x_obj.ob_pd) == vradio_old_class)
-        hchange = x->x_change;
-    sprintf(buf, "pdtk_iemgui_dialog %%s |vradio| \
-        ----------dimensions(pix):----------- %d %d size: 0 0 empty \
-        empty 0.0 empty 0.0 empty %d %d new-only new&old %d %d number: %d \
-        {%s} {%s} {%s} %d %d %d %d %d %d %d\n",
-        x->x_gui.x_w, IEM_GUI_MINSIZE, 0,/*no_schedule*/
-        hchange, x->x_gui.x_loadinit, -1, x->x_number,
-        srl[0]->s_name, srl[1]->s_name,
-        srl[2]->s_name, x->x_gui.x_ldx, x->x_gui.x_ldy,
-        x->x_gui.x_font_style, x->x_gui.x_fontsize,
-        0xffffff & x->x_gui.x_bcol, 0xffffff & x->x_gui.x_fcol,
-        0xffffff & x->x_gui.x_lcol);
-    gfxstub_new(&x->x_gui.x_obj.ob_pd, x, buf);
-}
-
-static void hradio_dialog(t_radio *x, t_symbol *s, int argc, t_atom *argv)
+static void radio_dialog(t_radio *x, t_symbol *s, int argc, t_atom *argv)
 {
     canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
 
@@ -465,45 +304,7 @@ static void hradio_dialog(t_radio *x, t_symbol *s, int argc, t_atom *argv)
         //canvas_fixlinesfor(glist_getcanvas(x->x_gui.x_glist), (t_text*)x);
         iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
     }
-    if (x->x_gui.x_selected) hradio_draw_select(x, x->x_gui.x_glist);
-    scrollbar_update(x->x_gui.x_glist);
-}
-static void vradio_dialog(t_radio *x, t_symbol *s, int argc, t_atom *argv)
-{
-    canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
-
-    t_symbol *srl[3];
-    int a = (int)atom_getintarg(0, argc, argv);
-    int chg = (int)atom_getintarg(4, argc, argv);
-    int num = (int)atom_getintarg(6, argc, argv);
-    int sr_flags;
-
-    if(chg != 0) chg = 1;
-    x->x_change = chg;
-    sr_flags = iemgui_dialog(&x->x_gui, srl, argc, argv);
-    x->x_gui.x_w = iemgui_clip_size(a);
-    x->x_gui.x_h = x->x_gui.x_w;
-    if(x->x_number != num)
-    {
-        x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_ERASE);
-        x->x_number = num;
-        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_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_NEW);
-    }
-    else
-    {
-        x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG);
-        x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_IO + sr_flags);
-        //x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE);
-        //canvas_fixlinesfor(glist_getcanvas(x->x_gui.x_glist), (t_text*)x);
-        iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
-    }
-    if (x->x_gui.x_selected) vradio_draw_select(x, x->x_gui.x_glist);
+    if (x->x_gui.x_selected) radio_draw_select(x, x->x_gui.x_glist);
     scrollbar_update(x->x_gui.x_glist);
 }
 
@@ -555,7 +356,7 @@ static void radio_bang(t_radio *x)
     }
 }
 
-static void radio_fout(t_radio *x, t_floatarg f)
+static void radio_float2(t_radio *x, t_floatarg f, int doout)
 {
     int i=mini(maxi((int)f,0),x->x_number-1);
 
@@ -564,45 +365,7 @@ static void radio_fout(t_radio *x, t_floatarg f)
     {
         if((x->x_change)&&(i != x->x_on_old))
         {
-            SETFLOAT(x->x_at, (t_float)x->x_on_old);
-            SETFLOAT(x->x_at+1, 0.0);
-            outlet_list(x->x_gui.x_obj.ob_outlet, &s_list, 2, x->x_at);
-            if(iemgui_has_snd(&x->x_gui) && x->x_gui.x_snd->s_thing)
-                pd_list(x->x_gui.x_snd->s_thing, &s_list, 2, x->x_at);
-        }
-        if(x->x_on != x->x_on_old)
-            x->x_on_old = x->x_on;
-        x->x_on = i;
-        x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
-        x->x_on_old = x->x_on;
-        SETFLOAT(x->x_at, (t_float)x->x_on);
-        SETFLOAT(x->x_at+1, 1.0);
-        outlet_list(x->x_gui.x_obj.ob_outlet, &s_list, 2, x->x_at);
-        if(iemgui_has_snd(&x->x_gui) && x->x_gui.x_snd->s_thing)
-            pd_list(x->x_gui.x_snd->s_thing, &s_list, 2, x->x_at);
-    }
-    else
-    {
-        x->x_on_old = x->x_on;
-        x->x_on = i;
-        if (i != x->x_on_old)
-            x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
-        outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on);
-        if (iemgui_has_snd(&x->x_gui) && x->x_gui.x_snd->s_thing)
-            pd_float(x->x_gui.x_snd->s_thing, x->x_on);
-    }
-}
-
-static void radio_float(t_radio *x, t_floatarg f)
-{
-    int i=mini(maxi((int)f,0),x->x_number-1);
-
-    if (pd_class(&x->x_gui.x_obj.ob_pd) == hradio_old_class ||
-        pd_class(&x->x_gui.x_obj.ob_pd) == vradio_old_class)
-    {
-        if((x->x_change)&&(i != x->x_on_old))
-        {
-            if(x->x_gui.x_put_in2out)
+            if(doout)
             {
                 SETFLOAT(x->x_at, (t_float)x->x_on_old);
                 SETFLOAT(x->x_at+1, 0.0);
@@ -611,12 +374,11 @@ static void radio_float(t_radio *x, t_floatarg f)
                     pd_list(x->x_gui.x_snd->s_thing, &s_list, 2, x->x_at);
             }
         }
-        if(x->x_on != x->x_on_old)
-            x->x_on_old = x->x_on;
+        x->x_on_old = x->x_on;
         x->x_on = i;
         x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
         x->x_on_old = x->x_on;
-        if(x->x_gui.x_put_in2out)
+        if(doout)
         {
             SETFLOAT(x->x_at, (t_float)x->x_on);
             SETFLOAT(x->x_at+1, 1.0);
@@ -631,7 +393,7 @@ static void radio_float(t_radio *x, t_floatarg f)
         x->x_on = i;
         if (i != x->x_on_old)
             x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
-        if (x->x_gui.x_put_in2out)
+        if (doout)
         {
             outlet_float(x->x_gui.x_obj.ob_outlet, x->x_on);
             if(iemgui_has_snd(&x->x_gui) && x->x_gui.x_snd->s_thing)
@@ -640,33 +402,33 @@ static void radio_float(t_radio *x, t_floatarg f)
     }
 }
 
-static void hradio_click(t_radio *x, t_floatarg xpos, t_floatarg ypos,
-    t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
+static void radio_fout(t_radio *x, t_floatarg f)
 {
-    int xx = (int)xpos - text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
-    radio_fout(x, (t_float)(xx / x->x_gui.x_w));
+    radio_float2(x,f,1);
 }
 
-static void vradio_click(t_radio *x, t_floatarg xpos, t_floatarg ypos,
-    t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
+static void radio_float(t_radio *x, t_floatarg f)
 {
-    int yy = (int)ypos - text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
-    radio_fout(x, (t_float)(yy / x->x_gui.x_h));
+    radio_float2(x,f,x->x_gui.x_put_in2out);
 }
 
-static int hradio_newclick(t_gobj *z, struct _glist *glist, int xpix, int ypix,
-    int shift, int alt, int dbl, int doit)
+static void radio_click(t_radio *x, t_floatarg xpos, t_floatarg ypos,
+    t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
 {
-    if(doit)
-        hradio_click((t_radio *)z, (t_floatarg)xpix, (t_floatarg)ypix,
-            (t_floatarg)shift, 0, (t_floatarg)alt);
-    return (1);
+    if (x->x_orient) {
+        int yy = (int)ypos - text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
+        radio_fout(x, (t_float)(yy / x->x_gui.x_h));
+    } else {
+        int xx = (int)xpos - text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
+        radio_fout(x, (t_float)(xx / x->x_gui.x_w));
+    }
 }
-static int vradio_newclick(t_gobj *z, struct _glist *glist, int xpix, int ypix,
+
+static int radio_newclick(t_gobj *z, struct _glist *glist, int xpix, int ypix,
     int shift, int alt, int dbl, int doit)
 {
     if(doit)
-        vradio_click((t_radio *)z, (t_floatarg)xpix, (t_floatarg)ypix,
+        radio_click((t_radio *)z, (t_floatarg)xpix, (t_floatarg)ypix,
             (t_floatarg)shift, 0, (t_floatarg)alt);
     return (1);
 }
@@ -698,11 +460,6 @@ static void radio_size(t_radio *x, t_symbol *s, int ac, t_atom *av)
     iemgui_size(&x->x_gui);
 }
 
-static void radio_init(t_radio *x, t_floatarg f)
-{
-    x->x_gui.x_loadinit = (f==0.0)?0:1;
-}
-
 static void radio_double_change(t_radio *x) {x->x_change = 1;}
 static void radio_single_change(t_radio *x) {x->x_change = 0;}
 
@@ -742,7 +499,7 @@ static void *radio_new(t_symbol *s, int argc, t_atom *argv)
         on = (int)atom_getintarg(14, argc, argv);
     }
     else iemgui_new_getnames(&x->x_gui, 4, 0);
-    x->x_gui.x_draw = x->x_orient ? (t_iemfunptr)vradio_draw : (t_iemfunptr)hradio_draw;
+    x->x_gui.x_draw = (t_iemfunptr)radio_draw;
     x->x_gui.x_glist = (t_glist *)canvas_getcurrent();
     if (x->x_gui.x_font_style<0 || x->x_gui.x_font_style>2) x->x_gui.x_font_style=0;
     if(num < 1)
@@ -773,7 +530,7 @@ 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 = x->x_orient ? vscalehandle_class : hscalehandle_class;
+    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_obj.te_iemgui = 1;
@@ -793,98 +550,61 @@ static void radio_free(t_radio *x)
 
 void radio_addmethods(t_class *c)
 {
+    class_addbang(hradio_class, radio_bang);
+    class_addfloat(hradio_class, radio_float);
     class_addmethod(c, (t_method)radio_loadbang,  gensym("loadbang"), 0);
     class_addmethod(c, (t_method)radio_set,       gensym("set"), A_FLOAT, 0);
     class_addmethod(c, (t_method)radio_size,      gensym("size"), A_GIMME, 0);
-    class_addmethod(c, (t_method)radio_init,      gensym("init"), A_FLOAT, 0);
+    class_addmethod(c, (t_method)iemgui_init,      gensym("init"), A_FLOAT, 0);
     class_addmethod(c, (t_method)radio_number,  gensym("number"), A_FLOAT, 0);
     class_addmethod(c, (t_method)radio_single_change,
         gensym("single_change"), 0);
     class_addmethod(c, (t_method)radio_double_change,
         gensym("double_change"), 0);
+    class_addmethod(c, (t_method)radio_click, gensym("click"),
+        A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
+    class_setpropertiesfn(c, radio_properties);
+    class_addmethod(c, (t_method)radio_dialog, gensym("dialog"), A_GIMME, 0);
+    class_setsavefn(c, radio_save);
+    class_setwidget(c, &radio_widgetbehavior);
 }
 
-void g_hradio_setup(void)
+void g_radio_setup(void)
 {
+    wb_init(&radio_widgetbehavior,radio_getrect,radio_newclick);
     hradio_class = class_new(gensym("hradio"), (t_newmethod)radio_new,
         (t_method)radio_free, sizeof(t_radio), 0, A_GIMME, 0);
-    class_addbang(hradio_class, radio_bang);
-    class_addfloat(hradio_class, radio_float);
-    class_addmethod(hradio_class, (t_method)hradio_click, gensym("click"),
-        A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
-    class_addmethod(hradio_class, (t_method)hradio_dialog, gensym("dialog"),
-        A_GIMME, 0);
-    iemgui_class_addmethods(hradio_class);
-    radio_addmethods(hradio_class);
-    hscalehandle_class = class_new(gensym("_scalehandle"), 0, 0,
-        sizeof(t_scalehandle), CLASS_PD, 0);
-    class_addmethod(hscalehandle_class, (t_method)hradio__clickhook,
-        gensym("_click"), A_FLOAT, A_FLOAT, A_FLOAT, 0);
-    class_addmethod(hscalehandle_class, (t_method)hradio__motionhook,
-        gensym("_motion"), A_FLOAT, A_FLOAT, 0);
-
-    wb_init(&hradio_widgetbehavior,hradio_getrect,hradio_newclick);
-    class_setwidget(hradio_class, &hradio_widgetbehavior);
-    class_sethelpsymbol(hradio_class, gensym("hradio"));
-    class_setsavefn(hradio_class, hradio_save);
-    class_setpropertiesfn(hradio_class, hradio_properties);
-
-        /* obsolete version (0.34-0.35) */
     hradio_old_class = class_new(gensym("hdl"), (t_newmethod)radio_new,
         (t_method)radio_free, sizeof(t_radio), 0, A_GIMME, 0);
+    vradio_class = class_new(gensym("vradio"), (t_newmethod)radio_new,
+        (t_method)radio_free, sizeof(t_radio), 0, A_GIMME, 0);
+    vradio_old_class = class_new(gensym("vdl"), (t_newmethod)radio_new,
+        (t_method)radio_free, sizeof(t_radio), 0, A_GIMME, 0);
     class_addcreator((t_newmethod)radio_new, gensym("rdb"), A_GIMME, 0);
     class_addcreator((t_newmethod)radio_new, gensym("radiobut"), A_GIMME, 0);
     class_addcreator((t_newmethod)radio_new, gensym("radiobutton"),
         A_GIMME, 0);
-    class_addbang(hradio_old_class, radio_bang);
-    class_addfloat(hradio_old_class, radio_float);
-    class_addmethod(hradio_old_class, (t_method)hradio_click, gensym("click"),
-        A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
-    class_addmethod(hradio_old_class, (t_method)hradio_dialog,
-        gensym("dialog"), A_GIMME, 0);
-    radio_addmethods(hradio_old_class);
+
+    iemgui_class_addmethods(hradio_class);
     iemgui_class_addmethods(hradio_old_class);
-    class_setwidget(hradio_old_class, &hradio_widgetbehavior);
-    class_sethelpsymbol(hradio_old_class, gensym("hradio"));
-}
+    iemgui_class_addmethods(vradio_class);
+    iemgui_class_addmethods(vradio_old_class);
 
-void g_vradio_setup(void)
-{
-    vradio_class = class_new(gensym("vradio"), (t_newmethod)radio_new,
-        (t_method)radio_free, sizeof(t_radio), 0, A_GIMME, 0);
-    class_addbang(vradio_class, radio_bang);
-    class_addfloat(vradio_class, radio_float);
-    class_addmethod(vradio_class, (t_method)vradio_click, gensym("click"),
-        A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
-    class_addmethod(vradio_class, (t_method)vradio_dialog, gensym("dialog"),
-        A_GIMME, 0);
+    radio_addmethods(hradio_class);
+    radio_addmethods(hradio_old_class);
     radio_addmethods(vradio_class);
-    iemgui_class_addmethods(vradio_class);
- 
-    vscalehandle_class = class_new(gensym("_scalehandle"), 0, 0,
+    radio_addmethods(vradio_old_class);
+
+    class_sethelpsymbol(hradio_class, gensym("hradio"));
+    class_sethelpsymbol(hradio_old_class, gensym("hradio"));
+    class_sethelpsymbol(vradio_class, gensym("vradio"));
+    class_sethelpsymbol(vradio_old_class, gensym("vradio"));
+
+    scalehandle_class = class_new(gensym("_scalehandle"), 0, 0,
         sizeof(t_scalehandle), CLASS_PD, 0);
-    class_addmethod(vscalehandle_class, (t_method)vradio__clickhook,
+    class_addmethod(scalehandle_class, (t_method)radio__clickhook,
         gensym("_click"), A_FLOAT, A_FLOAT, A_FLOAT, 0);
-    class_addmethod(vscalehandle_class, (t_method)vradio__motionhook,
+    class_addmethod(scalehandle_class, (t_method)radio__motionhook,
         gensym("_motion"), A_FLOAT, A_FLOAT, 0);
 
-    wb_init(&vradio_widgetbehavior,vradio_getrect,vradio_newclick);
-    class_setwidget(vradio_class, &vradio_widgetbehavior);
-    class_sethelpsymbol(vradio_class, gensym("vradio"));
-    class_setsavefn(vradio_class, vradio_save);
-    class_setpropertiesfn(vradio_class, vradio_properties);
-
-        /* obsolete version (0.34-0.35) */
-    vradio_old_class = class_new(gensym("vdl"), (t_newmethod)radio_new,
-        (t_method)radio_free, sizeof(t_radio), 0, A_GIMME, 0);
-    class_addbang(vradio_old_class, radio_bang);
-    class_addfloat(vradio_old_class, radio_float);
-    class_addmethod(vradio_old_class, (t_method)vradio_click, gensym("click"),
-        A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
-    class_addmethod(vradio_old_class, (t_method)vradio_dialog,
-        gensym("dialog"), A_GIMME, 0);
-    radio_addmethods(vradio_old_class);
-    iemgui_class_addmethods(vradio_old_class);
-    class_setwidget(vradio_old_class, &vradio_widgetbehavior);
-    class_sethelpsymbol(vradio_old_class, gensym("vradio"));
 }
diff --git a/pd/src/g_slider.c b/pd/src/g_slider.c
index c35780bea..40f9ca17e 100644
--- a/pd/src/g_slider.c
+++ b/pd/src/g_slider.c
@@ -13,13 +13,10 @@
 #include "g_all_guis.h"
 #include <math.h>
 
-static t_class *hscalehandle_class;
-static t_class *vscalehandle_class;
+static t_class *scalehandle_class;
 extern int gfxstub_haveproperties(void *key);
-static void hslider_draw_select(t_slider *x, t_glist *glist);
-static void vslider_draw_select(t_slider *x, t_glist *glist);
-t_widgetbehavior vslider_widgetbehavior;
-t_widgetbehavior hslider_widgetbehavior;
+static void slider_draw_select(t_slider *x, t_glist *glist);
+t_widgetbehavior slider_widgetbehavior;
 t_class *hslider_class;
 t_class *vslider_class;
 
@@ -101,11 +98,7 @@ static void slider_draw_move(t_slider *x, t_glist *glist)
             canvas, x, r, y1+2, r, y2-2);
     iemgui_label_draw_move(&x->x_gui,canvas,x1,y1);
     iemgui_io_draw_move(&x->x_gui,canvas,nlet_tag);
-    if (x->x_gui.x_selected) {
-        if (x->x_orient) vslider_draw_select(x, x->x_gui.x_glist);
-        else             hslider_draw_select(x, x->x_gui.x_glist);
-    }
-    if (x->x_gui.x_selected) vslider_draw_select(x, x->x_gui.x_glist);
+    if (x->x_gui.x_selected) slider_draw_select(x, x->x_gui.x_glist);
 }
 
 static void slider_draw_config(t_slider *x, t_glist *glist)
@@ -117,29 +110,14 @@ static void slider_draw_config(t_slider *x, t_glist *glist)
         canvas, x, x->x_gui.x_fcol);
 }
 
-static void hslider_draw_select(t_slider *x, t_glist *glist)
+static void slider_draw_select(t_slider *x, t_glist *glist)
 {
     t_canvas *canvas=glist_getcanvas(glist);
     iemgui_base_draw_config(&x->x_gui,canvas);
     if(x->x_gui.x_selected)
     {
         if (x->x_gui.x_glist == glist_getcanvas(glist))
-            scalehandle_draw_select2(&x->x_gui,glist,
-                x->x_gui.x_w+5-1,x->x_gui.x_h-1);
-    }
-    else scalehandle_draw_erase2(&x->x_gui,glist);
-    iemgui_label_draw_select(&x->x_gui,canvas);
-    iemgui_tag_selected(&x->x_gui,canvas);
-}
-static void vslider_draw_select(t_slider *x, t_glist *glist)
-{
-    t_canvas *canvas=glist_getcanvas(glist);
-    iemgui_base_draw_config(&x->x_gui,canvas);
-    if(x->x_gui.x_selected)
-    {
-        if (x->x_gui.x_glist == glist_getcanvas(glist))
-            scalehandle_draw_select2(&x->x_gui,glist,
-                x->x_gui.x_w-1,x->x_gui.x_h+5-1);
+            scalehandle_draw_select2(&x->x_gui,glist);
     }
     else scalehandle_draw_erase2(&x->x_gui,glist);
     iemgui_label_draw_select(&x->x_gui,canvas);
@@ -147,14 +125,13 @@ static void vslider_draw_select(t_slider *x, t_glist *glist)
 }
 
 void slider_check_minmax(t_slider *x, double min, double max);
-void hslider_check_width(t_slider *x, int w);
-void vslider_check_height(t_slider *x, int w);
+void slider_check_length(t_slider *x, int w);
 
 static void hslider__clickhook2(t_scalehandle *sh, t_slider *x) {
     double w_change_ratio = (double)(x->x_gui.x_w + sh->h_dragx)
         /(double)x->x_gui.x_w;
     x->x_val = x->x_val * w_change_ratio;
-    hslider_check_width(x, x->x_gui.x_w + sh->h_dragx);
+    slider_check_length(x, x->x_gui.x_w + sh->h_dragx);
     x->x_gui.x_h += sh->h_dragy;
     slider_check_minmax(x, x->x_min, x->x_max);
 }
@@ -163,7 +140,7 @@ static void vslider__clickhook2(t_scalehandle *sh, t_slider *x) {
         /(double)x->x_gui.x_h;
     x->x_val = x->x_val * h_change_ratio;
     x->x_gui.x_w += sh->h_dragx;
-    vslider_check_height(x, x->x_gui.x_h + sh->h_dragy);
+    slider_check_length(x, x->x_gui.x_h + sh->h_dragy);
     slider_check_minmax(x, x->x_min, x->x_max);
 }
 
@@ -190,37 +167,17 @@ static void slider__clickhook(t_scalehandle *sh, t_floatarg f,
     iemgui__clickhook3(sh,newstate);
 }
 
-static void hslider__motionhook(t_scalehandle *sh, t_floatarg f1, t_floatarg f2)
-{
-    if (sh->h_dragon && sh->h_scale)
-    {
-        t_slider *x = (t_slider *)(sh->h_master);
-        int dx = (int)f1, dy = (int)f2;
-        dx = maxi(dx, IEM_SL_MINSIZE-x->x_gui.x_w);
-        dy = maxi(dy,IEM_GUI_MINSIZE-x->x_gui.x_h);
-        sh->h_dragx = dx;
-        sh->h_dragy = dy;
-        scalehandle_drag_scale(sh);
-
-        int properties = gfxstub_haveproperties((void *)x);
-        if (properties)
-        {
-            int new_w = x->x_gui.x_w + sh->h_dragx;
-            int new_h = x->x_gui.x_h + sh->h_dragy;
-            properties_set_field_int(properties,"dim.w_ent",new_w);
-            properties_set_field_int(properties,"dim.h_ent",new_h);
-        }
-    }
-    scalehandle_dragon_label(sh,f1,f2);
-}
-static void vslider__motionhook(t_scalehandle *sh, t_floatarg f1, t_floatarg f2)
+static void slider__motionhook(t_scalehandle *sh, t_floatarg f1, t_floatarg f2)
 {
     if (sh->h_dragon && sh->h_scale)
     {
         t_slider *x = (t_slider *)(sh->h_master);
         int dx = (int)f1, dy = (int)f2;
-        dx = maxi(dx,IEM_GUI_MINSIZE-x->x_gui.x_w);
-        dy = maxi(dy, IEM_SL_MINSIZE-x->x_gui.x_h);
+        int minx = x->x_orient ? IEM_GUI_MINSIZE : IEM_SL_MINSIZE;
+        int miny = x->x_orient ? IEM_SL_MINSIZE : IEM_GUI_MINSIZE;
+        
+        dx = maxi(dx,minx-x->x_gui.x_w);
+        dy = maxi(dy,miny-x->x_gui.x_h);
         sh->h_dragx = dx;
         sh->h_dragy = dy;
         scalehandle_drag_scale(sh);
@@ -237,7 +194,7 @@ static void vslider__motionhook(t_scalehandle *sh, t_floatarg f1, t_floatarg f2)
     scalehandle_dragon_label(sh,f1,f2);
 }
 
-void hslider_draw(t_slider *x, t_glist *glist, int mode)
+void slider_draw(t_slider *x, t_glist *glist, int mode)
 {
     if(mode == IEM_GUI_DRAW_MODE_UPDATE)
         sys_queuegui(x, glist, slider_draw_update);
@@ -249,27 +206,7 @@ void hslider_draw(t_slider *x, t_glist *glist, int mode)
         sys_vgui(".x%lx.c raise all_cords\n", glist_getcanvas(glist));
     }
     else if(mode == IEM_GUI_DRAW_MODE_SELECT)
-        hslider_draw_select(x, glist);
-    else if(mode == IEM_GUI_DRAW_MODE_ERASE)
-        iemgui_draw_erase(&x->x_gui, glist);
-    else if(mode == IEM_GUI_DRAW_MODE_CONFIG)
-        slider_draw_config(x, glist);
-    else if(mode >= IEM_GUI_DRAW_MODE_IO)
-        slider_draw_io(x, glist, mode - IEM_GUI_DRAW_MODE_IO);
-}
-void vslider_draw(t_slider *x, t_glist *glist, int mode)
-{
-    if(mode == IEM_GUI_DRAW_MODE_UPDATE)
-        sys_queuegui(x, glist, slider_draw_update);
-    else if(mode == IEM_GUI_DRAW_MODE_MOVE)
-        slider_draw_move(x, glist);
-    else if(mode == IEM_GUI_DRAW_MODE_NEW)
-    {
-        slider_draw_new(x, glist);
-        sys_vgui(".x%lx.c raise all_cords\n", glist_getcanvas(glist));
-    }
-    else if(mode == IEM_GUI_DRAW_MODE_SELECT)
-        vslider_draw_select(x, glist);
+        slider_draw_select(x, glist);
     else if(mode == IEM_GUI_DRAW_MODE_ERASE)
         iemgui_draw_erase(&x->x_gui, glist);
     else if(mode == IEM_GUI_DRAW_MODE_CONFIG)
@@ -278,21 +215,7 @@ void vslider_draw(t_slider *x, t_glist *glist, int mode)
         slider_draw_io(x, glist, mode - IEM_GUI_DRAW_MODE_IO);
 }
 
-static void hslider_getrect(t_gobj *z, t_glist *glist,
-                            int *xp1, int *yp1, int *xp2, int *yp2)
-{
-    t_slider *x = (t_slider *)z;
-
-    *xp1 = text_xpix(&x->x_gui.x_obj, glist);
-    *yp1 = text_ypix(&x->x_gui.x_obj, glist);
-    *xp2 = *xp1 + x->x_gui.x_w + 5;
-    *yp2 = *yp1 + x->x_gui.x_h;
-
-    iemgui_label_getrect(x->x_gui, glist, xp1, yp1, xp2, yp2);
-}
-
-
-static void vslider_getrect(t_gobj *z, t_glist *glist,
+static void slider_getrect(t_gobj *z, t_glist *glist,
                             int *xp1, int *yp1, int *xp2, int *yp2)
 {
     t_slider *x = (t_slider *)z;
@@ -300,12 +223,12 @@ static void vslider_getrect(t_gobj *z, t_glist *glist,
     *xp1 = text_xpix(&x->x_gui.x_obj, glist);
     *yp1 = text_ypix(&x->x_gui.x_obj, glist);
     *xp2 = *xp1 + x->x_gui.x_w;
-    *yp2 = *yp1 + x->x_gui.x_h + 5;
-
+    *yp2 = *yp1 + x->x_gui.x_h;
+    if (x->x_orient) *yp2+=5; else *xp2+=5;
     iemgui_label_getrect(x->x_gui, glist, xp1, yp1, xp2, yp2);
 }
 
-static void hslider_save(t_gobj *z, t_binbuf *b)
+static void slider_save(t_gobj *z, t_binbuf *b)
 {
     t_slider *x = (t_slider *)z;
     int bflcol[3];
@@ -313,71 +236,33 @@ static void hslider_save(t_gobj *z, t_binbuf *b)
 
     iemgui_save(&x->x_gui, srl, bflcol);
     binbuf_addv(b, "ssiisiiffiisssiiiiiiiii", gensym("#X"),gensym("obj"),
-                (int)x->x_gui.x_obj.te_xpix, (int)x->x_gui.x_obj.te_ypix,
-                gensym("hsl"), x->x_gui.x_w, x->x_gui.x_h,
-                (t_float)x->x_min, (t_float)x->x_max,
-                x->x_lin0_log1, iem_symargstoint(&x->x_gui),
-                srl[0], srl[1], srl[2],
-                x->x_gui.x_ldx, x->x_gui.x_ldy,
-                iem_fstyletoint(&x->x_gui), x->x_gui.x_fontsize,
-                bflcol[0], bflcol[1], bflcol[2],
-                x->x_val, x->x_steady);
+        (int)x->x_gui.x_obj.te_xpix, (int)x->x_gui.x_obj.te_ypix,
+        gensym(x->x_orient ? "vsl" : "hsl"), x->x_gui.x_w, x->x_gui.x_h,
+        (t_float)x->x_min, (t_float)x->x_max,
+        x->x_lin0_log1, iem_symargstoint(&x->x_gui),
+        srl[0], srl[1], srl[2], x->x_gui.x_ldx, x->x_gui.x_ldy,
+        iem_fstyletoint(&x->x_gui), x->x_gui.x_fontsize,
+        bflcol[0], bflcol[1], bflcol[2],
+        x->x_val, x->x_steady);
     binbuf_addv(b, ";");
 }
 
-
-static void vslider_save(t_gobj *z, t_binbuf *b)
-{
-    t_slider *x = (t_slider *)z;
-    int bflcol[3];
-    t_symbol *srl[3];
-
-    iemgui_save(&x->x_gui, srl, bflcol);
-    binbuf_addv(b, "ssiisiiffiisssiiiiiiiii", gensym("#X"),gensym("obj"),
-                (int)x->x_gui.x_obj.te_xpix, (int)x->x_gui.x_obj.te_ypix,
-                gensym("vsl"), x->x_gui.x_w, x->x_gui.x_h, // diff
-                (t_float)x->x_min, (t_float)x->x_max,
-                x->x_lin0_log1, iem_symargstoint(&x->x_gui),
-                srl[0], srl[1], srl[2],
-                x->x_gui.x_ldx, x->x_gui.x_ldy,
-                iem_fstyletoint(&x->x_gui), x->x_gui.x_fontsize,
-                bflcol[0], bflcol[1], bflcol[2],
-                x->x_val, x->x_steady);
-    binbuf_addv(b, ";");
-}
-
-void hslider_check_width(t_slider *x, int w)
+void slider_check_length(t_slider *x, int w)
 {
     if(w < IEM_SL_MINSIZE)
         w = IEM_SL_MINSIZE;
-    x->x_gui.x_w = w;
-    x->x_center = (x->x_gui.x_w-1)*50;
-    if(x->x_val > (x->x_gui.x_w*100 - 100))
-    {
-        x->x_pos = x->x_gui.x_w*100 - 100;
-        x->x_val = x->x_pos;
-    }
-    if(x->x_lin0_log1)
-        x->x_k = log(x->x_max/x->x_min)/(double)(x->x_gui.x_w - 1);
-    else
-        x->x_k = (x->x_max - x->x_min)/(double)(x->x_gui.x_w - 1);
-}
-
-void vslider_check_height(t_slider *x, int h)
-{
-    if(h < IEM_SL_MINSIZE)
-        h = IEM_SL_MINSIZE;
-    x->x_gui.x_h = h;
-    x->x_center = (x->x_gui.x_h-1)*50;
-    if(x->x_val > (x->x_gui.x_h*100 - 100))
+    if (x->x_orient) x->x_gui.x_h = w;
+    else             x->x_gui.x_w = w;
+    x->x_center = (w-1)*50;
+    if(x->x_val > (w*100 - 100))
     {
-        x->x_pos = x->x_gui.x_h*100 - 100;
+        x->x_pos = (w-1)*100;
         x->x_val = x->x_pos;
     }
     if(x->x_lin0_log1)
-        x->x_k = log(x->x_max/x->x_min)/(double)(x->x_gui.x_h - 1);
+        x->x_k = log(x->x_max/x->x_min)/(double)(w-1);
     else
-        x->x_k = (x->x_max - x->x_min)/(double)(x->x_gui.x_h - 1);
+        x->x_k =    (x->x_max-x->x_min)/(double)(w-1);
 }
 
 void slider_check_minmax(t_slider *x, double min, double max)
@@ -400,45 +285,27 @@ void slider_check_minmax(t_slider *x, double min, double max)
     x->x_min = min;
     x->x_max = max;
     x->x_gui.x_reverse = x->x_min > x->x_max;
+    int w = x->x_orient ? x->x_gui.x_h : x->x_gui.x_w;
     if(x->x_lin0_log1)
-        x->x_k = log(x->x_max/x->x_min)/(double)(x->x_gui.x_w - 1);
+        x->x_k = log(x->x_max/x->x_min)/(double)(w-1);
     else
-        x->x_k = (x->x_max - x->x_min)/(double)(x->x_gui.x_w - 1);
+        x->x_k =    (x->x_max-x->x_min)/(double)(w-1);
 }
 
-static void hslider_properties(t_gobj *z, t_glist *owner)
+static void slider_properties(t_gobj *z, t_glist *owner)
 {
     t_slider *x = (t_slider *)z;
     char buf[800];
     t_symbol *srl[3];
-
+    int minx = x->x_orient ? IEM_GUI_MINSIZE : IEM_SL_MINSIZE;
+    int miny = x->x_orient ? IEM_SL_MINSIZE : IEM_GUI_MINSIZE;
     iemgui_properties(&x->x_gui, srl);
-    sprintf(buf, "pdtk_iemgui_dialog %%s |hsl| \
+    sprintf(buf, "pdtk_iemgui_dialog %%s |%csl| \
         --------dimensions(pix)(pix):-------- %d %d width: %d %d height: \
         -----------output-range:----------- %g left: %g right: %g \
         %d lin log %d %d empty %d {%s} {%s} {%s} %d %d %d %d %d %d %d\n",
-        x->x_gui.x_w, IEM_SL_MINSIZE, x->x_gui.x_h, IEM_GUI_MINSIZE,
-        x->x_min, x->x_max, 0.0,/*no_schedule*/
-        x->x_lin0_log1, x->x_gui.x_loadinit, x->x_steady, -1,/*no multi, but iem-characteristic*/
-        srl[0]->s_name, srl[1]->s_name,
-        srl[2]->s_name, x->x_gui.x_ldx, x->x_gui.x_ldy,
-        x->x_gui.x_font_style, x->x_gui.x_fontsize,
-        0xffffff & x->x_gui.x_bcol, 0xffffff & x->x_gui.x_fcol,
-        0xffffff & x->x_gui.x_lcol);
-    gfxstub_new(&x->x_gui.x_obj.ob_pd, x, buf);
-}
-static void vslider_properties(t_gobj *z, t_glist *owner)
-{
-    t_slider *x = (t_slider *)z;
-    char buf[800];
-    t_symbol *srl[3];
-
-    iemgui_properties(&x->x_gui, srl);
-    sprintf(buf, "pdtk_iemgui_dialog %%s |vsl| \
-        --------dimensions(pix)(pix):-------- %d %d width: %d %d height: \
-        -----------output-range:----------- %g bottom: %g top: %g \
-        %d lin log %d %d empty %d {%s} {%s} {%s} %d %d %d %d %d %d %d\n",
-        x->x_gui.x_w, IEM_GUI_MINSIZE, x->x_gui.x_h, IEM_SL_MINSIZE,
+        x->x_orient ? 'v' : 'h',
+        x->x_gui.x_w, minx, x->x_gui.x_h, miny,
         x->x_min, x->x_max, 0.0,/*no_schedule*/
         x->x_lin0_log1, x->x_gui.x_loadinit, x->x_steady, -1,/*no multi, but iem-characteristic*/
         srl[0]->s_name, srl[1]->s_name,
@@ -452,7 +319,6 @@ static void vslider_properties(t_gobj *z, t_glist *owner)
 static void slider_bang(t_slider *x)
 {
     double out;
-
     if(x->x_lin0_log1)
         out = x->x_min*exp(x->x_k*(double)(x->x_val)*0.01);
     else {
@@ -469,44 +335,7 @@ static void slider_bang(t_slider *x)
         pd_float(x->x_gui.x_snd->s_thing, out);
 }
 
-static void hslider_dialog(t_slider *x, t_symbol *s, int argc, t_atom *argv)
-{
-    canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
-
-    t_symbol *srl[3];
-    int w = (int)atom_getintarg(0, argc, argv);
-    int h = (int)atom_getintarg(1, argc, argv);
-    double min = (double)atom_getfloatarg(2, argc, argv);
-    double max = (double)atom_getfloatarg(3, argc, argv);
-    int lilo = (int)atom_getintarg(4, argc, argv);
-    int steady = (int)atom_getintarg(17, argc, argv);
-    int sr_flags;
-
-    if(lilo != 0) lilo = 1;
-    x->x_lin0_log1 = lilo;
-    if(steady)
-        x->x_steady = 1;
-    else
-        x->x_steady = 0;
-    sr_flags = iemgui_dialog(&x->x_gui, srl, argc, argv);
-    x->x_gui.x_h = iemgui_clip_size(h); //diff
-    int old_width = x->x_gui.x_w; //diff
-    hslider_check_width(x, w); //diff
-    if (x->x_gui.x_w != old_width) //diff
-    {
-        x->x_val = x->x_val * ((double)x->x_gui.x_w/(double)old_width); //diff
-    }
-    slider_check_minmax(x, min, max);
-    x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG);
-    x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_IO + sr_flags);
-    //x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE);
-    //canvas_fixlinesfor(glist_getcanvas(x->x_gui.x_glist), (t_text*)x);
-    iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
-
-    if (x->x_gui.x_selected) hslider_draw_select(x, x->x_gui.x_glist); //diff
-    scrollbar_update(x->x_gui.x_glist);
-}
-static void vslider_dialog(t_slider *x, t_symbol *s, int argc, t_atom *argv)
+static void slider_dialog(t_slider *x, t_symbol *s, int argc, t_atom *argv)
 {
     canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
 
@@ -517,21 +346,24 @@ static void vslider_dialog(t_slider *x, t_symbol *s, int argc, t_atom *argv)
     double max = (double)atom_getfloatarg(3, argc, argv);
     int lilo = (int)atom_getintarg(4, argc, argv);
     int steady = (int)atom_getintarg(17, argc, argv);
-    int sr_flags;
+    int sr_flags, oldl;
 
     if(lilo != 0) lilo = 1;
     x->x_lin0_log1 = lilo;
-    if(steady)
-        x->x_steady = 1;
-    else
-        x->x_steady = 0;
+    x->x_steady = !!steady;
     sr_flags = iemgui_dialog(&x->x_gui, srl, argc, argv);
-    x->x_gui.x_w = iemgui_clip_size(w);
-    int old_height = x->x_gui.x_h;
-    vslider_check_height(x, h);
-    if (x->x_gui.x_h != old_height)
-    {
-        x->x_val = x->x_val * ((double)x->x_gui.x_h/(double)old_height);
+    if (x->x_orient) {
+        x->x_gui.x_w = iemgui_clip_size(w);
+        oldl = x->x_gui.x_h;
+        slider_check_length(x, h);
+        if (x->x_gui.x_h != oldl)
+            x->x_val = x->x_val * ((double)x->x_gui.x_h/(double)oldl);
+    } else {
+        x->x_gui.x_h = iemgui_clip_size(h);
+        oldl = x->x_gui.x_w;
+        slider_check_length(x, w);
+        if (x->x_gui.x_w != oldl)
+            x->x_val = 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);
@@ -540,52 +372,22 @@ static void vslider_dialog(t_slider *x, t_symbol *s, int argc, t_atom *argv)
     //canvas_fixlinesfor(glist_getcanvas(x->x_gui.x_glist), (t_text*)x);
     iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
 
-    if (x->x_gui.x_selected) vslider_draw_select(x, x->x_gui.x_glist);
+    if (x->x_gui.x_selected) slider_draw_select(x, x->x_gui.x_glist);
     scrollbar_update(x->x_gui.x_glist);
 }
 
-static void hslider_motion(t_slider *x, t_floatarg dx, t_floatarg dy)
-{
-    x->x_is_last_float = 0;
-    int old = x->x_val;
-
-    if(x->x_gui.x_finemoved)
-        x->x_pos += (int)dx;
-    else
-        x->x_pos += 100*(int)dx;
-    x->x_val = x->x_pos;
-    if(x->x_val > (100*x->x_gui.x_w - 100))
-    {
-        x->x_val = 100*x->x_gui.x_w - 100;
-        x->x_pos += 50;
-        x->x_pos -= x->x_pos%100;
-    }
-    if(x->x_val < 0)
-    {
-        x->x_val = 0;
-        x->x_pos -= 50;
-        x->x_pos -= x->x_pos%100;
-    }
-    if(old != x->x_val)
-    {
-        x->x_gui.x_changed = 1;
-        x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
-        slider_bang(x);
-    }
-}
-static void vslider_motion(t_slider *x, t_floatarg dx, t_floatarg dy)
+static void slider_motion(t_slider *x, t_floatarg dx, t_floatarg dy)
 {
     x->x_is_last_float = 0;
     int old = x->x_val;
-
-    if(x->x_gui.x_finemoved)
-        x->x_pos -= (int)dy;
-    else
-        x->x_pos -= 100*(int)dy;
+    int d = x->x_orient ? -dy : dx;
+    if(!x->x_gui.x_finemoved) d *= 100;
+    x->x_pos += d;
     x->x_val = x->x_pos;
-    if(x->x_val > (100*x->x_gui.x_h - 100))
+    int w = x->x_orient ? x->x_gui.x_h : x->x_gui.x_w;
+    if(x->x_val > (100*w - 100))
     {
-        x->x_val = 100*x->x_gui.x_h - 100;
+        x->x_val = 100*w - 100;
         x->x_pos += 50;
         x->x_pos -= x->x_pos%100;
     }
@@ -603,36 +405,16 @@ static void vslider_motion(t_slider *x, t_floatarg dx, t_floatarg dy)
     }
 }
 
-static void hslider_click(t_slider *x, t_floatarg xpos, t_floatarg ypos,
-    t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
-{
-    if(!x->x_steady)
-        x->x_val = (int)(100.0 * (xpos -
-            text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist)));
-    if(x->x_val > (100*x->x_gui.x_w - 100))
-        x->x_val = 100*x->x_gui.x_w - 100;
-    if(x->x_val < 0)
-        x->x_val = 0;
-    if (x->x_pos != x->x_val)
-    {
-        x->x_pos = x->x_val;
-        x->x_gui.x_changed = 1;
-        x->x_gui.x_draw(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_UPDATE);
-    }
-    slider_bang(x);
-    glist_grab(x->x_gui.x_glist, &x->x_gui.x_obj.te_g,
-        (t_glistmotionfn)hslider_motion, 0, xpos, ypos);
-}
-static void vslider_click(t_slider *x, t_floatarg xpos, t_floatarg ypos,
+static void slider_click(t_slider *x, t_floatarg xpos, t_floatarg ypos,
     t_floatarg shift, t_floatarg ctrl, t_floatarg alt)
 {
     if(!x->x_steady)
-        x->x_val = (int)(100.0 * (x->x_gui.x_h +
-            text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist) - ypos));
-    if(x->x_val > (100*x->x_gui.x_h - 100))
-        x->x_val = 100*x->x_gui.x_h - 100;
-    if(x->x_val < 0)
-        x->x_val = 0;
+        x->x_val = x->x_orient ?
+         (int)(100.0 * (        xpos - text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist))) :
+         (int)(100.0 * (x->x_gui.x_h + text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist) - ypos));
+
+    int w = x->x_orient ? x->x_gui.x_h : x->x_gui.x_w;
+    x->x_val = mini(maxi(x->x_val,0),100*(w-1));
     if (x->x_pos != x->x_val)
     {
         x->x_pos = x->x_val;
@@ -641,38 +423,18 @@ static void vslider_click(t_slider *x, t_floatarg xpos, t_floatarg ypos,
     }
     slider_bang(x);
     glist_grab(x->x_gui.x_glist, &x->x_gui.x_obj.te_g,
-        (t_glistmotionfn)vslider_motion, 0, xpos, ypos);
+        (t_glistmotionfn)slider_motion, 0, xpos, ypos);
 }
 
-static int hslider_newclick(t_gobj *z, struct _glist *glist,
+static int slider_newclick(t_gobj *z, struct _glist *glist,
     int xpix, int ypix, int shift, int alt, int dbl, int doit)
 {
     t_slider *x = (t_slider *)z;
-
     if(doit)
     {
-        hslider_click(x, (t_floatarg)xpix, (t_floatarg)ypix, (t_floatarg)shift,
+        slider_click(x, (t_floatarg)xpix, (t_floatarg)ypix, (t_floatarg)shift,
             0, (t_floatarg)alt);
-        if(shift)
-            x->x_gui.x_finemoved = 1;
-        else
-            x->x_gui.x_finemoved = 0;
-    }
-    return (1);
-}
-static int vslider_newclick(t_gobj *z, struct _glist *glist,
-    int xpix, int ypix, int shift, int alt, int dbl, int doit)
-{
-    t_slider *x = (t_slider *)z;
-
-    if(doit)
-    {
-        vslider_click(x, (t_floatarg)xpix, (t_floatarg)ypix, (t_floatarg)shift,
-            0, (t_floatarg)alt);
-        if(shift)
-            x->x_gui.x_finemoved = 1;
-        else
-            x->x_gui.x_finemoved = 0;
+        x->x_gui.x_finemoved = !!shift;
     }
     return (1);
 }
@@ -712,18 +474,17 @@ static void slider_float(t_slider *x, t_floatarg f)
         slider_bang(x);
 }
 
-static void hslider_size(t_slider *x, t_symbol *s, int ac, t_atom *av)
-{
-    hslider_check_width(x, (int)atom_getintarg(0, ac, av));
-    if(ac > 1)
-        x->x_gui.x_h = iemgui_clip_size((int)atom_getintarg(1, ac, av));
-    iemgui_size(&x->x_gui);
-}
-static void vslider_size(t_slider *x, t_symbol *s, int ac, t_atom *av)
+static void slider_size(t_slider *x, t_symbol *s, int ac, t_atom *av)
 {
-    x->x_gui.x_w = iemgui_clip_size((int)atom_getintarg(0, ac, av));
-    if(ac > 1)
-        vslider_check_height(x, (int)atom_getintarg(1, ac, av));
+    if (x->x_orient) {
+        x->x_gui.x_w = iemgui_clip_size((int)atom_getintarg(0, ac, av));
+        if(ac > 1)
+            slider_check_length(x, (int)atom_getintarg(1, ac, av));
+    } else {
+        slider_check_length(x, (int)atom_getintarg(0, ac, av));
+        if(ac > 1)
+            x->x_gui.x_h = iemgui_clip_size((int)atom_getintarg(1, ac, av));
+    }
     iemgui_size(&x->x_gui);
 }
 
@@ -739,20 +500,11 @@ static void slider_log(t_slider *x)
     slider_check_minmax(x, x->x_min, x->x_max);
 }
 
-static void hslider_lin(t_slider *x)
+static void slider_lin(t_slider *x)
 {
     x->x_lin0_log1 = 0;
-    x->x_k = (x->x_max - x->x_min)/(double)(x->x_gui.x_w - 1);
-}
-static void vslider_lin(t_slider *x)
-{
-    x->x_lin0_log1 = 0;
-    x->x_k = (x->x_max - x->x_min)/(double)(x->x_gui.x_h - 1);
-}
-
-static void slider_init(t_slider *x, t_floatarg f)
-{
-    x->x_gui.x_loadinit = (f==0.0)?0:1;
+    int w = x->x_orient ? x->x_gui.x_h : x->x_gui.x_w;
+    x->x_k = (x->x_max - x->x_min)/(double)(w-1);
 }
 
 static void slider_steady(t_slider *x, t_floatarg f)
@@ -816,7 +568,7 @@ static void *slider_new(t_symbol *s, int argc, t_atom *argv)
     else iemgui_new_getnames(&x->x_gui, 6, 0);
     if((argc == 18)&&IS_A_FLOAT(argv,17))
         steady = (int)atom_getintarg(17, argc, argv);
-    x->x_gui.x_draw = orient ? (t_iemfunptr)vslider_draw : (t_iemfunptr)hslider_draw;
+    x->x_gui.x_draw = (t_iemfunptr)slider_draw;
     x->x_is_last_float = 0;
     x->x_last = 0.0;
     x->x_gui.x_glist = (t_glist *)canvas_getcurrent();
@@ -839,10 +591,10 @@ static void *slider_new(t_symbol *s, int argc, t_atom *argv)
     x->x_gui.x_fontsize = fs;
     if (orient) {
         x->x_gui.x_w = iemgui_clip_size(w);
-        vslider_check_height(x, h);
+        slider_check_length(x, h);
     } else {
         x->x_gui.x_h = iemgui_clip_size(h);
-        hslider_check_width(x, w);
+        slider_check_length(x, w);
     }
     slider_check_minmax(x, min, max);
     iemgui_all_colfromload(&x->x_gui, bflcol);
@@ -850,7 +602,7 @@ 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 = orient ? vscalehandle_class : hscalehandle_class;
+    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_obj.te_iemgui = 1;
@@ -875,75 +627,47 @@ void slider_addmethods(t_class *c) {
     class_addmethod(c, (t_method)slider_set,
         gensym("set"), A_FLOAT, 0);
     class_addmethod(c, (t_method)slider_log, gensym("log"), 0);
-    class_addmethod(c, (t_method)slider_init,
-        gensym("init"), A_FLOAT, 0);
-    class_addmethod(c, (t_method)slider_steady,
-        gensym("steady"), A_FLOAT, 0);
-    class_addmethod(c, (t_method)slider_range,
-        gensym("range"), A_GIMME, 0);
-}
-
-void g_hslider_setup(void)
-{
-    hslider_class = class_new(gensym("hsl"), (t_newmethod)slider_new,
-        (t_method)slider_free, sizeof(t_slider), 0, A_GIMME, 0);
-    class_addcreator((t_newmethod)slider_new, gensym("hslider"), A_GIMME, 0);
-    class_addbang(hslider_class,slider_bang);
-    class_addfloat(hslider_class,slider_float);
-    class_addmethod(hslider_class, (t_method)hslider_click, gensym("click"),
+    class_addmethod(c, (t_method)slider_lin, gensym("lin"), 0);
+    class_addmethod(c, (t_method)iemgui_init, gensym("init"), A_FLOAT, 0);
+    class_addmethod(c, (t_method)slider_steady, gensym("steady"), A_FLOAT, 0);
+    class_addmethod(c, (t_method)slider_range, gensym("range"), A_GIMME, 0);
+    class_addbang(c,slider_bang);
+    class_addfloat(c,slider_float);
+    class_addmethod(c, (t_method)slider_click, gensym("click"),
         A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
-    class_addmethod(hslider_class, (t_method)hslider_motion, gensym("motion"),
+    class_addmethod(c, (t_method)slider_motion, gensym("motion"),
         A_FLOAT, A_FLOAT, 0);
-    class_addmethod(hslider_class, (t_method)hslider_dialog, gensym("dialog"),
+    class_setsavefn(c, slider_save);
+    class_addmethod(c, (t_method)slider_size, gensym("size"), A_GIMME, 0);
+    class_setwidget(c, &slider_widgetbehavior);
+    class_addmethod(c, (t_method)slider_dialog, gensym("dialog"),
         A_GIMME, 0);
-    slider_addmethods(hslider_class);
-    class_addmethod(hslider_class, (t_method)hslider_size,
-        gensym("size"), A_GIMME, 0);
-    iemgui_class_addmethods(hslider_class);
-    class_addmethod(hslider_class, (t_method)hslider_lin, gensym("lin"), 0);
- 
-    hscalehandle_class = class_new(gensym("_scalehandle"), 0, 0,
-        sizeof(t_scalehandle), CLASS_PD, 0);
-    class_addmethod(hscalehandle_class, (t_method)slider__clickhook,
-        gensym("_click"), A_FLOAT, A_FLOAT, A_FLOAT, 0);
-    class_addmethod(hscalehandle_class, (t_method)hslider__motionhook,
-        gensym("_motion"), A_FLOAT, A_FLOAT, 0);
-
-    wb_init(&hslider_widgetbehavior,hslider_getrect,hslider_newclick);
-    class_setwidget(hslider_class, &hslider_widgetbehavior);
-    class_sethelpsymbol(hslider_class, gensym("hslider"));
-    class_setsavefn(hslider_class, hslider_save);
-    class_setpropertiesfn(hslider_class, hslider_properties);
+    class_setpropertiesfn(c, slider_properties);
 }
-void g_vslider_setup(void)
+
+void g_slider_setup(void)
 {
+    wb_init(&slider_widgetbehavior,slider_getrect,slider_newclick);
+
+    hslider_class = class_new(gensym("hsl"), (t_newmethod)slider_new,
+        (t_method)slider_free, sizeof(t_slider), 0, A_GIMME, 0);
     vslider_class = class_new(gensym("vsl"), (t_newmethod)slider_new,
         (t_method)slider_free, sizeof(t_slider), 0, A_GIMME, 0);
+    class_addcreator((t_newmethod)slider_new, gensym("hslider"), A_GIMME, 0);
     class_addcreator((t_newmethod)slider_new, gensym("vslider"), A_GIMME, 0);
-    class_addbang(vslider_class,slider_bang);
-    class_addfloat(vslider_class,slider_float);
-    class_addmethod(vslider_class, (t_method)vslider_click, gensym("click"),
-        A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
-    class_addmethod(vslider_class, (t_method)vslider_motion, gensym("motion"),
-        A_FLOAT, A_FLOAT, 0);
-    class_addmethod(vslider_class, (t_method)vslider_dialog, gensym("dialog"),
-        A_GIMME, 0);
+ 
     slider_addmethods(hslider_class);
-    class_addmethod(vslider_class, (t_method)vslider_size,
-        gensym("size"), A_GIMME, 0);
+    slider_addmethods(vslider_class);
+    iemgui_class_addmethods(hslider_class);
     iemgui_class_addmethods(vslider_class);
-    class_addmethod(vslider_class, (t_method)vslider_lin, gensym("lin"), 0);
  
-    vscalehandle_class = class_new(gensym("_scalehandle"), 0, 0,
+    class_sethelpsymbol(hslider_class, gensym("hslider"));
+    class_sethelpsymbol(vslider_class, gensym("vslider"));
+
+    scalehandle_class = class_new(gensym("_scalehandle"), 0, 0,
         sizeof(t_scalehandle), CLASS_PD, 0);
-    class_addmethod(vscalehandle_class, (t_method)slider__clickhook,
+    class_addmethod(scalehandle_class, (t_method)slider__clickhook,
         gensym("_click"), A_FLOAT, A_FLOAT, A_FLOAT, 0);
-    class_addmethod(vscalehandle_class, (t_method)vslider__motionhook,
+    class_addmethod(scalehandle_class, (t_method)slider__motionhook,
         gensym("_motion"), A_FLOAT, A_FLOAT, 0);
-
-    wb_init(&vslider_widgetbehavior,vslider_getrect,vslider_newclick);
-    class_setwidget(vslider_class, &vslider_widgetbehavior);
-    class_sethelpsymbol(vslider_class, gensym("vslider"));
-    class_setsavefn(vslider_class, vslider_save);
-    class_setpropertiesfn(vslider_class, vslider_properties);
 }
diff --git a/pd/src/g_toggle.c b/pd/src/g_toggle.c
index 19f5074f5..3ad8a1ab6 100644
--- a/pd/src/g_toggle.c
+++ b/pd/src/g_toggle.c
@@ -108,15 +108,9 @@ void toggle_draw_select(t_toggle* x, t_glist* glist)
     if(x->x_gui.x_selected)
     {
         if (x->x_gui.x_glist == glist_getcanvas(glist))
-        {
-            scalehandle_draw_select2(&x->x_gui,glist,
-                x->x_gui.x_w-1,x->x_gui.x_h-1);
-        }
-    }
-    else
-    {
-        scalehandle_draw_erase2(&x->x_gui,glist);
+            scalehandle_draw_select2(&x->x_gui,glist);
     }
+    else scalehandle_draw_erase2(&x->x_gui,glist);
     iemgui_label_draw_select(&x->x_gui,canvas);
     iemgui_tag_selected(&x->x_gui,canvas);
 }
@@ -338,11 +332,6 @@ static void toggle_size(t_toggle *x, t_symbol *s, int ac, t_atom *av)
     iemgui_size(&x->x_gui);
 }
 
-static void toggle_init(t_toggle *x, t_floatarg f)
-{
-    x->x_gui.x_loadinit = (f==0.0)?0:1;
-}
-
 static void toggle_nonzero(t_toggle *x, t_floatarg f)
 {
     if(f != 0.0)
@@ -444,7 +433,7 @@ void g_toggle_setup(void)
     class_addmethod(toggle_class, (t_method)toggle_size, gensym("size"),
         A_GIMME, 0);
     iemgui_class_addmethods(toggle_class);
-    class_addmethod(toggle_class, (t_method)toggle_init, gensym("init"),
+    class_addmethod(toggle_class, (t_method)iemgui_init, gensym("init"),
         A_FLOAT, 0);
     class_addmethod(toggle_class, (t_method)toggle_nonzero, gensym("nonzero"),
         A_FLOAT, 0);
diff --git a/pd/src/g_vumeter.c b/pd/src/g_vumeter.c
index 9f10bf232..f2a0cc651 100644
--- a/pd/src/g_vumeter.c
+++ b/pd/src/g_vumeter.c
@@ -270,14 +270,10 @@ static void vu_draw_select(t_vu* x,t_glist* glist)
     int issel = x->x_gui.x_selected && x->x_gui.x_glist==canvas;
     sys_vgui(".x%lx.c itemconfigure %lxSCALEN "
         "-fill %s\n", canvas, x, issel ? selection_color : lcol);
-    if(issel) {
-        scalehandle_draw_select2(&x->x_gui,glist,
-            x->x_gui.x_w+2-1,x->x_gui.x_h+4-1);
-    }
+    if(issel)
+        scalehandle_draw_select2(&x->x_gui,glist);
     else
-    {
         scalehandle_draw_erase2(&x->x_gui,glist);
-    }
     iemgui_label_draw_select(&x->x_gui,canvas);
     iemgui_tag_selected(&x->x_gui,canvas);
 }
@@ -305,8 +301,7 @@ static void vu__clickhook(t_scalehandle *sh, t_floatarg f, t_floatarg xxx,
             scalehandle_unclick_scale(sh);
         }
     }
-    else iemgui__clickhook3(sh,newstate);
-    sh->h_dragon = newstate;
+    iemgui__clickhook3(sh,newstate);
 }
 
 static void vu__motionhook(t_scalehandle *sh, t_floatarg f1, t_floatarg f2)
diff --git a/pd/src/m_conf.c b/pd/src/m_conf.c
index c62e4f769..8c2f94e11 100644
--- a/pd/src/m_conf.c
+++ b/pd/src/m_conf.c
@@ -13,13 +13,11 @@ void g_guiconnect_setup(void);
 /* iemlib */
 void g_iemgui_setup(void);
 void g_bang_setup(void);
-void g_hradio_setup(void);
-void g_hslider_setup(void);
+void g_radio_setup(void);
+void g_slider_setup(void);
 void g_mycanvas_setup(void);
 void g_numbox_setup(void);
 void g_toggle_setup(void);
-void g_vradio_setup(void);
-void g_vslider_setup(void);
 void g_vumeter_setup(void);
 /* iemlib */
 void g_io_setup(void);
@@ -64,13 +62,11 @@ void conf_init(void)
 /* iemlib */
     g_iemgui_setup();
     g_bang_setup();
-    g_hradio_setup();
-    g_hslider_setup();
+    g_radio_setup();
+    g_slider_setup();
     g_mycanvas_setup();
     g_numbox_setup();
     g_toggle_setup();
-    g_vradio_setup();
-    g_vslider_setup();
     g_vumeter_setup();
 /* iemlib */
     g_io_setup();
-- 
GitLab