From 4cc30b0dd29cfa06e50c7778e33baaaa90825bfd Mon Sep 17 00:00:00 2001 From: erg Date: Fri, 8 Apr 2005 20:45:33 +0000 Subject: [PATCH] Update with new lefty, fixing many bugs and supporting new features --- cmd/lefty/gfxview.c | 2331 ++++++++++++++++++++++--------------------- 1 file changed, 1167 insertions(+), 1164 deletions(-) diff --git a/cmd/lefty/gfxview.c b/cmd/lefty/gfxview.c index 6a16b4cb5..773cd213c 100644 --- a/cmd/lefty/gfxview.c +++ b/cmd/lefty/gfxview.c @@ -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); } -- 2.40.0