1*37da2899SCharles.Forsythimplement Gui; 2*37da2899SCharles.Forsyth 3*37da2899SCharles.Forsythinclude "common.m"; 4*37da2899SCharles.Forsythinclude "tk.m"; 5*37da2899SCharles.Forsythinclude "wmclient.m"; 6*37da2899SCharles.Forsyth wmclient: Wmclient; 7*37da2899SCharles.Forsyth 8*37da2899SCharles.Forsythsys : Sys; 9*37da2899SCharles.Forsythdraw : Draw; 10*37da2899SCharles.Forsythacme : Acme; 11*37da2899SCharles.Forsythdat : Dat; 12*37da2899SCharles.Forsythutils : Utils; 13*37da2899SCharles.Forsyth 14*37da2899SCharles.ForsythFont, Point, Rect, Image, Context, Screen, Display, Pointer : import draw; 15*37da2899SCharles.Forsythkeyboardpid, mousepid : import acme; 16*37da2899SCharles.Forsythckeyboard, cmouse : import dat; 17*37da2899SCharles.Forsythmousefd: ref Sys->FD; 18*37da2899SCharles.Forsytherror : import utils; 19*37da2899SCharles.Forsyth 20*37da2899SCharles.Forsythwin: ref Wmclient->Window; 21*37da2899SCharles.Forsyth 22*37da2899SCharles.Forsythr2s(r: Rect): string 23*37da2899SCharles.Forsyth{ 24*37da2899SCharles.Forsyth return sys->sprint("%d %d %d %d", r.min.x, r.min.y, r.max.x, r.max.y); 25*37da2899SCharles.Forsyth} 26*37da2899SCharles.Forsyth 27*37da2899SCharles.Forsythinit(mods : ref Dat->Mods) 28*37da2899SCharles.Forsyth{ 29*37da2899SCharles.Forsyth sys = mods.sys; 30*37da2899SCharles.Forsyth draw = mods.draw; 31*37da2899SCharles.Forsyth acme = mods.acme; 32*37da2899SCharles.Forsyth dat = mods.dat; 33*37da2899SCharles.Forsyth utils = mods.utils; 34*37da2899SCharles.Forsyth wmclient = load Wmclient Wmclient->PATH; 35*37da2899SCharles.Forsyth if(wmclient == nil) 36*37da2899SCharles.Forsyth error(sys->sprint("cannot load %s: %r", Wmclient->PATH)); 37*37da2899SCharles.Forsyth wmclient->init(); 38*37da2899SCharles.Forsyth 39*37da2899SCharles.Forsyth if(acme->acmectxt == nil) 40*37da2899SCharles.Forsyth acme->acmectxt = wmclient->makedrawcontext(); 41*37da2899SCharles.Forsyth display = (acme->acmectxt).display; 42*37da2899SCharles.Forsyth win = wmclient->window(acme->acmectxt, "Acme", Wmclient->Appl); 43*37da2899SCharles.Forsyth wmclient->win.reshape(((0, 0), (win.displayr.size().div(2)))); 44*37da2899SCharles.Forsyth cmouse = chan of ref Draw->Pointer; 45*37da2899SCharles.Forsyth ckeyboard = win.ctxt.kbd; 46*37da2899SCharles.Forsyth wmclient->win.onscreen("place"); 47*37da2899SCharles.Forsyth wmclient->win.startinput("kbd"::"ptr"::nil); 48*37da2899SCharles.Forsyth mainwin = win.image; 49*37da2899SCharles.Forsyth 50*37da2899SCharles.Forsyth yellow = display.color(Draw->Yellow); 51*37da2899SCharles.Forsyth green = display.color(Draw->Green); 52*37da2899SCharles.Forsyth red = display.color(Draw->Red); 53*37da2899SCharles.Forsyth blue = display.color(Draw->Blue); 54*37da2899SCharles.Forsyth black = display.color(Draw->Black); 55*37da2899SCharles.Forsyth white = display.color(Draw->White); 56*37da2899SCharles.Forsyth} 57*37da2899SCharles.Forsyth 58*37da2899SCharles.Forsythspawnprocs() 59*37da2899SCharles.Forsyth{ 60*37da2899SCharles.Forsyth spawn mouseproc(); 61*37da2899SCharles.Forsyth spawn eventproc(); 62*37da2899SCharles.Forsyth} 63*37da2899SCharles.Forsyth 64*37da2899SCharles.Forsythzpointer: Draw->Pointer; 65*37da2899SCharles.Forsyth 66*37da2899SCharles.Forsytheventproc() 67*37da2899SCharles.Forsyth{ 68*37da2899SCharles.Forsyth for(;;) alt{ 69*37da2899SCharles.Forsyth e := <-win.ctl or 70*37da2899SCharles.Forsyth e = <-win.ctxt.ctl => 71*37da2899SCharles.Forsyth p := ref zpointer; 72*37da2899SCharles.Forsyth if(e == "exit"){ 73*37da2899SCharles.Forsyth p.buttons = Acme->M_QUIT; 74*37da2899SCharles.Forsyth cmouse <-= p; 75*37da2899SCharles.Forsyth }else{ 76*37da2899SCharles.Forsyth wmclient->win.wmctl(e); 77*37da2899SCharles.Forsyth if(win.image != mainwin){ 78*37da2899SCharles.Forsyth mainwin = win.image; 79*37da2899SCharles.Forsyth p.buttons = Acme->M_RESIZE; 80*37da2899SCharles.Forsyth cmouse <-= p; 81*37da2899SCharles.Forsyth } 82*37da2899SCharles.Forsyth } 83*37da2899SCharles.Forsyth } 84*37da2899SCharles.Forsyth} 85*37da2899SCharles.Forsyth 86*37da2899SCharles.Forsythmouseproc() 87*37da2899SCharles.Forsyth{ 88*37da2899SCharles.Forsyth for(;;){ 89*37da2899SCharles.Forsyth p := <-win.ctxt.ptr; 90*37da2899SCharles.Forsyth if(wmclient->win.pointer(*p) == 0){ 91*37da2899SCharles.Forsyth p.buttons &= ~Acme->M_DOUBLE; 92*37da2899SCharles.Forsyth cmouse <-= p; 93*37da2899SCharles.Forsyth } 94*37da2899SCharles.Forsyth } 95*37da2899SCharles.Forsyth} 96*37da2899SCharles.Forsyth 97*37da2899SCharles.Forsyth 98*37da2899SCharles.Forsyth# consctlfd : ref Sys->FD; 99*37da2899SCharles.Forsyth 100*37da2899SCharles.Forsythcursorset(p: Point) 101*37da2899SCharles.Forsyth{ 102*37da2899SCharles.Forsyth wmclient->win.wmctl("ptr " + string p.x + " " + string p.y); 103*37da2899SCharles.Forsyth} 104*37da2899SCharles.Forsyth 105*37da2899SCharles.Forsythcursorswitch(cur: ref Dat->Cursor) 106*37da2899SCharles.Forsyth{ 107*37da2899SCharles.Forsyth s: string; 108*37da2899SCharles.Forsyth if(cur == nil) 109*37da2899SCharles.Forsyth s = "cursor"; 110*37da2899SCharles.Forsyth else{ 111*37da2899SCharles.Forsyth Hex: con "0123456789abcdef"; 112*37da2899SCharles.Forsyth s = sys->sprint("cursor %d %d %d %d ", cur.hot.x, cur.hot.y, cur.size.x, cur.size.y); 113*37da2899SCharles.Forsyth buf := cur.bits; 114*37da2899SCharles.Forsyth for(i := 0; i < len buf; i++){ 115*37da2899SCharles.Forsyth c := int buf[i]; 116*37da2899SCharles.Forsyth s[len s] = Hex[c >> 4]; 117*37da2899SCharles.Forsyth s[len s] = Hex[c & 16rf]; 118*37da2899SCharles.Forsyth } 119*37da2899SCharles.Forsyth } 120*37da2899SCharles.Forsyth wmclient->win.wmctl(s); 121*37da2899SCharles.Forsyth} 122*37da2899SCharles.Forsyth 123*37da2899SCharles.Forsythkillwins() 124*37da2899SCharles.Forsyth{ 125*37da2899SCharles.Forsyth wmclient->win.wmctl("exit"); 126*37da2899SCharles.Forsyth} 127