#include #include "x11-inc.h" #include #include #include #include #include #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; }