diff --git a/pd/src/g_rtext.c b/pd/src/g_rtext.c
index a907a5df9a133ec1b9c5fab9dc584f90f372e484..d87f37769d39f400147a699d25abbbe46e79085a 100644
--- a/pd/src/g_rtext.c
+++ b/pd/src/g_rtext.c
@@ -9,22 +9,19 @@
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
-#include <ctype.h>
 #include "m_pd.h"
 #include "m_imp.h"
 #include "s_stuff.h"
 #include "g_canvas.h"
 #include "s_utf8.h"
-#include "t_tk.h"
 
 #define LMARGIN 2
 #define RMARGIN 2
+#define TMARGIN 3
 /* for some reason, it draws text 1 pixel lower on Mac OS X */
 #ifdef __APPLE__
-#define TMARGIN 3
 #define BMARGIN 1
 #else
-#define TMARGIN 3
 #define BMARGIN 0
 #endif
 
@@ -46,7 +43,6 @@ struct _rtext
     int x_selend;   /*-- byte offset --*/
     int x_active;
     int x_dragfrom;
-    int x_height;
     int x_drawnwidth;
     int x_drawnheight;
     t_text *x_text;
@@ -58,7 +54,6 @@ struct _rtext
 t_rtext *rtext_new(t_glist *glist, t_text *who)
 {
     t_rtext *x = (t_rtext *)getbytes(sizeof *x);
-    x->x_height = -1;
     x->x_text = who;
     x->x_glist = glist;
     x->x_next = glist->gl_editor->e_rtext;
@@ -74,14 +69,15 @@ static t_rtext *rtext_entered;
 
 void rtext_free(t_rtext *x)
 {
-    if (x->x_glist->gl_editor->e_textedfor == x)
-        x->x_glist->gl_editor->e_textedfor = 0;
-    if (x->x_glist->gl_editor->e_rtext == x)
-        x->x_glist->gl_editor->e_rtext = x->x_next;
+    t_editor *e = x->x_glist->gl_editor;
+    if (e->e_textedfor == x)
+        e->e_textedfor = 0;
+    if (e->e_rtext == x)
+        e->e_rtext = x->x_next;
     else
     {
         t_rtext *e2;
-        for (e2 = x->x_glist->gl_editor->e_rtext; e2; e2 = e2->x_next)
+        for (e2 = e->e_rtext; e2; e2 = e2->x_next)
             if (e2->x_next == x)
         {
             e2->x_next = x->x_next;
@@ -206,8 +202,6 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp,
         int widthspec_c = x->x_text->te_width; // width if any specified
         // width limit in chars
         int widthlimit_c = (widthspec_c ? widthspec_c : BOXWIDTH);
-        //fprintf(stderr,"senditup widthlimit_c %d %d\n",
-        //    widthspec_c, widthlimit_c);
         int inindex_b = 0; // index location in the buffer
         int inindex_c = 0; // index location in the u8 chars
         int selstart_b = 0, selend_b = 0; // selection start and end
@@ -240,7 +234,6 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp,
             int foundit_c;
             //following deals with \v replacement for \n in multiline comments
             int foundit_bv  = firstone(x->x_buf + inindex_b, '\v', maxindex_b);
-            //fprintf(stderr,"%d %d <%s>\n", foundit_b, foundit_bv, x->x_buf);
             if ((foundit_bv < foundit_b && foundit_bv != -1) ||
                 (foundit_b == -1 && foundit_bv != -1))
                 foundit_b = foundit_bv;
@@ -280,7 +273,6 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp,
                 *indexp = inindex_b + u8_offset(x->x_buf + inindex_b, actualx);
                 reportedindex = 1;
             }
-            //fprintf(stderr,"eatchar %d <%s>\n", eatchar, tempbuf);
             strncpy(tempbuf+outchars_b, x->x_buf + inindex_b, foundit_b);
             if (x->x_selstart >= inindex_b &&
                 x->x_selstart <= inindex_b + foundit_b + eatchar)
@@ -322,10 +314,10 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp,
 
         if (action && x->x_text->te_width && x->x_text->te_type != T_ATOM)
         {
-                /* if our width is specified but the "natural" width is the
-                same as the specified width, set specified width to zero
-                so future text editing will automatically change width.
-                Except atoms whose content changes at runtime. */
+            /* if our width is specified but the "natural" width is the
+               same as the specified width, set specified width to zero
+               so future text editing will automatically change width.
+               Except atoms whose content changes at runtime. */
             int widthwas = x->x_text->te_width, newwidth = 0, newheight = 0,
                 newindex = 0;
             x->x_text->te_width = 0;
@@ -333,12 +325,9 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp,
             if (newwidth/fontwidth != widthwas)
                 x->x_text->te_width = widthwas;
             else x->x_text->te_width = 0;
-            //fprintf(stderr,"senditup width %d %d %d\n",
-            //    newwidth/fontwidth, widthwas, x->x_text->te_width);
         }
         if (action == SEND_FIRST)
         {
-            //fprintf(stderr,"canvas=.x%lx %s\n", (t_int)canvas, tempbuf);
             sys_vgui("pdtk_text_new .x%lx.c {%s %s text} %f %f {%.*s} %d %s\n",
                 canvas, x->x_tag, rtext_gettype(x)->s_name,
                 dispx + LMARGIN, dispy + TMARGIN,
@@ -349,23 +338,9 @@ static void rtext_senditup(t_rtext *x, int action, int *widthp, int *heightp,
         }
         else if (action == SEND_UPDATE)
         {
-            /*fprintf(stderr,
-                "SEND_UPDATE canvas_class=%d isgraph=%d goprect=%d\n",
-                (pd_class(&x->x_text->te_pd) == canvas_class ? 1 : 0),
-                ((t_glist *)(x->x_text))->gl_isgraph,
-                ((t_glist *)(x->x_text))->gl_goprect );*/
-
             sys_vgui("pdtk_text_set .x%lx.c %s {%.*s}\n",
                 canvas, x->x_tag, outchars_b, tempbuf);
 
-            /*if ( pd_class(&x->x_text->te_pd) == canvas_class &&
-                ((t_glist *)(x->x_text))->gl_isgraph &&
-                (((t_glist *)(x->x_text))->gl_goprect) )
-            {
-                fprintf(stderr, "do not update outlets\n");
-            }
-            else */
-
             if (pixwide != x->x_drawnwidth || pixhigh != x->x_drawnheight) 
                 text_drawborder(x->x_text, x->x_glist, x->x_tag,
                     pixwide, pixhigh, 0);
@@ -405,8 +380,8 @@ void rtext_retext(t_rtext *x)
     t_text *text = x->x_text;
     t_freebytes(x->x_buf, x->x_bufsize);
     binbuf_gettext(text->te_binbuf, &x->x_buf, &x->x_bufsize);
-        /* special case: for number boxes, try to pare the number down
-        to the specified width of the box. */
+    /* special case: for number boxes, try to pare the number down
+       to the specified width of the box. */
     if (text->te_width > 0 && text->te_type == T_ATOM &&
         x->x_bufsize > text->te_width)
     {
@@ -415,7 +390,7 @@ void rtext_retext(t_rtext *x)
         int bufsize = x->x_bufsize;
         if (natom == 1 && atomp->a_type == A_FLOAT)
         {
-                /* try to reduce size by dropping decimal digits */
+            /* try to reduce size by dropping decimal digits */
             int wantreduce = bufsize - text->te_width;
             char *decimal = 0, *nextchar, *ebuf = x->x_buf + bufsize,
                 *s1, *s2;
@@ -436,7 +411,7 @@ void rtext_retext(t_rtext *x)
             bufsize = text->te_width;
             goto done;
         giveup:
-                /* give up and bash it to "+" or "-" */
+            /* give up and bash it to "+" or "-" */
             x->x_buf[0] = (atomp->a_w.w_float < 0 ? '-' : '+');
             x->x_buf = t_resizebytes(x->x_buf, bufsize, 1);
             bufsize = 1;
@@ -531,10 +506,12 @@ void rtext_select(t_rtext *x, int state)
 
 void rtext_activate(t_rtext *x, int state)
 {
-    //fprintf(stderr, "rtext_activate\n");
     int w = 0, h = 0, indx;
     t_glist *glist = x->x_glist;
     t_canvas *canvas = glist_getcanvas(glist);
+    if (state && x->x_active) {
+        printf("duplicate rtext_activate\n");
+    }
     if (state)
     {
         sys_vgui(".x%lx.c focus %s\n", canvas, x->x_tag);
@@ -568,19 +545,12 @@ static int rtext_compare_special_chars(const char c)
 void rtext_key(t_rtext *x, int keynum, t_symbol *keysym)
 {
     int w = 0, h = 0, indx, i, newsize, ndel;
-    //fprintf(stderr,"rtext_key keysym=%s\n", keysym->s_name);
     if (keynum)
     {
         int n = keynum;
         if (n == '\r') n = '\n';
-        if (n == '\b')  /* backspace */
+        if (n == '\b') /* backspace */
         {
-                    /* LATER delete the box if all text is selected...
-                    this causes reentrancy problems now. */
-            /* if ((!x->x_selstart) && (x->x_selend == x->x_bufsize))
-            {
-                ....
-            } */
             if (x->x_selstart && (x->x_selstart == x->x_selend))
             {
                 u8_dec(x->x_buf, &x->x_selstart);
@@ -590,7 +560,7 @@ void rtext_key(t_rtext *x, int keynum, t_symbol *keysym)
             }
             
         }
-        else if (n == 127)      /* delete */
+        else if (n == 127) /* delete */
         {
             if (x->x_selend < x->x_bufsize && (x->x_selstart == x->x_selend))
                 u8_inc(x->x_buf, &x->x_selend);
@@ -617,7 +587,6 @@ be printable in whatever 8-bit character set we find ourselves. */
 */
         if (n == '\n' || (n > 31 && n < 127))
         {
-            //fprintf(stderr,"return or 31-127\n");
             newsize = x->x_bufsize+1;
             x->x_buf = resizebytes(x->x_buf, x->x_bufsize, newsize);
             for (i = x->x_bufsize; i > x->x_selstart; i--)
@@ -632,7 +601,6 @@ be printable in whatever 8-bit character set we find ourselves. */
         /*--moo: check for unicode codepoints beyond 7-bit ASCII --*/
         else if (n > 127)
         {
-            //fprintf(stderr,">127\n");
             int ch_nbytes = u8_wc_nbytes(n);
             newsize = x->x_bufsize + ch_nbytes;
             x->x_buf = resizebytes(x->x_buf, x->x_bufsize, newsize);
@@ -739,12 +707,10 @@ be printable in whatever 8-bit character set we find ourselves. */
     }
     else if (!strcmp(keysym->s_name, "CtrlLeft"))
     {
-        //fprintf(stderr,"ctrleft\n");
         /* first find first non-space char going back */
         while (x->x_selstart > 0 &&
             rtext_compare_special_chars(x->x_buf[x->x_selstart-1]))
         {
-            //fprintf(stderr,"while 1 <%c>\n", x->x_buf[x->x_selstart-1]);
             u8_dec(x->x_buf, &x->x_selstart);
         }
         /* now go back until you find another space or
@@ -752,13 +718,11 @@ be printable in whatever 8-bit character set we find ourselves. */
         while (x->x_selstart > 0 &&
           !rtext_compare_special_chars(x->x_buf[x->x_selstart-1]))
         {
-            //fprintf(stderr,"while 2 <%c>\n", x->x_buf[x->x_selstart-1]);
             u8_dec(x->x_buf, &x->x_selstart);
         }
         if (x->x_buf[x->x_selstart+1] == ' ' &&
             x->x_buf[x->x_selstart] == ' ')
         {
-            //fprintf(stderr,"go forward\n");
             u8_inc(x->x_buf, &x->x_selstart);
         }
         x->x_selend = x->x_selstart;
@@ -772,18 +736,10 @@ be printable in whatever 8-bit character set we find ourselves. */
         while (x->x_selend < x->x_bufsize &&
           !rtext_compare_special_chars(x->x_buf[x->x_selend]))
             u8_inc(x->x_buf, &x->x_selend);
-        /* now skip all the spaces and land before next word */
-        /*while (x->x_selend < x->x_bufsize &&
-          x->x_buf[x->x_selend] == ' ')
-            u8_inc(x->x_buf, &x->x_selend);
-        if (x->x_selend > 0 && x->x_buf[x->x_selend-1] == ' ')
-            u8_dec(x->x_buf, &x->x_selend);*/
         x->x_selstart = x->x_selend;
     }
     else if (!strcmp(keysym->s_name, "CtrlShiftLeft"))
     {
-        //fprintf(stderr,"ctrlshiftleft %d %d %d\n",
-        //    last_sel, x->x_selstart, x->x_selend);
         int swap = 0;
         int *target;
         if (!last_sel) last_sel = 1;
@@ -799,25 +755,19 @@ be printable in whatever 8-bit character set we find ourselves. */
             rtext_compare_special_chars(x->x_buf[*target-1]))
         {
             u8_dec(x->x_buf, target);
-            //(*target)--;
         }
-        //fprintf(stderr,"%d %d\n", x->x_selstart, x->x_selend);
         /* now go back until you find another space or
            the beginning of the buffer */
         while (*target > 0 &&
             !rtext_compare_special_chars(x->x_buf[*target-1]))
         {
             u8_dec(x->x_buf, target);
-            //(*target)--;
         }
-        //fprintf(stderr,"%d %d\n", x->x_selstart, x->x_selend);
         if (x->x_buf[*target+1] == ' ' &&
             x->x_buf[x->x_selstart] == ' ')
         {
             u8_inc(x->x_buf, target);
-            //(*target)++;
         }
-        //fprintf(stderr,"%d %d\n", x->x_selstart, x->x_selend);
         if (x->x_selstart > x->x_selend)
         {
             swap = x->x_selend;
@@ -828,8 +778,6 @@ be printable in whatever 8-bit character set we find ourselves. */
     }
     else if (!strcmp(keysym->s_name, "CtrlShiftRight"))
     {
-        //fprintf(stderr,"ctrlshiftright %d %d %d\n",
-        //    last_sel, x->x_selstart, x->x_selend);
         int swap = 0;
         int *target;
         if (!last_sel) last_sel = 2;
@@ -840,38 +788,17 @@ be printable in whatever 8-bit character set we find ourselves. */
             last_sel = 2;
             target = &x->x_selend;
         }
-        //fprintf(stderr,"%d %d\n", x->x_selstart, x->x_selend);
         /* now go forward until you find another space or
            the end of the buffer */
         if (*target < x->x_bufsize - 1)
         {
-            //fprintf(stderr,"while 1 <%c>\n", x->x_buf[*target]);
             u8_inc(x->x_buf, target);
-            //(*target)++;
         }
-        //fprintf(stderr,"%d %d\n", x->x_selstart, x->x_selend);
         while (*target < x->x_bufsize &&
             !rtext_compare_special_chars(x->x_buf[*target]))
-        {
-            //fprintf(stderr,"while 2 <%c>\n", x->x_buf[*target]);
-            u8_inc(x->x_buf, target);
-            //(*target)++;
-        }
-        /* now skip all the spaces and land before next word */
-
-        /*while (*target < x->x_bufsize &&
-            x->x_buf[*target] == ' ')
         {
             u8_inc(x->x_buf, target);
-            //(*target)++;
         }
-        if (*target > 0 && x->x_buf[*target-1] == ' ')
-        {
-            u8_dec(x->x_buf, target);
-            //(*target)--;
-        }*/
-
-        //fprintf(stderr,"%d %d\n", x->x_selstart, x->x_selend);
         if (x->x_selstart > x->x_selend)
         {
             swap = x->x_selend;
@@ -879,9 +806,7 @@ be printable in whatever 8-bit character set we find ourselves. */
             x->x_selstart = swap;
             last_sel = 2;
         }
-        //fprintf(stderr,"%d %d\n", x->x_selstart, x->x_selend);
     }
-
     rtext_senditup(x, SEND_UPDATE, &w, &h, &indx);
 }
 
@@ -895,37 +820,21 @@ void rtext_mouse(t_rtext *x, int xval, int yval, int flag)
     }
     else if (flag == RTEXT_DBL)
     {
-        int whereseparator, newseparator;
+        int ws, ns;
         x->x_dragfrom = -1;
-        whereseparator = 0;
-        if ((newseparator = lastone(x->x_buf, ' ', indx)) > whereseparator)
-            whereseparator = newseparator+1;
-        if ((newseparator = lastone(x->x_buf, '\n', indx)) > whereseparator)
-            whereseparator = newseparator+1;
-        if ((newseparator = lastone(x->x_buf, ';', indx)) > whereseparator)
-            whereseparator = newseparator+1;
-        if ((newseparator = lastone(x->x_buf, ',', indx)) > whereseparator)
-            whereseparator = newseparator+1;
-        x->x_selstart = whereseparator;
+        ws = 0;
+        if ((ns = lastone(x->x_buf, ' ' , indx)) > ws) ws = ns+1;
+        if ((ns = lastone(x->x_buf, '\n', indx)) > ws) ws = ns+1;
+        if ((ns = lastone(x->x_buf, ';' , indx)) > ws) ws = ns+1;
+        if ((ns = lastone(x->x_buf, ',' , indx)) > ws) ws = ns+1;
+        x->x_selstart = ws;
         
-        whereseparator = x->x_bufsize - indx;
-        if ((newseparator =
-            firstone(x->x_buf+indx, ' ', x->x_bufsize - indx)) >= 0 &&
-                newseparator < whereseparator)
-                    whereseparator = newseparator;
-        if ((newseparator =
-            firstone(x->x_buf+indx, '\n', x->x_bufsize - indx)) >= 0 &&
-                newseparator < whereseparator)
-                    whereseparator = newseparator;
-        if ((newseparator =
-            firstone(x->x_buf+indx, ';', x->x_bufsize - indx)) >= 0 &&
-                newseparator < whereseparator)
-                    whereseparator = newseparator;
-        if ((newseparator =
-            firstone(x->x_buf+indx, ',', x->x_bufsize - indx)) >= 0 &&
-                newseparator < whereseparator)
-                    whereseparator = newseparator;
-        x->x_selend = indx + whereseparator;
+        int i = ws = x->x_bufsize - indx;
+        if ((ns = firstone(x->x_buf+indx, ' ' , i)) >= 0 && ns < ws) ws = ns;
+        if ((ns = firstone(x->x_buf+indx, '\n', i)) >= 0 && ns < ws) ws = ns;
+        if ((ns = firstone(x->x_buf+indx, ';',  i)) >= 0 && ns < ws) ws = ns;
+        if ((ns = firstone(x->x_buf+indx, ',',  i)) >= 0 && ns < ws) ws = ns;
+        x->x_selend = indx + ws;
     }
     else if (flag == RTEXT_SHIFT)
     {