| #include <u.h> |
| #include <libc.h> |
| #include <draw.h> |
| #include <thread.h> |
| #include <keyboard.h> |
| |
| void |
| closekeyboard(Keyboardctl *kc) |
| { |
| Rune r; |
| |
| if(kc == nil) |
| return; |
| |
| /* postnote(PNPROC, kc->pid, "kill"); */ |
| |
| do; while(nbrecv(kc->c, &r) > 0); |
| chanfree(kc->c); |
| free(kc); |
| } |
| |
| static |
| void |
| _ioproc(void *arg) |
| { |
| Rune r; |
| Keyboardctl *kc; |
| |
| kc = arg; |
| threadsetname("kbdproc"); |
| for(;;){ |
| if(_displayrdkbd(display, &r) < 0) |
| threadexits("read error"); |
| send(kc->c, &r); |
| } |
| } |
| |
| Keyboardctl* |
| initkeyboard(char *file) |
| { |
| Keyboardctl *kc; |
| |
| kc = mallocz(sizeof(Keyboardctl), 1); |
| if(kc == nil) |
| return nil; |
| USED(file); |
| kc->c = chancreate(sizeof(Rune), 20); |
| chansetname(kc->c, "kbdc"); |
| proccreate(_ioproc, kc, 32*1024); |
| return kc; |
| } |
| |