forsyth20121205-174063a80cc13 years agoHistory
91 lines · 1.7 KB · C
RawDownload
#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;}