123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- 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");
- }
|