diff options
Diffstat (limited to 'libtk')
| -rw-r--r-- | libtk/buton.c | 5 | ||||
| -rw-r--r-- | libtk/colrs.c | 3 | ||||
| -rw-r--r-- | libtk/parse.c | 63 |
3 files changed, 57 insertions, 14 deletions
diff --git a/libtk/buton.c b/libtk/buton.c index 356b8985..325422b9 100644 --- a/libtk/buton.c +++ b/libtk/buton.c @@ -198,15 +198,16 @@ tkmkbutton(TkTop *t, int btype) tkl = TKobj(TkLabel, tk); tkl->ul = -1; tkl->justify = Tkleft; - if (btype == TKradiobutton) - tkl->variable = strdup(tkselbut); switch (btype) { case TKbutton: e = tkbindings(t, tk, bb, nelem(bb)); break; case TKcheckbutton: + e = tkbindings(t, tk, cb, nelem(cb)); + break; case TKradiobutton: + tkl->variable = strdup(tkselbut); e = tkbindings(t, tk, cb, nelem(cb)); break; } diff --git a/libtk/colrs.c b/libtk/colrs.c index d4fc73c4..b72b2801 100644 --- a/libtk/colrs.c +++ b/libtk/colrs.c @@ -73,6 +73,9 @@ static Coltab coltab[] = TkChighlightfgnd, RGB(0, 0, 0), TkSameshade, + TkCtransparent, + DTransparent, + TkSameshade, -1, }; diff --git a/libtk/parse.c b/libtk/parse.c index 32f9194a..57a1a651 100644 --- a/libtk/parse.c +++ b/libtk/parse.c @@ -47,6 +47,7 @@ static char* (*oparse[])(TkTop*, TkOption*, void*, char**, char*, char*) = /* OPTignore */ pignore, /* OPTsticky */ psticky, /* OPTlist */ plist, + /* OPTflags */ pstab, }; char* @@ -290,7 +291,7 @@ tkgencget(TkOptab *ft, char *arg, char **val, TkTop *t) TkStab *s; TkOption *o; int wh, con, i, n, flag, *v; - char *r, *buf, *fmt; + char *r, *buf, *fmt, *out; buf = mallocz(Tkmaxitem, 0); if(buf == nil) @@ -381,6 +382,23 @@ tkgencget(TkOptab *ft, char *arg, char **val, TkTop *t) } free(buf); return tkvalue(val, "%s", c); + case OPTflags: + con = OPTION(ft->ptr, int, o->offset); + out = mallocz(Tkmaxitem, 0); + if(out == nil) { + free(buf); + return TkNomem; + } + c = out; + for (s = o->aux; s->val != nil; s++) { + if (con & s->con) + c = seprint(c, out+Tkmaxitem, " %s", s->val); /* should this be quoted? */ + } + free(buf); + *c = 0; + r = tkvalue(val, "%s", out); + free(out); + return r; case OPTfont: e = OPTION(ft->ptr, TkEnv*, o->offset); free(buf); @@ -411,8 +429,10 @@ tkgencget(TkOptab *ft, char *arg, char **val, TkTop *t) free(buf); return nil; case OPTbmap: + //free(buf); return tkvalue(val, "%d", OPTION(ft->ptr, Image*, o->offset) != nil); case OPTimag: + //free(buf); return tkvalue(val, "%d", OPTION(ft->ptr, TkImg*, o->offset) != nil); } } @@ -518,41 +538,60 @@ psize(TkTop *t, TkOption *o, void *place, char **str, char *buf, char *ebuf) return nil; } +static TkStab* +lookstab(TkStab *s, char *word) +{ + for(; s->val != nil; s++) + if(strcmp(s->val, word) == 0) + return s; + return nil; +} + static char* pstab(TkTop *t, TkOption *o, void *place, char **str, char *buf, char *ebuf) { - char *p; - int mask; + char *p, *fields[8]; + int mask, val, nf; TkStab *s, *c; p = tkword(t, *str, buf, ebuf, nil); if(*buf == '\0') return TkOparg; - for(s = o->aux; s->val; s++) - if(strcmp(s->val, buf) == 0) - break; - if(s->val == nil) - return TkBadvl; - - *str = p; if(o->type == OPTstab) { + s = lookstab(o->aux, buf); + if(s == nil) + return TkBadvl; + *str = p; OPTION(place, int, o->offset) = s->con; return nil; } + nf = getfields(buf, fields, nelem(fields), 1, " \t,"); + if(nf < 1 || nf > 1 && o->type != OPTflags) + return TkBadvl; + mask = 0; for(c = o->aux; c->val; c++) mask |= c->con; + val = 0; + while(--nf >= 0) { + s = lookstab(o->aux, fields[nf]); + if(s == nil) + return TkBadvl; + val |= s->con; + } + *str = p; + OPTION(place, int, o->offset) &= ~mask; - OPTION(place, int, o->offset) |= s->con; + OPTION(place, int, o->offset) |= val; /* * a hack, but otherwise we have to dirty the focus order * every time any command is executed on a widget */ - if (!strcmp(o->o, "takefocus")) + if(strcmp(o->o, "takefocus") == 0) tkdirtyfocusorder(t); return nil; } |
