ref: babf901b4a508c3ec5d1f89655f10377bbdf9637
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");
}