xref: /inferno-os/libtk/varbl.c (revision 0b97835064f7a6adffa5529a9676920f6c1ad3bf)
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