1 #include <lib9.h>
2 #include <kernel.h>
3 #include "draw.h"
4 #include "tk.h"
5 #include "label.h"
6
7 char*
tksetvar(TkTop * top,char * c,char * newval)8 tksetvar(TkTop *top, char *c, char *newval)
9 {
10 TkVar *v;
11 TkWin *tkw;
12 Tk *f, *m;
13 void (*vc)(Tk*, char*, char*);
14
15 if (c == nil || c[0] == '\0')
16 return nil;
17
18 v = tkmkvar(top, c, TkVstring);
19 if(v == nil)
20 return TkNomem;
21 if(v->type != TkVstring)
22 return TkNotvt;
23
24 if(newval == nil)
25 newval = "";
26
27 if(v->value != nil) {
28 if (strcmp(v->value, newval) == 0)
29 return nil;
30 free(v->value);
31 }
32
33 v->value = strdup(newval);
34 if(v->value == nil)
35 return TkNomem;
36
37 for(f = top->root; f; f = f->siblings) {
38 if(f->type == TKmenu) {
39 tkw = TKobj(TkWin, f);
40 for(m = tkw->slave; m; m = m->next)
41 if ((vc = tkmethod[m->type]->varchanged) != nil)
42 (*vc)(m, c, newval);
43 } else
44 if ((vc = tkmethod[f->type]->varchanged) != nil)
45 (*vc)(f, c, newval);
46 }
47
48 return nil;
49 }
50
51 char*
tkvariable(TkTop * t,char * arg,char ** ret)52 tkvariable(TkTop *t, char *arg, char **ret)
53 {
54 TkVar *v;
55 char *fmt, *e, *buf, *ebuf, *val;
56 int l;
57
58 l = strlen(arg) + 2;
59 buf = malloc(l);
60 if(buf == nil)
61 return TkNomem;
62 ebuf = buf+l;
63
64 arg = tkword(t, arg, buf, ebuf, nil);
65 arg = tkskip(arg, " \t");
66 if (*arg == '\0') {
67 if(strcmp(buf, "lasterror") == 0) {
68 free(buf);
69 if(t->err == nil)
70 return nil;
71 fmt = "%s: %s";
72 if(strlen(t->errcmd) == sizeof(t->errcmd)-1)
73 fmt = "%s...: %s";
74 e = tkvalue(ret, fmt, t->errcmd, t->err);
75 t->err = nil;
76 return e;
77 }
78 v = tkmkvar(t, buf, 0);
79 free(buf);
80 if(v == nil || v->value == nil)
81 return nil;
82 if(v->type != TkVstring)
83 return TkNotvt;
84 return tkvalue(ret, "%s", v->value);
85 }
86 val = buf+strlen(buf)+1;
87 tkword(t, arg, val, ebuf, nil);
88 e = tksetvar(t, buf, val);
89 free(buf);
90 return e;
91 }
92