diff options
Diffstat (limited to 'libtk/varbl.c')
| -rw-r--r-- | libtk/varbl.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/libtk/varbl.c b/libtk/varbl.c new file mode 100644 index 00000000..9f5346ff --- /dev/null +++ b/libtk/varbl.c @@ -0,0 +1,91 @@ +#include <lib9.h> +#include <kernel.h> +#include "draw.h" +#include "tk.h" +#include "label.h" + +char* +tksetvar(TkTop *top, char *c, char *newval) +{ + TkVar *v; + TkWin *tkw; + Tk *f, *m; + void (*vc)(Tk*, char*, char*); + + if (c == nil || c[0] == '\0') + return nil; + + v = tkmkvar(top, c, TkVstring); + if(v == nil) + return TkNomem; + if(v->type != TkVstring) + return TkNotvt; + + if(newval == nil) + newval = ""; + + if(v->value != nil) { + if (strcmp(v->value, newval) == 0) + return nil; + free(v->value); + } + + v->value = strdup(newval); + if(v->value == nil) + return TkNomem; + + for(f = top->root; f; f = f->siblings) { + if(f->type == TKmenu) { + tkw = TKobj(TkWin, f); + for(m = tkw->slave; m; m = m->next) + if ((vc = tkmethod[m->type]->varchanged) != nil) + (*vc)(m, c, newval); + } else + if ((vc = tkmethod[f->type]->varchanged) != nil) + (*vc)(f, c, newval); + } + + return nil; +} + +char* +tkvariable(TkTop *t, char *arg, char **ret) +{ + TkVar *v; + char *fmt, *e, *buf, *ebuf, *val; + int l; + + l = strlen(arg) + 2; + buf = malloc(l); + if(buf == nil) + return TkNomem; + ebuf = buf+l; + + arg = tkword(t, arg, buf, ebuf, nil); + arg = tkskip(arg, " \t"); + if (*arg == '\0') { + if(strcmp(buf, "lasterror") == 0) { + free(buf); + if(t->err == nil) + return nil; + fmt = "%s: %s"; + if(strlen(t->errcmd) == sizeof(t->errcmd)-1) + fmt = "%s...: %s"; + e = tkvalue(ret, fmt, t->errcmd, t->err); + t->err = nil; + return e; + } + v = tkmkvar(t, buf, 0); + free(buf); + if(v == nil || v->value == nil) + return nil; + if(v->type != TkVstring) + return TkNotvt; + return tkvalue(ret, "%s", v->value); + } + val = buf+strlen(buf)+1; + tkword(t, arg, val, ebuf, nil); + e = tksetvar(t, buf, val); + free(buf); + return e; +} |
