summaryrefslogtreecommitdiff
path: root/libtk
diff options
context:
space:
mode:
Diffstat (limited to 'libtk')
-rw-r--r--libtk/buton.c5
-rw-r--r--libtk/colrs.c3
-rw-r--r--libtk/parse.c63
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;
}