Blame


1 9142d362 2008-06-30 rsc /*
2 9142d362 2008-06-30 rsc * Window system protocol server.
3 9142d362 2008-06-30 rsc */
4 9142d362 2008-06-30 rsc
5 9142d362 2008-06-30 rsc #include <u.h>
6 9142d362 2008-06-30 rsc #include <errno.h>
7 9142d362 2008-06-30 rsc #include <sys/select.h>
8 9142d362 2008-06-30 rsc #include <libc.h>
9 9142d362 2008-06-30 rsc #include <thread.h>
10 9142d362 2008-06-30 rsc #include <draw.h>
11 9142d362 2008-06-30 rsc #include <memdraw.h>
12 9142d362 2008-06-30 rsc #include <memlayer.h>
13 9142d362 2008-06-30 rsc #include <keyboard.h>
14 9142d362 2008-06-30 rsc #include <mouse.h>
15 9142d362 2008-06-30 rsc #include <cursor.h>
16 9142d362 2008-06-30 rsc #include <drawfcall.h>
17 9142d362 2008-06-30 rsc #include "osx-screen.h"
18 9142d362 2008-06-30 rsc #include "devdraw.h"
19 9142d362 2008-06-30 rsc
20 9142d362 2008-06-30 rsc #undef time
21 9142d362 2008-06-30 rsc
22 9142d362 2008-06-30 rsc #define MouseMask (\
23 9142d362 2008-06-30 rsc ButtonPressMask|\
24 9142d362 2008-06-30 rsc ButtonReleaseMask|\
25 9142d362 2008-06-30 rsc PointerMotionMask|\
26 9142d362 2008-06-30 rsc Button1MotionMask|\
27 9142d362 2008-06-30 rsc Button2MotionMask|\
28 9142d362 2008-06-30 rsc Button3MotionMask)
29 9142d362 2008-06-30 rsc
30 9142d362 2008-06-30 rsc #define Mask MouseMask|ExposureMask|StructureNotifyMask|KeyPressMask|EnterWindowMask|LeaveWindowMask
31 9142d362 2008-06-30 rsc
32 9142d362 2008-06-30 rsc typedef struct Kbdbuf Kbdbuf;
33 9142d362 2008-06-30 rsc typedef struct Mousebuf Mousebuf;
34 9142d362 2008-06-30 rsc typedef struct Fdbuf Fdbuf;
35 9142d362 2008-06-30 rsc typedef struct Tagbuf Tagbuf;
36 9142d362 2008-06-30 rsc
37 9142d362 2008-06-30 rsc struct Kbdbuf
38 9142d362 2008-06-30 rsc {
39 9142d362 2008-06-30 rsc Rune r[32];
40 9142d362 2008-06-30 rsc int ri;
41 9142d362 2008-06-30 rsc int wi;
42 9142d362 2008-06-30 rsc int stall;
43 9142d362 2008-06-30 rsc };
44 9142d362 2008-06-30 rsc
45 9142d362 2008-06-30 rsc struct Mousebuf
46 9142d362 2008-06-30 rsc {
47 9142d362 2008-06-30 rsc Mouse m[32];
48 1f74e1b7 2008-07-10 rsc Mouse last;
49 9142d362 2008-06-30 rsc int ri;
50 9142d362 2008-06-30 rsc int wi;
51 9142d362 2008-06-30 rsc int stall;
52 9142d362 2008-06-30 rsc };
53 9142d362 2008-06-30 rsc
54 9142d362 2008-06-30 rsc struct Tagbuf
55 9142d362 2008-06-30 rsc {
56 9142d362 2008-06-30 rsc int t[32];
57 9142d362 2008-06-30 rsc int ri;
58 9142d362 2008-06-30 rsc int wi;
59 9142d362 2008-06-30 rsc };
60 9142d362 2008-06-30 rsc
61 9142d362 2008-06-30 rsc Kbdbuf kbd;
62 9142d362 2008-06-30 rsc Mousebuf mouse;
63 9142d362 2008-06-30 rsc Tagbuf kbdtags;
64 9142d362 2008-06-30 rsc Tagbuf mousetags;
65 9142d362 2008-06-30 rsc
66 9142d362 2008-06-30 rsc void fdslide(Fdbuf*);
67 9142d362 2008-06-30 rsc void runmsg(Wsysmsg*);
68 9142d362 2008-06-30 rsc void replymsg(Wsysmsg*);
69 9142d362 2008-06-30 rsc void matchkbd(void);
70 9142d362 2008-06-30 rsc void matchmouse(void);
71 9142d362 2008-06-30 rsc int fdnoblock(int);
72 9142d362 2008-06-30 rsc Rectangle mouserect;
73 9142d362 2008-06-30 rsc int mouseresized;
74 9142d362 2008-06-30 rsc
75 9142d362 2008-06-30 rsc
76 9142d362 2008-06-30 rsc QLock lk;
77 9142d362 2008-06-30 rsc void
78 9142d362 2008-06-30 rsc zlock(void)
79 9142d362 2008-06-30 rsc {
80 9142d362 2008-06-30 rsc qlock(&lk);
81 9142d362 2008-06-30 rsc }
82 9142d362 2008-06-30 rsc
83 9142d362 2008-06-30 rsc void
84 9142d362 2008-06-30 rsc zunlock(void)
85 9142d362 2008-06-30 rsc {
86 9142d362 2008-06-30 rsc qunlock(&lk);
87 9142d362 2008-06-30 rsc }
88 9142d362 2008-06-30 rsc
89 9142d362 2008-06-30 rsc int chatty;
90 9142d362 2008-06-30 rsc int drawsleep;
91 9142d362 2008-06-30 rsc int trace;
92 100ec44e 2010-01-04 rsc int multitouch = 1;
93 9142d362 2008-06-30 rsc
94 9142d362 2008-06-30 rsc void
95 9142d362 2008-06-30 rsc usage(void)
96 9142d362 2008-06-30 rsc {
97 9142d362 2008-06-30 rsc fprint(2, "usage: devdraw (don't run directly)\n");
98 9142d362 2008-06-30 rsc threadexitsall("usage");
99 9142d362 2008-06-30 rsc }
100 9142d362 2008-06-30 rsc
101 9142d362 2008-06-30 rsc void
102 9142d362 2008-06-30 rsc bell(void *v, char *msg)
103 9142d362 2008-06-30 rsc {
104 9142d362 2008-06-30 rsc if(strcmp(msg, "alarm") == 0)
105 9142d362 2008-06-30 rsc drawsleep = drawsleep ? 0 : 1000;
106 9142d362 2008-06-30 rsc noted(NCONT);
107 9142d362 2008-06-30 rsc }
108 9142d362 2008-06-30 rsc
109 9142d362 2008-06-30 rsc void
110 9142d362 2008-06-30 rsc threadmain(int argc, char **argv)
111 9142d362 2008-06-30 rsc {
112 9142d362 2008-06-30 rsc uchar buf[4], *mbuf;
113 9142d362 2008-06-30 rsc int nmbuf, n, nn;
114 9142d362 2008-06-30 rsc Wsysmsg m;
115 9142d362 2008-06-30 rsc
116 9142d362 2008-06-30 rsc /*
117 9142d362 2008-06-30 rsc * Move the protocol off stdin/stdout so that
118 9142d362 2008-06-30 rsc * any inadvertent prints don't screw things up.
119 9142d362 2008-06-30 rsc */
120 9142d362 2008-06-30 rsc dup(0, 3);
121 9142d362 2008-06-30 rsc dup(1, 4);
122 9142d362 2008-06-30 rsc close(0);
123 9142d362 2008-06-30 rsc close(1);
124 9142d362 2008-06-30 rsc open("/dev/null", OREAD);
125 9142d362 2008-06-30 rsc open("/dev/null", OWRITE);
126 9142d362 2008-06-30 rsc
127 9142d362 2008-06-30 rsc //trace = 1;
128 9142d362 2008-06-30 rsc fmtinstall('W', drawfcallfmt);
129 9142d362 2008-06-30 rsc
130 9142d362 2008-06-30 rsc ARGBEGIN{
131 9142d362 2008-06-30 rsc case 'D':
132 9142d362 2008-06-30 rsc chatty++;
133 100ec44e 2010-01-04 rsc break;
134 100ec44e 2010-01-04 rsc case 'M':
135 100ec44e 2010-01-04 rsc multitouch = 0;
136 9142d362 2008-06-30 rsc break;
137 9142d362 2008-06-30 rsc default:
138 9142d362 2008-06-30 rsc usage();
139 9142d362 2008-06-30 rsc }ARGEND
140 9142d362 2008-06-30 rsc
141 9142d362 2008-06-30 rsc /*
142 9142d362 2008-06-30 rsc * Ignore arguments. They're only for good ps -a listings.
143 9142d362 2008-06-30 rsc */
144 9142d362 2008-06-30 rsc
145 9142d362 2008-06-30 rsc notify(bell);
146 9142d362 2008-06-30 rsc
147 9142d362 2008-06-30 rsc mbuf = nil;
148 9142d362 2008-06-30 rsc nmbuf = 0;
149 9142d362 2008-06-30 rsc while((n = read(3, buf, 4)) == 4){
150 9142d362 2008-06-30 rsc GET(buf, n);
151 9142d362 2008-06-30 rsc if(n > nmbuf){
152 9142d362 2008-06-30 rsc free(mbuf);
153 9142d362 2008-06-30 rsc mbuf = malloc(4+n);
154 9142d362 2008-06-30 rsc if(mbuf == nil)
155 9142d362 2008-06-30 rsc sysfatal("malloc: %r");
156 9142d362 2008-06-30 rsc nmbuf = n;
157 9142d362 2008-06-30 rsc }
158 9142d362 2008-06-30 rsc memmove(mbuf, buf, 4);
159 9142d362 2008-06-30 rsc nn = readn(3, mbuf+4, n-4);
160 9142d362 2008-06-30 rsc if(nn != n-4)
161 9142d362 2008-06-30 rsc sysfatal("eof during message");
162 9142d362 2008-06-30 rsc
163 9142d362 2008-06-30 rsc /* pick off messages one by one */
164 9142d362 2008-06-30 rsc if(convM2W(mbuf, nn+4, &m) <= 0)
165 9142d362 2008-06-30 rsc sysfatal("cannot convert message");
166 9142d362 2008-06-30 rsc if(trace) fprint(2, "<- %W\n", &m);
167 9142d362 2008-06-30 rsc runmsg(&m);
168 9142d362 2008-06-30 rsc }
169 9142d362 2008-06-30 rsc threadexitsall(0);
170 9142d362 2008-06-30 rsc }
171 9142d362 2008-06-30 rsc
172 9142d362 2008-06-30 rsc void
173 9142d362 2008-06-30 rsc replyerror(Wsysmsg *m)
174 9142d362 2008-06-30 rsc {
175 9142d362 2008-06-30 rsc char err[256];
176 9142d362 2008-06-30 rsc
177 9142d362 2008-06-30 rsc rerrstr(err, sizeof err);
178 9142d362 2008-06-30 rsc m->type = Rerror;
179 9142d362 2008-06-30 rsc m->error = err;
180 9142d362 2008-06-30 rsc replymsg(m);
181 9142d362 2008-06-30 rsc }
182 9142d362 2008-06-30 rsc
183 9142d362 2008-06-30 rsc /*
184 9142d362 2008-06-30 rsc * Handle a single wsysmsg.
185 9142d362 2008-06-30 rsc * Might queue for later (kbd, mouse read)
186 9142d362 2008-06-30 rsc */
187 9142d362 2008-06-30 rsc void
188 9142d362 2008-06-30 rsc runmsg(Wsysmsg *m)
189 9142d362 2008-06-30 rsc {
190 9142d362 2008-06-30 rsc static uchar buf[65536];
191 9142d362 2008-06-30 rsc int n;
192 9142d362 2008-06-30 rsc Memimage *i;
193 9142d362 2008-06-30 rsc
194 9142d362 2008-06-30 rsc switch(m->type){
195 9142d362 2008-06-30 rsc case Tinit:
196 9142d362 2008-06-30 rsc memimageinit();
197 9142d362 2008-06-30 rsc i = attachscreen(m->label, m->winsize);
198 9142d362 2008-06-30 rsc _initdisplaymemimage(i);
199 9142d362 2008-06-30 rsc replymsg(m);
200 9142d362 2008-06-30 rsc break;
201 9142d362 2008-06-30 rsc
202 9142d362 2008-06-30 rsc case Trdmouse:
203 9142d362 2008-06-30 rsc zlock();
204 9142d362 2008-06-30 rsc mousetags.t[mousetags.wi++] = m->tag;
205 9142d362 2008-06-30 rsc if(mousetags.wi == nelem(mousetags.t))
206 9142d362 2008-06-30 rsc mousetags.wi = 0;
207 9142d362 2008-06-30 rsc if(mousetags.wi == mousetags.ri)
208 9142d362 2008-06-30 rsc sysfatal("too many queued mouse reads");
209 9142d362 2008-06-30 rsc mouse.stall = 0;
210 9142d362 2008-06-30 rsc matchmouse();
211 9142d362 2008-06-30 rsc zunlock();
212 9142d362 2008-06-30 rsc break;
213 9142d362 2008-06-30 rsc
214 9142d362 2008-06-30 rsc case Trdkbd:
215 9142d362 2008-06-30 rsc zlock();
216 9142d362 2008-06-30 rsc kbdtags.t[kbdtags.wi++] = m->tag;
217 9142d362 2008-06-30 rsc if(kbdtags.wi == nelem(kbdtags.t))
218 9142d362 2008-06-30 rsc kbdtags.wi = 0;
219 9142d362 2008-06-30 rsc if(kbdtags.wi == kbdtags.ri)
220 9142d362 2008-06-30 rsc sysfatal("too many queued keyboard reads");
221 9142d362 2008-06-30 rsc kbd.stall = 0;
222 9142d362 2008-06-30 rsc matchkbd();
223 9142d362 2008-06-30 rsc zunlock();
224 9142d362 2008-06-30 rsc break;
225 9142d362 2008-06-30 rsc
226 9142d362 2008-06-30 rsc case Tmoveto:
227 9142d362 2008-06-30 rsc setmouse(m->mouse.xy);
228 9142d362 2008-06-30 rsc replymsg(m);
229 9142d362 2008-06-30 rsc break;
230 9142d362 2008-06-30 rsc
231 9142d362 2008-06-30 rsc case Tcursor:
232 9142d362 2008-06-30 rsc if(m->arrowcursor)
233 9142d362 2008-06-30 rsc setcursor(nil);
234 9142d362 2008-06-30 rsc else
235 9142d362 2008-06-30 rsc setcursor(&m->cursor);
236 9142d362 2008-06-30 rsc replymsg(m);
237 9142d362 2008-06-30 rsc break;
238 9142d362 2008-06-30 rsc
239 9142d362 2008-06-30 rsc case Tbouncemouse:
240 9142d362 2008-06-30 rsc // _xbouncemouse(&m->mouse);
241 9142d362 2008-06-30 rsc replymsg(m);
242 9142d362 2008-06-30 rsc break;
243 9142d362 2008-06-30 rsc
244 9142d362 2008-06-30 rsc case Tlabel:
245 4a34106c 2009-06-16 rsc kicklabel(m->label);
246 9142d362 2008-06-30 rsc replymsg(m);
247 9142d362 2008-06-30 rsc break;
248 9142d362 2008-06-30 rsc
249 9142d362 2008-06-30 rsc case Trdsnarf:
250 9142d362 2008-06-30 rsc m->snarf = getsnarf();
251 9142d362 2008-06-30 rsc replymsg(m);
252 9142d362 2008-06-30 rsc free(m->snarf);
253 9142d362 2008-06-30 rsc break;
254 9142d362 2008-06-30 rsc
255 9142d362 2008-06-30 rsc case Twrsnarf:
256 9142d362 2008-06-30 rsc putsnarf(m->snarf);
257 9142d362 2008-06-30 rsc replymsg(m);
258 9142d362 2008-06-30 rsc break;
259 9142d362 2008-06-30 rsc
260 9142d362 2008-06-30 rsc case Trddraw:
261 9142d362 2008-06-30 rsc n = m->count;
262 9142d362 2008-06-30 rsc if(n > sizeof buf)
263 9142d362 2008-06-30 rsc n = sizeof buf;
264 9142d362 2008-06-30 rsc n = _drawmsgread(buf, n);
265 9142d362 2008-06-30 rsc if(n < 0)
266 9142d362 2008-06-30 rsc replyerror(m);
267 9142d362 2008-06-30 rsc else{
268 9142d362 2008-06-30 rsc m->count = n;
269 9142d362 2008-06-30 rsc m->data = buf;
270 9142d362 2008-06-30 rsc replymsg(m);
271 9142d362 2008-06-30 rsc }
272 9142d362 2008-06-30 rsc break;
273 9142d362 2008-06-30 rsc
274 9142d362 2008-06-30 rsc case Twrdraw:
275 9142d362 2008-06-30 rsc if(_drawmsgwrite(m->data, m->count) < 0)
276 9142d362 2008-06-30 rsc replyerror(m);
277 9142d362 2008-06-30 rsc else
278 9142d362 2008-06-30 rsc replymsg(m);
279 9142d362 2008-06-30 rsc break;
280 9142d362 2008-06-30 rsc
281 9142d362 2008-06-30 rsc case Ttop:
282 9142d362 2008-06-30 rsc // _xtopwindow();
283 9142d362 2008-06-30 rsc replymsg(m);
284 9142d362 2008-06-30 rsc break;
285 9142d362 2008-06-30 rsc
286 9142d362 2008-06-30 rsc case Tresize:
287 9142d362 2008-06-30 rsc // _xresizewindow(m->rect);
288 9142d362 2008-06-30 rsc replymsg(m);
289 9142d362 2008-06-30 rsc break;
290 9142d362 2008-06-30 rsc }
291 9142d362 2008-06-30 rsc }
292 9142d362 2008-06-30 rsc
293 9142d362 2008-06-30 rsc /*
294 9142d362 2008-06-30 rsc * Reply to m.
295 9142d362 2008-06-30 rsc */
296 607880ce 2008-10-08 rsc QLock replylock;
297 9142d362 2008-06-30 rsc void
298 9142d362 2008-06-30 rsc replymsg(Wsysmsg *m)
299 9142d362 2008-06-30 rsc {
300 9142d362 2008-06-30 rsc int n;
301 9142d362 2008-06-30 rsc static uchar *mbuf;
302 9142d362 2008-06-30 rsc static int nmbuf;
303 9142d362 2008-06-30 rsc
304 9142d362 2008-06-30 rsc /* T -> R msg */
305 9142d362 2008-06-30 rsc if(m->type%2 == 0)
306 9142d362 2008-06-30 rsc m->type++;
307 9142d362 2008-06-30 rsc
308 9142d362 2008-06-30 rsc if(trace) fprint(2, "-> %W\n", m);
309 9142d362 2008-06-30 rsc /* copy to output buffer */
310 9142d362 2008-06-30 rsc n = sizeW2M(m);
311 607880ce 2008-10-08 rsc
312 607880ce 2008-10-08 rsc qlock(&replylock);
313 9142d362 2008-06-30 rsc if(n > nmbuf){
314 9142d362 2008-06-30 rsc free(mbuf);
315 9142d362 2008-06-30 rsc mbuf = malloc(n);
316 9142d362 2008-06-30 rsc if(mbuf == nil)
317 9142d362 2008-06-30 rsc sysfatal("out of memory");
318 9142d362 2008-06-30 rsc nmbuf = n;
319 9142d362 2008-06-30 rsc }
320 9142d362 2008-06-30 rsc convW2M(m, mbuf, n);
321 962d5a8b 2008-07-04 rsc if(write(4, mbuf, n) != n)
322 962d5a8b 2008-07-04 rsc sysfatal("write: %r");
323 607880ce 2008-10-08 rsc qunlock(&replylock);
324 9142d362 2008-06-30 rsc }
325 9142d362 2008-06-30 rsc
326 9142d362 2008-06-30 rsc /*
327 9142d362 2008-06-30 rsc * Match queued kbd reads with queued kbd characters.
328 9142d362 2008-06-30 rsc */
329 9142d362 2008-06-30 rsc void
330 9142d362 2008-06-30 rsc matchkbd(void)
331 9142d362 2008-06-30 rsc {
332 9142d362 2008-06-30 rsc Wsysmsg m;
333 9142d362 2008-06-30 rsc
334 9142d362 2008-06-30 rsc if(kbd.stall)
335 9142d362 2008-06-30 rsc return;
336 9142d362 2008-06-30 rsc while(kbd.ri != kbd.wi && kbdtags.ri != kbdtags.wi){
337 9142d362 2008-06-30 rsc m.type = Rrdkbd;
338 9142d362 2008-06-30 rsc m.tag = kbdtags.t[kbdtags.ri++];
339 9142d362 2008-06-30 rsc if(kbdtags.ri == nelem(kbdtags.t))
340 9142d362 2008-06-30 rsc kbdtags.ri = 0;
341 9142d362 2008-06-30 rsc m.rune = kbd.r[kbd.ri++];
342 9142d362 2008-06-30 rsc if(kbd.ri == nelem(kbd.r))
343 9142d362 2008-06-30 rsc kbd.ri = 0;
344 9142d362 2008-06-30 rsc replymsg(&m);
345 9142d362 2008-06-30 rsc }
346 9142d362 2008-06-30 rsc }
347 9142d362 2008-06-30 rsc
348 9142d362 2008-06-30 rsc /*
349 9142d362 2008-06-30 rsc * Match queued mouse reads with queued mouse events.
350 9142d362 2008-06-30 rsc */
351 9142d362 2008-06-30 rsc void
352 9142d362 2008-06-30 rsc matchmouse(void)
353 9142d362 2008-06-30 rsc {
354 9142d362 2008-06-30 rsc Wsysmsg m;
355 9142d362 2008-06-30 rsc
356 9142d362 2008-06-30 rsc while(mouse.ri != mouse.wi && mousetags.ri != mousetags.wi){
357 9142d362 2008-06-30 rsc m.type = Rrdmouse;
358 9142d362 2008-06-30 rsc m.tag = mousetags.t[mousetags.ri++];
359 9142d362 2008-06-30 rsc if(mousetags.ri == nelem(mousetags.t))
360 9142d362 2008-06-30 rsc mousetags.ri = 0;
361 9142d362 2008-06-30 rsc m.mouse = mouse.m[mouse.ri];
362 9142d362 2008-06-30 rsc m.resized = mouseresized;
363 9142d362 2008-06-30 rsc /*
364 9142d362 2008-06-30 rsc if(m.resized)
365 9142d362 2008-06-30 rsc fprint(2, "sending resize\n");
366 9142d362 2008-06-30 rsc */
367 9142d362 2008-06-30 rsc mouseresized = 0;
368 9142d362 2008-06-30 rsc mouse.ri++;
369 9142d362 2008-06-30 rsc if(mouse.ri == nelem(mouse.m))
370 9142d362 2008-06-30 rsc mouse.ri = 0;
371 9142d362 2008-06-30 rsc replymsg(&m);
372 9142d362 2008-06-30 rsc }
373 9142d362 2008-06-30 rsc }
374 9142d362 2008-06-30 rsc
375 9142d362 2008-06-30 rsc void
376 9142d362 2008-06-30 rsc mousetrack(int x, int y, int b, int ms)
377 9142d362 2008-06-30 rsc {
378 9142d362 2008-06-30 rsc Mouse *m;
379 9142d362 2008-06-30 rsc
380 9142d362 2008-06-30 rsc if(x < mouserect.min.x)
381 9142d362 2008-06-30 rsc x = mouserect.min.x;
382 9142d362 2008-06-30 rsc if(x > mouserect.max.x)
383 9142d362 2008-06-30 rsc x = mouserect.max.x;
384 9142d362 2008-06-30 rsc if(y < mouserect.min.y)
385 9142d362 2008-06-30 rsc y = mouserect.min.y;
386 9142d362 2008-06-30 rsc if(y > mouserect.max.y)
387 9142d362 2008-06-30 rsc y = mouserect.max.y;
388 9142d362 2008-06-30 rsc
389 9142d362 2008-06-30 rsc zlock();
390 1f74e1b7 2008-07-10 rsc // If reader has stopped reading, don't bother.
391 1f74e1b7 2008-07-10 rsc // If reader is completely caught up, definitely queue.
392 1f74e1b7 2008-07-10 rsc // Otherwise, queue only button change events.
393 1f74e1b7 2008-07-10 rsc if(!mouse.stall)
394 1f74e1b7 2008-07-10 rsc if(mouse.wi == mouse.ri || mouse.last.buttons != b){
395 1f74e1b7 2008-07-10 rsc m = &mouse.last;
396 1f74e1b7 2008-07-10 rsc m->xy.x = x;
397 1f74e1b7 2008-07-10 rsc m->xy.y = y;
398 1f74e1b7 2008-07-10 rsc m->buttons = b;
399 1f74e1b7 2008-07-10 rsc m->msec = ms;
400 1f74e1b7 2008-07-10 rsc
401 1f74e1b7 2008-07-10 rsc mouse.m[mouse.wi] = *m;
402 1f74e1b7 2008-07-10 rsc if(++mouse.wi == nelem(mouse.m))
403 1f74e1b7 2008-07-10 rsc mouse.wi = 0;
404 1f74e1b7 2008-07-10 rsc if(mouse.wi == mouse.ri){
405 1f74e1b7 2008-07-10 rsc mouse.stall = 1;
406 1f74e1b7 2008-07-10 rsc mouse.ri = 0;
407 1f74e1b7 2008-07-10 rsc mouse.wi = 1;
408 1f74e1b7 2008-07-10 rsc mouse.m[0] = *m;
409 1f74e1b7 2008-07-10 rsc }
410 1f74e1b7 2008-07-10 rsc matchmouse();
411 9142d362 2008-06-30 rsc }
412 9142d362 2008-06-30 rsc zunlock();
413 9142d362 2008-06-30 rsc }
414 81a90f89 2008-07-02 rsc
415 9142d362 2008-06-30 rsc void
416 81a90f89 2008-07-02 rsc kputc(int c)
417 9142d362 2008-06-30 rsc {
418 9142d362 2008-06-30 rsc zlock();
419 9142d362 2008-06-30 rsc kbd.r[kbd.wi++] = c;
420 9142d362 2008-06-30 rsc if(kbd.wi == nelem(kbd.r))
421 9142d362 2008-06-30 rsc kbd.wi = 0;
422 9142d362 2008-06-30 rsc if(kbd.ri == kbd.wi)
423 9142d362 2008-06-30 rsc kbd.stall = 1;
424 9142d362 2008-06-30 rsc matchkbd();
425 9142d362 2008-06-30 rsc zunlock();
426 81a90f89 2008-07-02 rsc }
427 81a90f89 2008-07-02 rsc
428 81a90f89 2008-07-02 rsc void
429 81a90f89 2008-07-02 rsc keystroke(int c)
430 81a90f89 2008-07-02 rsc {
431 81a90f89 2008-07-02 rsc static Rune k[10];
432 81a90f89 2008-07-02 rsc static int alting, nk;
433 81a90f89 2008-07-02 rsc int i;
434 81a90f89 2008-07-02 rsc
435 81a90f89 2008-07-02 rsc if(c == Kalt){
436 81a90f89 2008-07-02 rsc alting = !alting;
437 81a90f89 2008-07-02 rsc return;
438 81a90f89 2008-07-02 rsc }
439 81a90f89 2008-07-02 rsc if(!alting){
440 81a90f89 2008-07-02 rsc kputc(c);
441 81a90f89 2008-07-02 rsc return;
442 81a90f89 2008-07-02 rsc }
443 81a90f89 2008-07-02 rsc if(nk >= nelem(k)) // should not happen
444 81a90f89 2008-07-02 rsc nk = 0;
445 81a90f89 2008-07-02 rsc k[nk++] = c;
446 81a90f89 2008-07-02 rsc c = _latin1(k, nk);
447 81a90f89 2008-07-02 rsc if(c > 0){
448 81a90f89 2008-07-02 rsc alting = 0;
449 81a90f89 2008-07-02 rsc kputc(c);
450 81a90f89 2008-07-02 rsc nk = 0;
451 81a90f89 2008-07-02 rsc return;
452 81a90f89 2008-07-02 rsc }
453 81a90f89 2008-07-02 rsc if(c == -1){
454 81a90f89 2008-07-02 rsc alting = 0;
455 81a90f89 2008-07-02 rsc for(i=0; i<nk; i++)
456 81a90f89 2008-07-02 rsc kputc(k[i]);
457 81a90f89 2008-07-02 rsc nk = 0;
458 81a90f89 2008-07-02 rsc return;
459 81a90f89 2008-07-02 rsc }
460 81a90f89 2008-07-02 rsc // need more input
461 81a90f89 2008-07-02 rsc return;
462 9142d362 2008-06-30 rsc }