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; } }