]> granicus.if.org Git - graphviz/commitdiff
Update with new lefty, fixing many bugs and supporting new features
authorerg <devnull@localhost>
Fri, 8 Apr 2005 20:45:33 +0000 (20:45 +0000)
committererg <devnull@localhost>
Fri, 8 Apr 2005 20:45:33 +0000 (20:45 +0000)
cmd/lefty/gfxview.c

index 6a16b4cb5c65e4e7b197a9ad317a05054a9ae2d8..773cd213ceb2bd6487a52f48278da8b0f14c3bd4 100644 (file)
@@ -14,8 +14,7 @@
 *              AT&T Research, Florham Park NJ             *
 **********************************************************/
 
-
-/* Lefteris Koutsofios - AT&T Bell Laboratories */
+/* Lefteris Koutsofios - AT&T Labs Research */
 
 #include "common.h"
 #include "g.h"
@@ -73,9 +72,9 @@ typedef struct gfxmenu_t {
 typedef struct gfxnode_t {
     int inuse;
     int wi;
-    Tobj plvo, pmvo, prvo, pkvo[256];
-    Gpoint_t plp, pmp, prp, pkp[256];
-    char ls, ms, rs, ks[256];
+    Tobj plvo, pmvo, prvo, pb3vo, pb4vo, pkvo[256];
+    Gpoint_t plp, pmp, prp, pb3p, pb4p, pkp[256];
+    char ls, ms, rs, b3s, b4s, ks[256];
     struct gfxrect_t *rect[LISTSIZE];
     struct gfxmenu_t *menu[LISTSIZE];
 } gfxnode_t;
@@ -87,8 +86,10 @@ static int gfxnoden;
 #define ISAWIDGET(wi) (wi >= 0 && wi < Gwidgetn && Gwidgets[wi].inuse)
 #define ISALABEL(wi) (Gwidgets[wi].type == G_LABELWIDGET)
 #define ISACANVAS(wi) (Gwidgets[wi].type == G_CANVASWIDGET)
-#define ISACANVAS2(wi) (Gwidgets[wi].type == G_CANVASWIDGET || \
-        Gwidgets[wi].type == G_PCANVASWIDGET)
+#define ISACANVAS2(wi) ( \
+    Gwidgets[wi].type == G_CANVASWIDGET || \
+    Gwidgets[wi].type == G_PCANVASWIDGET \
+)
 #define NODEID(wi) Gwidgets[wi].udata
 #define ISABITMAP(bi) (bi >= 0 && bi < Gbitmapn && Gbitmaps[bi].inuse)
 
@@ -105,539 +106,557 @@ static int wattri = 0;
 
 static Tobj rootwo, rootbo;
 
