Exemple #1
0
static char*
tkforget(TkTop *t, char *arg)
{
	Tk *tk;
	char *buf;

	buf = mallocz(Tkmaxitem, 0);
	if(buf == nil)
		return TkNomem;
	for(;;) {
		arg = tkword(t, arg, buf, buf+Tkmaxitem, nil);
		if(buf[0] == '\0')
			break;
		tk = tklook(t, buf, 0);
		if(tk == nil) {
			tkrunpack(t);
			tkerr(t, buf);
			free(buf);
			return TkBadwp;
		}
		tkpackqit(tk->master);
		tkdelpack(tk);
	}
	free(buf);
	tkrunpack(t);
	return nil;
}
Exemple #2
0
void
tkgeomchg(Tk *tk, TkGeom *g, int bd)
{
	int w, h;
	void (*geomfn)(Tk*);
	if(memcmp(&tk->req, g, sizeof(TkGeom)) == 0 && bd == tk->borderwidth)
		return;

	geomfn = tkmethod[tk->type]->geom;
	if(geomfn != nil)
		geomfn(tk);

	if(tk->master != nil) {
		tkpackqit(tk->master);
		tkrunpack(tk->env->top);
	}
	else
	if(tk->geom != nil) {
		w = tk->req.width;
		h = tk->req.height;
		tk->req.width = 0;
		tk->req.height = 0;
		tk->geom(tk, tk->act.x, tk->act.y, w, h);
		if (tk->slave) {
			tkpackqit(tk);
			tkrunpack(tk->env->top);
		}
	}
	tkdeliver(tk, TkConfigure, g);
}
Exemple #3
0
static void
tkcvswindsize(TkCitem *i)
{
	Tk *s;
	int bw;
	Point p;
	TkGeom old;
	TkCwind *w;

	w = TKobj(TkCwind, i);
	s = w->sub;
	if(s == nil)
		return;

	if(w->width != s->act.width || w->height != s->act.height) {
		old = s->act;
		s->act.width = w->width;
		s->act.height = w->height;
		if(s->slave) {
			tkpackqit(s);
			tkrunpack(s->env->top);
		}
		tkdeliver(s, TkConfigure, &old);
	}
	p = tkcvsanchor(i->p.drawpt[0], s->act.width, s->act.height, w->flags);
	s->act.x = p.x;
	s->act.y = p.y;

	bw = 2*s->borderwidth;
	i->p.bb.min = p;
	i->p.bb.max.x = p.x + s->act.width + bw;
	i->p.bb.max.y = p.y + s->act.height + bw;
}
Exemple #4
0
char*
tkpropagate(TkTop *t, char *arg)
{
	Tk *tk;
	TkStab *s;
	char *buf;

	buf = mallocz(Tkmaxitem, 0);
	if(buf == nil)
		return TkNomem;
	arg = tkword(t, arg, buf, buf+Tkmaxitem, nil);
	tk = tklook(t, buf, 0);
	if(tk == nil) {
		tkerr(t, buf);
		free(buf);
		return TkBadwp;
	}

	tkword(t, arg, buf, buf+Tkmaxitem, nil);
	for(s = tkbool; s->val; s++) {
		if(strcmp(s->val, buf) == 0) {
			if(s->con == BoolT) {
				tk->flag &= ~Tknoprop;
				tkpackqit(tk);
				tkrunpack(t);
			} else
				tk->flag |= Tknoprop;
			free(buf);
			return nil;
		}
	}
	free(buf);
	return TkBadvl;
}
Exemple #5
0
char*
tkpack(TkTop *t, char *arg, char **val)
{
	TkParam param = defparam;
	TkParam *p = &param;
	TkOptab tko[2];
	Tk *tk, **l, *tkp;
	TkName *names, *n;
	char *e, *w, *buf;

	buf = mallocz(Tkminitem, 0);
	if(buf == nil)
		return TkNomem;

	w = tkword(t, arg, buf, buf+Tkminitem, nil);
	if(strcmp(buf, "forget") == 0) {
		e = tkforget(t, w);
		free(buf);
		return e;
	}
	if(strcmp(buf, "propagate") == 0) {
		e = tkpropagate(t, w);
		free(buf);
		return e;
	}
	if(strcmp(buf, "slaves") == 0) {
		e = tkslaves(t, w, val);
		free(buf);
		return e;
	}
	free(buf);

	tko[0].ptr = p;
	tko[0].optab = opts;
	tko[1].ptr = nil;

	names = nil;
	e = tkparse(t, arg, tko, &names);
	if(e != nil)
		return e;

	if((p->before && p->before->master == nil) ||
	   (p->after && p->after->master == nil)) {
		tkfreename(names);
		return TkNotpk;
	}

	for(n = names; n; n = n->link) {
		tkp = tklook(t, n->name, 0);
		if(tkp == nil) {
			tkerr(t, n->name);
			tkfreename(names);
			return TkBadwp;
		}
		if(tkp->flag & Tkwindow) {
			tkfreename(names);
			return TkIstop;
		}
		if(tkp->parent != nil) {
			tkfreename(names);
			return TkWpack;
		}
		n->obj = tkp;
	}

	e = nil;
	for(n = names; n; n = n->link) {
		tk = n->obj;
		if(tk->master == nil) {
			tk->pad = ZP;
			tk->ipad = ZP;
			tk->flag &= ~(Tkanchor|Tkside|Tkfill|Tkexpand);
			tk->flag |= Tktop;
		}
		if(tk->master != nil) {
			tkpackqit(tk->master);
			tkdelpack(tk);
		}
		if(p->before == nil && p->after == nil && p->in == nil) {
			tkp = tklook(t, n->name, 1);
			if(tkp == nil) {
				e = TkBadwp;
				tkerr(t, n->name);
				goto Error;
			}
			e = tkcanpack(tk, tkp);
			if (e != nil)
				goto Error;
			tkappendpack(tkp, tk, -1);
		}
		else {
			if(p->in != nil) {
				e = tkcanpack(tk, p->in);
				if(e != nil)
					goto Error;
				tkappendpack(p->in, tk, -1);
			}
			else
			if(p->before != nil) {
				e = tkcanpack(tk, p->before->master);
				if (e != nil)
					goto Error;
				tk->master = p->before->master;
				l = &tk->master->slave;
				for(;;) {
					if(*l == p->before) {
						tk->next = *l;
						*l = tk;
						break;
					}
					l = &(*l)->next;
				}
				p->before = tk;
			}
			else {
				e = tkcanpack(tk, p->after->master);
				if (e != nil)
					goto Error;
				tk->master = p->after->master;
				tk->next = p->after->next;
				p->after->next = tk;
				p->after = tk;
			}
		}
		tksetopt(p, tk);
		if (tk->master->flag&Tksubsub)
			tksetbits(tk, Tksubsub);
		tkpackqit(tk->master);
	}

Error:
	tkfreename(names);
	tkrunpack(t);

	return e;
}