xref: /inferno-os/appl/acme/gui.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
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