-static void nodeinit(int);
-static void nodeterm(int);
-static void rectinit(int);
-static void rectterm(int);
-static void rectinsert(int, Tobj, Grect_t);
-static void rectmerge(int, Tobj, Grect_t);
-static Tobj rectfind(int, Gpoint_t);
-static void rectdelete(int, Tobj);
-static void rectprune(int);
-static void menuinsert(int, Tobj, long, int);
-static int menufind(int, Tobj, long);
-static void menuprune(int);
-static int getwattr(Tobj, int *);
-static int getgattr(Tobj, Ggattr_t *);
-static int getrect(Tobj, Grect_t *);
-static int getxy(Tobj, Gxy_t *);
-static int getint(Tobj, int *);
-static int getdouble(Tobj, double *);
-static int getstr(Tobj, char **);
-static int getcolor(Tobj, Tobj, Gcolor_t *);
-
-void GFXinit(void)
-{
+static void nodeinit (int);
+static void nodeterm (int);
+static void rectinit (int);
+static void rectterm (int);
+static void rectinsert (int, Tobj, Grect_t);
+static void rectmerge (int, Tobj, Grect_t);
+static Tobj rectfind (int, Gpoint_t);
+static void rectdelete (int, Tobj);
+static void rectprune (int);
+static void menuinsert (int, Tobj, long, int);
+static int menufind (int, Tobj, long);
+static void menuprune (int);
+static int scanhsv (char *, float *, float *, float *);
+static void hsv2rgb (float, float, float, Gcolor_t *);
+
+static int getwattr (Tobj, int *);
+static int getgattr (Tobj, Ggattr_t *);
+static int getrect (Tobj, Grect_t *);
+static int getxy (Tobj, Gxy_t *);
+static int getint (Tobj, int *);
+static int getdouble (Tobj, double *);
+static int getstr (Tobj, char **);
+static int getcolor (Tobj, Tobj, Gcolor_t *);
+
+void GFXinit (void) {
     int ni;
 
-    Tinss(root, "widgets", (rootwo = Ttable(100)));
-    Tinss(root, "bitmaps", (rootbo = Ttable(100)));
-    gfxnodes = Marrayalloc((long) GFXNODEINCR * GFXNODESIZE);
+    Tinss (root, "widgets", (rootwo = Ttable (100)));
+    Tinss (root, "bitmaps", (rootbo = Ttable (100)));
+    gfxnodes = Marrayalloc ((long) GFXNODEINCR * GFXNODESIZE);
     gfxnoden = GFXNODEINCR;
     for (ni = 0; ni < gfxnoden; ni++)
-       gfxnodes[ni].inuse = FALSE;
+        gfxnodes[ni].inuse = FALSE;
     ni = 0;
-    gpp = Marrayalloc((long) GPINCR * GPSIZE);
+    gpp = Marrayalloc ((long) GPINCR * GPSIZE);
     gpn = GPINCR;
-    wattrp = Marrayalloc((long) WATTRINCR * WATTRSIZE);
+    wattrp = Marrayalloc ((long) WATTRINCR * WATTRSIZE);
     wattrn = WATTRINCR, wattri = 0;
 }
 
-void GFXterm(void)
-{
+void GFXterm (void) {
     int ni;
 
-    Marrayfree(wattrp), wattrp = NULL, wattrn = 0;
-    Marrayfree(gpp), gpp = NULL, gpn = 0;
+    Marrayfree (wattrp), wattrp = NULL, wattrn = 0;
+    Marrayfree (gpp), gpp = NULL, gpn = 0;
     for (ni = 0; ni < gfxnoden; ni++) {
-       if (gfxnodes[ni].inuse) {
-           Gdestroywidget(gfxnodes[ni].wi);
-           nodeterm(ni);
-           gfxnodes[ni].inuse = FALSE;
-       }
+        if (gfxnodes[ni].inuse) {
+            Gdestroywidget (gfxnodes[ni].wi);
+            nodeterm (ni);
+            gfxnodes[ni].inuse = FALSE;
+        }
     }
-    Marrayfree(gfxnodes), gfxnodes = NULL, gfxnoden = 0;
-    Tdels(root, "bitmaps");
-    Tdels(root, "widgets");
+    Marrayfree (gfxnodes), gfxnodes = NULL, gfxnoden = 0;
+    Tdels (root, "bitmaps");
+    Tdels (root, "widgets");
 }
 
 /* callback for mem.c module - removes dead objects from gfxnodes */
-void GFXprune(void)
-{
+void GFXprune (void) {
     gfxnode_t *np;
     int ni, ki;
 
     for (ni = 0; ni < gfxnoden; ni++) {
-       np = &gfxnodes[ni];
-       if (np->inuse) {
-           rectprune(ni), menuprune(ni);
-           if (np->plvo && !M_AREAOF(np->plvo))
-               np->plvo = 0;
-           if (np->pmvo && !M_AREAOF(np->pmvo))
-               np->pmvo = 0;
-           if (np->prvo && !M_AREAOF(np->prvo))
-               np->prvo = 0;
-           for (ki = 0; ki < 256; ki++)
-               if (np->pkvo[ki] && !M_AREAOF(np->pkvo[ki]))
-                   np->pkvo[ki] = 0;
-       }
+        np = &gfxnodes[ni];
+        if (np->inuse) {
+            rectprune (ni), menuprune (ni);
+            if (np->plvo && !M_AREAOF (np->plvo))
+                np->plvo = 0;
+            if (np->pmvo && !M_AREAOF (np->pmvo))
+                np->pmvo = 0;
+            if (np->prvo && !M_AREAOF (np->prvo))
+                np->prvo = 0;
+            if (np->pb3vo && !M_AREAOF (np->pb3vo))
+                np->pb3vo = 0;
+            if (np->pb4vo && !M_AREAOF (np->pb4vo))
+                np->pb4vo = 0;
+            for (ki = 0; ki < 256; ki++)
+                if (np->pkvo[ki] && !M_AREAOF (np->pkvo[ki]))
+                    np->pkvo[ki] = 0;
+        }
     }
 }
 
 /* callback for g.c module - calls the appropriate lefty function */
-void GFXlabelcb(Gevent_t * evp)
-{
+void GFXlabelcb (Gevent_t *evp) {
     Tobj fo, to, co, wo;
     char *fn;
     char s[2];
     long fm;
-    fn = 0;
 
-    wo = Tfindi(rootwo, evp->wi);
+    wo = Tfindi (rootwo, evp->wi);
     switch (evp->type) {
     case G_MOUSE:
-       switch (evp->data) {
-       case G_LEFT:
-           fn = (evp->code == G_UP) ? "leftup" : "leftdown";
-           break;
-       case G_MIDDLE:
-           fn = (evp->code == G_UP) ? "middleup" : "middledown";
-           break;
-       case G_RIGHT:
-           fn = (evp->code == G_UP) ? "rightup" : "rightdown";
-           break;
-       }
-       break;
+        switch (evp->data) {
+        case G_LEFT:
+            fn = (evp->code == G_UP) ? "leftup" : "leftdown";
+            break;
+        case G_MIDDLE:
+            fn = (evp->code == G_UP) ? "middleup" : "middledown";
+            break;
+        case G_RIGHT:
+            fn = (evp->code == G_UP) ? "rightup" : "rightdown";
+            break;
+        }
+        break;
     case G_KEYBD:
-       fn = (evp->code == G_UP) ? "keyup" : "keydown";
-       break;
+        fn = (evp->code == G_UP) ? "keyup" : "keydown";
+        break;
     }
-    if (!wo || !(fo = Tfinds(wo, fn)) || Tgettype(fo) != T_CODE)
-       if (!(fo = Tfinds(root, fn)) || Tgettype(fo) != T_CODE)
-           return;
-    fm = Mpushmark(fo);
-    to = Ttable(4);
-    Mpushmark(to);
-    Tinss(to, "widget", Tinteger(evp->wi));
+    if (!wo || !(fo = Tfinds (wo, fn)) || Tgettype (fo) != T_CODE)
+        if (!(fo = Tfinds (root, fn)) || Tgettype (fo) != T_CODE)
+            return;
+    fm = Mpushmark (fo);
+    to = Ttable (4);
+    Mpushmark (to);
+    Tinss (to, "widget", Tinteger (evp->wi));
     if (evp->type == G_KEYBD)
-       s[0] = evp->data, s[1] = '\000', Tinss(to, "key", Tstring(s));
-    if ((co = Pfcall(fo, to)))
-       Eunit(co);
-    Mpopmark(fm);
+        s[0] = evp->data, s[1] = '\000', Tinss (to, "key", Tstring (s));
+    if ((co = Pfcall (fo, to)))
+        Eunit (co);
+    Mpopmark (fm);
 }
 
 /* callback for g.c module - calls the appropriate lefty function */
-void GFXviewcb(Gevent_t * evp)
-{
+void GFXviewcb (Gevent_t *evp) {
     Tobj fo, to, co, wo;
     char *fn;
     long fm;
 
-    wo = Tfindi(rootwo, evp->wi);
+    wo = Tfindi (rootwo, evp->wi);
     fn = "closeview";
-    if (!wo || !(fo = Tfinds(wo, fn)) || Tgettype(fo) != T_CODE)
-       if (!(fo = Tfinds(root, fn)) || Tgettype(fo) != T_CODE)
-           exit(0);
-    fm = Mpushmark(fo);
-    to = Ttable(2);
-    Mpushmark(to);
-    Tinss(to, "widget", Tinteger(evp->wi));
-    if ((co = Pfcall(fo, to)))
-       Eunit(co);
-    Mpopmark(fm);
+    if (!wo || !(fo = Tfinds (wo, fn)) || Tgettype (fo) != T_CODE)
+        if (!(fo = Tfinds (root, fn)) || Tgettype (fo) != T_CODE)
+            exit (0);
+    fm = Mpushmark (fo);
+    to = Ttable (2);
+    Mpushmark (to);
+    Tinss (to, "widget", Tinteger (evp->wi));
+    if ((co = Pfcall (fo, to)))
+        Eunit (co);
+    Mpopmark (fm);
 }
 
 /* callback for g.c module - calls the appropriate lefty function */
-void GFXevent(Gevent_t * evp)
-{
-    Tobj vo, pvo = NULL, fo, to, po, co, wo;
+void GFXevent (Gevent_t *evp) {
+    Tobj vo, pvo, fo, to, po, co, wo;
     gfxnode_t *np;
-    Gpoint_t pp = { 0, 0 };
+    Gpoint_t pp;
     char *fn;
     char s[2];
     long fm;
     int ni;
-    fn = 0;
 
     ni = Gwidgets[evp->wi].udata;
     np = &gfxnodes[ni];
-    wo = Tfindi(rootwo, evp->wi);
-    if (!(vo = rectfind(ni, evp->p)))
-       vo = null;
+    wo = Tfindi (rootwo, evp->wi);
+    if (!(vo = rectfind (ni, evp->p)))
+        vo = null;
     switch (evp->type) {
     case G_MOUSE:
-       switch (evp->data) {
-       case G_LEFT:
-           if (evp->code == G_UP)
-               fn = "leftup", pvo = np->plvo, pp = np->plp, np->ls = 0;
-           else
-               fn = "leftdown", np->plvo = vo, np->plp = evp->p, np->ls =
-                   1;
-           break;
-       case G_MIDDLE:
-           if (evp->code == G_UP)
-               fn = "middleup", pvo = np->pmvo, pp = np->pmp, np->ms = 0;
-           else
-               fn = "middledown", np->pmvo = vo, np->pmp =
-                   evp->p, np->ms = 1;
-           break;
-       case G_RIGHT:
-           if (evp->code == G_UP)
-               fn = "rightup", pvo = np->prvo, pp = np->prp, np->rs = 0;
-           else
-               fn = "rightdown", np->prvo = vo, np->prp = evp->p, np->rs =
-                   1;
-           break;
-       }
-       break;
+        switch (evp->data) {
+        case G_LEFT:
+            if (evp->code == G_UP)
+                fn = "leftup", pvo = np->plvo, pp = np->plp, np->ls = 0;
+            else
+                fn = "leftdown", np->plvo = vo, np->plp = evp->p, np->ls = 1;
+            break;
+        case G_MIDDLE:
+            if (evp->code == G_UP)
+                fn = "middleup", pvo = np->pmvo, pp = np->pmp, np->ms = 0;
+            else
+                fn = "middledown", np->pmvo = vo, np->pmp = evp->p, np->ms = 1;
+            break;
+        case G_RIGHT:
+            if (evp->code == G_UP)
+                fn = "rightup", pvo = np->prvo, pp = np->prp, np->rs = 0;
+            else
+                fn = "rightdown", np->prvo = vo, np->prp = evp->p, np->rs = 1;
+            break;
+        case G_BUTTON3:
+            if (evp->code == G_UP) {
+                fn = "button3up";
+                pvo = np->pb3vo, pp = np->pb3p, np->b3s = 0;
+            } else {
+                fn = "button4down";
+                np->pb3vo = vo, np->pb3p = evp->p, np->b3s = 1;
+            }
+            break;
+        case G_BUTTON4:
+            if (evp->code == G_UP) {
+                fn = "button4up";
+                pvo = np->pb4vo, pp = np->pb4p, np->b4s = 0;
+            } else {
+                fn = "button4down";
+                np->pb4vo = vo, np->pb4p = evp->p, np->b4s = 1;
+            }
+            break;
+        }
+        break;
     case G_KEYBD:
-       if (evp->code == G_UP) {
-           fn = "keyup";
-           pvo = np->pkvo[evp->data];
-           pp = np->pkp[evp->data];
-           np->ks[evp->data] = 0;
-       } else {
-           fn = "keydown";
-           np->pkvo[evp->data] = vo;
-           np->pkp[evp->data] = evp->p;
-           np->ks[evp->data] = 1;
-       }
-       break;
+        if (evp->code == G_UP) {
+            fn = "keyup";
+            pvo = np->pkvo[evp->data];
+            pp = np->pkp[evp->data];
+            np->ks[evp->data] = 0;
+        } else {
+            fn = "keydown";
+            np->pkvo[evp->data] = vo;
+            np->pkp[evp->data] = evp->p;
+            np->ks[evp->data] = 1;
+        }
+        break;
     }
-    if (!wo || !(fo = Tfinds(wo, fn)) || Tgettype(fo) != T_CODE)
-       if (!(fo = Tfinds(root, fn)) || Tgettype(fo) != T_CODE)
-           return;
-
-    fm = Mpushmark(fo);
-    to = Ttable(4);
-    Mpushmark(to);
-    Tinss(to, "widget", Tinteger(evp->wi));
-    Tinss(to, "obj", vo);
-    Tinss(to, "pos", (po = Ttable(2)));
-    Tinss(po, "x", Treal(evp->p.x));
-    Tinss(po, "y", Treal(evp->p.y));
+    if (!wo || !(fo = Tfinds (wo, fn)) || Tgettype (fo) != T_CODE)
+        if (!(fo = Tfinds (root, fn)) || Tgettype (fo) != T_CODE)
+            return;
+
+    fm = Mpushmark (fo);
+    to = Ttable (4);
+    Mpushmark (to);
+    Tinss (to, "widget", Tinteger (evp->wi));
+    Tinss (to, "obj", vo);
+    Tinss (to, "pos", (po = Ttable (2)));
+    Tinss (po, "x", Treal (evp->p.x));
+    Tinss (po, "y", Treal (evp->p.y));
     if (evp->code == G_UP) {
-       Tinss(to, "pobj", pvo);
-       Tinss(to, "ppos", (po = Ttable(2)));
-       Tinss(po, "x", Treal(pp.x));
-       Tinss(po, "y", Treal(pp.y));
+        Tinss (to, "pobj", pvo);
+        Tinss (to, "ppos", (po = Ttable (2)));
+        Tinss (po, "x", Treal (pp.x));
+        Tinss (po, "y", Treal (pp.y));
     }
     if (evp->type == G_KEYBD)
-       s[0] = evp->data, s[1] = '\000', Tinss(to, "key", Tstring(s));
-    if ((co = Pfcall(fo, to)))
-       Eunit(co);
-    Mpopmark(fm);
+        s[0] = evp->data, s[1] = '\000', Tinss (to, "key", Tstring (s));
+    if ((co = Pfcall (fo, to)))
+        Eunit (co);
+    Mpopmark (fm);
 }
 
 /* called directly from lefty.c, when any button is held down */
-void GFXmove(void)
-{
+void GFXmove (void) {
     gfxnode_t *np;
-    char *fn[3];
-    Tobj vo[3], fo, to, po, co, wo;
-    Gpoint_t cp, pp[3];
+    char *fn[5];
+    Tobj vo[5], fo, to, po, co, wo;
+    Gpoint_t cp, pp[5];
     long fm;
     int count, i, ni;
 
     for (ni = 0; ni < gfxnoden; ni++) {
-       np = &gfxnodes[ni];
-       if (!np->inuse || !ISACANVAS(np->wi) ||
-           !Gwidgets[np->wi].u.c->buttonsdown)
-           continue;
-       wo = Tfindi(rootwo, np->wi);
-       Ggetmousecoords(np->wi, &cp, &count);
-       if (!count) {
-           Gresetbstate(np->wi);
-           continue;
-       }
-       if (np->ls)
-           fn[0] = "leftmove", pp[0] = np->plp, vo[0] = np->plvo;
-       else
-           fn[0] = NULL;
-       if (np->ms)
-           fn[1] = "middlemove", pp[1] = np->pmp, vo[1] = np->pmvo;
-       else
-           fn[1] = NULL;
-       if (np->rs)
-           fn[2] = "rightmove", pp[2] = np->prp, vo[2] = np->prvo;
-       else
-           fn[2] = NULL;
-       for (i = 0; i < 3; i++) {
-           if (!fn[i])
-               continue;
-           if (!wo || !(fo = Tfinds(wo, fn[i])) || Tgettype(fo) != T_CODE)
-               fo = Tfinds(root, fn[i]);
-           if (fo && Tgettype(fo) == T_CODE) {
-               fm = Mpushmark(fo);
-               to = Ttable(4);
-               Mpushmark(to);
-               Tinss(to, "widget", Tinteger(np->wi));
-               Tinss(to, "obj", vo[i]);
-               Tinss(to, "pos", (po = Ttable(2)));
-               Tinss(po, "x", Treal(cp.x));
-               Tinss(po, "y", Treal(cp.y));
-               Tinss(to, "ppos", (po = Ttable(2)));
-               Tinss(po, "x", Treal(pp[i].x));
-               Tinss(po, "y", Treal(pp[i].y));
-               if ((co = Pfcall(fo, to)))
-                   Eunit(co);
-               Mpopmark(fm);
-           }
-       }
+        np = &gfxnodes[ni];
+        if (
+            !np->inuse || !ISACANVAS (np->wi) ||
+            !Gwidgets[np->wi].u.c->buttonsdown
+        )
+            continue;
+        wo = Tfindi (rootwo, np->wi);
+        Ggetmousecoords (np->wi, &cp, &count);
+        if (!count) {
+            Gresetbstate (np->wi);
+            continue;
+        }
+        if (np->ls)
+            fn[0] = "leftmove",   pp[0] = np->plp, vo[0] = np->plvo;
+        else
+            fn[0] = NULL;
+        if (np->ms)
+            fn[1] = "middlemove", pp[1] = np->pmp, vo[1] = np->pmvo;
+        else
+            fn[1] = NULL;
+        if (np->rs)
+            fn[2] = "rightmove",  pp[2] = np->prp, vo[2] = np->prvo;
+        else
+            fn[2] = NULL;
+        if (np->b3s)
+            fn[3] = "button3move",  pp[3] = np->pb3p, vo[3] = np->pb3vo;
+        else
+            fn[3] = NULL;
+        if (np->b4s)
+            fn[4] = "button4move",  pp[4] = np->pb4p, vo[4] = np->pb4vo;
+        else
+            fn[4] = NULL;
+        for (i = 0; i < 5; i++) {
+            if (!fn[i])
+                continue;
+            if (!wo || !(fo = Tfinds (wo, fn[i])) || Tgettype (fo) != T_CODE)
+                fo = Tfinds (root, fn[i]);
+            if (fo && Tgettype (fo) == T_CODE) {
+                fm = Mpushmark (fo);
+                to = Ttable (4);
+                Mpushmark (to);
+                Tinss (to, "widget", Tinteger (np->wi));
+                Tinss (to, "obj", vo[i]);
+                Tinss (to, "pos", (po = Ttable (2)));
+                Tinss (po, "x", Treal (cp.x));
+                Tinss (po, "y", Treal (cp.y));
+                Tinss (to, "ppos", (po = Ttable (2)));
+                Tinss (po, "x", Treal (pp[i].x));
+                Tinss (po, "y", Treal (pp[i].y));
+                if ((co = Pfcall (fo, to)))
+                    Eunit (co);
+                Mpopmark (fm);
+            }
+        }
     }
 }
 
 /* called directly from lefty.c, when any canvas needs to be redrawn */
-void GFXredraw(void)
-{
+void GFXredraw (void) {
     gfxnode_t *np;
     Tobj wo, fo, co, to;
     long fm;
     int ni;
 
     for (ni = 0; ni < gfxnoden; ni++) {
-       np = &gfxnodes[ni];
-       if (!np->inuse || !ISACANVAS(np->wi) ||
-           !Gwidgets[np->wi].u.c->needredraw)
-           continue;
-       Gwidgets[np->wi].u.c->needredraw = FALSE;
-       wo = Tfindi(rootwo, np->wi);
-       if (!wo || !(fo = Tfinds(wo, "redraw")) || Tgettype(fo) != T_CODE)
-           if (!(fo = Tfinds(root, "redraw")) || Tgettype(fo) != T_CODE)
-               return;
-
-       fm = Mpushmark(fo);
-       to = Ttable(4);
-       Mpushmark(to);
-       Tinss(to, "widget", Tinteger(np->wi));
-       if ((co = Pfcall(fo, to)))
-           Eunit(co);
-       Mpopmark(fm);
+        np = &gfxnodes[ni];
+        if (
+            !np->inuse || !ISACANVAS (np->wi) ||
+            !Gwidgets[np->wi].u.c->needredraw
+        )
+            continue;
+        Gwidgets[np->wi].u.c->needredraw = FALSE;
+        wo = Tfindi (rootwo, np->wi);
+        if (!wo || !(fo = Tfinds (wo, "redraw")) || Tgettype (fo) != T_CODE)
+            if (!(fo = Tfinds (root, "redraw")) || Tgettype (fo) != T_CODE)
+                return;
+
+        fm = Mpushmark (fo);
+        to = Ttable (4);
+        Mpushmark (to);
+        Tinss (to, "widget", Tinteger (np->wi));
+        if ((co = Pfcall (fo, to)))
+            Eunit (co);
+        Mpopmark (fm);
     }
 }
 
-void GFXtextcb(int wi, char *s)
-{
+void GFXtextcb (int wi, char *s) {
     Tobj wo, fo, co, to;
     long fm;
 
-    if (!(wo = Tfindi(rootwo, wi)))
-       return;
+    if (!(wo = Tfindi (rootwo, wi)))
+        return;
 
-    if (!(fo = Tfinds(wo, "oneline")) || Tgettype(fo) != T_CODE)
-       return;
+    if (!(fo = Tfinds (wo, "oneline")) || Tgettype (fo) != T_CODE)
+        return;
 
-    fm = Mpushmark(fo);
-    to = Ttable(4);
-    Mpushmark(to);
-    Tinss(to, "widget", Tinteger(wi));
-    Tinss(to, "text", Tstring(s));
-    if ((co = Pfcall(fo, to)))
-       Eunit(co);
-    Mpopmark(fm);
+    fm = Mpushmark (fo);
+    to = Ttable (4);
+    Mpushmark (to);
+    Tinss (to, "widget", Tinteger (wi));
+    Tinss (to, "text", Tstring (s));
+    if ((co = Pfcall (fo, to)))
+        Eunit (co);
+    Mpopmark (fm);
 }
 
-void GFXbuttoncb(int wi, void *data)
-{
+void GFXbuttoncb (int wi, void *data) {
     Tobj wo, fo, co, to;
     long fm;
 
-    if (!(wo = Tfindi(rootwo, wi)))
-       return;
+    if (!(wo = Tfindi (rootwo, wi)))
+        return;
 
-    if (!(fo = Tfinds(wo, "pressed")) || Tgettype(fo) != T_CODE)
-       return;
+    if (!(fo = Tfinds (wo, "pressed")) || Tgettype (fo) != T_CODE)
+        return;
 
-    fm = Mpushmark(fo);
-    to = Ttable(4);
-    Mpushmark(to);
-    Tinss(to, "widget", Tinteger(wi));
-    if ((co = Pfcall(fo, to)))
-       Eunit(co);
-    Mpopmark(fm);
+    fm = Mpushmark (fo);
+    to = Ttable (4);
+    Mpushmark (to);
+    Tinss (to, "widget", Tinteger (wi));
+    if ((co = Pfcall (fo, to)))
+        Eunit (co);
+    Mpopmark (fm);
 }
 
-void GFXarrayresizecb(int wi, Gawdata_t * dp)
-{
-    Tobj wo, fo, co, so, to, lrtno = NULL, sxo, syo;
+void GFXarrayresizecb (int wi, Gawdata_t *dp) {
+    Tobj wo, fo, co, so, to, lrtno, sxo, syo;
     Tkvindex_t tkvi;
     Gawcarray_t *cp;
     int sx, sy, csx, csy, ci;
     long fm;
 
-    if (!(wo = Tfindi(rootwo, wi)))
-       return;
+    if (!(wo = Tfindi (rootwo, wi)))
+        return;
 
-    if (!(fo = Tfinds(wo, "resize")) || Tgettype(fo) != T_CODE) {
-       Gawdefcoordscb(wi, dp);
-       return;
+    if (!(fo = Tfinds (wo, "resize")) || Tgettype (fo) != T_CODE) {
+        Gawdefcoordscb (wi, dp);
+        return;
     }
 
-    fm = Mpushmark(fo);
-    to = Ttable(4);
-    Mpushmark(to);
-    Tinss(to, "widget", Tinteger(wi));
-    Tinss(to, "size", (so = Ttable(2)));
-    Tinss(so, "x", Treal((double) dp->sx));
-    Tinss(so, "y", Treal((double) dp->sy));
-    if ((co = Pfcall(fo, to)))
-       lrtno = Eunit(co);
-    Mpopmark(fm);
+    fm = Mpushmark (fo);
+    to = Ttable (4);
+    Mpushmark (to);
+    Tinss (to, "widget", Tinteger (wi));
+    Tinss (to, "size", (so = Ttable (2)));
+    Tinss (so, "x", Treal ((double) dp->sx));
+    Tinss (so, "y", Treal ((double) dp->sy));
+    if ((co = Pfcall (fo, to)))
+        lrtno = Eunit (co);
+    Mpopmark (fm);
     if (!lrtno) {
-       Gawdefcoordscb(wi, dp);
-       return;
+        Gawdefcoordscb (wi, dp);
+        return;
     }
-    for (Tgetfirst(lrtno, &tkvi); tkvi.kvp; Tgetnext(&tkvi)) {
-       if (!T_ISNUMBER(tkvi.kvp->ko) || !T_ISTABLE((so = tkvi.kvp->vo)))
-           continue;
-       wi = Tgetnumber(tkvi.kvp->ko);
-       if (!ISAWIDGET(wi))
-           continue;
-       for (ci = 0; ci < dp->cj; ci++) {
-           cp = &dp->carray[ci];
-           if (!cp->flag || cp->w != Gwidgets[wi].w)
-               continue;
-           if ((sxo = Tfinds(so, "x")) && T_ISNUMBER(sxo))
-               cp->sx = Tgetnumber(sxo);
-           if ((syo = Tfinds(so, "y")) && T_ISNUMBER(syo))
-               cp->sy = Tgetnumber(syo);
-           break;
-       }
+    for (Tgetfirst (lrtno, &tkvi); tkvi.kvp; Tgetnext (&tkvi)) {
+        if (!T_ISNUMBER (tkvi.kvp->ko) || !T_ISTABLE ((so = tkvi.kvp->vo)))
+            continue;
+        wi = Tgetnumber (tkvi.kvp->ko);
+        if (!ISAWIDGET (wi))
+            continue;
+        for (ci = 0; ci < dp->cj; ci++) {
+            cp = &dp->carray[ci];
+            if (!cp->flag || cp->w != Gwidgets[wi].w)
+                continue;
+            if ((sxo = Tfinds (so, "x")) && T_ISNUMBER (sxo))
+                cp->sx = Tgetnumber (sxo);
+            if ((syo = Tfinds (so, "y")) && T_ISNUMBER (syo))
+                cp->sy = Tgetnumber (syo);
+            break;
+        }
     }
     sx = dp->sx, sy = dp->sy;
     csx = csy = 0;
     for (ci = 0; ci < dp->cj; ci++) {
-       cp = &dp->carray[ci];
-       if (!cp->flag)
-           continue;
-       cp->ox = csx, cp->oy = csy;
-       if (dp->type == G_AWVARRAY)
-           cp->sx = sx - 2 * cp->bs, csy += cp->sy + 2 * cp->bs;
-       else
-           cp->sy = sy - 2 * cp->bs, csx += cp->sx + 2 * cp->bs;
+        cp = &dp->carray[ci];
+        if (!cp->flag)
+            continue;
+        cp->ox = csx, cp->oy = csy;
+        if (dp->type == G_AWVARRAY)
+            cp->sx = sx - 2 * cp->bs, csy += cp->sy + 2 * cp->bs;
+        else
+            cp->sy = sy - 2 * cp->bs, csx += cp->sx + 2 * cp->bs;
     }
     if (dp->type == G_AWVARRAY)
-       dp->sy = csy;
+        dp->sy = csy;
     else
-       dp->sx = csx;
+        dp->sx = csx;
 }
 
 /* callback for when there is input on some file descriptor */
-void GFXmonitorfile(int fd)
-{
+void GFXmonitorfile (int fd) {
     Tobj fo, to, co;
     long fm, tm;
 
-    if (!(fo = Tfinds(root, "monitorfile")) || Tgettype(fo) != T_CODE)
-       return;
-
-    fm = Mpushmark(fo);
-    to = Ttable(4);
-    tm = Mpushmark(to);
-    Tinss(to, "fd", Tinteger(fd));
-    if ((co = Pfcall(fo, to)))
-       Eunit(co);
-    Mpopmark(tm);
-    Mpopmark(fm);
+    if (!(fo = Tfinds (root, "monitorfile")) || Tgettype (fo) != T_CODE)
+        return;
+
+    fm = Mpushmark (fo);
+    to = Ttable (4);
+    tm = Mpushmark (to);
+    Tinss (to, "fd", Tinteger (fd));
+    if ((co = Pfcall (fo, to)))
+        Eunit (co);
+    Mpopmark (tm);
+    Mpopmark (fm);
 }
 
 /* callback for when there is no X event and no file input */
-void GFXidle(void)
-{
+void GFXidle (void) {
     Tobj fo, to, co;
     long fm, tm;
 
-    if (!(fo = Tfinds(root, "idle")) || Tgettype(fo) != T_CODE)
-       return;
+    if (!(fo = Tfinds (root, "idle")) || Tgettype (fo) != T_CODE)
+        return;
 
-    fm = Mpushmark(fo);
-    to = Ttable(4);
-    tm = Mpushmark(to);
-    if ((co = Pfcall(fo, to)))
-       Eunit(co);
-    Mpopmark(tm);
-    Mpopmark(fm);
+    fm = Mpushmark (fo);
+    to = Ttable (4);
+    tm = Mpushmark (to);
+    if ((co = Pfcall (fo, to)))
+        Eunit (co);
+    Mpopmark (tm);
+    Mpopmark (fm);
 }
 
 /* LEFTY builtin */
-int GFXcreatewidget(int argc, lvar_t * argv)
-{
+int GFXcreatewidget (int argc, lvar_t *argv) {
     Tobj pwo, cwo, cho;
     long rtnm;
     int type, pwi, wi, ni;
 
     type = -1;
-    if (getint(argv[0].o, &pwi) == -1 || getwattr(argv[1].o, &type) == -1)
-       return L_FAILURE;
-    if (type != G_VIEWWIDGET && type != G_PCANVASWIDGET && !ISAWIDGET(pwi))
-       return L_FAILURE;
+    if (getint (argv[0].o, &pwi) == -1 || getwattr (argv[1].o, &type) == -1)
+        return L_FAILURE;
+    if (type != G_VIEWWIDGET && type != G_PCANVASWIDGET && !ISAWIDGET (pwi))
+        return L_FAILURE;
     if (type == G_CANVASWIDGET || type == G_LABELWIDGET) {
-       for (ni = 0; ni < gfxnoden; ni++)
-           if (!gfxnodes[ni].inuse)
-               break;
-       if (ni == gfxnoden) {
-           gfxnodes = Marraygrow(gfxnodes,
-                                 (long) (ni + GFXNODEINCR) * GFXNODESIZE);
-           for (ni = gfxnoden; ni < gfxnoden + GFXNODEINCR; ni++)
-               gfxnodes[ni].inuse = FALSE;
-           ni = gfxnoden, gfxnoden += GFXNODEINCR;
-       }
-       nodeinit(ni);
-       if (wattri >= wattrn) {
-           wattrp = Marraygrow(wattrp,
-                               (long) (wattrn + WATTRINCR) * WATTRSIZE);
-           wattrn += WATTRINCR;
-       }
-       switch (type) {
-       case G_CANVASWIDGET:
-           wattrp[wattri].id = G_ATTRUSERDATA;
-           wattrp[wattri].u.u = ni, wattri++;
-           break;
-       case G_LABELWIDGET:
-           wattrp[wattri].id = G_ATTRUSERDATA;
-           wattrp[wattri].u.u = ni, wattri++;
-           break;
-       }
-       wi = gfxnodes[ni].wi = Gcreatewidget(pwi, type, wattri, wattrp);
-       gfxnodes[ni].inuse = TRUE;
-       goto done;
+        for (ni = 0; ni < gfxnoden; ni++)
+            if (!gfxnodes[ni].inuse)
+                break;
+        if (ni == gfxnoden) {
+            gfxnodes = Marraygrow (
+                gfxnodes, (long) (ni + GFXNODEINCR) * GFXNODESIZE
+            );
+            for (ni = gfxnoden; ni < gfxnoden + GFXNODEINCR; ni++)
+                gfxnodes[ni].inuse = FALSE;
+            ni = gfxnoden, gfxnoden += GFXNODEINCR;
+        }
+        nodeinit (ni);
+        if (wattri >= wattrn) {
+            wattrp = Marraygrow (
+                wattrp, (long) (wattrn + WATTRINCR) * WATTRSIZE
+            );
+            wattrn += WATTRINCR;
+        }
+        switch (type) {
+        case G_CANVASWIDGET:
+            wattrp[wattri].id = G_ATTRUSERDATA;
+            wattrp[wattri].u.u = ni, wattri++;
+            break;
+        case G_LABELWIDGET:
+            wattrp[wattri].id = G_ATTRUSERDATA;
+            wattrp[wattri].u.u = ni, wattri++;
+            break;
+        }
+        wi = gfxnodes[ni].wi = Gcreatewidget (pwi, type, wattri, wattrp);
+        gfxnodes[ni].inuse = TRUE;
+        goto done;
     }
-    wi = Gcreatewidget(pwi, type, wattri, wattrp);
+    wi = Gcreatewidget (pwi, type, wattri, wattrp);
 
-  done:
-    Tinsi(rootwo, wi, (cwo = Ttable(4)));
-    rtno = Tinteger(wi);
-    rtnm = Mpushmark(rtno);
+done:
+    Tinsi (rootwo, wi, (cwo = Ttable (4)));
+    rtno = Tinteger (wi);
+    rtnm = Mpushmark (rtno);
     if (pwi != -1) {
-       Tinss(cwo, "parent", Tinteger(pwi));
-       if ((pwo = Tfindi(rootwo, pwi))) {
-           if (!(cho = Tfinds(pwo, "children")))
-               Tinss(pwo, "children", (cho = Ttable(2)));
-           Tinsi(cho, wi, Tinteger(pwi));
-       }
+        Tinss (cwo, "parent", Tinteger (pwi));
+        if ((pwo = Tfindi (rootwo, pwi))) {
+            if (!(cho = Tfinds (pwo, "children")))
+                Tinss (pwo, "children", (cho = Ttable (2)));
+            Tinsi (cho, wi, Tinteger (pwi));
+        }
     }
-    Mpopmark(rtnm);
+    Mpopmark (rtnm);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXsetwidgetattr(int argc, lvar_t * argv)
-{
+int GFXsetwidgetattr (int argc, lvar_t *argv) {
     int wi, type, rtn;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi))
-       return L_FAILURE;
+    if (getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi))
+        return L_FAILURE;
     type = Gwidgets[wi].type;
-    if ((rtn = getwattr(argv[1].o, &type)) == -1)
-       return L_FAILURE;
-    Gsetwidgetattr(wi, wattri, wattrp);
-    rtno = Tinteger(rtn);
+    if ((rtn = getwattr (argv[1].o, &type)) == -1)
+        return L_FAILURE;
+    Gsetwidgetattr (wi, wattri, wattrp);
+    rtno = Tinteger (rtn);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXgetwidgetattr(int argc, lvar_t * argv)
-{
+int GFXgetwidgetattr (int argc, lvar_t *argv) {
     Tkvindex_t tkvi;
     Tobj po, so, ro, co, co2;
     Gwattrmap_t *mapp;
@@ -646,552 +665,575 @@ int GFXgetwidgetattr(int argc, lvar_t * argv)
     long rtnm;
 
     wattri = 0;
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) ||
-       !T_ISTABLE(argv[1].o))
-       return L_FAILURE;
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) ||
+        !T_ISTABLE (argv[1].o)
+    )
+        return L_FAILURE;
     type = Gwidgets[wi].type;
     for (ap = NULL, li = 0; Gwlist[li].wname; li++) {
-       if (type == Gwlist[li].wid) {
-           ap = Gwlist[li].attrid;
-           break;
-       }
+        if (type == Gwlist[li].wid) {
+            ap = Gwlist[li].attrid;
+            break;
+        }
     }
     if (!ap)
-       return L_FAILURE;
-    for (Tgetfirst(argv[1].o, &tkvi); tkvi.kvp; Tgetnext(&tkvi)) {
-       if (!T_ISSTRING(tkvi.kvp->vo))
-           continue;
-       for (ai = 0; ap[ai] != -1; ai++) {
-           if (Strcmp(Gwattrmap[ap[ai]].name,
-                      Tgetstring(tkvi.kvp->vo)) == 0) {
-               if (wattri >= wattrn) {
-                   wattrp = Marraygrow(wattrp,
-                                       (long) (wattrn +
-                                               WATTRINCR) * WATTRSIZE);
-                   wattrn += WATTRINCR;
-               }
-               if (ap[ai] == G_ATTRCOLOR) {
-                   for (color = 0; color < G_MAXCOLORS; color++) {
-                       if (wattri >= wattrn) {
-                           wattrp = Marraygrow(wattrp,
-                                               (long) (wattrn +
-                                                       WATTRINCR) *
-                                               WATTRSIZE);
-                           wattrn += WATTRINCR;
-                       }
-                       wattrp[wattri].u.c.index = color;
-                       wattrp[wattri++].id = ap[ai];
-                   }
-               } else
-                   wattrp[wattri++].id = ap[ai];
-               break;
-           }
-       }
+        return L_FAILURE;
+    for (Tgetfirst (argv[1].o, &tkvi); tkvi.kvp; Tgetnext (&tkvi)) {
+        if (!T_ISSTRING (tkvi.kvp->vo))
+            continue;
+        for (ai = 0; ap[ai] != -1; ai++) {
+            if (
+                strcmp (Gwattrmap[ap[ai]].name,
+                Tgetstring (tkvi.kvp->vo)) == 0
+            ) {
+                if (wattri >= wattrn) {
+                    wattrp = Marraygrow (
+                        wattrp, (long) (wattrn + WATTRINCR) * WATTRSIZE
+                    );
+                    wattrn += WATTRINCR;
+                }
+                if (ap[ai] == G_ATTRCOLOR) {
+                    for (color = 0; color < G_MAXCOLORS; color++) {
+                        if (wattri >= wattrn) {
+                            wattrp = Marraygrow (
+                                wattrp, (long) (wattrn + WATTRINCR) * WATTRSIZE
+                            );
+                            wattrn += WATTRINCR;
+                        }
+                        wattrp[wattri].u.c.index = color;
+                        wattrp[wattri++].id = ap[ai];
+                    }
+                } else
+                    wattrp[wattri++].id = ap[ai];
+                break;
+            }
+        }
     }
-    if (Ggetwidgetattr(wi, wattri, wattrp) == -1)
-       return L_FAILURE;
-    rtno = Ttable(wattri);
-    rtnm = Mpushmark(rtno);
+    if (Ggetwidgetattr (wi, wattri, wattrp) == -1)
+        return L_FAILURE;
+    rtno = Ttable (wattri);
+    rtnm = Mpushmark (rtno);
     for (wattri2 = 0; wattri2 < wattri; wattri2++) {
-       mapp = &Gwattrmap[wattrp[wattri2].id];
-       switch (mapp->type) {
-       case G_ATTRTYPEPOINT:
-           Tinss(rtno, mapp->name, (po = Ttable(2)));
-           Tinss(po, "x", Treal(wattrp[wattri2].u.p.x));
-           Tinss(po, "y", Treal(wattrp[wattri2].u.p.y));
-           break;
-       case G_ATTRTYPESIZE:
-           Tinss(rtno, mapp->name, (so = Ttable(2)));
-           Tinss(so, "x", Treal(wattrp[wattri2].u.s.x));
-           Tinss(so, "y", Treal(wattrp[wattri2].u.s.y));
-           break;
-       case G_ATTRTYPERECT:
-           Tinss(rtno, mapp->name, (ro = Ttable(2)));
-           Tinsi(ro, 0, (po = Ttable(2)));
-           Tinss(po, "x", Treal(wattrp[wattri2].u.r.o.x));
-           Tinss(po, "y", Treal(wattrp[wattri2].u.r.o.y));
-           Tinsi(ro, 1, (po = Ttable(2)));
-           Tinss(po, "x", Treal(wattrp[wattri2].u.r.c.x));
-           Tinss(po, "y", Treal(wattrp[wattri2].u.r.c.y));
-           break;
-       case G_ATTRTYPETEXT:
-           Tinss(rtno, mapp->name, Tstring(wattrp[wattri2].u.t));
-           break;
-       case G_ATTRTYPEINT:
-           Tinss(rtno, mapp->name, Tinteger(wattrp[wattri2].u.i));
-           break;
-       case G_ATTRTYPECOLOR:
-           Tinss(rtno, mapp->name, (co = Ttable(G_MAXCOLORS)));
-           for (color = 0; color < G_MAXCOLORS; color++) {
-               Tinsi(co, color, (co2 = Ttable(3)));
-               Tinss(co2, "r", Treal(wattrp[wattri2 + color].u.c.r));
-               Tinss(co2, "g", Treal(wattrp[wattri2 + color].u.c.g));
-               Tinss(co2, "b", Treal(wattrp[wattri2 + color].u.c.g));
-           }
-           wattri2 += (G_MAXCOLORS - 1);
-           break;
-       default:
-           break;
-       }
+        mapp = &Gwattrmap[wattrp[wattri2].id];
+        switch (mapp->type) {
+        case G_ATTRTYPEPOINT:
+            Tinss (rtno, mapp->name, (po = Ttable (2)));
+            Tinss (po, "x", Treal (wattrp[wattri2].u.p.x));
+            Tinss (po, "y", Treal (wattrp[wattri2].u.p.y));
+            break;
+        case G_ATTRTYPESIZE:
+            Tinss (rtno, mapp->name, (so = Ttable (2)));
+            Tinss (so, "x", Treal (wattrp[wattri2].u.s.x));
+            Tinss (so, "y", Treal (wattrp[wattri2].u.s.y));
+            break;
+        case G_ATTRTYPERECT:
+            Tinss (rtno, mapp->name, (ro = Ttable (2)));
+            Tinsi (ro, 0, (po = Ttable (2)));
+            Tinss (po, "x", Treal (wattrp[wattri2].u.r.o.x));
+            Tinss (po, "y", Treal (wattrp[wattri2].u.r.o.y));
+            Tinsi (ro, 1, (po = Ttable (2)));
+            Tinss (po, "x", Treal (wattrp[wattri2].u.r.c.x));
+            Tinss (po, "y", Treal (wattrp[wattri2].u.r.c.y));
+            break;
+        case G_ATTRTYPETEXT:
+            Tinss (rtno, mapp->name, Tstring (wattrp[wattri2].u.t));
+            break;
+        case G_ATTRTYPEINT:
+            Tinss (rtno, mapp->name, Tinteger (wattrp[wattri2].u.i));
+            break;
+        case G_ATTRTYPECOLOR:
+            Tinss (rtno, mapp->name, (co = Ttable (G_MAXCOLORS)));
+            for (color = 0; color < G_MAXCOLORS; color++) {
+                Tinsi (co, color, (co2 = Ttable (3)));
+                Tinss (co2, "r", Treal (wattrp[wattri2 + color].u.c.r));
+                Tinss (co2, "g", Treal (wattrp[wattri2 + color].u.c.g));
+                Tinss (co2, "b", Treal (wattrp[wattri2 + color].u.c.g));
+            }
+            wattri2 += (G_MAXCOLORS - 1);
+            break;
+        }
     }
-    Mpopmark(rtnm);
+    Mpopmark (rtnm);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXdestroywidget(int argc, lvar_t * argv)
-{
+int GFXdestroywidget (int argc, lvar_t *argv) {
     Tkvindex_t tkvi;
     Tobj wo, cho, pwio, pwo;
     lvar_t argv2[1];
     int wi;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi))
-       return L_FAILURE;
+    if (getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi))
+        return L_FAILURE;
 
-    wo = Tfindi(rootwo, wi);
-    if ((cho = Tfinds(wo, "children"))) {
-       while (Tgettablen(cho) > 0) {
-           Tgetfirst(cho, &tkvi);
-           argv2[0].o = tkvi.kvp->ko;
-           GFXdestroywidget(1, argv2);
-       }
+    wo = Tfindi (rootwo, wi);
+    if ((cho = Tfinds (wo, "children"))) {
+        while (Tgettablen (cho) > 0) {
+            Tgetfirst (cho, &tkvi);
+            argv2[0].o = tkvi.kvp->ko;
+            GFXdestroywidget (1, argv2);
+        }
     }
-    if ((pwio = Tfinds(wo, "parent"))) {
-       pwo = Tfindi(rootwo, Tgetinteger(pwio));
-       cho = Tfinds(pwo, "children");
-       Tdeli(cho, wi);
+    if ((pwio = Tfinds (wo, "parent"))) {
+        pwo = Tfindi (rootwo, Tgetinteger (pwio));
+        cho = Tfinds (pwo, "children");
+        Tdeli (cho, wi);
     }
-    if (ISACANVAS(wi) || ISALABEL(wi)) {
-       nodeterm(NODEID(wi));
-       gfxnodes[NODEID(wi)].inuse = FALSE;
+    if (ISACANVAS (wi) || ISALABEL (wi)) {
+        nodeterm (NODEID (wi));
+        gfxnodes[NODEID (wi)].inuse = FALSE;
     }
-    Gdestroywidget(wi);
-    Tdeli(rootwo, wi);
+    Gdestroywidget (wi);
+    Tdeli (rootwo, wi);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXclear(int argc, lvar_t * argv)
-{
+int GFXclear (int argc, lvar_t *argv) {
     int wi;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi))
-       return L_FAILURE;
-    Gcanvasclear(wi);
-    if (ISACANVAS(wi))
-       rectterm(NODEID(wi)), rectinit(NODEID(wi));
+    if (getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi))
+        return L_FAILURE;
+    Gcanvasclear (wi);
+    if (ISACANVAS (wi))
+        rectterm (NODEID (wi)), rectinit (NODEID (wi));
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXsetgfxattr(int argc, lvar_t * argv)
-{
+int GFXsetgfxattr (int argc, lvar_t *argv) {
     Ggattr_t gattr;
     int wi;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) ||
-       getgattr(argv[1].o, &gattr) == -1)
-       return L_FAILURE;
-    Gsetgfxattr(wi, &gattr);
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) ||
+        getgattr (argv[1].o, &gattr) == -1
+    )
+        return L_FAILURE;
+    Gsetgfxattr (wi, &gattr);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXgetgfxattr(int argc, lvar_t * argv)
-{
+int GFXgetgfxattr (int argc, lvar_t *argv) {
     Tkvindex_t tkvi;
     Ggattr_t gattr;
-    long rtnm = 0;
+    long rtnm;
     int wi;
-    char *s = 0;
-
-    gattr.flags = (Ggattrflags_t) 0;
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) ||
-       !T_ISTABLE(argv[1].o))
-       return L_FAILURE;
-    for (Tgetfirst(argv[1].o, &tkvi); tkvi.kvp; Tgetnext(&tkvi)) {
-       if (!T_ISSTRING(tkvi.kvp->vo))
-           continue;
-       s = Tgetstring(tkvi.kvp->vo);
-       if (Strcmp(s, "color") == 0)
-           gattr.flags |= G_GATTRCOLOR;
-       else if (Strcmp(s, "width") == 0)
-           gattr.flags |= G_GATTRWIDTH;
-       else if (Strcmp(s, "mode") == 0)
-           gattr.flags |= G_GATTRMODE;
-       else if (Strcmp(s, "fill") == 0)
-           gattr.flags |= G_GATTRFILL;
-       else if (Strcmp(s, "style") == 0)
-           gattr.flags |= G_GATTRSTYLE;
+    char *s;
+
+    gattr.flags = 0;
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) ||
+        !T_ISTABLE (argv[1].o)
+    )
+        return L_FAILURE;
+    for (Tgetfirst (argv[1].o, &tkvi); tkvi.kvp; Tgetnext (&tkvi)) {
+        if (!T_ISSTRING (tkvi.kvp->vo))
+            continue;
+        s = Tgetstring (tkvi.kvp->vo);
+        if (strcmp (s, "color") == 0)
+            gattr.flags |= G_GATTRCOLOR;
+        else if (strcmp (s, "width") == 0)
+            gattr.flags |= G_GATTRWIDTH;
+        else if (strcmp (s, "mode") == 0)
+            gattr.flags |= G_GATTRMODE;
+        else if (strcmp (s, "fill") == 0)
+            gattr.flags |= G_GATTRFILL;
+        else if (strcmp (s, "style") == 0)
+            gattr.flags |= G_GATTRSTYLE;
     }
-    if (Ggetgfxattr(wi, &gattr) == -1)
-       return L_FAILURE;
-    rtno = Ttable(wattri);
-    rtnm = Mpushmark(rtno);
+    if (Ggetgfxattr (wi, &gattr) == -1)
+        return L_FAILURE;
+    rtno = Ttable (wattri);
+    rtnm = Mpushmark (rtno);
     if (gattr.flags & G_GATTRCOLOR) {
-       Tinss(rtno, "color", Tinteger(gattr.color));
+        Tinss (rtno, "color", Tinteger (gattr.color));
     } else if (gattr.flags & G_GATTRWIDTH) {
-       Tinss(rtno, "width", Tinteger(gattr.width));
+        Tinss (rtno, "width", Tinteger (gattr.width));
     } else if (gattr.flags & G_GATTRMODE) {
-       s = (gattr.mode == G_SRC) ? "src" : "xor";
-       Tinss(rtno, "mode", Tstring(s));
+        s = (gattr.mode == G_SRC) ? "src" : "xor";
+        Tinss (rtno, "mode", Tstring (s));
     } else if (gattr.flags & G_GATTRFILL) {
-       s = (gattr.fill) ? "on" : "off";
-       Tinss(rtno, "fill", Tstring(s));
+        s = (gattr.fill) ? "on" : "off";
+        Tinss (rtno, "fill", Tstring (s));
     } else if (gattr.flags & G_GATTRSTYLE) {
-       switch (gattr.style) {
-       case G_SOLID:
-           s = "solid";
-           break;
-       case G_DASHED:
-           s = "dashed";
-           break;
-       case G_DOTTED:
-           s = "dotted";
-           break;
-       case G_LONGDASHED:
-           s = "longdashed";
-           break;
-       case G_SHORTDASHED:
-           s = "shortdashed";
-           break;
-       }
-       Tinss(rtno, "style", Tstring(s));
+        switch (gattr.style) {
+        case G_SOLID:       s = "solid";       break;
+        case G_DASHED:      s = "dashed";      break;
+        case G_DOTTED:      s = "dotted";      break;
+        case G_LONGDASHED:  s = "longdashed";  break;
+        case G_SHORTDASHED: s = "shortdashed"; break;
+        }
+        Tinss (rtno, "style", Tstring (s));
     }
-    Mpopmark(rtnm);
+    Mpopmark (rtnm);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXarrow(int argc, lvar_t * argv)
-{
+int GFXarrow (int argc, lvar_t *argv) {
     Ggattr_t gattr;
     Gpoint_t p0, p1;
     int wi;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) || !ISACANVAS2(wi)
-       || getxy(argv[2].o, &p0) == -1 || getxy(argv[3].o, &p1) == -1
-       || getgattr((argc == 5) ? argv[4].o : NULL, &gattr) == -1)
-       return L_FAILURE;
-    Garrow(wi, p0, p1, &gattr);
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) || !ISACANVAS2 (wi) ||
+        getxy (argv[2].o, &p0) == -1 || getxy (argv[3].o, &p1) == -1 ||
+        getgattr ((argc == 5) ? argv[4].o : NULL, &gattr) == -1
+    )
+        return L_FAILURE;
+    Garrow (wi, p0, p1, &gattr);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXline(int argc, lvar_t * argv)
-{
+int GFXline (int argc, lvar_t *argv) {
     Ggattr_t gattr;
     Gpoint_t p0, p1;
     int wi;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) || !ISACANVAS2(wi)
-       || getxy(argv[2].o, &p0) == -1 || getxy(argv[3].o, &p1) == -1
-       || getgattr((argc == 5) ? argv[4].o : NULL, &gattr) == -1)
-       return L_FAILURE;
-    Gline(wi, p0, p1, &gattr);
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) || !ISACANVAS2 (wi) ||
+        getxy (argv[2].o, &p0) == -1 || getxy (argv[3].o, &p1) == -1 ||
+        getgattr ((argc == 5) ? argv[4].o : NULL, &gattr) == -1
+    )
+        return L_FAILURE;
+    Gline (wi, p0, p1, &gattr);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXbox(int argc, lvar_t * argv)
-{
+int GFXbox (int argc, lvar_t *argv) {
     Ggattr_t gattr;
     Grect_t r;
     int wi, rtn;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) || !ISACANVAS2(wi)
-       || getrect(argv[2].o, &r) == -1
-       || getgattr((argc == 4) ? argv[3].o : NULL, &gattr) == -1)
-       return L_FAILURE;
-    rtn = Gbox(wi, r, &gattr);
-    if (rtn == 0 && argv[1].o != null && ISACANVAS(wi))
-       rectmerge(NODEID(wi), argv[1].o, r);
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) || !ISACANVAS2 (wi) ||
+        getrect (argv[2].o, &r) == -1 ||
+        getgattr ((argc == 4) ? argv[3].o : NULL, &gattr) == -1
+    )
+        return L_FAILURE;
+    rtn = Gbox (wi, r, &gattr);
+    if (rtn == 0 && argv[1].o != null && ISACANVAS (wi))
+        rectmerge (NODEID (wi), argv[1].o, r);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXpolygon(int argc, lvar_t * argv)
-{
+int GFXpolygon (int argc, lvar_t *argv) {
     Tobj po;
     Ggattr_t gattr;
     long i, pn;
     int wi;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) || !ISACANVAS2(wi)
-       || getgattr((argc == 4) ? argv[3].o : NULL, &gattr) == -1)
-       return L_FAILURE;
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) || !ISACANVAS2 (wi) ||
+        getgattr ((argc == 4) ? argv[3].o : NULL, &gattr) == -1
+    )
+        return L_FAILURE;
     po = argv[2].o;
-    if ((pn = Tgettablen(po)) > gpn) {
-       gpp = Marraygrow(gpp, (long) pn * GPSIZE);
-       gpn = pn;
+    if ((pn = Tgettablen (po)) > gpn) {
+        gpp = Marraygrow (gpp, (long) pn * GPSIZE);
+        gpn = pn;
     }
     for (i = 0; i < pn; i++)
-       if (getxy(Tfindi(po, i), &gpp[i]) == -1)
-           return L_FAILURE;
-    Gpolygon(wi, pn, gpp, &gattr);
+        if (getxy (Tfindi (po, i), &gpp[i]) == -1)
+            return L_FAILURE;
+    Gpolygon (wi, pn, gpp, &gattr);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXsplinegon(int argc, lvar_t * argv)
-{
+int GFXsplinegon (int argc, lvar_t *argv) {
     Tobj po;
     Ggattr_t gattr;
     long i, pn;
     int wi;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) || !ISACANVAS2(wi)
-       || getgattr((argc == 4) ? argv[3].o : NULL, &gattr) == -1)
-       return L_FAILURE;
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) || !ISACANVAS2 (wi) ||
+        getgattr ((argc == 4) ? argv[3].o : NULL, &gattr) == -1
+    )
+        return L_FAILURE;
     po = argv[2].o;
-    if ((pn = Tgettablen(po)) > gpn) {
-       gpp = Marraygrow(gpp, (long) pn * GPSIZE);
-       gpn = pn;
+    if ((pn = Tgettablen (po)) > gpn) {
+        gpp = Marraygrow (gpp, (long) pn * GPSIZE);
+        gpn = pn;
     }
     for (i = 0; i < pn; i++)
-       if (getxy(Tfindi(po, i), &gpp[i]) == -1)
-           return L_FAILURE;
-    Gsplinegon(wi, pn, gpp, &gattr);
+        if (getxy (Tfindi (po, i), &gpp[i]) == -1)
+            return L_FAILURE;
+    Gsplinegon (wi, pn, gpp, &gattr);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXarc(int argc, lvar_t * argv)
-{
+int GFXarc (int argc, lvar_t *argv) {
     Ggattr_t gattr;
     Grect_t r;
     Gpoint_t op;
     Gsize_t sp;
     int wi, rtn;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) || !ISACANVAS2(wi)
-       || getxy(argv[2].o, &op) == -1 || getxy(argv[3].o, &sp) == -1
-       || getgattr((argc == 5) ? argv[4].o : NULL, &gattr) == -1)
-       return L_FAILURE;
-    rtn = Garc(wi, op, sp, (double) 0, (double) 360, &gattr);
-    if (rtn == 0 && argv[1].o != null && ISACANVAS(wi)) {
-       r.o.x = op.x - sp.x, r.o.y = op.y - sp.y;
-       r.c.x = op.x + sp.x, r.c.y = op.y + sp.y;
-       rectmerge(NODEID(wi), argv[1].o, r);
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) || !ISACANVAS2 (wi) ||
+        getxy (argv[2].o, &op) == -1 || getxy (argv[3].o, &sp) == -1 ||
+        getgattr ((argc == 5) ? argv[4].o : NULL, &gattr) == -1
+    )
+        return L_FAILURE;
+    rtn = Garc (wi, op, sp, (double) 0, (double) 360, &gattr);
+    if (rtn == 0 && argv[1].o != null && ISACANVAS (wi)) {
+        r.o.x = op.x - sp.x, r.o.y = op.y - sp.y;
+        r.c.x = op.x + sp.x, r.c.y = op.y + sp.y;
+        rectmerge (NODEID (wi), argv[1].o, r);
     }
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXtext(int argc, lvar_t * argv)
-{
+int GFXtext (int argc, lvar_t *argv) {
     Ggattr_t gattr;
     Gpoint_t p;
     char *s, *fn, *justs;
     double fs;
     int wi;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) || !ISACANVAS2(wi)
-       || getxy(argv[2].o, &p) == -1 || getstr(argv[3].o, &s) == -1
-       || getstr(argv[4].o, &fn) == -1 || getdouble(argv[5].o, &fs) == -1
-       || getstr(argv[6].o, &justs) == -1
-       || getgattr((argc == 8) ? argv[7].o : NULL, &gattr) == -1)
-       return L_FAILURE;
-    Gtext(wi, s, p, fn, fs, justs, &gattr);
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) || !ISACANVAS2 (wi) ||
+        getxy (argv[2].o, &p) == -1 || getstr (argv[3].o, &s) == -1 ||
+        getstr (argv[4].o, &fn) == -1 || getdouble (argv[5].o, &fs) == -1 ||
+        getstr (argv[6].o, &justs) == -1 ||
+        getgattr ((argc == 8) ? argv[7].o : NULL, &gattr) == -1
+    )
+        return L_FAILURE;
+    Gtext (wi, s, p, fn, fs, justs, &gattr);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXtextsize(int argc, lvar_t * argv)
-{
+int GFXtextsize (int argc, lvar_t *argv) {
     Gsize_t sp;
     double fs;
     char *s, *fn;
     long m;
     int wi;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) || !ISACANVAS(wi) ||
-       getstr(argv[1].o, &s) == -1 || getstr(argv[2].o, &fn) == -1 ||
-       getdouble(argv[3].o, &fs) == -1)
-       return L_FAILURE;
-    if (Ggettextsize(wi, s, fn, fs, &sp) == -1)
-       return L_FAILURE;
-    m = Mpushmark((rtno = Ttable(2)));
-    Tinss(rtno, "x", Treal(sp.x)), Tinss(rtno, "y", Treal(sp.y));
-    Mpopmark(m);
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) || !ISACANVAS (wi) ||
+        getstr (argv[1].o, &s) == -1 || getstr (argv[2].o, &fn) == -1 ||
+        getdouble (argv[3].o, &fs) == -1
+    )
+        return L_FAILURE;
+    if (Ggettextsize (wi, s, fn, fs, &sp) == -1)
+        return L_FAILURE;
+    m = Mpushmark ((rtno = Ttable (2)));
+    Tinss (rtno, "x", Treal (sp.x)), Tinss (rtno, "y", Treal (sp.y));
+    Mpopmark (m);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXcreatebitmap(int argc, lvar_t * argv)
-{
+int GFXcreatebitmap (int argc, lvar_t *argv) {
     Tobj bo, so;
     Gsize_t s;
     long rtnm;
     int wi, bi;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) || !ISACANVAS2(wi)
-       || getxy(argv[1].o, &s) == -1)
-       return L_FAILURE;
-    if ((bi = Gcreatebitmap(wi, s)) == -1)
-       return L_FAILURE;
-    Tinsi(rootbo, bi, (bo = Ttable(4)));
-    rtno = Tinteger(bi);
-    rtnm = Mpushmark(rtno);
-    Tinss(bo, "canvas", Tinteger(bi));
-    Tinss(bo, "size", (so = Ttable(2)));
-    Tinss(so, "x", Tinteger((long) Gbitmaps[bi].size.x));
-    Tinss(so, "y", Tinteger((long) Gbitmaps[bi].size.y));
-    Mpopmark(rtnm);
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) || !ISACANVAS2 (wi) ||
+        getxy (argv[1].o, &s) == -1
+    )
+        return L_FAILURE;
+    if ((bi = Gcreatebitmap (wi, s)) == -1)
+        return L_FAILURE;
+    Tinsi (rootbo, bi, (bo = Ttable (4)));
+    rtno = Tinteger (bi);
+    rtnm = Mpushmark (rtno);
+    Tinss (bo, "canvas", Tinteger (bi));
+    Tinss (bo, "size", (so = Ttable (2)));
+    Tinss (so, "x", Tinteger ((long) Gbitmaps[bi].size.x));
+    Tinss (so, "y", Tinteger ((long) Gbitmaps[bi].size.y));
+    Mpopmark (rtnm);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXdestroybitmap(int argc, lvar_t * argv)
-{
+int GFXdestroybitmap (int argc, lvar_t *argv) {
     int bi;
 
-    if (getint(argv[0].o, &bi) == -1 || !ISABITMAP(bi))
-       return L_FAILURE;
-    Gdestroybitmap(bi);
-    Tdeli(rootbo, bi);
+    if (getint (argv[0].o, &bi) == -1 || !ISABITMAP (bi))
+        return L_FAILURE;
+    Gdestroybitmap (bi);
+    Tdeli (rootbo, bi);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXreadbitmap(int argc, lvar_t * argv)
-{
+int GFXreadbitmap (int argc, lvar_t *argv) {
     Tobj bo, so;
     long rtnm;
     int wi, bi, ioi;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) || !ISACANVAS2(wi)
-       || getint(argv[1].o, &ioi) == -1 || ioi < 0 || ioi > ion
-       || !iop[ioi].inuse)
-       return L_FAILURE;
-    if ((bi = Greadbitmap(wi, iop[ioi].ifp)) == -1)
-       return L_FAILURE;
-    Tinsi(rootbo, bi, (bo = Ttable(4)));
-    rtno = Tinteger(bi);
-    rtnm = Mpushmark(rtno);
-    Tinss(bo, "canvas", Tinteger(bi));
-    Tinss(bo, "size", (so = Ttable(2)));
-    Tinss(so, "x", Tinteger((long) Gbitmaps[bi].size.x));
-    Tinss(so, "y", Tinteger((long) Gbitmaps[bi].size.y));
-    Mpopmark(rtnm);
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) || !ISACANVAS2 (wi) ||
+        getint (argv[1].o, &ioi) == -1 || ioi < 0 || ioi > ion ||
+        !iop[ioi].inuse
+    )
+        return L_FAILURE;
+    if ((bi = Greadbitmap (wi, iop[ioi].ifp)) == -1)
+        return L_FAILURE;
+    Tinsi (rootbo, bi, (bo = Ttable (4)));
+    rtno = Tinteger (bi);
+    rtnm = Mpushmark (rtno);
+    Tinss (bo, "canvas", Tinteger (bi));
+    Tinss (bo, "size", (so = Ttable (2)));
+    Tinss (so, "x", Tinteger ((long) Gbitmaps[bi].size.x));
+    Tinss (so, "y", Tinteger ((long) Gbitmaps[bi].size.y));
+    Mpopmark (rtnm);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXwritebitmap(int argc, lvar_t * argv)
-{
+int GFXwritebitmap (int argc, lvar_t *argv) {
     int bi, ioi;
 
-    if (getint(argv[0].o, &ioi) == -1 || ioi < 0 || ioi > ion ||
-       !iop[ioi].inuse || getint(argv[1].o, &bi) == -1 || !ISABITMAP(bi))
-       return L_FAILURE;
-    Gwritebitmap(iop[ioi].ofp, bi);
+    if (
+        getint (argv[0].o, &ioi) == -1 || ioi < 0 || ioi > ion ||
+        !iop[ioi].inuse || getint (argv[1].o, &bi) == -1 || !ISABITMAP (bi)
+    )
+        return L_FAILURE;
+    Gwritebitmap (iop[ioi].ofp, bi);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXbitblt(int argc, lvar_t * argv)
-{
+int GFXbitblt (int argc, lvar_t *argv) {
     Ggattr_t gattr;
     Grect_t r;
     Gpoint_t p;
     char *mode;
     int wi, bi, rtn;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) || !ISACANVAS2(wi)
-       || getxy(argv[2].o, &p) == -1 || getrect(argv[3].o, &r) == -1
-       || getint(argv[4].o, &bi) == -1 || getstr(argv[5].o, &mode) == -1
-       || getgattr((argc == 7) ? argv[6].o : NULL, &gattr) == -1)
-       return L_FAILURE;
-    rtn = Gbitblt(wi, p, r, bi, mode, &gattr);
-    if (rtn == 0 && argv[1].o != null && ISACANVAS(wi) &&
-       strcmp(mode, "b2c") == 0)
-       rectmerge(NODEID(wi), argv[1].o, r);
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) || !ISACANVAS2 (wi) ||
+        getxy (argv[2].o, &p) == -1 || getrect (argv[3].o, &r) == -1 ||
+        getint (argv[4].o, &bi) == -1 || getstr (argv[5].o, &mode) == -1 ||
+        getgattr ((argc == 7) ? argv[6].o : NULL, &gattr) == -1
+    )
+        return L_FAILURE;
+    rtn = Gbitblt (wi, p, r, bi, mode, &gattr);
+    if (
+        rtn == 0 && argv[1].o != null && ISACANVAS (wi) &&
+        strcmp (mode, "b2c") == 0
+    )
+        rectmerge (NODEID (wi), argv[1].o, r);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXclearpick(int argc, lvar_t * argv)
-{
+int GFXclearpick (int argc, lvar_t *argv) {
     int wi;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) || !ISACANVAS(wi))
