Blame


1 84b1cb73 2003-09-30 devnull #include <u.h>
2 84b1cb73 2003-09-30 devnull #include <libc.h>
3 84b1cb73 2003-09-30 devnull #include <draw.h>
4 84b1cb73 2003-09-30 devnull #include <thread.h>
5 84b1cb73 2003-09-30 devnull #include <mouse.h>
6 84b1cb73 2003-09-30 devnull #include <cursor.h>
7 84b1cb73 2003-09-30 devnull #include <keyboard.h>
8 84b1cb73 2003-09-30 devnull #include <frame.h>
9 84b1cb73 2003-09-30 devnull #include "flayer.h"
10 84b1cb73 2003-09-30 devnull #include "samterm.h"
11 84b1cb73 2003-09-30 devnull
12 b4135f04 2005-01-07 devnull int protodebug;
13 84b1cb73 2003-09-30 devnull int cursorfd;
14 84b1cb73 2003-09-30 devnull int plumbfd = -1;
15 84b1cb73 2003-09-30 devnull int input;
16 84b1cb73 2003-09-30 devnull int got;
17 84b1cb73 2003-09-30 devnull int block;
18 84b1cb73 2003-09-30 devnull int kbdc;
19 84b1cb73 2003-09-30 devnull int resized;
20 84b1cb73 2003-09-30 devnull uchar *hostp;
21 84b1cb73 2003-09-30 devnull uchar *hoststop;
22 84b1cb73 2003-09-30 devnull uchar *plumbbase;
23 84b1cb73 2003-09-30 devnull uchar *plumbp;
24 84b1cb73 2003-09-30 devnull uchar *plumbstop;
25 84b1cb73 2003-09-30 devnull Channel *plumbc;
26 84b1cb73 2003-09-30 devnull Channel *hostc;
27 84b1cb73 2003-09-30 devnull Mousectl *mousectl;
28 84b1cb73 2003-09-30 devnull Mouse *mousep;
29 84b1cb73 2003-09-30 devnull Keyboardctl *keyboardctl;
30 84b1cb73 2003-09-30 devnull void panic(char*);
31 84b1cb73 2003-09-30 devnull
32 84b1cb73 2003-09-30 devnull void
33 84b1cb73 2003-09-30 devnull initio(void)
34 84b1cb73 2003-09-30 devnull {
35 84b1cb73 2003-09-30 devnull threadsetname("main");
36 a19ff5b2 2005-01-07 devnull if(protodebug) print("mouse\n");
37 84b1cb73 2003-09-30 devnull mousectl = initmouse(nil, display->image);
38 84b1cb73 2003-09-30 devnull if(mousectl == nil){
39 84b1cb73 2003-09-30 devnull fprint(2, "samterm: mouse init failed: %r\n");
40 84b1cb73 2003-09-30 devnull threadexitsall("mouse");
41 84b1cb73 2003-09-30 devnull }
42 84b1cb73 2003-09-30 devnull mousep = &mousectl->m;
43 a19ff5b2 2005-01-07 devnull if(protodebug) print("kbd\n");
44 84b1cb73 2003-09-30 devnull keyboardctl = initkeyboard(nil);
45 84b1cb73 2003-09-30 devnull if(keyboardctl == nil){
46 84b1cb73 2003-09-30 devnull fprint(2, "samterm: keyboard init failed: %r\n");
47 84b1cb73 2003-09-30 devnull threadexitsall("kbd");
48 84b1cb73 2003-09-30 devnull }
49 a19ff5b2 2005-01-07 devnull if(protodebug) print("hoststart\n");
50 84b1cb73 2003-09-30 devnull hoststart();
51 a19ff5b2 2005-01-07 devnull if(protodebug) print("plumbstart\n");
52 a19ff5b2 2005-01-07 devnull if(plumbstart() < 0){
53 a19ff5b2 2005-01-07 devnull if(protodebug) print("extstart\n");
54 84b1cb73 2003-09-30 devnull extstart();
55 a19ff5b2 2005-01-07 devnull }
56 a19ff5b2 2005-01-07 devnull if(protodebug) print("initio done\n");
57 84b1cb73 2003-09-30 devnull }
58 84b1cb73 2003-09-30 devnull
59 84b1cb73 2003-09-30 devnull void
60 84b1cb73 2003-09-30 devnull getmouse(void)
61 84b1cb73 2003-09-30 devnull {
62 84b1cb73 2003-09-30 devnull if(readmouse(mousectl) < 0)
63 84b1cb73 2003-09-30 devnull panic("mouse");
64 84b1cb73 2003-09-30 devnull }
65 84b1cb73 2003-09-30 devnull
66 84b1cb73 2003-09-30 devnull void
67 84b1cb73 2003-09-30 devnull mouseunblock(void)
68 84b1cb73 2003-09-30 devnull {
69 84b1cb73 2003-09-30 devnull got &= ~(1<<RMouse);
70 84b1cb73 2003-09-30 devnull }
71 84b1cb73 2003-09-30 devnull
72 84b1cb73 2003-09-30 devnull void
73 84b1cb73 2003-09-30 devnull kbdblock(void)
74 84b1cb73 2003-09-30 devnull { /* ca suffit */
75 84b1cb73 2003-09-30 devnull block = (1<<RKeyboard)|(1<<RPlumb);
76 84b1cb73 2003-09-30 devnull }
77 84b1cb73 2003-09-30 devnull
78 84b1cb73 2003-09-30 devnull int
79 84b1cb73 2003-09-30 devnull button(int but)
80 84b1cb73 2003-09-30 devnull {
81 84b1cb73 2003-09-30 devnull getmouse();
82 84b1cb73 2003-09-30 devnull return mousep->buttons&(1<<(but-1));
83 84b1cb73 2003-09-30 devnull }
84 84b1cb73 2003-09-30 devnull
85 84b1cb73 2003-09-30 devnull void
86 84b1cb73 2003-09-30 devnull externload(int i)
87 84b1cb73 2003-09-30 devnull {
88 941c9f36 2003-10-11 devnull drawtopwindow();
89 84b1cb73 2003-09-30 devnull plumbbase = malloc(plumbbuf[i].n);
90 84b1cb73 2003-09-30 devnull if(plumbbase == 0)
91 84b1cb73 2003-09-30 devnull return;
92 84b1cb73 2003-09-30 devnull memmove(plumbbase, plumbbuf[i].data, plumbbuf[i].n);
93 84b1cb73 2003-09-30 devnull plumbp = plumbbase;
94 84b1cb73 2003-09-30 devnull plumbstop = plumbbase + plumbbuf[i].n;
95 84b1cb73 2003-09-30 devnull got |= 1<<RPlumb;
96 84b1cb73 2003-09-30 devnull }
97 84b1cb73 2003-09-30 devnull
98 84b1cb73 2003-09-30 devnull int
99 84b1cb73 2003-09-30 devnull waitforio(void)
100 84b1cb73 2003-09-30 devnull {
101 84b1cb73 2003-09-30 devnull Alt alts[NRes+1];
102 84b1cb73 2003-09-30 devnull Rune r;
103 84b1cb73 2003-09-30 devnull int i;
104 84b1cb73 2003-09-30 devnull ulong type;
105 84b1cb73 2003-09-30 devnull
106 84b1cb73 2003-09-30 devnull again:
107 d27787fb 2005-03-18 devnull alts[RPlumb].c = plumbc;
108 d27787fb 2005-03-18 devnull alts[RPlumb].v = &i;
109 d27787fb 2005-03-18 devnull alts[RPlumb].op = CHANRCV;
110 d27787fb 2005-03-18 devnull if((block & (1<<RPlumb)) || plumbc == nil)
111 d27787fb 2005-03-18 devnull alts[RPlumb].op = CHANNOP;
112 d27787fb 2005-03-18 devnull
113 84b1cb73 2003-09-30 devnull alts[RHost].c = hostc;
114 84b1cb73 2003-09-30 devnull alts[RHost].v = &i;
115 84b1cb73 2003-09-30 devnull alts[RHost].op = CHANRCV;
116 84b1cb73 2003-09-30 devnull if(block & (1<<RHost))
117 84b1cb73 2003-09-30 devnull alts[RHost].op = CHANNOP;
118 84b1cb73 2003-09-30 devnull
119 84b1cb73 2003-09-30 devnull alts[RKeyboard].c = keyboardctl->c;
120 84b1cb73 2003-09-30 devnull alts[RKeyboard].v = &r;
121 84b1cb73 2003-09-30 devnull alts[RKeyboard].op = CHANRCV;
122 84b1cb73 2003-09-30 devnull if(block & (1<<RKeyboard))
123 84b1cb73 2003-09-30 devnull alts[RKeyboard].op = CHANNOP;
124 84b1cb73 2003-09-30 devnull
125 84b1cb73 2003-09-30 devnull alts[RMouse].c = mousectl->c;
126 84b1cb73 2003-09-30 devnull alts[RMouse].v = &mousectl->m;
127 84b1cb73 2003-09-30 devnull alts[RMouse].op = CHANRCV;
128 84b1cb73 2003-09-30 devnull if(block & (1<<RMouse))
129 84b1cb73 2003-09-30 devnull alts[RMouse].op = CHANNOP;
130 93f2ae0d 2004-12-27 devnull
131 84b1cb73 2003-09-30 devnull alts[RResize].c = mousectl->resizec;
132 84b1cb73 2003-09-30 devnull alts[RResize].v = nil;
133 84b1cb73 2003-09-30 devnull alts[RResize].op = CHANRCV;
134 84b1cb73 2003-09-30 devnull if(block & (1<<RResize))
135 84b1cb73 2003-09-30 devnull alts[RResize].op = CHANNOP;
136 84b1cb73 2003-09-30 devnull
137 b4135f04 2005-01-07 devnull if(protodebug) print("waitforio %c%c%c%c%c\n",
138 b4135f04 2005-01-07 devnull "h-"[alts[RHost].op == CHANNOP],
139 b4135f04 2005-01-07 devnull "k-"[alts[RKeyboard].op == CHANNOP],
140 b4135f04 2005-01-07 devnull "m-"[alts[RMouse].op == CHANNOP],
141 b4135f04 2005-01-07 devnull "p-"[alts[RPlumb].op == CHANNOP],
142 b4135f04 2005-01-07 devnull "R-"[alts[RResize].op == CHANNOP]);
143 93f2ae0d 2004-12-27 devnull
144 84b1cb73 2003-09-30 devnull alts[NRes].op = CHANEND;
145 84b1cb73 2003-09-30 devnull
146 84b1cb73 2003-09-30 devnull if(got & ~block)
147 84b1cb73 2003-09-30 devnull return got & ~block;
148 84b1cb73 2003-09-30 devnull flushimage(display, 1);
149 84b1cb73 2003-09-30 devnull type = alt(alts);
150 84b1cb73 2003-09-30 devnull switch(type){
151 84b1cb73 2003-09-30 devnull case RHost:
152 93f2ae0d 2004-12-27 devnull if(0) print("hostalt recv %d %d\n", i, hostbuf[i].n);
153 84b1cb73 2003-09-30 devnull hostp = hostbuf[i].data;
154 84b1cb73 2003-09-30 devnull hoststop = hostbuf[i].data + hostbuf[i].n;
155 84b1cb73 2003-09-30 devnull block = 0;
156 84b1cb73 2003-09-30 devnull break;
157 84b1cb73 2003-09-30 devnull case RPlumb:
158 84b1cb73 2003-09-30 devnull externload(i);
159 84b1cb73 2003-09-30 devnull break;
160 84b1cb73 2003-09-30 devnull case RKeyboard:
161 84b1cb73 2003-09-30 devnull kbdc = r;
162 84b1cb73 2003-09-30 devnull break;
163 84b1cb73 2003-09-30 devnull case RMouse:
164 84b1cb73 2003-09-30 devnull break;
165 84b1cb73 2003-09-30 devnull case RResize:
166 84b1cb73 2003-09-30 devnull resized = 1;
167 84b1cb73 2003-09-30 devnull /* do the resize in line if we've finished initializing and we're not in a blocking state */
168 84b1cb73 2003-09-30 devnull if(hasunlocked && block==0 && RESIZED())
169 84b1cb73 2003-09-30 devnull resize();
170 84b1cb73 2003-09-30 devnull goto again;
171 84b1cb73 2003-09-30 devnull }
172 84b1cb73 2003-09-30 devnull got |= 1<<type;
173 fa325e9b 2020-01-10 cross return got;
174 84b1cb73 2003-09-30 devnull }
175 84b1cb73 2003-09-30 devnull
176 84b1cb73 2003-09-30 devnull int
177 84b1cb73 2003-09-30 devnull rcvchar(void)
178 84b1cb73 2003-09-30 devnull {
179 84b1cb73 2003-09-30 devnull int c;
180 84b1cb73 2003-09-30 devnull
181 84b1cb73 2003-09-30 devnull if(!(got & (1<<RHost)))
182 84b1cb73 2003-09-30 devnull return -1;
183 84b1cb73 2003-09-30 devnull c = *hostp++;
184 84b1cb73 2003-09-30 devnull if(hostp == hoststop)
185 84b1cb73 2003-09-30 devnull got &= ~(1<<RHost);
186 84b1cb73 2003-09-30 devnull return c;
187 84b1cb73 2003-09-30 devnull }
188 84b1cb73 2003-09-30 devnull
189 84b1cb73 2003-09-30 devnull char*
190 84b1cb73 2003-09-30 devnull rcvstring(void)
191 84b1cb73 2003-09-30 devnull {
192 84b1cb73 2003-09-30 devnull *hoststop = 0;
193 84b1cb73 2003-09-30 devnull got &= ~(1<<RHost);
194 84b1cb73 2003-09-30 devnull return (char*)hostp;
195 84b1cb73 2003-09-30 devnull }
196 84b1cb73 2003-09-30 devnull
197 84b1cb73 2003-09-30 devnull int
198 84b1cb73 2003-09-30 devnull getch(void)
199 84b1cb73 2003-09-30 devnull {
200 84b1cb73 2003-09-30 devnull int c;
201 84b1cb73 2003-09-30 devnull
202 84b1cb73 2003-09-30 devnull while((c = rcvchar()) == -1){
203 84b1cb73 2003-09-30 devnull block = ~(1<<RHost);
204 84b1cb73 2003-09-30 devnull waitforio();
205 84b1cb73 2003-09-30 devnull block = 0;
206 84b1cb73 2003-09-30 devnull }
207 84b1cb73 2003-09-30 devnull return c;
208 84b1cb73 2003-09-30 devnull }
209 84b1cb73 2003-09-30 devnull
210 84b1cb73 2003-09-30 devnull int
211 84b1cb73 2003-09-30 devnull externchar(void)
212 84b1cb73 2003-09-30 devnull {
213 84b1cb73 2003-09-30 devnull Rune r;
214 84b1cb73 2003-09-30 devnull
215 84b1cb73 2003-09-30 devnull loop:
216 84b1cb73 2003-09-30 devnull if(got & ((1<<RPlumb) & ~block)){
217 84b1cb73 2003-09-30 devnull plumbp += chartorune(&r, (char*)plumbp);
218 84b1cb73 2003-09-30 devnull if(plumbp >= plumbstop){
219 84b1cb73 2003-09-30 devnull got &= ~(1<<RPlumb);
220 84b1cb73 2003-09-30 devnull free(plumbbase);
221 84b1cb73 2003-09-30 devnull }
222 84b1cb73 2003-09-30 devnull if(r == 0)
223 84b1cb73 2003-09-30 devnull goto loop;
224 84b1cb73 2003-09-30 devnull return r;
225 84b1cb73 2003-09-30 devnull }
226 84b1cb73 2003-09-30 devnull return -1;
227 84b1cb73 2003-09-30 devnull }
228 84b1cb73 2003-09-30 devnull
229 84b1cb73 2003-09-30 devnull int kpeekc = -1;
230 84b1cb73 2003-09-30 devnull int
231 84b1cb73 2003-09-30 devnull ecankbd(void)
232 84b1cb73 2003-09-30 devnull {
233 84b1cb73 2003-09-30 devnull Rune r;
234 84b1cb73 2003-09-30 devnull
235 84b1cb73 2003-09-30 devnull if(kpeekc >= 0)
236 84b1cb73 2003-09-30 devnull return 1;
237 84b1cb73 2003-09-30 devnull if(nbrecv(keyboardctl->c, &r) > 0){
238 84b1cb73 2003-09-30 devnull kpeekc = r;
239 84b1cb73 2003-09-30 devnull return 1;
240 84b1cb73 2003-09-30 devnull }
241 84b1cb73 2003-09-30 devnull return 0;
242 84b1cb73 2003-09-30 devnull }
243 84b1cb73 2003-09-30 devnull
244 84b1cb73 2003-09-30 devnull int
245 84b1cb73 2003-09-30 devnull ekbd(void)
246 84b1cb73 2003-09-30 devnull {
247 84b1cb73 2003-09-30 devnull int c;
248 84b1cb73 2003-09-30 devnull Rune r;
249 84b1cb73 2003-09-30 devnull
250 84b1cb73 2003-09-30 devnull if(kpeekc >= 0){
251 84b1cb73 2003-09-30 devnull c = kpeekc;
252 84b1cb73 2003-09-30 devnull kpeekc = -1;
253 84b1cb73 2003-09-30 devnull return c;
254 84b1cb73 2003-09-30 devnull }
255 84b1cb73 2003-09-30 devnull if(recv(keyboardctl->c, &r) < 0){
256 84b1cb73 2003-09-30 devnull fprint(2, "samterm: keybard recv error: %r\n");
257 84b1cb73 2003-09-30 devnull panic("kbd");
258 84b1cb73 2003-09-30 devnull }
259 84b1cb73 2003-09-30 devnull return r;
260 84b1cb73 2003-09-30 devnull }
261 84b1cb73 2003-09-30 devnull
262 84b1cb73 2003-09-30 devnull int
263 84b1cb73 2003-09-30 devnull kbdchar(void)
264 84b1cb73 2003-09-30 devnull {
265 d27787fb 2005-03-18 devnull int c, i;
266 84b1cb73 2003-09-30 devnull
267 84b1cb73 2003-09-30 devnull c = externchar();
268 84b1cb73 2003-09-30 devnull if(c > 0)
269 84b1cb73 2003-09-30 devnull return c;
270 84b1cb73 2003-09-30 devnull if(got & (1<<RKeyboard)){
271 84b1cb73 2003-09-30 devnull c = kbdc;
272 84b1cb73 2003-09-30 devnull kbdc = -1;
273 84b1cb73 2003-09-30 devnull got &= ~(1<<RKeyboard);
274 84b1cb73 2003-09-30 devnull return c;
275 84b1cb73 2003-09-30 devnull }
276 84b1cb73 2003-09-30 devnull while(plumbc!=nil && nbrecv(plumbc, &i)>0){
277 84b1cb73 2003-09-30 devnull externload(i);
278 84b1cb73 2003-09-30 devnull c = externchar();
279 84b1cb73 2003-09-30 devnull if(c > 0)
280 84b1cb73 2003-09-30 devnull return c;
281 84b1cb73 2003-09-30 devnull }
282 84b1cb73 2003-09-30 devnull if(!ecankbd())
283 84b1cb73 2003-09-30 devnull return -1;
284 84b1cb73 2003-09-30 devnull return ekbd();
285 84b1cb73 2003-09-30 devnull }
286 84b1cb73 2003-09-30 devnull
287 84b1cb73 2003-09-30 devnull int
288 84b1cb73 2003-09-30 devnull qpeekc(void)
289 84b1cb73 2003-09-30 devnull {
290 84b1cb73 2003-09-30 devnull return kbdc;
291 84b1cb73 2003-09-30 devnull }
292 84b1cb73 2003-09-30 devnull
293 84b1cb73 2003-09-30 devnull int
294 84b1cb73 2003-09-30 devnull RESIZED(void)
295 84b1cb73 2003-09-30 devnull {
296 84b1cb73 2003-09-30 devnull if(resized){
297 84b1cb73 2003-09-30 devnull if(getwindow(display, Refnone) < 0)
298 84b1cb73 2003-09-30 devnull panic("can't reattach to window");
299 84b1cb73 2003-09-30 devnull resized = 0;
300 84b1cb73 2003-09-30 devnull return 1;
301 84b1cb73 2003-09-30 devnull }
302 84b1cb73 2003-09-30 devnull return 0;
303 84b1cb73 2003-09-30 devnull }