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