summaryrefslogtreecommitdiff
path: root/appl/acme/gui.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/acme/gui.b')
-rw-r--r--appl/acme/gui.b126
1 files changed, 126 insertions, 0 deletions
diff --git a/appl/acme/gui.b b/appl/acme/gui.b
new file mode 100644
index 00000000..92e61f08
--- /dev/null
+++ b/appl/acme/gui.b
@@ -0,0 +1,126 @@
+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");
+}