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 */ }
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; }
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); }
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; } }
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); }
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; }