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
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;
105 84b1cb73 2003-09-30 devnull
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;
111 84b1cb73 2003-09-30 devnull
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;
117 84b1cb73 2003-09-30 devnull
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;
123 84b1cb73 2003-09-30 devnull
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;
129 84b1cb73 2003-09-30 devnull
130 84b1cb73 2003-09-30 devnull alts[NRes].op = CHANEND;
131 84b1cb73 2003-09-30 devnull
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;
141 84b1cb73 2003-09-30 devnull break;
142 84b1cb73 2003-09-30 devnull case RPlumb:
143 84b1cb73 2003-09-30 devnull externload(i);
144 84b1cb73 2003-09-30 devnull break;
145 84b1cb73 2003-09-30 devnull case RKeyboard:
146 84b1cb73 2003-09-30 devnull kbdc = r;
147 84b1cb73 2003-09-30 devnull break;
148 84b1cb73 2003-09-30 devnull case RMouse:
149 84b1cb73 2003-09-30 devnull break;
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;
156 84b1cb73 2003-09-30 devnull }
157 84b1cb73 2003-09-30 devnull got |= 1<<type;
158 84b1cb73 2003-09-30 devnull return got;
159 84b1cb73 2003-09-30 devnull }
160 84b1cb73 2003-09-30 devnull
161 84b1cb73 2003-09-30 devnull int
162 84b1cb73 2003-09-30 devnull rcvchar(void)
163 84b1cb73 2003-09-30 devnull {
164 84b1cb73 2003-09-30 devnull int c;
165 84b1cb73 2003-09-30 devnull
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;
172 84b1cb73 2003-09-30 devnull }
173 84b1cb73 2003-09-30 devnull
174 84b1cb73 2003-09-30 devnull char*
175 84b1cb73 2003-09-30 devnull rcvstring(void)
176 84b1cb73 2003-09-30 devnull {
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;
180 84b1cb73 2003-09-30 devnull }
181 84b1cb73 2003-09-30 devnull
182 84b1cb73 2003-09-30 devnull int
183 84b1cb73 2003-09-30 devnull getch(void)
184 84b1cb73 2003-09-30 devnull {
185 84b1cb73 2003-09-30 devnull int c;
186 84b1cb73 2003-09-30 devnull
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;
191 84b1cb73 2003-09-30 devnull }
192 84b1cb73 2003-09-30 devnull return c;
193 84b1cb73 2003-09-30 devnull }
194 84b1cb73 2003-09-30 devnull
195 84b1cb73 2003-09-30 devnull int
196 84b1cb73 2003-09-30 devnull externchar(void)
197 84b1cb73 2003-09-30 devnull {
198 84b1cb73 2003-09-30 devnull Rune r;
199 84b1cb73 2003-09-30 devnull
200 84b1cb73 2003-09-30 devnull loop:
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);
206 84b1cb73 2003-09-30 devnull }
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;
210 84b1cb73 2003-09-30 devnull }
211 84b1cb73 2003-09-30 devnull return -1;
212 84b1cb73 2003-09-30 devnull }
213 84b1cb73 2003-09-30 devnull
214 84b1cb73 2003-09-30 devnull int kpeekc = -1;
215 84b1cb73 2003-09-30 devnull int
216 84b1cb73 2003-09-30 devnull ecankbd(void)
217 84b1cb73 2003-09-30 devnull {
218 84b1cb73 2003-09-30 devnull Rune r;
219 84b1cb73 2003-09-30 devnull
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;
225 84b1cb73 2003-09-30 devnull }
226 84b1cb73 2003-09-30 devnull return 0;
227 84b1cb73 2003-09-30 devnull }
228 84b1cb73 2003-09-30 devnull
229 84b1cb73 2003-09-30 devnull int
230 84b1cb73 2003-09-30 devnull ekbd(void)
231 84b1cb73 2003-09-30 devnull {
232 84b1cb73 2003-09-30 devnull int c;
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 c = kpeekc;
237 84b1cb73 2003-09-30 devnull kpeekc = -1;
238 84b1cb73 2003-09-30 devnull return c;
239 84b1cb73 2003-09-30 devnull }
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");
243 84b1cb73 2003-09-30 devnull }
244 84b1cb73 2003-09-30 devnull return r;
245 84b1cb73 2003-09-30 devnull }
246 84b1cb73 2003-09-30 devnull
247 84b1cb73 2003-09-30 devnull int
248 84b1cb73 2003-09-30 devnull kbdchar(void)
249 84b1cb73 2003-09-30 devnull {
250 941c9f36 2003-10-11 devnull int i, c;
251 84b1cb73 2003-09-30 devnull
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;
260 84b1cb73 2003-09-30 devnull }
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;
266 84b1cb73 2003-09-30 devnull }
267 84b1cb73 2003-09-30 devnull if(!ecankbd())
268 84b1cb73 2003-09-30 devnull return -1;
269 84b1cb73 2003-09-30 devnull return ekbd();
270 84b1cb73 2003-09-30 devnull }
271 84b1cb73 2003-09-30 devnull
272 84b1cb73 2003-09-30 devnull int
273 84b1cb73 2003-09-30 devnull qpeekc(void)
274 84b1cb73 2003-09-30 devnull {
275 84b1cb73 2003-09-30 devnull return kbdc;
276 84b1cb73 2003-09-30 devnull }
277 84b1cb73 2003-09-30 devnull
278 84b1cb73 2003-09-30 devnull int
279 84b1cb73 2003-09-30 devnull RESIZED(void)
280 84b1cb73 2003-09-30 devnull {
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;
286 84b1cb73 2003-09-30 devnull }
287 84b1cb73 2003-09-30 devnull return 0;
288 84b1cb73 2003-09-30 devnull }