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"
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;
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*);
32 84b1cb73 2003-09-30 devnull initio(void)
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");
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");
46 84b1cb73 2003-09-30 devnull hoststart();
47 84b1cb73 2003-09-30 devnull if(plumbstart() < 0)
48 84b1cb73 2003-09-30 devnull extstart();
52 84b1cb73 2003-09-30 devnull getmouse(void)
54 84b1cb73 2003-09-30 devnull if(readmouse(mousectl) < 0)
55 84b1cb73 2003-09-30 devnull panic("mouse");
59 84b1cb73 2003-09-30 devnull mouseunblock(void)
61 84b1cb73 2003-09-30 devnull got &= ~(1<<RMouse);
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);
71 84b1cb73 2003-09-30 devnull button(int but)
73 84b1cb73 2003-09-30 devnull getmouse();
74 84b1cb73 2003-09-30 devnull return mousep->buttons&(1<<(but-1));
78 84b1cb73 2003-09-30 devnull externload(int i)
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)
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;
91 84b1cb73 2003-09-30 devnull waitforio(void)
93 84b1cb73 2003-09-30 devnull Alt alts[NRes+1];
96 84b1cb73 2003-09-30 devnull ulong type;
100 84b1cb73 2003-09-30 devnull alts[RPlumb].c = plumbc;
101 84b1cb73 2003-09-30 devnull alts[RPlumb].v = &i;
102 84b1cb73 2003-09-30 devnull alts[RPlumb].op = CHANRCV;
103 84b1cb73 2003-09-30 devnull if((block & (1<<RPlumb)) || plumbc == nil)
104 84b1cb73 2003-09-30 devnull alts[RPlumb].op = CHANNOP;
106 84b1cb73 2003-09-30 devnull alts[RHost].c = hostc;
107 84b1cb73 2003-09-30 devnull alts[RHost].v = &i;
108 84b1cb73 2003-09-30 devnull alts[RHost].op = CHANRCV;
109 84b1cb73 2003-09-30 devnull if(block & (1<<RHost))
110 84b1cb73 2003-09-30 devnull alts[RHost].op = CHANNOP;
112 84b1cb73 2003-09-30 devnull alts[RKeyboard].c = keyboardctl->c;
113 84b1cb73 2003-09-30 devnull alts[RKeyboard].v = &r;
114 84b1cb73 2003-09-30 devnull alts[RKeyboard].op = CHANRCV;
115 84b1cb73 2003-09-30 devnull if(block & (1<<RKeyboard))
116 84b1cb73 2003-09-30 devnull alts[RKeyboard].op = CHANNOP;
118 84b1cb73 2003-09-30 devnull alts[RMouse].c = mousectl->c;
119 84b1cb73 2003-09-30 devnull alts[RMouse].v = &mousectl->m;
120 84b1cb73 2003-09-30 devnull alts[RMouse].op = CHANRCV;
121 84b1cb73 2003-09-30 devnull if(block & (1<<RMouse))
122 84b1cb73 2003-09-30 devnull alts[RMouse].op = CHANNOP;
124 84b1cb73 2003-09-30 devnull alts[RResize].c = mousectl->resizec;
125 84b1cb73 2003-09-30 devnull alts[RResize].v = nil;
126 84b1cb73 2003-09-30 devnull alts[RResize].op = CHANRCV;
127 84b1cb73 2003-09-30 devnull if(block & (1<<RResize))
128 84b1cb73 2003-09-30 devnull alts[RResize].op = CHANNOP;
130 84b1cb73 2003-09-30 devnull alts[NRes].op = CHANEND;
132 84b1cb73 2003-09-30 devnull if(got & ~block)
133 84b1cb73 2003-09-30 devnull return got & ~block;
134 84b1cb73 2003-09-30 devnull flushimage(display, 1);
135 84b1cb73 2003-09-30 devnull type = alt(alts);
136 84b1cb73 2003-09-30 devnull switch(type){
137 84b1cb73 2003-09-30 devnull case RHost:
138 84b1cb73 2003-09-30 devnull hostp = hostbuf[i].data;
139 84b1cb73 2003-09-30 devnull hoststop = hostbuf[i].data + hostbuf[i].n;
140 84b1cb73 2003-09-30 devnull block = 0;
142 84b1cb73 2003-09-30 devnull case RPlumb:
143 84b1cb73 2003-09-30 devnull externload(i);
145 84b1cb73 2003-09-30 devnull case RKeyboard:
146 84b1cb73 2003-09-30 devnull kbdc = r;
148 84b1cb73 2003-09-30 devnull case RMouse:
150 84b1cb73 2003-09-30 devnull case RResize:
151 84b1cb73 2003-09-30 devnull resized = 1;
152 84b1cb73 2003-09-30 devnull /* do the resize in line if we've finished initializing and we're not in a blocking state */
153 84b1cb73 2003-09-30 devnull if(hasunlocked && block==0 && RESIZED())
154 84b1cb73 2003-09-30 devnull resize();
155 84b1cb73 2003-09-30 devnull goto again;
157 84b1cb73 2003-09-30 devnull got |= 1<<type;
158 84b1cb73 2003-09-30 devnull return got;
162 84b1cb73 2003-09-30 devnull rcvchar(void)
166 84b1cb73 2003-09-30 devnull if(!(got & (1<<RHost)))
167 84b1cb73 2003-09-30 devnull return -1;
168 84b1cb73 2003-09-30 devnull c = *hostp++;
169 84b1cb73 2003-09-30 devnull if(hostp == hoststop)
170 84b1cb73 2003-09-30 devnull got &= ~(1<<RHost);
171 84b1cb73 2003-09-30 devnull return c;
175 84b1cb73 2003-09-30 devnull rcvstring(void)
177 84b1cb73 2003-09-30 devnull *hoststop = 0;
178 84b1cb73 2003-09-30 devnull got &= ~(1<<RHost);
179 84b1cb73 2003-09-30 devnull return (char*)hostp;
183 84b1cb73 2003-09-30 devnull getch(void)
187 84b1cb73 2003-09-30 devnull while((c = rcvchar()) == -1){
188 84b1cb73 2003-09-30 devnull block = ~(1<<RHost);
189 84b1cb73 2003-09-30 devnull waitforio();
190 84b1cb73 2003-09-30 devnull block = 0;
192 84b1cb73 2003-09-30 devnull return c;
196 84b1cb73 2003-09-30 devnull externchar(void)
201 84b1cb73 2003-09-30 devnull if(got & ((1<<RPlumb) & ~block)){
202 84b1cb73 2003-09-30 devnull plumbp += chartorune(&r, (char*)plumbp);
203 84b1cb73 2003-09-30 devnull if(plumbp >= plumbstop){
204 84b1cb73 2003-09-30 devnull got &= ~(1<<RPlumb);
205 84b1cb73 2003-09-30 devnull free(plumbbase);
207 84b1cb73 2003-09-30 devnull if(r == 0)
208 84b1cb73 2003-09-30 devnull goto loop;
209 84b1cb73 2003-09-30 devnull return r;
211 84b1cb73 2003-09-30 devnull return -1;
214 84b1cb73 2003-09-30 devnull int kpeekc = -1;
216 84b1cb73 2003-09-30 devnull ecankbd(void)
220 84b1cb73 2003-09-30 devnull if(kpeekc >= 0)
221 84b1cb73 2003-09-30 devnull return 1;
222 84b1cb73 2003-09-30 devnull if(nbrecv(keyboardctl->c, &r) > 0){
223 84b1cb73 2003-09-30 devnull kpeekc = r;
224 84b1cb73 2003-09-30 devnull return 1;
226 84b1cb73 2003-09-30 devnull return 0;
230 84b1cb73 2003-09-30 devnull ekbd(void)
235 84b1cb73 2003-09-30 devnull if(kpeekc >= 0){
236 84b1cb73 2003-09-30 devnull c = kpeekc;
237 84b1cb73 2003-09-30 devnull kpeekc = -1;
238 84b1cb73 2003-09-30 devnull return c;
240 84b1cb73 2003-09-30 devnull if(recv(keyboardctl->c, &r) < 0){
241 84b1cb73 2003-09-30 devnull fprint(2, "samterm: keybard recv error: %r\n");
242 84b1cb73 2003-09-30 devnull panic("kbd");
244 84b1cb73 2003-09-30 devnull return r;
248 84b1cb73 2003-09-30 devnull kbdchar(void)
250 941c9f36 2003-10-11 devnull int i, c;
252 84b1cb73 2003-09-30 devnull c = externchar();
253 84b1cb73 2003-09-30 devnull if(c > 0)
254 84b1cb73 2003-09-30 devnull return c;
255 84b1cb73 2003-09-30 devnull if(got & (1<<RKeyboard)){
256 84b1cb73 2003-09-30 devnull c = kbdc;
257 84b1cb73 2003-09-30 devnull kbdc = -1;
258 84b1cb73 2003-09-30 devnull got &= ~(1<<RKeyboard);
259 84b1cb73 2003-09-30 devnull return c;
261 84b1cb73 2003-09-30 devnull while(plumbc!=nil && nbrecv(plumbc, &i)>0){
262 84b1cb73 2003-09-30 devnull externload(i);
263 84b1cb73 2003-09-30 devnull c = externchar();
264 84b1cb73 2003-09-30 devnull if(c > 0)
265 84b1cb73 2003-09-30 devnull return c;
267 84b1cb73 2003-09-30 devnull if(!ecankbd())
268 84b1cb73 2003-09-30 devnull return -1;
269 84b1cb73 2003-09-30 devnull return ekbd();
273 84b1cb73 2003-09-30 devnull qpeekc(void)
275 84b1cb73 2003-09-30 devnull return kbdc;
279 84b1cb73 2003-09-30 devnull RESIZED(void)
281 84b1cb73 2003-09-30 devnull if(resized){
282 84b1cb73 2003-09-30 devnull if(getwindow(display, Refnone) < 0)
283 84b1cb73 2003-09-30 devnull panic("can't reattach to window");
284 84b1cb73 2003-09-30 devnull resized = 0;
285 84b1cb73 2003-09-30 devnull return 1;
287 84b1cb73 2003-09-30 devnull return 0;