-       return L_FAILURE;
+    if (getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) || !ISACANVAS (wi))
+        return L_FAILURE;
     if (argv[1].o != null)
-       rectdelete(NODEID(wi), argv[1].o);
+        rectdelete (NODEID (wi), argv[1].o);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXsetpick(int argc, lvar_t * argv)
-{
+int GFXsetpick (int argc, lvar_t *argv) {
     Grect_t r;
     int wi;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) || !ISACANVAS(wi) ||
-       getrect(argv[2].o, &r) == -1)
-       return L_FAILURE;
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) || !ISACANVAS (wi) ||
+        getrect (argv[2].o, &r) == -1
+    )
+        return L_FAILURE;
     if (argv[1].o != null)
-       rectinsert(NODEID(wi), argv[1].o, r);
+        rectinsert (NODEID (wi), argv[1].o, r);
     return L_SUCCESS;
 }
 
 /* LEFTY builtin */
-int GFXdisplaymenu(int argc, lvar_t * argv)
-{
+int GFXdisplaymenu (int argc, lvar_t *argv) {
     Tobj mo, meo;
     char buf[50];
     char *entries[1];
     int wi, mi, mei;
     int rtn;
 
-    if (getint(argv[0].o, &wi) == -1 || !ISAWIDGET(wi) ||
-       !(ISACANVAS(wi) || ISALABEL(wi)))
-       return L_FAILURE;
+    if (
+        getint (argv[0].o, &wi) == -1 || !ISAWIDGET (wi) ||
+        !(ISACANVAS (wi) || ISALABEL (wi))
+    )
+        return L_FAILURE;
     mo = argv[1].o;
-    if ((mi = menufind(NODEID(wi), mo, Tgettime(mo))) != -1) {
-       if ((rtn = Gmenudisplay(wi, mi)) == -1)
-           rtno = NULL;
-       else
-           rtno = Tinteger(rtn);
-       return L_SUCCESS;
+    if ((mi = menufind (NODEID (wi), mo, Tgettime (mo))) != -1) {
+        if ((rtn = Gmenudisplay (wi, mi)) == -1)
+            rtno = NULL;
+        else
+            rtno = Tinteger (rtn);
+        return L_SUCCESS;
     }
     wattri = 0;
-    mi = Gcreatewidget(wi, G_MENUWIDGET, wattri, wattrp);
+    mi = Gcreatewidget (wi, G_MENUWIDGET, wattri, wattrp);
     mei = 0;
-    while ((meo = Tfindi(mo, mei))) {
-       switch (Tgettype(meo)) {
-       case T_STRING:
-           entries[0] = Tgetstring(meo);
-           break;
-       case T_INTEGER:
-           sprintf(buf, "%d", (int) Tgetnumber(meo));
-           entries[0] = &buf[0];
-           break;
-       case T_REAL:
-           sprintf(buf, "%f", Tgetnumber(meo));
-           entries[0] = &buf[0];
-           break;
-       case T_CODE:
-       case T_TABLE:
-       case T_SIZE:
-           break;
-       }
-       Gmenuaddentries(mi, 1, &entries[0]);
-       mei++;
+    while ((meo = Tfindi (mo, mei))) {
+        switch (Tgettype (meo)) {
+        case T_STRING:
+            entries[0] = Tgetstring (meo);
+            break;
+        case T_INTEGER:
+            sprintf (buf, "%d", (int) Tgetnumber (meo));
+            entries[0] = &buf[0];
+            break;
+        case T_REAL:
+            sprintf (buf, "%f", Tgetnumber (meo));
+            entries[0] = &buf[0];
+            break;
+        }
+        Gmenuaddentries (mi, 1, &entries[0]);
+        mei++;
     }
-    menuinsert(NODEID(wi), mo, Tgettime(mo), mi);
+    menuinsert (NODEID (wi), mo, Tgettime (mo), mi);
     Ttime++;
-    if ((rtn = Gmenudisplay(wi, mi)) == -1)
-       rtno = NULL;
+    if ((rtn = Gmenudisplay (wi, mi)) == -1)
+        rtno = NULL;
     else
-       rtno = Tinteger(rtn);
+        rtno = Tinteger (rtn);
     return L_SUCCESS;
 }
 
-static int getwattr(Tobj ao, int *type)
-{
+/* LEFTY builtin */
+int GFXcolormap (int argc, lvar_t *argv) {
+    char *cs;
+    int cni;
+    long rtnm;
+
+    if (getstr (argv[0].o, &cs) == -1)
+        return L_FAILURE;
+    rtno = NULL;
+    for (cni = 0; cni < sizeof (colornames) / sizeof (colorname_t); cni++) {
+        if (strcmp (colornames[cni].name, cs) != 0)
+            continue;
+        rtno = Ttable (4);
+        rtnm = Mpushmark (rtno);
+        Tinss (rtno, "r", Tinteger (colornames[cni].r));
+        Tinss (rtno, "g", Tinteger (colornames[cni].g));
+        Tinss (rtno, "b", Tinteger (colornames[cni].b));
+        Mpopmark (rtnm);
+        break;
+    }
+    return L_SUCCESS;
+}
+
+static int getwattr (Tobj ao, int *type) {
     Tkvindex_t tkvi;
     Tobj co;
     int *ap;
@@ -1199,388 +1241,299 @@ static int getwattr(Tobj ao, int *type)
     int li, ai;
 
     wattri = 0;
-    if (!ao && Tgettype(ao) != T_TABLE)
-       return -1;
+    if (!ao && Tgettype (ao) != T_TABLE)
+        return -1;
     if (*type == -1) {
-       if (getstr(Tfinds(ao, "type"), &ts) == -1)
-           return -1;
-       for (ap = NULL, li = 0; Gwlist[li].wname; li++) {
-           if (Strcmp(ts, Gwlist[li].wname) == 0) {
-               *type = Gwlist[li].wid;
-               ap = Gwlist[li].attrid;
-               break;
-           }
-       }
-       if (*type == -1)
-           return -1;
-       if (wattri >= wattrn) {
-           wattrp = Marraygrow(wattrp,
-                               (long) (wattrn + WATTRINCR) * WATTRSIZE);
-           wattrn += WATTRINCR;
-       }
-       switch (*type) {
-       case G_TEXTWIDGET:
-           wattrp[wattri].id = G_ATTRNEWLINECB;
-           wattrp[wattri].u.func = (void *) (GFXtextcb), wattri++;
-           break;
-       case G_ARRAYWIDGET:
-           wattrp[wattri].id = G_ATTRRESIZECB;
-           wattrp[wattri].u.func = (void *) (GFXarrayresizecb), wattri++;
-           break;
-       case G_BUTTONWIDGET:
-           wattrp[wattri].id = G_ATTRBUTTONCB;
-           wattrp[wattri].u.func = (void *) (GFXbuttoncb), wattri++;
-           break;
-       case G_LABELWIDGET:
-           wattrp[wattri].id = G_ATTREVENTCB;
-           wattrp[wattri].u.func = (void *) (GFXlabelcb), wattri++;
-           break;
-       case G_CANVASWIDGET:
-           wattrp[wattri].id = G_ATTREVENTCB;
-           wattrp[wattri].u.func = (void *) (GFXevent), wattri++;
-           break;
-       case G_VIEWWIDGET:
-           wattrp[wattri].id = G_ATTREVENTCB;
-           wattrp[wattri].u.func = (void *) (GFXviewcb), wattri++;
-           break;
-       }
+        if (getstr (Tfinds (ao, "type"), &ts) == -1)
+            return -1;
+        for (ap = NULL, li = 0; Gwlist[li].wname; li++) {
+            if (strcmp (ts, Gwlist[li].wname) == 0) {
+                *type = Gwlist[li].wid;
+                ap = Gwlist[li].attrid;
+                break;
+            }
+        }
+        if (*type == -1)
+            return -1;
+        if (wattri >= wattrn) {
+            wattrp = Marraygrow (
+                wattrp, (long) (wattrn + WATTRINCR) * WATTRSIZE
+            );
+            wattrn += WATTRINCR;
+        }
+        switch (*type) {
+        case G_TEXTWIDGET:
+            wattrp[wattri].id = G_ATTRNEWLINECB;
+            wattrp[wattri].u.func = GFXtextcb, wattri++;
+            break;
+        case G_ARRAYWIDGET:
+            wattrp[wattri].id = G_ATTRRESIZECB;
+            wattrp[wattri].u.func = GFXarrayresizecb, wattri++;
+            break;
+        case G_BUTTONWIDGET:
+            wattrp[wattri].id = G_ATTRBUTTONCB;
+            wattrp[wattri].u.func = GFXbuttoncb, wattri++;
+            break;
+        case G_LABELWIDGET:
+            wattrp[wattri].id = G_ATTREVENTCB;
+            wattrp[wattri].u.func = GFXlabelcb, wattri++;
+            break;
+        case G_CANVASWIDGET:
+            wattrp[wattri].id = G_ATTREVENTCB;
+            wattrp[wattri].u.func = GFXevent, wattri++;
+            break;
+        case G_VIEWWIDGET:
+            wattrp[wattri].id = G_ATTREVENTCB;
+            wattrp[wattri].u.func = GFXviewcb, wattri++;
+            break;
+        }
     } else {
-       for (ap = NULL, li = 0; Gwlist[li].wname; li++) {
-           if (*type == Gwlist[li].wid) {
-               ap = Gwlist[li].attrid;
-               break;
-           }
-       }
+        for (ap = NULL, li = 0; Gwlist[li].wname; li++) {
+            if (*type == Gwlist[li].wid) {
+                ap = Gwlist[li].attrid;
+                break;
+            }
+        }
     }
     for (ai = 0; ap[ai] != -1; ai++) {
-       if (wattri >= wattrn) {
-           wattrp = Marraygrow(wattrp,
-                               (long) (wattrn + WATTRINCR) * WATTRSIZE);
-           wattrn += WATTRINCR;
-       }
-       wattrp[wattri].id = ap[ai];
-       switch (Gwattrmap[ap[ai]].type) {
-       case G_ATTRTYPEPOINT:
-           getwpointnset(Tfinds(ao, Gwattrmap[ap[ai]].name));
-           break;
-       case G_ATTRTYPESIZE:
-           getwsizenset(Tfinds(ao, Gwattrmap[ap[ai]].name));
-           break;
-       case G_ATTRTYPERECT:
-           getwrectnset(Tfinds(ao, Gwattrmap[ap[ai]].name));
-           break;
-       case G_ATTRTYPETEXT:
-           getwstrnset(Tfinds(ao, Gwattrmap[ap[ai]].name));
-           break;
-       case G_ATTRTYPEINT:
-           getwintnset(Tfinds(ao, Gwattrmap[ap[ai]].name));
-           break;
-       case G_ATTRTYPECOLOR:
-           if ((co = Tfinds(ao, Gwattrmap[ap[ai]].name)) &&
-               Tgettype(co) == T_TABLE) {
-               for (Tgetfirst(co, &tkvi); tkvi.kvp; Tgetnext(&tkvi)) {
-                   if (wattri >= wattrn) {
-                       wattrp =
-                           Marraygrow(wattrp,
-                                      (long) (wattrn +
-                                              WATTRINCR) * WATTRSIZE);
-                       wattrn += WATTRINCR;
-                   }
-                   wattrp[wattri].id = ap[ai];
-                   getwcolornset(tkvi.kvp->ko, tkvi.kvp->vo);
-               }
-           }
-           break;
-       default:
-           break;
-       }
+        if (wattri >= wattrn) {
+            wattrp = Marraygrow (
+                wattrp, (long) (wattrn + WATTRINCR) * WATTRSIZE
+            );
+            wattrn += WATTRINCR;
+        }
+        wattrp[wattri].id = ap[ai];
+        switch (Gwattrmap[ap[ai]].type) {
+        case G_ATTRTYPEPOINT:
+            getwpointnset (Tfinds (ao, Gwattrmap[ap[ai]].name));
+            break;
+        case G_ATTRTYPESIZE:
+            getwsizenset (Tfinds (ao, Gwattrmap[ap[ai]].name));
+            break;
+        case G_ATTRTYPERECT:
+            getwrectnset (Tfinds (ao, Gwattrmap[ap[ai]].name));
+            break;
+        case G_ATTRTYPETEXT:
+            getwstrnset (Tfinds (ao, Gwattrmap[ap[ai]].name));
+            break;
+        case G_ATTRTYPEINT:
+            getwintnset (Tfinds (ao, Gwattrmap[ap[ai]].name));
+            break;
+        case G_ATTRTYPECOLOR:
+            if ((co = Tfinds (
+                ao, Gwattrmap[ap[ai]].name
+            )) && Tgettype (co) == T_TABLE) {
+                for (Tgetfirst (co, &tkvi); tkvi.kvp; Tgetnext (&tkvi)) {
+                    if (wattri >= wattrn) {
+                        wattrp = Marraygrow (
+                            wattrp, (long) (wattrn + WATTRINCR) * WATTRSIZE
+                        );
+                        wattrn += WATTRINCR;
+                    }
+                    wattrp[wattri].id = ap[ai];
+                    getwcolornset (tkvi.kvp->ko, tkvi.kvp->vo);
+                }
+            }
+            break;
+        }
     }
     return wattri;
 }
 
-static int getgattr(Tobj ao, Ggattr_t * dp)
-{
+static int getgattr (Tobj ao, Ggattr_t *dp) {
     Tkvindex_t tkvi;
     char *s, *s2;
 
-    dp->flags = (Ggattrflags_t) 0;
+    dp->flags = 0;
     if (!ao)
-       return 0;
-    if (Tgettype(ao) != T_TABLE)
-       return -1;
-    for (Tgetfirst(ao, &tkvi); tkvi.kvp; Tgetnext(&tkvi)) {
-       if (Tgettype(tkvi.kvp->ko) != T_STRING)
-           continue;
-       s = Tgetstring(tkvi.kvp->ko);
-       if (Strcmp(s, "color") == 0) {
-           getaintnset(tkvi.kvp->vo, dp->color, G_GATTRCOLOR);
-       } else if (Strcmp(s, "width") == 0) {
-           getaintnset(tkvi.kvp->vo, dp->width, G_GATTRWIDTH);
-       } else if (Strcmp(s, "mode") == 0) {
-           getastrnset(tkvi.kvp->vo, s2, G_GATTRMODE);
-           if (dp->flags & G_GATTRMODE) {
-               if (Strcmp(s2, "src") == 0)
-                   dp->mode = G_SRC;
-               else if (Strcmp(s2, "xor") == 0)
-                   dp->mode = G_XOR;
-               else
-                   dp->flags &= ~G_GATTRMODE;
-           }
-       } else if (Strcmp(s, "fill") == 0) {
-           getastrnset(tkvi.kvp->vo, s2, G_GATTRFILL);
-           if (dp->flags & G_GATTRFILL) {
-               if (Strcmp(s2, "on") == 0)
-                   dp->fill = 1;
-               else if (Strcmp(s2, "off") == 0)
-                   dp->fill = 0;
-               else
-                   dp->flags &= ~G_GATTRFILL;
-           }
-       } else if (Strcmp(s, "style") == 0) {
-           getastrnset(tkvi.kvp->vo, s2, G_GATTRSTYLE);
-           if (dp->flags & G_GATTRSTYLE) {
-               if (Strcmp(s2, "solid") == 0)
-                   dp->style = G_SOLID;
-               else if (Strcmp(s2, "dashed") == 0)
-                   dp->style = G_DASHED;
-               else if (Strcmp(s2, "dotted") == 0)
-                   dp->style = G_DOTTED;
-               else if (Strcmp(s2, "longdashed") == 0)
-                   dp->style = G_LONGDASHED;
-               else if (Strcmp(s2, "shortdashed") == 0)
-                   dp->style = G_SHORTDASHED;
-               else
-                   dp->flags &= ~G_GATTRSTYLE;
-           }
-       }
+        return 0;
+    if (Tgettype (ao) != T_TABLE)
+        return -1;
+    for (Tgetfirst (ao, &tkvi); tkvi.kvp; Tgetnext (&tkvi)) {
+        if (Tgettype (tkvi.kvp->ko) != T_STRING)
+            continue;
+        s = Tgetstring (tkvi.kvp->ko);
+        if (strcmp (s, "color") == 0) {
+            getaintnset (tkvi.kvp->vo, dp->color, G_GATTRCOLOR);
+        } else if (strcmp (s, "width") == 0) {
+            getaintnset (tkvi.kvp->vo, dp->width, G_GATTRWIDTH);
+        } else if (strcmp (s, "mode") == 0) {
+            getastrnset (tkvi.kvp->vo, s2, G_GATTRMODE);
+            if (dp->flags & G_GATTRMODE) {
+                if (strcmp (s2, "src") == 0)
+                    dp->mode = G_SRC;
+                else if (strcmp (s2, "xor") == 0)
+                    dp->mode = G_XOR;
+                else
+                    dp->flags &= ~G_GATTRMODE;
+            }
+        } else if (strcmp (s, "fill") == 0) {
+            getastrnset (tkvi.kvp->vo, s2, G_GATTRFILL);
+            if (dp->flags & G_GATTRFILL) {
+                if (strcmp (s2, "on") == 0)
+                    dp->fill = 1;
+                else if (strcmp (s2, "off") == 0)
+                    dp->fill = 0;
+                else
+                    dp->flags &= ~G_GATTRFILL;
+            }
+        } else if (strcmp (s, "style") == 0) {
+            getastrnset (tkvi.kvp->vo, s2, G_GATTRSTYLE);
+            if (dp->flags & G_GATTRSTYLE) {
+                if (strcmp (s2, "solid") == 0)
+                    dp->style = G_SOLID;
+                else if (strcmp (s2, "dashed") == 0)
+                    dp->style = G_DASHED;
+                else if (strcmp (s2, "dotted") == 0)
+                    dp->style = G_DOTTED;
+                else if (strcmp (s2, "longdashed") == 0)
+                    dp->style = G_LONGDASHED;
+                else if (strcmp (s2, "shortdashed") == 0)
+                    dp->style = G_SHORTDASHED;
+                else
+                    dp->flags &= ~G_GATTRSTYLE;
+            }
+        }
     }
     return 0;
 }
 
-static int getrect(Tobj ro, Grect_t * rp)
-{
-    if (ro && Tgettype(ro) == T_TABLE)
-       if (getxy(Tfindi(ro, 0), &rp->o) != -1 &&
-           getxy(Tfindi(ro, 1), &rp->c) != -1)
-           return 0;
+static int getrect (Tobj ro, Grect_t *rp) {
+    if (ro && Tgettype (ro) == T_TABLE)
+        if (
+            getxy (Tfindi (ro, 0), &rp->o) != -1 &&
+            getxy (Tfindi (ro, 1), &rp->c) != -1
+        )
+            return 0;
     return -1;
 }
 
-static int getxy(Tobj po, Gxy_t * xyp)
-{
+static int getxy (Tobj po, Gxy_t *xyp) {
     Tobj xo, yo;
 
-    if (po && Tgettype(po) == T_TABLE) {
-       xo = Tfinds(po, "x"), yo = Tfinds(po, "y");
-       if (xo && T_ISNUMBER(xo) && yo && T_ISNUMBER(yo)) {
-           xyp->x = Tgetnumber(xo), xyp->y = Tgetnumber(yo);
-           return 0;
-       }
+    if (po && Tgettype (po) == T_TABLE) {
+        xo = Tfinds (po, "x"), yo = Tfinds (po, "y");
+        if (xo && T_ISNUMBER (xo) && yo && T_ISNUMBER (yo)) {
+            xyp->x = Tgetnumber (xo), xyp->y = Tgetnumber (yo);
+            return 0;
+        }
     }
     return -1;
 }
 
-static int getint(Tobj to, int *ip)
-{
-    if (to && T_ISNUMBER(to)) {
-       *ip = Tgetnumber(to);
-       return 0;
+static int getint (Tobj to, int *ip) {
+    if (to && T_ISNUMBER (to)) {
+        *ip = Tgetnumber (to);
+        return 0;
     }
     return -1;
 }
 
-static int getdouble(Tobj to, double *dp)
-{
-    if (to && T_ISNUMBER(to)) {
-       *dp = Tgetnumber(to);
-       return 0;
+static int getdouble (Tobj to, double *dp) {
+    if (to && T_ISNUMBER (to)) {
+        *dp = Tgetnumber (to);
+        return 0;
     }
     return -1;
 }
 
-static int getstr(Tobj so, char **s)
-{
-    if (so && T_ISSTRING(so)) {
-       *s = Tgetstring(so);
-       return 0;
+static int getstr (Tobj so, char **s) {
+    if (so && T_ISSTRING (so)) {
+        *s = Tgetstring (so);
+        return 0;
     }
     return -1;
 }
 
-/* scan a string for 3 floating point numbers separated by
- * white-space or commas.
- */
-static int scanhsv(char *strp, double *h, double *s, double *v)
-{
-    char *endp;
-
-    *h = strtod(strp, &endp);
-    if (endp == strp)
-       return 0;
-    strp = endp;
-    while ((*strp == ',') || isspace(*strp))
-       strp++;
-    *s = strtod(strp, &endp);
-    if (endp == strp)
-       return 0;
-    strp = endp;
-    while ((*strp == ',') || isspace(*strp))
-       strp++;
-    *v = strtod(strp, &endp);
-    if (endp == strp)
-       return 0;
-    return 1;
-}
-
-static void hsv2rgb(double h, double s, double v, Gcolor_t * cp)
-{
-    double r, g, b;
-    double f, p, q, t;
-    int i;
-
-    /* clip to reasonable values */
-    h = max(min(h, 1.0), 0.0);
-    s = max(min(s, 1.0), 0.0);
-    v = max(min(v, 1.0), 0.0);
-
-    r = g = b = v;
-    if (s != 0.0) {
-       if (h == 1.0)
-           h = 0.0;
-       h = h * 6.0;
-       i = (int) h;
-       f = h - (double) i;
-       p = v * (1 - s);
-       q = v * (1 - (s * f));
-       t = v * (1 - (s * (1 - f)));
-       switch (i) {
-       case 0:
-           r = v;
-           g = t;
-           b = p;
-           break;
-       case 1:
-           r = q;
-           g = v;
-           b = p;
-           break;
-       case 2:
-           r = p;
-           g = v;
-           b = t;
-           break;
-       case 3:
-           r = p;
-           g = q;
-           b = v;
-           break;
-       case 4:
-           r = t;
-           g = p;
-           b = v;
-           break;
-       case 5:
-           r = v;
-           g = p;
-           b = q;
-           break;
-       }
-    }
-    cp->r = (int) (255.0 * r);
-    cp->g = (int) (255.0 * g);
-    cp->b = (int) (255.0 * b);
-}
-
-static int getcolor(Tobj ko, Tobj co, Gcolor_t * cp)
-{
+static int getcolor (Tobj ko, Tobj co, Gcolor_t *cp) {
     Tobj ro, go, bo, ho, so, vo;
     char *s, *s1, *s2;
-    double hc, sc, vc;
+    float hc, sc, vc;
     int cni;
+    int r, g, b, a;
 
-    if (ko && T_ISNUMBER(ko))
-       cp->index = Tgetnumber(ko);
+    if (ko && T_ISNUMBER (ko))
+        cp->index = Tgetnumber (ko);
     else
-       return -1;
-    if (!co || !(T_ISSTRING(co) || T_ISTABLE(co)))
-       return -1;
-    if (T_ISSTRING(co)) {
-       unsigned int r, g, b, a;
-
-       s = Tgetstring(co);
-       while (*s == ' ')
-           s++;                /* skip over any leading spaces */
-       if ((*s == '#')
-           && (sscanf(s, "#%2x%2x%2x%2x", &r, &g, &b, &a) >= 3)) {
-           cp->r = r;
-           cp->g = g;
-           cp->b = b;
-           return 0;
-       }
-       if ((isdigit(*s) || (*s == '.')) && scanhsv(s, &hc, &sc, &vc)) {
-           hsv2rgb(hc, sc, vc, cp);
-           return 0;
-       }
-       for (cni = 0; cni < sizeof(colornames) / sizeof(colorname_t);
-            cni++) {
-           for (s1 = colornames[cni].name, s2 = s; *s1 && *s2; s1++, s2++) {
-               if (*s2 == ' ' || *s2 == '_')
-                   s2++;
-               else if (*s1 != *s2)
-                   break;
-           }
-           if (*s1 != *s2)
-               continue;
-           cp->r = colornames[cni].r;
-           cp->g = colornames[cni].g;
-           cp->b = colornames[cni].b;
-           return 0;
-       }
-       return -1;
+        return -1;
+    if (!co || !(T_ISSTRING (co) || T_ISTABLE (co)))
+        return -1;
+    if (T_ISSTRING (co)) {
+        s = Tgetstring (co);
+        while (*s == ' ')
+            s++; /* skip over any leading spaces */
+        if (*s == '#' && sscanf (s, "#%2x%2x%2x%2x", &r, &g, &b, &a) >= 3) {
+            cp->r = r;
+            cp->g = g;
+            cp->b = b;
+            return 0;
+        }
+        if ((isdigit (*s) || *s == '.') && scanhsv (s, &hc, &sc, &vc)) {
+            hsv2rgb (hc, sc, vc, cp);
+            return 0;
+        }
+        for (cni = 0; cni < sizeof (colornames) / sizeof (colorname_t); cni++) {
+            for (s1 = colornames[cni].name, s2 = s; *s1 && *s2; s1++, s2++) {
+                if (*s2 == ' ' || *s2 == '_')
+                    s2++;
+                else if (*s1 != *s2)
+                    break;
+            }
+            if (*s1 != *s2)
+                continue;
+            cp->r = colornames[cni].r;
+            cp->g = colornames[cni].g;
+            cp->b = colornames[cni].b;
+            return 0;
+        }
+        return -1;
     } else {
-       ro = Tfinds(co, "r");
-       go = Tfinds(co, "g");
-       bo = Tfinds(co, "b");
-       if (ro && T_ISNUMBER(ro) && go && T_ISNUMBER(go) &&
-           bo && T_ISNUMBER(bo)) {
-           cp->r = Tgetnumber(ro);
-           cp->g = Tgetnumber(go);
-           cp->b = Tgetnumber(bo);
-           return 0;
-       } else {
-           ho = Tfinds(co, "h");
-           so = Tfinds(co, "s");
-           vo = Tfinds(co, "v");
-           if (ho && T_ISNUMBER(ho) && so && T_ISNUMBER(so) &&
-               vo && T_ISNUMBER(vo)) {
-               hc = Tgetnumber(ho);
-               sc = Tgetnumber(so);
-               vc = Tgetnumber(vo);
-               hsv2rgb(hc, sc, vc, cp);
-               return 0;
-           } else
-               return -1;
-       }
+        ro = Tfinds (co, "r");
+        go = Tfinds (co, "g");
+        bo = Tfinds (co, "b");
+        if (
+            ro && T_ISNUMBER (ro) && go && T_ISNUMBER (go) &&
+            bo && T_ISNUMBER (bo)
+        ) {
+            cp->r = Tgetnumber (ro);
+            cp->g = Tgetnumber (go);
+            cp->b = Tgetnumber (bo);
+            return 0;
+        } else {
+            ho = Tfinds (co, "h");
+            so = Tfinds (co, "s");
+            vo = Tfinds (co, "v");
+            if (
+                ho && T_ISNUMBER (ho) && so && T_ISNUMBER (so) &&
+                vo && T_ISNUMBER (vo)
+            ) {
+                hc = Tgetnumber (ho);
+                sc = Tgetnumber (so);
+                vc = Tgetnumber (vo);
+                hsv2rgb (hc, sc, vc, cp);
+                return 0;
+            } else
+                return -1;
+        }
     }
-    /* return -1; */
+    return -1;
 }
 
-static void nodeinit(int ni)
-{
+static void nodeinit (int ni) {
     int li, ki;
 
     for (li = 0; li < LISTSIZE; li++)
-       gfxnodes[ni].rect[li] = NULL, gfxnodes[ni].menu[li] = NULL;
+        gfxnodes[ni].rect[li] = NULL, gfxnodes[ni].menu[li] = NULL;
     gfxnodes[ni].ls = gfxnodes[ni].ms = gfxnodes[ni].rs = 0;
     for (ki = 0; ki < 256; ki++)
-       gfxnodes[ni].ks[ki] = 0;
+        gfxnodes[ni].ks[ki] = 0;
     gfxnodes[ni].plvo = gfxnodes[ni].pmvo = gfxnodes[ni].prvo = 0;
+    gfxnodes[ni].pb3vo = gfxnodes[ni].pb4vo = 0;
     for (ki = 0; ki < 256; ki++)
-       gfxnodes[ni].pkvo[ki] = 0;
+        gfxnodes[ni].pkvo[ki] = 0;
 }
 
-static void nodeterm(int ni)
-{
+static void nodeterm (int ni) {
     gfxrect_t **rp;
     gfxrect_t *crp, *nrp;
     gfxmenu_t **mp;
@@ -1588,157 +1541,151 @@ static void nodeterm(int ni)
     int li;
 
     for (li = 0; li < LISTSIZE; li++) {
-       rp = &gfxnodes[ni].rect[li];
-       for (crp = *rp; crp; crp = nrp)
-           nrp = crp->next, free(crp);
-       *rp = NULL;
-       mp = &gfxnodes[ni].menu[li];
-       for (cmp = *mp; cmp; cmp = nmp)
-           nmp = cmp->next, free(cmp);
-       *mp = NULL;
+        rp = &gfxnodes[ni].rect[li];
+        for (crp = *rp; crp; crp = nrp)
+            nrp = crp->next, free (crp);
+        *rp = NULL;
+        mp = &gfxnodes[ni].menu[li];
+        for (cmp = *mp; cmp; cmp = nmp)
+            nmp = cmp->next, free (cmp);
+        *mp = NULL;
     }
 }
 
-static void rectinit(int ni)
-{
+static void rectinit (int ni) {
     int li;
 
     for (li = 0; li < LISTSIZE; li++)
-       gfxnodes[ni].rect[li] = NULL;
+        gfxnodes[ni].rect[li] = NULL;
 }
 
-static void rectterm(int ni)
-{
+static void rectterm (int ni) {
     gfxrect_t **rp;
     gfxrect_t *crp, *nrp;
     int li;
 
     for (li = 0; li < LISTSIZE; li++) {
-       rp = &gfxnodes[ni].rect[li];
-       for (crp = *rp; crp; crp = nrp)
-           nrp = crp->next, free(crp);
-       *rp = NULL;
+        rp = &gfxnodes[ni].rect[li];
+        for (crp = *rp; crp; crp = nrp)
+            nrp = crp->next, free (crp);
+        *rp = NULL;
     }
 }
 
-static void rectinsert(int ni, Tobj ko, Grect_t r)
-{
+static void rectinsert (int ni, Tobj ko, Grect_t r) {
     gfxrect_t **rp;
     gfxrect_t *crp;
 
     rp = &gfxnodes[ni].rect[(unsigned long) ko % LISTSIZE];
     for (crp = *rp; crp; crp = crp->next)
-       if (crp->ko == ko) {
-           crp->r.o.x = min(r.o.x, r.c.x);
-           crp->r.o.y = min(r.o.y, r.c.y);
-           crp->r.c.x = max(r.o.x, r.c.x);
-           crp->r.c.y = max(r.o.y, r.c.y);
-           return;
-       }
-    if (!(crp = malloc(sizeof(gfxrect_t))))
-       panic(POS, "rectinsert", "rect malloc failed");
+        if (crp->ko == ko) {
+            crp->r.o.x = min (r.o.x, r.c.x);
+            crp->r.o.y = min (r.o.y, r.c.y);
+            crp->r.c.x = max (r.o.x, r.c.x);
+            crp->r.c.y = max (r.o.y, r.c.y);
+            return;
+        }
+    if (!(crp = malloc (sizeof (gfxrect_t))))
+        panic (POS, "rectinsert", "rect malloc failed");
 
     crp->ko = ko;
-    crp->r.o.x = min(r.o.x, r.c.x);
-    crp->r.o.y = min(r.o.y, r.c.y);
-    crp->r.c.x = max(r.o.x, r.c.x);
-    crp->r.c.y = max(r.o.y, r.c.y);
+    crp->r.o.x = min (r.o.x, r.c.x);
+    crp->r.o.y = min (r.o.y, r.c.y);
+    crp->r.c.x = max (r.o.x, r.c.x);
+    crp->r.c.y = max (r.o.y, r.c.y);
     crp->next = *rp;
     *rp = crp;
 }
 
-static void rectmerge(int ni, Tobj ko, Grect_t r)
-{
+static void rectmerge (int ni, Tobj ko, Grect_t r) {
     gfxrect_t **rp;
     gfxrect_t *crp;
 
     rp = &gfxnodes[ni].rect[(unsigned long) ko % LISTSIZE];
     for (crp = *rp; crp; crp = crp->next)
-       if (crp->ko == ko) {
-           crp->r.o.x = min(crp->r.o.x, min(r.o.x, r.c.x));
-           crp->r.o.y = min(crp->r.o.y, min(r.o.y, r.c.y));
-           crp->r.c.x = max(crp->r.c.x, max(r.o.x, r.c.x));
-           crp->r.c.y = max(crp->r.c.y, max(r.o.y, r.c.y));
-           return;
-       }
-    if (!(crp = malloc(sizeof(gfxrect_t))))
-       panic(POS, "rectmerge", "rect malloc failed");
+        if (crp->ko == ko) {
+            crp->r.o.x = min (crp->r.o.x, min (r.o.x, r.c.x));
+            crp->r.o.y = min (crp->r.o.y, min (r.o.y, r.c.y));
+            crp->r.c.x = max (crp->r.c.x, max (r.o.x, r.c.x));
+            crp->r.c.y = max (crp->r.c.y, max (r.o.y, r.c.y));
+            return;
+        }
+    if (!(crp = malloc (sizeof (gfxrect_t))))
+        panic (POS, "rectmerge", "rect malloc failed");
 
     crp->ko = ko;
-    crp->r.o.x = min(r.o.x, r.c.x);
-    crp->r.o.y = min(r.o.y, r.c.y);
-    crp->r.c.x = max(r.o.x, r.c.x);
-    crp->r.c.y = max(r.o.y, r.c.y);
+    crp->r.o.x = min (r.o.x, r.c.x);
+    crp->r.o.y = min (r.o.y, r.c.y);
+    crp->r.c.x = max (r.o.x, r.c.x);
+    crp->r.c.y = max (r.o.y, r.c.y);
     crp->next = *rp;
     *rp = crp;
 }
 
-static Tobj rectfind(int ni, Gpoint_t p)
-{
+static Tobj rectfind (int ni, Gpoint_t p) {
     gfxrect_t **rp;
     gfxrect_t *crp;
     int li;
 
     for (li = 0; li < LISTSIZE; li++) {
-       rp = &gfxnodes[ni].rect[li];
-       for (crp = *rp; crp; crp = crp->next)
-           if (crp->r.o.x <= p.x && crp->r.c.x >= p.x &&
-               crp->r.o.y <= p.y && crp->r.c.y >= p.y)
-               return crp->ko;
+        rp = &gfxnodes[ni].rect[li];
+        for (crp = *rp; crp; crp = crp->next)
+            if (
+                crp->r.o.x <= p.x && crp->r.c.x >= p.x &&
+                crp->r.o.y <= p.y && crp->r.c.y >= p.y
+            )
+                return crp->ko;
     }
     return NULL;
 }
 
-static void rectdelete(int ni, Tobj ko)
-{
+static void rectdelete (int ni, Tobj ko) {
     gfxrect_t **rp;
     gfxrect_t *crp, *prp;
 
     rp = &gfxnodes[ni].rect[(unsigned long) ko % LISTSIZE];
     for (crp = *rp, prp = NULL; crp; prp = crp, crp = crp->next)
-       if (crp->ko == ko) {
-           if (crp == *rp)
-               *rp = crp->next;
-           else
-               prp->next = crp->next;
-           free(crp);
-           return;
-       }
+        if (crp->ko == ko) {
+            if (crp == *rp)
+                *rp = crp->next;
+            else
+                prp->next = crp->next;
+            free (crp);
+            return;
+        }
 }
 
-static void rectprune(int ni)
-{
+static void rectprune (int ni) {
     gfxrect_t **rp;
     gfxrect_t *crp, *prp;
     int li;
 
     for (li = 0; li < LISTSIZE; li++) {
-       rp = &gfxnodes[ni].rect[li];
-       for (crp = *rp, prp = NULL; crp;) {
-           if (!M_AREAOF(crp->ko)) {
-               if (crp == *rp)
-                   *rp = crp->next, free(crp), crp = *rp;
-               else
-                   prp->next = crp->next, free(crp), crp = prp->next;
-           } else
-               prp = crp, crp = crp->next;
-       }
+        rp = &gfxnodes[ni].rect[li];
+        for (crp = *rp, prp = NULL; crp; ) {
+            if (!M_AREAOF (crp->ko)) {
+                if (crp == *rp)
+                    *rp = crp->next, free (crp), crp = *rp;
+                else
+                    prp->next = crp->next, free (crp), crp = prp->next;
+            } else
+                prp = crp, crp = crp->next;
+        }
     }
 }
 
-static void menuinsert(int ni, Tobj ko, long time, int mi)
-{
+static void menuinsert (int ni, Tobj ko, long time, int mi) {
     gfxmenu_t **mp;
     gfxmenu_t *cmp;
 
     mp = &gfxnodes[ni].menu[(unsigned long) ko % LISTSIZE];
     for (cmp = *mp; cmp; cmp = cmp->next)
-       if (cmp->ko == ko) {
-           cmp->time = time, cmp->mi = mi;
-           return;
-       }
-    if (!(cmp = malloc(sizeof(gfxmenu_t))))
-       panic(POS, "menuinsert", "menu malloc failed");
+        if (cmp->ko == ko) {
+            cmp->time = time, cmp->mi = mi;
+            return;
+        }
+    if (!(cmp = malloc (sizeof (gfxmenu_t))))
+        panic (POS, "menuinsert", "menu malloc failed");
 
     cmp->ko = ko;
     cmp->time = time;
@@ -1747,34 +1694,90 @@ static void menuinsert(int ni, Tobj ko, long time, int mi)
     *mp = cmp;
 }
 
-static int menufind(int ni, Tobj ko, long time)
-{
+static int menufind (int ni, Tobj ko, long time) {
     gfxmenu_t **mp;
     gfxmenu_t *cmp;
 
     mp = &gfxnodes[ni].menu[(unsigned long) ko % LISTSIZE];
     for (cmp = *mp; cmp; cmp = cmp->next)
-       if (cmp->ko == ko && cmp->time == time)
-           return cmp->mi;
+        if (cmp->ko == ko && cmp->time == time)
+            return cmp->mi;
     return -1;
 }
 
-static void menuprune(int ni)
-{
+static void menuprune (int ni) {
     gfxmenu_t **mp;
     gfxmenu_t *cmp, *pmp;
     int li;
 
     for (li = 0; li < LISTSIZE; li++) {
-       mp = &gfxnodes[ni].menu[li];
-       for (cmp = *mp, pmp = NULL; cmp;) {
-           if (!M_AREAOF(cmp->ko)) {
-               if (cmp == *mp)
-                   *mp = cmp->next, free(cmp), cmp = *mp;
-               else
-                   pmp->next = cmp->next, free(cmp), cmp = pmp->next;
-           } else
-               pmp = cmp, cmp = cmp->next;
-       }
+        mp = &gfxnodes[ni].menu[li];
+        for (cmp = *mp, pmp = NULL; cmp; ) {
+            if (!M_AREAOF (cmp->ko)) {
+                if (cmp == *mp)
+                    *mp = cmp->next, free (cmp), cmp = *mp;
+                else
+                    pmp->next = cmp->next, free (cmp), cmp = pmp->next;
+            } else
+                pmp = cmp, cmp = cmp->next;
+        }
+    }
+}
+
+/*  scan a string for 3 floating point numbers separated by
+    white-space or commas.
+*/
+static int scanhsv (char *strp, float *h, float *s, float *v) {
+    char *endp;
+
+    *h = strtod (strp, &endp);
+    if (endp == strp)
+        return 0;
+    strp = endp;
+    while (*strp == ',' || isspace (*strp))
+        strp++;
+    *s = strtod (strp, &endp);
+    if (endp == strp)
+        return 0;
+    strp = endp;
+    while (*strp == ',' || isspace (*strp))
+        strp++;
+    *v = strtod (strp, &endp);
+    if (endp == strp)
+        return 0;
+    return 1;
+}
+
+static void hsv2rgb (float h, float s, float v, Gcolor_t *cp) {
+    float r, g, b, f, p, q, t;
+    int i;
+
+    /* clip to reasonable values */
+    h = max (min (h, 1.0), 0.0);
+    s = max (min (s, 1.0), 0.0);
+    v = max (min (v, 1.0), 0.0);
+
+    if (s == 0.0)
+        r = g = b = v;
+    else {
+        if (h == 1.0)
+            h = 0.0;
+        h = h * 6.0;
+        i = (int) h;
+        f = h - (float) i;
+        p = v * (1 - s);
+        q = v * (1 - (s * f));
+        t = v * (1 - (s * (1 - f)));
+        switch (i) {
+            case 0: r = v; g = t; b = p; break;
+            case 1: r = q; g = v; b = p; break;
+            case 2: r = p; g = v; b = t; break;
+            case 3: r = p; g = q; b = v; break;
+            case 4: r = t; g = p; b = v; break;
+            case 5: r = v; g = p; b = q; break;
+        }
     }
+    cp->r = (int) (255.0 * r);
+    cp->g = (int) (255.0 * g);
+    cp->b = (int) (255.0 * b);
 }