137da2899SCharles.Forsyth #include "lib9.h"
237da2899SCharles.Forsyth #include "draw.h"
337da2899SCharles.Forsyth #include "tk.h"
437da2899SCharles.Forsyth #include "canvs.h"
537da2899SCharles.Forsyth
637da2899SCharles.Forsyth #define O(t, e) ((long)(&((t*)0)->e))
737da2899SCharles.Forsyth
837da2899SCharles.Forsyth /* Window Options (+ means implemented)
937da2899SCharles.Forsyth +tags
1037da2899SCharles.Forsyth +width
1137da2899SCharles.Forsyth +height
1237da2899SCharles.Forsyth +window
1337da2899SCharles.Forsyth +anchor
1437da2899SCharles.Forsyth */
1537da2899SCharles.Forsyth
1637da2899SCharles.Forsyth static
1737da2899SCharles.Forsyth TkOption windopts[] =
1837da2899SCharles.Forsyth {
1937da2899SCharles.Forsyth "width", OPTdist, O(TkCwind, width), nil,
2037da2899SCharles.Forsyth "height", OPTdist, O(TkCwind, height), nil,
2137da2899SCharles.Forsyth "anchor", OPTstab, O(TkCwind, flags), tkanchor,
2237da2899SCharles.Forsyth "window", OPTwinp, O(TkCwind, sub), nil,
2337da2899SCharles.Forsyth nil
2437da2899SCharles.Forsyth };
2537da2899SCharles.Forsyth
2637da2899SCharles.Forsyth static
2737da2899SCharles.Forsyth TkOption itemopts[] =
2837da2899SCharles.Forsyth {
2937da2899SCharles.Forsyth "tags", OPTctag, O(TkCitem, tags), nil,
3037da2899SCharles.Forsyth nil
3137da2899SCharles.Forsyth };
3237da2899SCharles.Forsyth
3337da2899SCharles.Forsyth static void
tkcvswindsize(TkCitem * i)3437da2899SCharles.Forsyth tkcvswindsize(TkCitem *i)
3537da2899SCharles.Forsyth {
3637da2899SCharles.Forsyth Tk *s;
3737da2899SCharles.Forsyth int bw;
3837da2899SCharles.Forsyth Point p;
3937da2899SCharles.Forsyth TkGeom old;
4037da2899SCharles.Forsyth TkCwind *w;
4137da2899SCharles.Forsyth
4237da2899SCharles.Forsyth w = TKobj(TkCwind, i);
4337da2899SCharles.Forsyth s = w->sub;
4437da2899SCharles.Forsyth if(s == nil)
4537da2899SCharles.Forsyth return;
4637da2899SCharles.Forsyth
4737da2899SCharles.Forsyth if(w->width != s->act.width || w->height != s->act.height) {
4837da2899SCharles.Forsyth old = s->act;
4937da2899SCharles.Forsyth s->act.width = w->width;
5037da2899SCharles.Forsyth s->act.height = w->height;
5137da2899SCharles.Forsyth if(s->slave) {
5237da2899SCharles.Forsyth tkpackqit(s);
5337da2899SCharles.Forsyth tkrunpack(s->env->top);
5437da2899SCharles.Forsyth }
5537da2899SCharles.Forsyth tkdeliver(s, TkConfigure, &old);
5637da2899SCharles.Forsyth }
5737da2899SCharles.Forsyth p = tkcvsanchor(i->p.drawpt[0], s->act.width, s->act.height, w->flags);
5837da2899SCharles.Forsyth s->act.x = p.x;
5937da2899SCharles.Forsyth s->act.y = p.y;
6037da2899SCharles.Forsyth
6137da2899SCharles.Forsyth bw = 2*s->borderwidth;
6237da2899SCharles.Forsyth i->p.bb.min = p;
6337da2899SCharles.Forsyth i->p.bb.max.x = p.x + s->act.width + bw;
6437da2899SCharles.Forsyth i->p.bb.max.y = p.y + s->act.height + bw;
6537da2899SCharles.Forsyth }
6637da2899SCharles.Forsyth
675849851aSforsyth TkCitem*
tkcvsfindwin(Tk * tk)685849851aSforsyth tkcvsfindwin(Tk *tk)
695849851aSforsyth {
705849851aSforsyth Tk *parent, *sub;
715849851aSforsyth TkCitem *i;
725849851aSforsyth TkCanvas *c;
735849851aSforsyth TkCwind *w;
745849851aSforsyth
755849851aSforsyth sub = tkfindsub(tk);
765849851aSforsyth if(sub == nil)
775849851aSforsyth return nil;
785849851aSforsyth parent = sub->parent;
795849851aSforsyth if(parent->type != TKcanvas)
805849851aSforsyth return nil; /* inconsistent */
815849851aSforsyth c = TKobj(TkCanvas, parent);
825849851aSforsyth for(i = c->head; i != nil; i = i->next) {
835849851aSforsyth if(i->type == TkCVwindow) {
845849851aSforsyth w = TKobj(TkCwind, i);
855849851aSforsyth if(w->sub == sub)
865849851aSforsyth return i;
875849851aSforsyth }
885849851aSforsyth }
895849851aSforsyth return nil;
905849851aSforsyth }
915849851aSforsyth
925849851aSforsyth void
tkcvsforgetsub(Tk * sub,Tk * tk)935849851aSforsyth tkcvsforgetsub(Tk *sub, Tk *tk)
945849851aSforsyth {
955849851aSforsyth TkCwind *w;
965849851aSforsyth TkCitem *i;
975849851aSforsyth
985849851aSforsyth i = tkcvsfindwin(sub);
995849851aSforsyth if(i == nil)
1005849851aSforsyth return;
1015849851aSforsyth w = TKobj(TkCwind, i);
1025849851aSforsyth if(w->focus == tk) {
1035849851aSforsyth if(0)print("tkcsvsforget sub %p %q focus %p %q\n", sub, tkname(sub), tk, tkname(tk));
1045849851aSforsyth w->focus = nil;
1055849851aSforsyth }
1065849851aSforsyth }
1075849851aSforsyth
10837da2899SCharles.Forsyth static void
tkcvswindgeom(Tk * sub,int x,int y,int w,int h)10937da2899SCharles.Forsyth tkcvswindgeom(Tk *sub, int x, int y, int w, int h)
11037da2899SCharles.Forsyth {
11137da2899SCharles.Forsyth TkCitem *i;
11237da2899SCharles.Forsyth Tk *parent;
11337da2899SCharles.Forsyth TkCanvas *c;
11437da2899SCharles.Forsyth TkCwind *win;
11537da2899SCharles.Forsyth
11637da2899SCharles.Forsyth USED(x);
11737da2899SCharles.Forsyth USED(y);
11837da2899SCharles.Forsyth parent = sub->parent;
11937da2899SCharles.Forsyth win = nil;
12037da2899SCharles.Forsyth c = TKobj(TkCanvas, parent);
12137da2899SCharles.Forsyth for(i = c->head; i; i = i->next) {
12237da2899SCharles.Forsyth if(i->type == TkCVwindow) {
12337da2899SCharles.Forsyth win = TKobj(TkCwind, i);
12437da2899SCharles.Forsyth if(win->sub == sub)
12537da2899SCharles.Forsyth break;
12637da2899SCharles.Forsyth }
12737da2899SCharles.Forsyth }
12837da2899SCharles.Forsyth
12937da2899SCharles.Forsyth tkbbmax(&c->update, &i->p.bb);
13037da2899SCharles.Forsyth
13137da2899SCharles.Forsyth if((win->flags & Tksetwidth) == 0)
13237da2899SCharles.Forsyth win->width = w;
13337da2899SCharles.Forsyth if ((win->flags & Tksetheight) == 0)
13437da2899SCharles.Forsyth win->height = h;
13537da2899SCharles.Forsyth
13637da2899SCharles.Forsyth sub->req.width = w;
13737da2899SCharles.Forsyth sub->req.height = h;
13837da2899SCharles.Forsyth tkcvswindsize(i);
13937da2899SCharles.Forsyth
14037da2899SCharles.Forsyth tkbbmax(&c->update, &i->p.bb);
14137da2899SCharles.Forsyth tkcvsdirty(parent);
14237da2899SCharles.Forsyth }
14337da2899SCharles.Forsyth
14437da2899SCharles.Forsyth static void
tkcvssubdestry(Tk * sub)14537da2899SCharles.Forsyth tkcvssubdestry(Tk *sub)
14637da2899SCharles.Forsyth {
14737da2899SCharles.Forsyth Tk *tk;
14837da2899SCharles.Forsyth TkCitem *i;
14937da2899SCharles.Forsyth TkCanvas *c;
15037da2899SCharles.Forsyth TkCwind *win;
15137da2899SCharles.Forsyth
15237da2899SCharles.Forsyth tk = sub->parent;
15337da2899SCharles.Forsyth if(tk == nil)
15437da2899SCharles.Forsyth return;
15537da2899SCharles.Forsyth
1565849851aSforsyth if(0)print("tkcvssubdestry %p %q\n", sub, tkname(sub));
1575849851aSforsyth i = tkcvsfindwin(sub);
158*c9c0d12eSforsyth if(i == nil)
159*c9c0d12eSforsyth return;
1605849851aSforsyth win = TKobj(TkCwind, i);
1615849851aSforsyth if(win->sub != sub){
162*c9c0d12eSforsyth if(win->sub != nil)
1635849851aSforsyth print("inconsistent tkcvssubdestry %p %q\n", sub, tkname(sub));
164*c9c0d12eSforsyth return;
1655849851aSforsyth }
1665849851aSforsyth
16737da2899SCharles.Forsyth c = TKobj(TkCanvas, tk);
16837da2899SCharles.Forsyth tkbbmax(&c->update, &i->p.bb);
16937da2899SCharles.Forsyth tkcvssetdirty(tk);
17037da2899SCharles.Forsyth
17137da2899SCharles.Forsyth win->focus = nil;
17237da2899SCharles.Forsyth win->sub = nil;
17337da2899SCharles.Forsyth sub->parent = nil;
17437da2899SCharles.Forsyth sub->geom = nil;
17537da2899SCharles.Forsyth }
17637da2899SCharles.Forsyth
17737da2899SCharles.Forsyth Point
tkcvsrelpos(Tk * sub)17837da2899SCharles.Forsyth tkcvsrelpos(Tk *sub)
17937da2899SCharles.Forsyth {
18037da2899SCharles.Forsyth Tk *tk;
18137da2899SCharles.Forsyth TkCitem *i;
18237da2899SCharles.Forsyth TkCanvas *c;
18337da2899SCharles.Forsyth TkCwind *win;
18437da2899SCharles.Forsyth
18537da2899SCharles.Forsyth tk = sub->parent;
18637da2899SCharles.Forsyth if(tk == nil)
18737da2899SCharles.Forsyth return ZP;
18837da2899SCharles.Forsyth
18937da2899SCharles.Forsyth c = TKobj(TkCanvas, tk);
19037da2899SCharles.Forsyth for(i = c->head; i; i = i->next) {
19137da2899SCharles.Forsyth if(i->type == TkCVwindow) {
19237da2899SCharles.Forsyth win = TKobj(TkCwind, i);
19337da2899SCharles.Forsyth if(win->sub == sub)
19437da2899SCharles.Forsyth return subpt(i->p.bb.min, c->view);
19537da2899SCharles.Forsyth }
19637da2899SCharles.Forsyth }
19737da2899SCharles.Forsyth return ZP;
19837da2899SCharles.Forsyth }
19937da2899SCharles.Forsyth
20037da2899SCharles.Forsyth static char*
tkcvswindchk(Tk * tk,TkCwind * w,Tk * oldsub)20137da2899SCharles.Forsyth tkcvswindchk(Tk *tk, TkCwind *w, Tk *oldsub)
20237da2899SCharles.Forsyth {
20337da2899SCharles.Forsyth Tk *sub;
20437da2899SCharles.Forsyth
20537da2899SCharles.Forsyth sub = w->sub;
20637da2899SCharles.Forsyth if (sub != oldsub) {
20737da2899SCharles.Forsyth w->sub = oldsub;
20837da2899SCharles.Forsyth if(sub == nil)
20937da2899SCharles.Forsyth return nil;
21037da2899SCharles.Forsyth
21137da2899SCharles.Forsyth if(sub->flag & Tkwindow)
21237da2899SCharles.Forsyth return TkIstop;
21337da2899SCharles.Forsyth
21437da2899SCharles.Forsyth if(sub->master != nil || sub->parent != nil)
21537da2899SCharles.Forsyth return TkWpack;
21637da2899SCharles.Forsyth
21737da2899SCharles.Forsyth if (oldsub != nil) {
21837da2899SCharles.Forsyth oldsub->parent = nil;
21937da2899SCharles.Forsyth oldsub->geom = nil;
22037da2899SCharles.Forsyth oldsub->destroyed = nil;
22137da2899SCharles.Forsyth }
22237da2899SCharles.Forsyth w->sub = sub;
22337da2899SCharles.Forsyth w->focus = nil;
22437da2899SCharles.Forsyth sub->parent = tk;
22537da2899SCharles.Forsyth tksetbits(w->sub, Tksubsub);
22637da2899SCharles.Forsyth sub->geom = tkcvswindgeom;
22737da2899SCharles.Forsyth sub->destroyed = tkcvssubdestry;
22837da2899SCharles.Forsyth
22937da2899SCharles.Forsyth if(w->width == 0)
23037da2899SCharles.Forsyth w->width = sub->req.width;
23137da2899SCharles.Forsyth if(w->height == 0)
23237da2899SCharles.Forsyth w->height = sub->req.height;
23337da2899SCharles.Forsyth }
23437da2899SCharles.Forsyth
23537da2899SCharles.Forsyth return nil;
23637da2899SCharles.Forsyth }
23737da2899SCharles.Forsyth
23837da2899SCharles.Forsyth char*
tkcvswindcreat(Tk * tk,char * arg,char ** val)23937da2899SCharles.Forsyth tkcvswindcreat(Tk* tk, char *arg, char **val)
24037da2899SCharles.Forsyth {
24137da2899SCharles.Forsyth char *e;
24237da2899SCharles.Forsyth TkCwind *w;
24337da2899SCharles.Forsyth TkCitem *i;
24437da2899SCharles.Forsyth TkCanvas *c;
24537da2899SCharles.Forsyth TkOptab tko[3];
24637da2899SCharles.Forsyth
24737da2899SCharles.Forsyth c = TKobj(TkCanvas, tk);
24837da2899SCharles.Forsyth
24937da2899SCharles.Forsyth i = tkcnewitem(tk, TkCVwindow, sizeof(TkCitem)+sizeof(TkCwind));
25037da2899SCharles.Forsyth if(i == nil)
25137da2899SCharles.Forsyth return TkNomem;
25237da2899SCharles.Forsyth
25337da2899SCharles.Forsyth w = TKobj(TkCwind, i);
25437da2899SCharles.Forsyth w->flags = Tkcenter;
25537da2899SCharles.Forsyth
25637da2899SCharles.Forsyth e = tkparsepts(tk->env->top, &i->p, &arg, 0);
25737da2899SCharles.Forsyth if(e != nil) {
25837da2899SCharles.Forsyth tkcvsfreeitem(i);
25937da2899SCharles.Forsyth return e;
26037da2899SCharles.Forsyth }
26137da2899SCharles.Forsyth if(i->p.npoint != 1) {
26237da2899SCharles.Forsyth tkcvsfreeitem(i);
26337da2899SCharles.Forsyth return TkFewpt;
26437da2899SCharles.Forsyth }
26537da2899SCharles.Forsyth
26637da2899SCharles.Forsyth tko[0].ptr = w;
26737da2899SCharles.Forsyth tko[0].optab = windopts;
26837da2899SCharles.Forsyth tko[1].ptr = i;
26937da2899SCharles.Forsyth tko[1].optab = itemopts;
27037da2899SCharles.Forsyth tko[2].ptr = nil;
27137da2899SCharles.Forsyth e = tkparse(tk->env->top, arg, tko, nil);
27237da2899SCharles.Forsyth if(e != nil) {
27337da2899SCharles.Forsyth tkcvsfreeitem(i);
27437da2899SCharles.Forsyth return e;
27537da2899SCharles.Forsyth }
27637da2899SCharles.Forsyth e = tkcvswindchk(tk, w, nil);
27737da2899SCharles.Forsyth if(e != nil) {
27837da2899SCharles.Forsyth tkcvsfreeitem(i);
27937da2899SCharles.Forsyth return e;
28037da2899SCharles.Forsyth }
28137da2899SCharles.Forsyth
28237da2899SCharles.Forsyth e = tkcaddtag(tk, i, 1);
28337da2899SCharles.Forsyth if(e != nil) {
28437da2899SCharles.Forsyth tkcvsfreeitem(i);
28537da2899SCharles.Forsyth return e;
28637da2899SCharles.Forsyth }
28737da2899SCharles.Forsyth
28837da2899SCharles.Forsyth e = tkvalue(val, "%d", i->id);
28937da2899SCharles.Forsyth if(e != nil) {
29037da2899SCharles.Forsyth tkcvsfreeitem(i);
29137da2899SCharles.Forsyth return e;
29237da2899SCharles.Forsyth }
29337da2899SCharles.Forsyth tkcvsappend(c, i);
29437da2899SCharles.Forsyth tkcvswindsize(i);
29537da2899SCharles.Forsyth
29637da2899SCharles.Forsyth tkbbmax(&c->update, &i->p.bb);
29737da2899SCharles.Forsyth tkcvssetdirty(tk);
29837da2899SCharles.Forsyth return nil;
29937da2899SCharles.Forsyth }
30037da2899SCharles.Forsyth
30137da2899SCharles.Forsyth char*
tkcvswindcget(TkCitem * i,char * arg,char ** val)30237da2899SCharles.Forsyth tkcvswindcget(TkCitem *i, char *arg, char **val)
30337da2899SCharles.Forsyth {
30437da2899SCharles.Forsyth TkOptab tko[3];
30537da2899SCharles.Forsyth TkCwind *w = TKobj(TkCwind, i);
30637da2899SCharles.Forsyth
30737da2899SCharles.Forsyth tko[0].ptr = w;
30837da2899SCharles.Forsyth tko[0].optab = windopts;
30937da2899SCharles.Forsyth tko[1].ptr = i;
31037da2899SCharles.Forsyth tko[1].optab = itemopts;
31137da2899SCharles.Forsyth tko[2].ptr = nil;
31237da2899SCharles.Forsyth
31337da2899SCharles.Forsyth return tkgencget(tko, arg, val, i->env->top);
31437da2899SCharles.Forsyth }
31537da2899SCharles.Forsyth
31637da2899SCharles.Forsyth char*
tkcvswindconf(Tk * tk,TkCitem * i,char * arg)31737da2899SCharles.Forsyth tkcvswindconf(Tk *tk, TkCitem *i, char *arg)
31837da2899SCharles.Forsyth {
31937da2899SCharles.Forsyth char *e;
32037da2899SCharles.Forsyth int dx, dy;
32137da2899SCharles.Forsyth TkOptab tko[3];
32237da2899SCharles.Forsyth TkCwind *w = TKobj(TkCwind, i);
32337da2899SCharles.Forsyth Tk *oldsub;
32437da2899SCharles.Forsyth
32537da2899SCharles.Forsyth tko[0].ptr = w;
32637da2899SCharles.Forsyth tko[0].optab = windopts;
32737da2899SCharles.Forsyth tko[1].ptr = i;
32837da2899SCharles.Forsyth tko[1].optab = itemopts;
32937da2899SCharles.Forsyth tko[2].ptr = nil;
33037da2899SCharles.Forsyth
33137da2899SCharles.Forsyth dx = w->width;
33237da2899SCharles.Forsyth dy = w->height;
33337da2899SCharles.Forsyth w->width = -1;
33437da2899SCharles.Forsyth w->height = -1;
33537da2899SCharles.Forsyth
33637da2899SCharles.Forsyth oldsub = w->sub;
33737da2899SCharles.Forsyth e = tkparse(tk->env->top, arg, tko, nil);
33837da2899SCharles.Forsyth if(e == nil) {
33937da2899SCharles.Forsyth e = tkcvswindchk(tk, w, oldsub);
34037da2899SCharles.Forsyth if(e != nil)
34137da2899SCharles.Forsyth return e;
34237da2899SCharles.Forsyth if(w->width == -1)
34337da2899SCharles.Forsyth w->width = dx;
34437da2899SCharles.Forsyth else
34537da2899SCharles.Forsyth w->flags |= Tksetwidth;
34637da2899SCharles.Forsyth if(w->height == -1)
34737da2899SCharles.Forsyth w->height = dy;
34837da2899SCharles.Forsyth else
34937da2899SCharles.Forsyth w->flags |= Tksetheight;
35037da2899SCharles.Forsyth tkcvswindsize(i);
35137da2899SCharles.Forsyth } else {
35237da2899SCharles.Forsyth w->width = dx;
35337da2899SCharles.Forsyth w->height = dy;
35437da2899SCharles.Forsyth }
35537da2899SCharles.Forsyth return e;
35637da2899SCharles.Forsyth }
35737da2899SCharles.Forsyth
35837da2899SCharles.Forsyth void
tkcvswindfree(TkCitem * i)35937da2899SCharles.Forsyth tkcvswindfree(TkCitem *i)
36037da2899SCharles.Forsyth {
36137da2899SCharles.Forsyth Tk *sub;
36237da2899SCharles.Forsyth TkCwind *w;
36337da2899SCharles.Forsyth
36437da2899SCharles.Forsyth w = TKobj(TkCwind, i);
36537da2899SCharles.Forsyth sub = w->sub;
36637da2899SCharles.Forsyth if(sub != nil) {
36737da2899SCharles.Forsyth sub->parent = nil;
36837da2899SCharles.Forsyth sub->geom = nil;
36937da2899SCharles.Forsyth sub->destroyed = nil;
37037da2899SCharles.Forsyth }
371*c9c0d12eSforsyth w->focus = nil;
372*c9c0d12eSforsyth w->sub = nil;
37337da2899SCharles.Forsyth }
37437da2899SCharles.Forsyth
37537da2899SCharles.Forsyth void
tkcvswinddraw(Image * img,TkCitem * i,TkEnv * pe)37637da2899SCharles.Forsyth tkcvswinddraw(Image *img, TkCitem *i, TkEnv *pe)
37737da2899SCharles.Forsyth {
37837da2899SCharles.Forsyth TkCwind *w;
37937da2899SCharles.Forsyth Point rel;
38037da2899SCharles.Forsyth Rectangle r;
38137da2899SCharles.Forsyth Tk *sub;
38237da2899SCharles.Forsyth
38337da2899SCharles.Forsyth USED(img); /* See tkimageof */
38437da2899SCharles.Forsyth USED(pe);
38537da2899SCharles.Forsyth w = TKobj(TkCwind, i);
38637da2899SCharles.Forsyth sub = w->sub;
38737da2899SCharles.Forsyth if(sub != nil) {
38837da2899SCharles.Forsyth int dirty;
38937da2899SCharles.Forsyth r = i->p.bb;
39037da2899SCharles.Forsyth rel.x = r.min.x + sub->borderwidth;
39137da2899SCharles.Forsyth rel.y = r.min.y + sub->borderwidth;
39237da2899SCharles.Forsyth if (rectclip(&r, img->clipr)) {
39337da2899SCharles.Forsyth sub->dirty = rectsubpt(r, rel);
39437da2899SCharles.Forsyth sub->flag |= Tkrefresh;
39537da2899SCharles.Forsyth tkdrawslaves(sub, ZP, &dirty); /* XXX - Tad: propagate err? */
39637da2899SCharles.Forsyth }
39737da2899SCharles.Forsyth }
39837da2899SCharles.Forsyth }
39937da2899SCharles.Forsyth
40037da2899SCharles.Forsyth char*
tkcvswindcoord(TkCitem * i,char * arg,int x,int y)40137da2899SCharles.Forsyth tkcvswindcoord(TkCitem *i, char *arg, int x, int y)
40237da2899SCharles.Forsyth {
40337da2899SCharles.Forsyth char *e;
40437da2899SCharles.Forsyth TkCpoints p;
40537da2899SCharles.Forsyth /*
40637da2899SCharles.Forsyth TkCwind *w;
40737da2899SCharles.Forsyth int xi, yi;
40837da2899SCharles.Forsyth */
40937da2899SCharles.Forsyth
41037da2899SCharles.Forsyth if(arg == nil) {
41137da2899SCharles.Forsyth tkxlatepts(i->p.parampt, i->p.npoint, x, y);
41237da2899SCharles.Forsyth tkxlatepts(i->p.drawpt, i->p.npoint, TKF2I(x), TKF2I(y));
41337da2899SCharles.Forsyth tkcvswindsize(i);
41437da2899SCharles.Forsyth /*
41537da2899SCharles.Forsyth w = TKobj(TkCwind, i);
41637da2899SCharles.Forsyth xi = TKF2I(x);
41737da2899SCharles.Forsyth yi = TKF2I(y);
41837da2899SCharles.Forsyth if (w->sub != nil) {
41937da2899SCharles.Forsyth w->sub->act.x += xi;
42037da2899SCharles.Forsyth w->sub->act.y += yi;
42137da2899SCharles.Forsyth }
42237da2899SCharles.Forsyth i->p.bb = rectaddpt(i->p.bb, Pt(xi, yi));
42337da2899SCharles.Forsyth */
42437da2899SCharles.Forsyth }
42537da2899SCharles.Forsyth else {
42637da2899SCharles.Forsyth e = tkparsepts(i->env->top, &p, &arg, 0);
42737da2899SCharles.Forsyth if(e != nil)
42837da2899SCharles.Forsyth return e;
42937da2899SCharles.Forsyth if(p.npoint != 1) {
43037da2899SCharles.Forsyth tkfreepoint(&p);
43137da2899SCharles.Forsyth return TkFewpt;
43237da2899SCharles.Forsyth }
43337da2899SCharles.Forsyth tkfreepoint(&i->p);
43437da2899SCharles.Forsyth i->p = p;
43537da2899SCharles.Forsyth tkcvswindsize(i);
43637da2899SCharles.Forsyth }
43737da2899SCharles.Forsyth return nil;
43837da2899SCharles.Forsyth }
439