xref: /inferno-os/appl/cmd/wish.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsythimplement Test;
2*37da2899SCharles.Forsyth
3*37da2899SCharles.Forsythinclude "sys.m";
4*37da2899SCharles.Forsythinclude "draw.m";
5*37da2899SCharles.Forsythdraw: Draw;
6*37da2899SCharles.ForsythScreen, Display, Image: import draw;
7*37da2899SCharles.Forsythinclude "tk.m";
8*37da2899SCharles.Forsyth
9*37da2899SCharles.ForsythTest: module
10*37da2899SCharles.Forsyth{
11*37da2899SCharles.Forsyth	init:	fn(ctxt: ref Draw->Context, argv: list of string);
12*37da2899SCharles.Forsyth};
13*37da2899SCharles.Forsyth
14*37da2899SCharles.Forsythtk: Tk;
15*37da2899SCharles.Forsythsys: Sys;
16*37da2899SCharles.Forsyth
17*37da2899SCharles.Forsythinit(nil: ref Draw->Context, argv: list of string)
18*37da2899SCharles.Forsyth{
19*37da2899SCharles.Forsyth	cmd: string;
20*37da2899SCharles.Forsyth
21*37da2899SCharles.Forsyth	sys = load Sys Sys->PATH;
22*37da2899SCharles.Forsyth	draw = load Draw Draw->PATH;
23*37da2899SCharles.Forsyth	tk = load Tk Tk->PATH;
24*37da2899SCharles.Forsyth
25*37da2899SCharles.Forsyth	display := Display.allocate(nil);
26*37da2899SCharles.Forsyth	if(display == nil) {
27*37da2899SCharles.Forsyth		sys->print("can't initialize display: %r\n");
28*37da2899SCharles.Forsyth		return;
29*37da2899SCharles.Forsyth	}
30*37da2899SCharles.Forsyth
31*37da2899SCharles.Forsyth	disp := display.image;
32*37da2899SCharles.Forsyth	screen := Screen.allocate(disp, display.rgb(161, 195, 209), 1);
33*37da2899SCharles.Forsyth	if(screen == nil) {
34*37da2899SCharles.Forsyth		sys->print("can't allocate screen: %r\n");
35*37da2899SCharles.Forsyth		return;
36*37da2899SCharles.Forsyth	}
37*37da2899SCharles.Forsyth	fd := sys->open("/dev/pointer", sys->OREAD);
38*37da2899SCharles.Forsyth	if(fd == nil) {
39*37da2899SCharles.Forsyth		sys->print("open: %s: %r\n", "/dev/pointer");
40*37da2899SCharles.Forsyth		sys->print("run wm/wish instead\n");
41*37da2899SCharles.Forsyth		return;
42*37da2899SCharles.Forsyth	}
43*37da2899SCharles.Forsyth
44*37da2899SCharles.Forsyth	t := tk->toplevel(display, "");
45*37da2899SCharles.Forsyth	spawn mouse(t, fd);
46*37da2899SCharles.Forsyth	spawn keyboard(t);
47*37da2899SCharles.Forsyth	disp.draw(disp.r, screen.fill, nil, disp.r.min);
48*37da2899SCharles.Forsyth
49*37da2899SCharles.Forsyth	input := array[8192] of byte;
50*37da2899SCharles.Forsyth	stdin := sys->fildes(0);
51*37da2899SCharles.Forsyth
52*37da2899SCharles.Forsyth	if(argv != nil)
53*37da2899SCharles.Forsyth		argv = tl argv;
54*37da2899SCharles.Forsyth	while(argv != nil) {
55*37da2899SCharles.Forsyth		exec(t, hd argv);
56*37da2899SCharles.Forsyth		argv = tl argv;
57*37da2899SCharles.Forsyth	}
58*37da2899SCharles.Forsyth
59*37da2899SCharles.Forsyth	for(;;) {
60*37da2899SCharles.Forsyth		tk->cmd(t, "update");
61*37da2899SCharles.Forsyth
62*37da2899SCharles.Forsyth		prompt := '%';
63*37da2899SCharles.Forsyth		if(cmd != nil)
64*37da2899SCharles.Forsyth			prompt = '>';
65*37da2899SCharles.Forsyth		sys->print("%c ", prompt);
66*37da2899SCharles.Forsyth
67*37da2899SCharles.Forsyth		n := sys->read(stdin, input, len input);
68*37da2899SCharles.Forsyth		if(n <= 0)
69*37da2899SCharles.Forsyth			break;
70*37da2899SCharles.Forsyth		if(n == 1)
71*37da2899SCharles.Forsyth			continue;
72*37da2899SCharles.Forsyth		cmd += string input[0:n-1];
73*37da2899SCharles.Forsyth		if(cmd[len cmd-1] != '\\') {
74*37da2899SCharles.Forsyth			cmd = esc(cmd);
75*37da2899SCharles.Forsyth			s := tk->cmd(t, cmd);
76*37da2899SCharles.Forsyth			if(len s != 0)
77*37da2899SCharles.Forsyth				sys->print("%s\n", s);
78*37da2899SCharles.Forsyth			cmd = nil;
79*37da2899SCharles.Forsyth			continue;
80*37da2899SCharles.Forsyth		}
81*37da2899SCharles.Forsyth		cmd = cmd[0:len cmd-1];
82*37da2899SCharles.Forsyth	}
83*37da2899SCharles.Forsyth}
84*37da2899SCharles.Forsyth
85*37da2899SCharles.Forsythesc(s: string): string
86*37da2899SCharles.Forsyth{
87*37da2899SCharles.Forsyth	c: int;
88*37da2899SCharles.Forsyth
89*37da2899SCharles.Forsyth	for(i := 0; i < len s; i++) {
90*37da2899SCharles.Forsyth		if(s[i] != '\\')
91*37da2899SCharles.Forsyth			continue;
92*37da2899SCharles.Forsyth		case s[i+1] {
93*37da2899SCharles.Forsyth		'n'=>	c = '\n';
94*37da2899SCharles.Forsyth		't'=>	c = '\t';
95*37da2899SCharles.Forsyth		'b'=>	c = '\b';
96*37da2899SCharles.Forsyth		'\\'=>	c = '\\';
97*37da2899SCharles.Forsyth		* =>	c = 0;
98*37da2899SCharles.Forsyth		}
99*37da2899SCharles.Forsyth		if(c != 0) {
100*37da2899SCharles.Forsyth			s[i] = c;
101*37da2899SCharles.Forsyth			s = s[0:i+1]+s[i+2:len s];
102*37da2899SCharles.Forsyth		}
103*37da2899SCharles.Forsyth	}
104*37da2899SCharles.Forsyth	return s;
105*37da2899SCharles.Forsyth}
106*37da2899SCharles.Forsyth
107*37da2899SCharles.Forsythexec(t: ref Tk->Toplevel, path: string)
108*37da2899SCharles.Forsyth{
109*37da2899SCharles.Forsyth	fd := sys->open(path, sys->OREAD);
110*37da2899SCharles.Forsyth	if(fd == nil) {
111*37da2899SCharles.Forsyth		sys->print("open: %s: %r\n", path);
112*37da2899SCharles.Forsyth		return;
113*37da2899SCharles.Forsyth	}
114*37da2899SCharles.Forsyth	(ok, d) := sys->fstat(fd);
115*37da2899SCharles.Forsyth	if(ok < 0) {
116*37da2899SCharles.Forsyth		sys->print("fstat: %s: %r\n", path);
117*37da2899SCharles.Forsyth		return;
118*37da2899SCharles.Forsyth	}
119*37da2899SCharles.Forsyth	buf := array[int d.length] of byte;
120*37da2899SCharles.Forsyth	if(sys->read(fd, buf, len buf) < 0) {
121*37da2899SCharles.Forsyth		sys->print("read: %s: %r\n", path);
122*37da2899SCharles.Forsyth		return;
123*37da2899SCharles.Forsyth	}
124*37da2899SCharles.Forsyth	(n, l) := sys->tokenize(string buf, "\n");
125*37da2899SCharles.Forsyth	buf = nil;
126*37da2899SCharles.Forsyth	n = -1;
127*37da2899SCharles.Forsyth	for(; l != nil; l = tl l) {
128*37da2899SCharles.Forsyth		n++;
129*37da2899SCharles.Forsyth		s := hd l;
130*37da2899SCharles.Forsyth		if(len s == 0 || s[0] == '#')
131*37da2899SCharles.Forsyth			continue;
132*37da2899SCharles.Forsyth
133*37da2899SCharles.Forsyth		while(s[len s-1] == '\\') {
134*37da2899SCharles.Forsyth			s = s[0:len s-1];
135*37da2899SCharles.Forsyth			if(tl l != nil) {
136*37da2899SCharles.Forsyth				l = tl l;
137*37da2899SCharles.Forsyth				s = s + hd l;
138*37da2899SCharles.Forsyth			}
139*37da2899SCharles.Forsyth			else
140*37da2899SCharles.Forsyth				break;
141*37da2899SCharles.Forsyth		}
142*37da2899SCharles.Forsyth
143*37da2899SCharles.Forsyth		s = tk->cmd(t, esc(s));
144*37da2899SCharles.Forsyth
145*37da2899SCharles.Forsyth		if(len s != 0 && s[0] == '!') {
146*37da2899SCharles.Forsyth			sys->print("%s:%d %s\n", path, n, s);
147*37da2899SCharles.Forsyth			sys->print("%s:%d %s\n", path, n, hd l);
148*37da2899SCharles.Forsyth		}
149*37da2899SCharles.Forsyth	}
150*37da2899SCharles.Forsyth}
151*37da2899SCharles.Forsyth
152*37da2899SCharles.Forsythmouse(t: ref Tk->Toplevel, fd: ref Sys->FD)
153*37da2899SCharles.Forsyth{
154*37da2899SCharles.Forsyth	n := 0;
155*37da2899SCharles.Forsyth	buf := array[100] of byte;
156*37da2899SCharles.Forsyth	for(;;) {
157*37da2899SCharles.Forsyth		n = sys->read(fd, buf, len buf);
158*37da2899SCharles.Forsyth		if(n <= 0)
159*37da2899SCharles.Forsyth			break;
160*37da2899SCharles.Forsyth
161*37da2899SCharles.Forsyth		if(int buf[0] == 'm' && n >= 1+3*12) {
162*37da2899SCharles.Forsyth			x := int(string buf[ 1:13]);
163*37da2899SCharles.Forsyth			y := int(string buf[12:25]);
164*37da2899SCharles.Forsyth			b := int(string buf[24:37]);
165*37da2899SCharles.Forsyth			tk->pointer(t, Draw->Pointer(b, Draw->Point(x, y), sys->millisec()));
166*37da2899SCharles.Forsyth		}
167*37da2899SCharles.Forsyth	}
168*37da2899SCharles.Forsyth}
169*37da2899SCharles.Forsyth
170*37da2899SCharles.Forsythkeyboard(t: ref Tk->Toplevel)
171*37da2899SCharles.Forsyth{
172*37da2899SCharles.Forsyth	dfd := sys->open("/dev/keyboard", sys->OREAD);
173*37da2899SCharles.Forsyth	if(dfd == nil)
174*37da2899SCharles.Forsyth		return;
175*37da2899SCharles.Forsyth
176*37da2899SCharles.Forsyth	b:= array[1] of byte;
177*37da2899SCharles.Forsyth	buf := array[10] of byte;
178*37da2899SCharles.Forsyth	i := 0;
179*37da2899SCharles.Forsyth	for(;;) {
180*37da2899SCharles.Forsyth		n := sys->read(dfd, buf[i:], len buf - i);
181*37da2899SCharles.Forsyth		if(n < 1)
182*37da2899SCharles.Forsyth			break;
183*37da2899SCharles.Forsyth		i += n;
184*37da2899SCharles.Forsyth		while(i >0 && (nutf := sys->utfbytes(buf, i)) > 0){
185*37da2899SCharles.Forsyth			s := string buf[0:nutf];
186*37da2899SCharles.Forsyth			tk->keyboard(t, int s[0]);
187*37da2899SCharles.Forsyth			buf[0:] = buf[nutf:i];
188*37da2899SCharles.Forsyth			i -= nutf;
189*37da2899SCharles.Forsyth		}
190*37da2899SCharles.Forsyth	}
191*37da2899SCharles.Forsyth}
192