xref: /inferno-os/libtk/cwind.c (revision c9c0d12ef55c878b0e361f9f6936bbb4c67b40fb)
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