diff options
Diffstat (limited to 'src/libdraw/x11-keyboard.c')
-rw-r--r-- | src/libdraw/x11-keyboard.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/libdraw/x11-keyboard.c b/src/libdraw/x11-keyboard.c new file mode 100644 index 00000000..188e52bf --- /dev/null +++ b/src/libdraw/x11-keyboard.c @@ -0,0 +1,71 @@ +#include "x11-inc.h" +#include <u.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; + Keyboardctl *kc; + Rune r; + XEvent xevent; + + kc = arg; + threadsetname("kbdproc"); + kc->pid = getpid(); + for(;;){ + XSelectInput(_x.kbdcon, _x.drawable, KeyPressMask); + XWindowEvent(_x.kbdcon, _x.drawable, KeyPressMask, &xevent); + switch(xevent.type){ + case KeyPress: + i = xtoplan9kbd(&xevent); + if(i == -1) + continue; + r = i; + send(kc->c, &r); + break; + } + } +} + +Keyboardctl* +initkeyboard(char *file) +{ + Keyboardctl *kc; + + kc = mallocz(sizeof(Keyboardctl), 1); + if(kc == nil) + return nil; + kc->c = chancreate(sizeof(Rune), 20); + proccreate(_ioproc, kc, 4096); + return kc; +} + |