2 a287dbab 2011-09-06 rsc * Window system protocol server.
5 a287dbab 2011-09-06 rsc #include <u.h>
6 a287dbab 2011-09-06 rsc #include <libc.h>
7 a287dbab 2011-09-06 rsc #include "cocoa-thread.h"
8 a287dbab 2011-09-06 rsc #include <draw.h>
9 a287dbab 2011-09-06 rsc #include <memdraw.h>
10 a287dbab 2011-09-06 rsc #include <keyboard.h>
11 a287dbab 2011-09-06 rsc #include <mouse.h>
12 a287dbab 2011-09-06 rsc #include <cursor.h>
13 a287dbab 2011-09-06 rsc #include <drawfcall.h>
14 a287dbab 2011-09-06 rsc #include "cocoa-screen.h"
15 a287dbab 2011-09-06 rsc #include "devdraw.h"
17 a287dbab 2011-09-06 rsc typedef struct Kbdbuf Kbdbuf;
18 a287dbab 2011-09-06 rsc typedef struct Mousebuf Mousebuf;
19 a287dbab 2011-09-06 rsc typedef struct Fdbuf Fdbuf;
20 a287dbab 2011-09-06 rsc typedef struct Tagbuf Tagbuf;
22 a287dbab 2011-09-06 rsc struct Kbdbuf
30 a287dbab 2011-09-06 rsc struct Mousebuf
39 a287dbab 2011-09-06 rsc struct Tagbuf
47 a287dbab 2011-09-06 rsc Mousebuf mouse;
48 a287dbab 2011-09-06 rsc Tagbuf kbdtags;
49 a287dbab 2011-09-06 rsc Tagbuf mousetags;
51 a287dbab 2011-09-06 rsc void runmsg(Wsysmsg*);
52 a287dbab 2011-09-06 rsc void replymsg(Wsysmsg*);
53 a287dbab 2011-09-06 rsc void matchkbd(void);
54 a287dbab 2011-09-06 rsc void matchmouse(void);
65 a287dbab 2011-09-06 rsc zunlock(void)
67 a287dbab 2011-09-06 rsc qunlock(&lk);
70 a287dbab 2011-09-06 rsc int trace = 0;
73 a287dbab 2011-09-06 rsc servep9p(void)
75 a287dbab 2011-09-06 rsc uchar buf[4], *mbuf;
76 a287dbab 2011-09-06 rsc int nmbuf, n, nn;
79 a287dbab 2011-09-06 rsc fmtinstall('W', drawfcallfmt);
83 a287dbab 2011-09-06 rsc while((n = read(3, buf, 4)) == 4){
85 a287dbab 2011-09-06 rsc if(n > nmbuf){
87 a287dbab 2011-09-06 rsc mbuf = malloc(4+n);
88 a287dbab 2011-09-06 rsc if(mbuf == nil)
89 a287dbab 2011-09-06 rsc sysfatal("malloc: %r");
92 a287dbab 2011-09-06 rsc memmove(mbuf, buf, 4);
93 a287dbab 2011-09-06 rsc nn = readn(3, mbuf+4, n-4);
94 a287dbab 2011-09-06 rsc if(nn != n-4)
95 a287dbab 2011-09-06 rsc sysfatal("eof during message");
97 a287dbab 2011-09-06 rsc /* pick off messages one by one */
98 a287dbab 2011-09-06 rsc if(convM2W(mbuf, nn+4, &m) <= 0)
99 a287dbab 2011-09-06 rsc sysfatal("cannot convert message");
100 a287dbab 2011-09-06 rsc if(trace) fprint(2, "<- %W\n", &m);
106 a287dbab 2011-09-06 rsc replyerror(Wsysmsg *m)
108 a287dbab 2011-09-06 rsc char err[256];
110 a287dbab 2011-09-06 rsc rerrstr(err, sizeof err);
111 a287dbab 2011-09-06 rsc m->type = Rerror;
112 a287dbab 2011-09-06 rsc m->error = err;
113 a287dbab 2011-09-06 rsc replymsg(m);
117 a287dbab 2011-09-06 rsc * Handle a single wsysmsg.
118 a287dbab 2011-09-06 rsc * Might queue for later (kbd, mouse read)
121 a287dbab 2011-09-06 rsc runmsg(Wsysmsg *m)
123 a287dbab 2011-09-06 rsc static uchar buf[65536];
125 a287dbab 2011-09-06 rsc Memimage *i;
127 a287dbab 2011-09-06 rsc switch(m->type){
129 a287dbab 2011-09-06 rsc memimageinit();
130 a287dbab 2011-09-06 rsc i = attachscreen(m->label, m->winsize);
131 a287dbab 2011-09-06 rsc _initdisplaymemimage(i);
132 a287dbab 2011-09-06 rsc replymsg(m);
135 a287dbab 2011-09-06 rsc case Trdmouse:
137 a287dbab 2011-09-06 rsc mousetags.t[mousetags.wi++] = m->tag;
138 a287dbab 2011-09-06 rsc if(mousetags.wi == nelem(mousetags.t))
139 a287dbab 2011-09-06 rsc mousetags.wi = 0;
140 a287dbab 2011-09-06 rsc if(mousetags.wi == mousetags.ri)
141 a287dbab 2011-09-06 rsc sysfatal("too many queued mouse reads");
142 a287dbab 2011-09-06 rsc mouse.stall = 0;
143 a287dbab 2011-09-06 rsc matchmouse();
147 a287dbab 2011-09-06 rsc case Trdkbd:
149 a287dbab 2011-09-06 rsc kbdtags.t[kbdtags.wi++] = m->tag;
150 a287dbab 2011-09-06 rsc if(kbdtags.wi == nelem(kbdtags.t))
151 a287dbab 2011-09-06 rsc kbdtags.wi = 0;
152 a287dbab 2011-09-06 rsc if(kbdtags.wi == kbdtags.ri)
153 a287dbab 2011-09-06 rsc sysfatal("too many queued keyboard reads");
154 a287dbab 2011-09-06 rsc kbd.stall = 0;
159 a287dbab 2011-09-06 rsc case Tmoveto:
160 a287dbab 2011-09-06 rsc setmouse(m->mouse.xy);
161 a287dbab 2011-09-06 rsc replymsg(m);
164 a287dbab 2011-09-06 rsc case Tcursor:
165 a287dbab 2011-09-06 rsc if(m->arrowcursor)
166 a287dbab 2011-09-06 rsc setcursor(nil);
168 a287dbab 2011-09-06 rsc setcursor(&m->cursor);
169 a287dbab 2011-09-06 rsc replymsg(m);
172 a287dbab 2011-09-06 rsc case Tbouncemouse:
173 a287dbab 2011-09-06 rsc // _xbouncemouse(&m->mouse);
174 a287dbab 2011-09-06 rsc replymsg(m);
177 a287dbab 2011-09-06 rsc case Tlabel:
178 a287dbab 2011-09-06 rsc kicklabel(m->label);
179 a287dbab 2011-09-06 rsc replymsg(m);
182 a287dbab 2011-09-06 rsc case Trdsnarf:
183 a287dbab 2011-09-06 rsc m->snarf = getsnarf();
184 a287dbab 2011-09-06 rsc replymsg(m);
185 a287dbab 2011-09-06 rsc free(m->snarf);
188 a287dbab 2011-09-06 rsc case Twrsnarf:
189 a287dbab 2011-09-06 rsc putsnarf(m->snarf);
190 a287dbab 2011-09-06 rsc replymsg(m);
193 a287dbab 2011-09-06 rsc case Trddraw:
194 a287dbab 2011-09-06 rsc n = m->count;
195 a287dbab 2011-09-06 rsc if(n > sizeof buf)
196 a287dbab 2011-09-06 rsc n = sizeof buf;
197 a287dbab 2011-09-06 rsc n = _drawmsgread(buf, n);
199 a287dbab 2011-09-06 rsc replyerror(m);
201 a287dbab 2011-09-06 rsc m->count = n;
202 a287dbab 2011-09-06 rsc m->data = buf;
203 a287dbab 2011-09-06 rsc replymsg(m);
207 a287dbab 2011-09-06 rsc case Twrdraw:
208 a287dbab 2011-09-06 rsc if(_drawmsgwrite(m->data, m->count) < 0)
209 a287dbab 2011-09-06 rsc replyerror(m);
211 a287dbab 2011-09-06 rsc replymsg(m);
216 a287dbab 2011-09-06 rsc replymsg(m);
219 a287dbab 2011-09-06 rsc case Tresize:
220 a287dbab 2011-09-06 rsc // _xresizewindow(m->rect);
221 a287dbab 2011-09-06 rsc replymsg(m);
227 a287dbab 2011-09-06 rsc * Reply to m.
229 a287dbab 2011-09-06 rsc QLock replylock;
231 a287dbab 2011-09-06 rsc replymsg(Wsysmsg *m)
234 a287dbab 2011-09-06 rsc static uchar *mbuf;
235 a287dbab 2011-09-06 rsc static int nmbuf;
237 a287dbab 2011-09-06 rsc /* T -> R msg */
238 a287dbab 2011-09-06 rsc if(m->type%2 == 0)
241 a287dbab 2011-09-06 rsc if(trace) fprint(2, "-> %W\n", m);
242 a287dbab 2011-09-06 rsc /* copy to output buffer */
243 a287dbab 2011-09-06 rsc n = sizeW2M(m);
245 a287dbab 2011-09-06 rsc qlock(&replylock);
246 a287dbab 2011-09-06 rsc if(n > nmbuf){
248 a287dbab 2011-09-06 rsc mbuf = malloc(n);
249 a287dbab 2011-09-06 rsc if(mbuf == nil)
250 a287dbab 2011-09-06 rsc sysfatal("out of memory");
253 a287dbab 2011-09-06 rsc convW2M(m, mbuf, n);
254 a287dbab 2011-09-06 rsc if(write(4, mbuf, n) != n)
255 a287dbab 2011-09-06 rsc sysfatal("write: %r");
256 a287dbab 2011-09-06 rsc qunlock(&replylock);
260 a287dbab 2011-09-06 rsc * Match queued kbd reads with queued kbd characters.
263 a287dbab 2011-09-06 rsc matchkbd(void)
267 a287dbab 2011-09-06 rsc if(kbd.stall)
269 a287dbab 2011-09-06 rsc while(kbd.ri != kbd.wi && kbdtags.ri != kbdtags.wi){
270 a287dbab 2011-09-06 rsc m.type = Rrdkbd;
271 a287dbab 2011-09-06 rsc m.tag = kbdtags.t[kbdtags.ri++];
272 a287dbab 2011-09-06 rsc if(kbdtags.ri == nelem(kbdtags.t))
273 a287dbab 2011-09-06 rsc kbdtags.ri = 0;
274 a287dbab 2011-09-06 rsc m.rune = kbd.r[kbd.ri++];
275 a287dbab 2011-09-06 rsc if(kbd.ri == nelem(kbd.r))
277 a287dbab 2011-09-06 rsc replymsg(&m);
282 a287dbab 2011-09-06 rsc * Match queued mouse reads with queued mouse events.
285 a287dbab 2011-09-06 rsc matchmouse(void)
289 a287dbab 2011-09-06 rsc while(mouse.ri != mouse.wi && mousetags.ri != mousetags.wi){
290 a287dbab 2011-09-06 rsc m.type = Rrdmouse;
291 a287dbab 2011-09-06 rsc m.tag = mousetags.t[mousetags.ri++];
292 a287dbab 2011-09-06 rsc if(mousetags.ri == nelem(mousetags.t))
293 a287dbab 2011-09-06 rsc mousetags.ri = 0;
294 a287dbab 2011-09-06 rsc m.mouse = mouse.m[mouse.ri];
295 a287dbab 2011-09-06 rsc m.resized = mouseresized;
297 a287dbab 2011-09-06 rsc if(m.resized)
298 a287dbab 2011-09-06 rsc fprint(2, "sending resize\n");
300 a287dbab 2011-09-06 rsc mouseresized = 0;
302 a287dbab 2011-09-06 rsc if(mouse.ri == nelem(mouse.m))
303 a287dbab 2011-09-06 rsc mouse.ri = 0;
304 a287dbab 2011-09-06 rsc replymsg(&m);
309 48107872 2011-09-19 rsc mousetrack(int x, int y, int b, uint ms)
313 a287dbab 2011-09-06 rsc if(x < mouserect.min.x)
314 a287dbab 2011-09-06 rsc x = mouserect.min.x;
315 a287dbab 2011-09-06 rsc if(x > mouserect.max.x)
316 a287dbab 2011-09-06 rsc x = mouserect.max.x;
317 a287dbab 2011-09-06 rsc if(y < mouserect.min.y)
318 a287dbab 2011-09-06 rsc y = mouserect.min.y;
319 a287dbab 2011-09-06 rsc if(y > mouserect.max.y)
320 a287dbab 2011-09-06 rsc y = mouserect.max.y;
323 a287dbab 2011-09-06 rsc // If reader has stopped reading, don't bother.
324 a287dbab 2011-09-06 rsc // If reader is completely caught up, definitely queue.
325 a287dbab 2011-09-06 rsc // Otherwise, queue only button change events.
326 a287dbab 2011-09-06 rsc if(!mouse.stall)
327 a287dbab 2011-09-06 rsc if(mouse.wi == mouse.ri || mouse.last.buttons != b){
328 a287dbab 2011-09-06 rsc m = &mouse.last;
329 a287dbab 2011-09-06 rsc m->xy.x = x;
330 a287dbab 2011-09-06 rsc m->xy.y = y;
331 a287dbab 2011-09-06 rsc m->buttons = b;
332 a287dbab 2011-09-06 rsc m->msec = ms;
334 a287dbab 2011-09-06 rsc mouse.m[mouse.wi] = *m;
335 a287dbab 2011-09-06 rsc if(++mouse.wi == nelem(mouse.m))
336 a287dbab 2011-09-06 rsc mouse.wi = 0;
337 a287dbab 2011-09-06 rsc if(mouse.wi == mouse.ri){
338 a287dbab 2011-09-06 rsc mouse.stall = 1;
339 a287dbab 2011-09-06 rsc mouse.ri = 0;
340 a287dbab 2011-09-06 rsc mouse.wi = 1;
341 a287dbab 2011-09-06 rsc mouse.m[0] = *m;
343 a287dbab 2011-09-06 rsc matchmouse();
349 a287dbab 2011-09-06 rsc kputc(int c)
352 a287dbab 2011-09-06 rsc kbd.r[kbd.wi++] = c;
353 a287dbab 2011-09-06 rsc if(kbd.wi == nelem(kbd.r))
355 a287dbab 2011-09-06 rsc if(kbd.ri == kbd.wi)
356 a287dbab 2011-09-06 rsc kbd.stall = 1;
361 73b0f029 2012-01-16 rsc static int alting;
364 73b0f029 2012-01-16 rsc abortcompose(void)
367 73b0f029 2012-01-16 rsc keystroke(Kalt);
370 55905845 2012-11-26 rsc void resizeimg(void);
373 a287dbab 2011-09-06 rsc keystroke(int c)
375 a287dbab 2011-09-06 rsc static Rune k[10];
376 73b0f029 2012-01-16 rsc static int nk;
379 a287dbab 2011-09-06 rsc if(c == Kalt){
380 a287dbab 2011-09-06 rsc alting = !alting;
384 ffaaaf9d 2012-11-26 rsc if(c == Kcmd+'r') {
385 55905845 2012-11-26 rsc if(forcedpi)
386 55905845 2012-11-26 rsc forcedpi = 0;
387 55905845 2012-11-26 rsc else if(displaydpi >= 200)
388 55905845 2012-11-26 rsc forcedpi = 100;
390 55905845 2012-11-26 rsc forcedpi = 225;
391 55905845 2012-11-26 rsc resizeimg();
394 a287dbab 2011-09-06 rsc if(!alting){
398 a287dbab 2011-09-06 rsc if(nk >= nelem(k)) // should not happen
400 a287dbab 2011-09-06 rsc k[nk++] = c;
401 a287dbab 2011-09-06 rsc c = _latin1(k, nk);
408 a287dbab 2011-09-06 rsc if(c == -1){
410 a287dbab 2011-09-06 rsc for(i=0; i<nk; i++)
411 a287dbab 2011-09-06 rsc kputc(k[i]);
415 a287dbab 2011-09-06 rsc // need more input