Charles.Forsyth20060303a828770d19 years agoHistory
126 lines · 2.4 KB · Brainfuck
RawDownload
implement Gui; include "common.m";include "tk.m";include "wmclient.m";	wmclient: Wmclient; sys : Sys;draw : Draw;acme : Acme;dat : Dat;utils : Utils; Font, Point, Rect, Image, Context, Screen, Display, Pointer : import draw;keyboardpid, mousepid : import acme;ckeyboard, cmouse : import dat;mousefd: ref Sys->FD;error : import utils; win: ref Wmclient->Window; r2s(r: Rect): string{	return sys->sprint("%d %d %d %d", r.min.x, r.min.y, r.max.x, r.max.y);} init(mods : ref Dat->Mods){	sys = mods.sys;	draw = mods.draw;	acme = mods.acme;	dat = mods.dat;	utils = mods.utils;	wmclient = load Wmclient Wmclient->PATH;	if(wmclient == nil)		error(sys->sprint("cannot load %s: %r", Wmclient->PATH));	wmclient->init(); 	if(acme->acmectxt == nil)		acme->acmectxt = wmclient->makedrawcontext();	display = (acme->acmectxt).display;	win = wmclient->window(acme->acmectxt, "Acme", Wmclient->Appl);	wmclient->win.reshape(((0, 0), (win.displayr.size().div(2))));	cmouse = chan of ref Draw->Pointer;	ckeyboard = win.ctxt.kbd;	wmclient->win.onscreen("place");	wmclient->win.startinput("kbd"::"ptr"::nil);	mainwin = win.image;		yellow = display.color(Draw->Yellow);	green = display.color(Draw->Green);	red = display.color(Draw->Red);	blue = display.color(Draw->Blue);	black = display.color(Draw->Black);	white = display.color(Draw->White);} spawnprocs(){	spawn mouseproc();	spawn eventproc();} zpointer: Draw->Pointer; eventproc(){	for(;;) alt{	e := <-win.ctl or	e = <-win.ctxt.ctl =>		p := ref zpointer;		if(e == "exit"){			p.buttons = Acme->M_QUIT;			cmouse <-= p;		}else{			wmclient->win.wmctl(e);			if(win.image != mainwin){				mainwin = win.image;				p.buttons = Acme->M_RESIZE;				cmouse <-= p;			}		}	}} mouseproc(){	for(;;){		p := <-win.ctxt.ptr;		if(wmclient->win.pointer(*p) == 0){			p.buttons &= ~Acme->M_DOUBLE;			cmouse <-= p;		}	}}		 # consctlfd : ref Sys->FD; cursorset(p: Point){	wmclient->win.wmctl("ptr " + string p.x + " " + string p.y);} cursorswitch(cur: ref Dat->Cursor){	s: string;	if(cur == nil)		s = "cursor";	else{		Hex: con "0123456789abcdef";		s = sys->sprint("cursor %d %d %d %d ", cur.hot.x, cur.hot.y, cur.size.x, cur.size.y);		buf := cur.bits;		for(i := 0; i < len buf; i++){			c := int buf[i];			s[len s] = Hex[c >> 4];			s[len s] = Hex[c & 16rf];	 	}	}	wmclient->win.wmctl(s);} killwins(){	wmclient->win.wmctl("exit");}