|  | #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; | 
|  | } | 
|  |  |