| #include <u.h> |
| #include "x11-inc.h" |
| #include <libc.h> |
| #include <draw.h> |
| #include <thread.h> |
| #include <memdraw.h> |
| #include <keyboard.h> |
| #include "x11-memdraw.h" |
| |
| void |
| closekeyboard(Keyboardctl *kc) |
| { |
| if(kc == nil) |
| return; |
| |
| /* postnote(PNPROC, kc->pid, "kill"); |
| */ |
| |
| #ifdef BUG |
| /* Drain the channel */ |
| while(?kc->c) |
| <-kc->c; |
| #endif |
| |
| close(kc->ctlfd); |
| close(kc->consfd); |
| free(kc->file); |
| free(kc->c); |
| free(kc); |
| } |
| |
| static |
| void |
| _ioproc(void *arg) |
| { |
| int i; |
| int fd; |
| Keyboardctl *kc; |
| Rune r; |
| XEvent xevent; |
| |
| kc = arg; |
| threadsetname("kbdproc"); |
| kc->pid = getpid(); |
| fd = XConnectionNumber(_x.kbdcon); |
| XSelectInput(_x.kbdcon, _x.drawable, KeyPressMask); |
| for(;;){ |
| while(XCheckWindowEvent(_x.kbdcon, _x.drawable, KeyPressMask, &xevent) == False){ |
| threadfdwait(fd, 'r'); |
| } |
| switch(xevent.type){ |
| case KeyPress: |
| i = _xtoplan9kbd(&xevent); |
| if(i == -1) |
| continue; |
| r = i; |
| send(kc->c, &r); |
| while((i=_xtoplan9kbd(nil)) >= 0){ |
| r = i; |
| send(kc->c, &r); |
| } |
| break; |
| } |
| } |
| } |
| |
| Keyboardctl* |
| initkeyboard(char *file) |
| { |
| Keyboardctl *kc; |
| |
| threadfdwaitsetup(); |
| kc = mallocz(sizeof(Keyboardctl), 1); |
| if(kc == nil) |
| return nil; |
| kc->c = chancreate(sizeof(Rune), 20); |
| threadcreate(_ioproc, kc, 32768); |
| return kc; |
| } |
| |