コード例 #1
0
ファイル: windw.c プロジェクト: 8l/inferno
void
tkunmap(Tk *tk)
{
	TkTop *t;
	TkCtxt *c;

	while(tk->master)
		tk = tk->master;

	if((tk->flag & Tkmapped) == 0)
		return;

	t = tk->env->top;
	c = t->ctxt;

	if(tkischild(tk, c->mgrab))
		tksetmgrab(t, nil);
	if(tkischild(tk, c->entered)){
		tkdeliver(c->entered, TkLeave, nil);
		c->entered = nil;
	}
	if(tk == t->root)
		tksetglobalfocus(t, 0);

	tk->flag &= ~(Tkmapped|Tksuspended);

	tkdestroywinimage(tk);
	tkdeliver(tk, TkUnmap, nil);
	tkenterleave(t);
	/* XXX should unmap menus too */
}
コード例 #2
0
ファイル: cwind.c プロジェクト: 8l/inferno
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;
}
コード例 #3
0
ファイル: windw.c プロジェクト: 8l/inferno
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);
}
コード例 #4
0
ファイル: packr.c プロジェクト: BGCX261/znos-git
void
tksetslavereq(Tk *slave, TkGeom frame)
{
	Point border;
	TkGeom pos, old;
	int slave2BW;
	void (*geomfn)(Tk*);

	border.x = slave->pad.x;
	border.y = slave->pad.y;

	slave2BW = slave->borderwidth * 2;

	pos.width = slave->req.width + slave2BW + slave->ipad.x;
	if((slave->flag&Tkfillx) || (pos.width > (frame.width - border.x)))
		pos.width = frame.width - border.x;

	pos.height = slave->req.height + slave2BW + slave->ipad.y;
	if((slave->flag&Tkfilly) || (pos.height > (frame.height - border.y)))
    		pos.height = frame.height - border.y;

	border.x /= 2;
	border.y /= 2;

	if(slave->flag & Tknorth)
		pos.y = frame.y + border.y;
	else
	if(slave->flag & Tksouth)
		pos.y = frame.y + frame.height - pos.height - border.y;
	else
		pos.y = frame.y + (frame.height - pos.height)/2;

	if(slave->flag & Tkwest)
		pos.x = frame.x + border.x;
	else
	if(slave->flag & Tkeast)
		pos.x = frame.x + frame.width - pos.width - border.x;
	else
		pos.x = frame.x + (frame.width - pos.width)/2;

	pos.width -= slave2BW;
	pos.height -= slave2BW;

	if(memcmp(&slave->act, &pos, sizeof(TkGeom)) != 0) {
		old = slave->act;
		slave->act = pos;
		geomfn = tkmethod[slave->type]->geom;
		if(geomfn != nil)
			geomfn(slave);
		if(slave->slave)
			tkpackqit(slave);
		tkdeliver(slave, TkConfigure, &old);

		slave->dirty = tkrect(slave, 1);
		slave->flag |= Tkrefresh;
	}
}
コード例 #5
0
ファイル: windw.c プロジェクト: 8l/inferno
char*
tkmap(Tk *tk)
{
/*
	is this necessary?
	tkw = TKobj(TkWin, tk);
	if(tkw->image != nil)
		tkwreq(tk->env->top, "raise %s", tk->name->name);
*/

	if(tk->flag & Tkmapped)
		return nil;

	tk->flag |= Tkmapped;
	tkmoveresize(tk, 0, 0, tk->act.width, tk->act.height);
	tkdeliver(tk, TkMap, nil);
	return nil;
//tkupdate(tk->env->top);
}
コード例 #6
0
ファイル: textu.c プロジェクト: BGCX261/znos-git
static Tk*
tktdeliver(Tk *tk, TkTitem *i, TkTitem *tagit, int event, void *data, Point deltasv)
{
	Tk *ftk, *dest;
	TkTwind *w;
	TkText *tkt;
	TkTtaginfo *t;
	TkTline *l;
	TkMouse m;
	Point mp, p;
	TkTindex ix;
	int bd;

	dest = nil;
	if(i != nil) {
		tkt = TKobj(TkText, tk);

		if(i->kind == TkTwin) {
			w = i->iwin;
			if(w->sub != nil) {
				if(!(event & TkKey) && (event & TkEmouse)) {
					m = *(TkMouse*)data;
					mp.x = m.x;
					mp.y = m.y;
					ix.item = i;
					ix.pos = 0;
					ix.line = tktitemline(i);
					p = tktitempos(tk, &ix);
					bd = w->sub->borderwidth;
					mp.x = m.x - (deltasv.x + p.x + w->sub->act.x + bd);
					mp.y = m.y - (deltasv.y + p.y + w->sub->act.y + bd);
					ftk = tkinwindow(w->sub, mp, 0);
					if(ftk != w->focus) {
						tkdeliver(w->focus, TkLeave, data);
						tkdeliver(ftk, TkEnter, data);

						w->focus = ftk;
					}
					if(ftk != nil)
						dest = tkdeliver(ftk, event, &m);
				}
				else {
					if ((event & TkLeave) && (w->focus != w->sub)) {
						tkdeliver(w->focus, TkLeave, data);
						w->focus = nil;
						event &= ~TkLeave;
					}
					if (event)
						tkdeliver(w->sub, event, data);
				}
				if(Dx(w->sub->dirty) > 0) {
					l = tktitemline(i);
					tktfixgeom(tk, tktprevwrapline(tk, l), l, 0);
				}
				if(event & TkKey)
					return dest;
			}
		}

		if(tagit != 0) {
			for(t = tkt->tags; t != nil; t = t->next) {
				if(t->binds != nil && tkttagset(tagit, t->id)) {
					if(tksubdeliver(tk, t->binds, event, data, 0) == TkDbreak) {
						return dest;
					}
				}
			}
		}
	}
	return dest;
}