Blame


1 76193d7c 2003-09-30 devnull #include <u.h>
2 be22ae2d 2004-03-26 devnull #include "x11-inc.h"
3 76193d7c 2003-09-30 devnull #include <libc.h>
4 76193d7c 2003-09-30 devnull #include <draw.h>
5 76193d7c 2003-09-30 devnull #include <thread.h>
6 76193d7c 2003-09-30 devnull #include <memdraw.h>
7 76193d7c 2003-09-30 devnull #include <keyboard.h>
8 76193d7c 2003-09-30 devnull #include "x11-memdraw.h"
9 76193d7c 2003-09-30 devnull
10 76193d7c 2003-09-30 devnull void
11 76193d7c 2003-09-30 devnull closekeyboard(Keyboardctl *kc)
12 76193d7c 2003-09-30 devnull {
13 76193d7c 2003-09-30 devnull if(kc == nil)
14 76193d7c 2003-09-30 devnull return;
15 76193d7c 2003-09-30 devnull
16 76193d7c 2003-09-30 devnull /* postnote(PNPROC, kc->pid, "kill");
17 76193d7c 2003-09-30 devnull */
18 76193d7c 2003-09-30 devnull
19 76193d7c 2003-09-30 devnull #ifdef BUG
20 76193d7c 2003-09-30 devnull /* Drain the channel */
21 76193d7c 2003-09-30 devnull while(?kc->c)
22 76193d7c 2003-09-30 devnull <-kc->c;
23 76193d7c 2003-09-30 devnull #endif
24 76193d7c 2003-09-30 devnull
25 76193d7c 2003-09-30 devnull close(kc->ctlfd);
26 76193d7c 2003-09-30 devnull close(kc->consfd);
27 76193d7c 2003-09-30 devnull free(kc->file);
28 76193d7c 2003-09-30 devnull free(kc->c);
29 76193d7c 2003-09-30 devnull free(kc);
30 76193d7c 2003-09-30 devnull }
31 76193d7c 2003-09-30 devnull
32 76193d7c 2003-09-30 devnull static
33 76193d7c 2003-09-30 devnull void
34 76193d7c 2003-09-30 devnull _ioproc(void *arg)
35 76193d7c 2003-09-30 devnull {
36 76193d7c 2003-09-30 devnull int i;
37 5a8e63b2 2004-02-29 devnull int fd;
38 76193d7c 2003-09-30 devnull Keyboardctl *kc;
39 76193d7c 2003-09-30 devnull Rune r;
40 76193d7c 2003-09-30 devnull XEvent xevent;
41 76193d7c 2003-09-30 devnull
42 76193d7c 2003-09-30 devnull kc = arg;
43 76193d7c 2003-09-30 devnull threadsetname("kbdproc");
44 76193d7c 2003-09-30 devnull kc->pid = getpid();
45 5a8e63b2 2004-02-29 devnull fd = XConnectionNumber(_x.kbdcon);
46 161060a4 2003-10-11 devnull XSelectInput(_x.kbdcon, _x.drawable, KeyPressMask);
47 76193d7c 2003-09-30 devnull for(;;){
48 a3a83c9e 2004-04-21 devnull while(XCheckWindowEvent(_x.kbdcon, _x.drawable, KeyPressMask, &xevent) == False){
49 5a8e63b2 2004-02-29 devnull threadfdwait(fd, 'r');
50 a3a83c9e 2004-04-21 devnull }
51 76193d7c 2003-09-30 devnull switch(xevent.type){
52 76193d7c 2003-09-30 devnull case KeyPress:
53 32f69c36 2003-12-11 devnull i = _xtoplan9kbd(&xevent);
54 76193d7c 2003-09-30 devnull if(i == -1)
55 76193d7c 2003-09-30 devnull continue;
56 76193d7c 2003-09-30 devnull r = i;
57 76193d7c 2003-09-30 devnull send(kc->c, &r);
58 32f69c36 2003-12-11 devnull while((i=_xtoplan9kbd(nil)) >= 0){
59 16a70966 2003-11-23 devnull r = i;
60 16a70966 2003-11-23 devnull send(kc->c, &r);
61 16a70966 2003-11-23 devnull }
62 76193d7c 2003-09-30 devnull break;
63 76193d7c 2003-09-30 devnull }
64 76193d7c 2003-09-30 devnull }
65 76193d7c 2003-09-30 devnull }
66 76193d7c 2003-09-30 devnull
67 76193d7c 2003-09-30 devnull Keyboardctl*
68 76193d7c 2003-09-30 devnull initkeyboard(char *file)
69 76193d7c 2003-09-30 devnull {
70 76193d7c 2003-09-30 devnull Keyboardctl *kc;
71 76193d7c 2003-09-30 devnull
72 5a8e63b2 2004-02-29 devnull threadfdwaitsetup();
73 76193d7c 2003-09-30 devnull kc = mallocz(sizeof(Keyboardctl), 1);
74 76193d7c 2003-09-30 devnull if(kc == nil)
75 76193d7c 2003-09-30 devnull return nil;
76 76193d7c 2003-09-30 devnull kc->c = chancreate(sizeof(Rune), 20);
77 63b67323 2004-04-21 devnull threadcreate(_ioproc, kc, 32768);
78 76193d7c 2003-09-30 devnull return kc;
79 76193d7c 2003-09-30 devnull }
80 76193d7c 2003-09-30 devnull