Wmsrv: module{
	PATH: con "/dis/lib/wmsrv.dis";

	init:	fn(): 	(chan of (string, chan of (string, ref Draw->Wmcontext)),
		chan of (ref Client, chan of string),
		chan of (ref Client, array of byte, Sys->Rwrite));

	find:	fn(p: Draw->Point): ref Client;
	top:	fn(): ref Client;

	Window: adt {
		tag:	string;
		r:	Draw->Rect;
		img:	ref Draw->Image;
	};

	Client: adt {
		kbd:		chan of int;
		ptr:		chan of ref Draw->Pointer;
		ctl:		chan of string;
		stop:		chan of int;
		flags:	int;			# general purpose.
		cursor:	string;		# hack.
		wins:	list of ref Window;
		znext:	cyclic ref Client;

		# private:
		images:	chan of (ref Draw->Point, ref Draw->Image, chan of int);
		id:		int;				# index into clients array
		fid:		int;
		token:	int;
		wmctxt:	ref Draw->Wmcontext;

		window:	fn(c: self ref Client, tag: string): ref Window;
		contains:	fn(c: self ref Client, p: Draw->Point): int;
		image:	fn(c: self ref Client, tag: string):	ref Draw->Image;
		setimage:	fn(c: self ref Client, tag: string,  i: ref Draw->Image): int;	# only in response to some msgs.
		setorigin:	fn(c: self ref Client, tag: string, o: Draw->Point): int;		# only in response to some msgs.
		top:		fn(c: self ref Client);			# bring to top.
		bottom:	fn(c: self ref Client);			# send to bottom.
		hide:		fn(w: self ref Client);		# move offscreen.
		unhide:	fn(w: self ref Client);		# move onscreen.
		remove:	fn(w: self ref Client);
	};
};

