1 76193d7c 2003-09-30 devnull #include <u.h>
2 76193d7c 2003-09-30 devnull #include <libc.h>
3 76193d7c 2003-09-30 devnull #include <draw.h>
4 76193d7c 2003-09-30 devnull #include <thread.h>
5 76193d7c 2003-09-30 devnull #include <keyboard.h>
9 76193d7c 2003-09-30 devnull closekeyboard(Keyboardctl *kc)
11 76193d7c 2003-09-30 devnull if(kc == nil)
14 76193d7c 2003-09-30 devnull postnote(PNPROC, kc->pid, "kill");
16 76193d7c 2003-09-30 devnull #ifdef BUG
17 76193d7c 2003-09-30 devnull /* Drain the channel */
18 76193d7c 2003-09-30 devnull while(?kc->c)
22 76193d7c 2003-09-30 devnull close(kc->ctlfd);
23 76193d7c 2003-09-30 devnull close(kc->consfd);
24 76193d7c 2003-09-30 devnull free(kc->file);
25 76193d7c 2003-09-30 devnull free(kc->c);
26 76193d7c 2003-09-30 devnull free(kc);
31 76193d7c 2003-09-30 devnull _ioproc(void *arg)
33 76193d7c 2003-09-30 devnull int m, n;
34 76193d7c 2003-09-30 devnull char buf[20];
36 76193d7c 2003-09-30 devnull Keyboardctl *kc;
38 76193d7c 2003-09-30 devnull kc = arg;
39 76193d7c 2003-09-30 devnull threadsetname("kbdproc");
40 76193d7c 2003-09-30 devnull kc->pid = getpid();
43 76193d7c 2003-09-30 devnull while(n>0 && fullrune(buf, n)){
44 76193d7c 2003-09-30 devnull m = chartorune(&r, buf);
46 76193d7c 2003-09-30 devnull memmove(buf, buf+m, n);
47 76193d7c 2003-09-30 devnull send(kc->c, &r);
49 76193d7c 2003-09-30 devnull m = read(kc->consfd, buf+n, sizeof buf-n);
50 76193d7c 2003-09-30 devnull if(m <= 0){
51 76193d7c 2003-09-30 devnull yield(); /* if error is due to exiting, we'll exit here */
52 76193d7c 2003-09-30 devnull fprint(2, "keyboard read error: %r\n");
53 76193d7c 2003-09-30 devnull threadexits("error");
59 76193d7c 2003-09-30 devnull Keyboardctl*
60 76193d7c 2003-09-30 devnull initkeyboard(char *file)
62 76193d7c 2003-09-30 devnull Keyboardctl *kc;
65 76193d7c 2003-09-30 devnull kc = mallocz(sizeof(Keyboardctl), 1);
66 76193d7c 2003-09-30 devnull if(kc == nil)
67 76193d7c 2003-09-30 devnull return nil;
68 76193d7c 2003-09-30 devnull if(file == nil)
69 76193d7c 2003-09-30 devnull file = "/dev/cons";
70 76193d7c 2003-09-30 devnull kc->file = strdup(file);
71 76193d7c 2003-09-30 devnull kc->consfd = open(file, ORDWR|OCEXEC);
72 76193d7c 2003-09-30 devnull t = malloc(strlen(file)+16);
73 76193d7c 2003-09-30 devnull if(kc->consfd<0 || t==nil){
75 76193d7c 2003-09-30 devnull free(kc);
76 76193d7c 2003-09-30 devnull return nil;
78 76193d7c 2003-09-30 devnull sprint(t, "%sctl", file);
79 76193d7c 2003-09-30 devnull kc->ctlfd = open(t, OWRITE|OCEXEC);
80 76193d7c 2003-09-30 devnull if(kc->ctlfd < 0){
81 76193d7c 2003-09-30 devnull fprint(2, "initkeyboard: can't open %s: %r\n", t);
83 76193d7c 2003-09-30 devnull close(kc->consfd);
85 76193d7c 2003-09-30 devnull goto Error1;
87 76193d7c 2003-09-30 devnull if(ctlkeyboard(kc, "rawon") < 0){
88 76193d7c 2003-09-30 devnull fprint(2, "initkeyboard: can't turn on raw mode on %s: %r\n", t);
89 76193d7c 2003-09-30 devnull close(kc->ctlfd);
90 76193d7c 2003-09-30 devnull goto Error2;
93 76193d7c 2003-09-30 devnull kc->c = chancreate(sizeof(Rune), 20);
94 76193d7c 2003-09-30 devnull proccreate(_ioproc, kc, 4096);
95 76193d7c 2003-09-30 devnull return kc;
99 76193d7c 2003-09-30 devnull ctlkeyboard(Keyboardctl *kc, char *m)
101 76193d7c 2003-09-30 devnull return write(kc->ctlfd, m, strlen(m));