ref: 54bac038f411c10a596adf84c06df32f8c7c4c53
dir: /appl/acme/gui.b/
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"); }