1 #include <lib9.h> 2 #include <kernel.h> 3 #include "draw.h" 4 #include "tk.h" 5 #include "label.h" 6 7 char* 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* 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