Blame


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>
6 76193d7c 2003-09-30 devnull
7 76193d7c 2003-09-30 devnull
8 76193d7c 2003-09-30 devnull void
9 76193d7c 2003-09-30 devnull closekeyboard(Keyboardctl *kc)
10 76193d7c 2003-09-30 devnull {
11 76193d7c 2003-09-30 devnull if(kc == nil)
12 76193d7c 2003-09-30 devnull return;
13 76193d7c 2003-09-30 devnull
14 76193d7c 2003-09-30 devnull postnote(PNPROC, kc->pid, "kill");
15 76193d7c 2003-09-30 devnull
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)
19 76193d7c 2003-09-30 devnull <-kc->c;
20 76193d7c 2003-09-30 devnull #endif
21 76193d7c 2003-09-30 devnull
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);
27 76193d7c 2003-09-30 devnull }
28 76193d7c 2003-09-30 devnull
29 76193d7c 2003-09-30 devnull static
30 76193d7c 2003-09-30 devnull void
31 76193d7c 2003-09-30 devnull _ioproc(void *arg)
32 76193d7c 2003-09-30 devnull {
33 76193d7c 2003-09-30 devnull int m, n;
34 76193d7c 2003-09-30 devnull char buf[20];
35 76193d7c 2003-09-30 devnull Rune r;
36 76193d7c 2003-09-30 devnull Keyboardctl *kc;
37 76193d7c 2003-09-30 devnull
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();
41 76193d7c 2003-09-30 devnull n = 0;
42 76193d7c 2003-09-30 devnull for(;;){
43 76193d7c 2003-09-30 devnull while(n>0 && fullrune(buf, n)){
44 76193d7c 2003-09-30 devnull m = chartorune(&r, buf);
45 76193d7c 2003-09-30 devnull n -= m;
46 76193d7c 2003-09-30 devnull memmove(buf, buf+m, n);
47 76193d7c 2003-09-30 devnull send(kc->c, &r);
48 76193d7c 2003-09-30 devnull }
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");
54 76193d7c 2003-09-30 devnull }
55 76193d7c 2003-09-30 devnull n += m;
56 76193d7c 2003-09-30 devnull }
57 76193d7c 2003-09-30 devnull }
58 76193d7c 2003-09-30 devnull
59 76193d7c 2003-09-30 devnull Keyboardctl*
60 76193d7c 2003-09-30 devnull initkeyboard(char *file)
61 76193d7c 2003-09-30 devnull {
62 76193d7c 2003-09-30 devnull Keyboardctl *kc;
63 76193d7c 2003-09-30 devnull char *t;
64 76193d7c 2003-09-30 devnull
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){
74 76193d7c 2003-09-30 devnull Error1:
75 76193d7c 2003-09-30 devnull free(kc);
76 76193d7c 2003-09-30 devnull return nil;
77 76193d7c 2003-09-30 devnull }
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);
82 76193d7c 2003-09-30 devnull Error2:
83 76193d7c 2003-09-30 devnull close(kc->consfd);
84 76193d7c 2003-09-30 devnull free(t);
85 76193d7c 2003-09-30 devnull goto Error1;
86 76193d7c 2003-09-30 devnull }
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;
91 76193d7c 2003-09-30 devnull }
92 76193d7c 2003-09-30 devnull free(t);
93 76193d7c 2003-09-30 devnull kc->c = chancreate(sizeof(Rune), 20);
94 b20f06ab 2004-12-26 devnull chansetname(kc->c, "kbdc");
95 76193d7c 2003-09-30 devnull proccreate(_ioproc, kc, 4096);
96 76193d7c 2003-09-30 devnull return kc;
97 76193d7c 2003-09-30 devnull }
98 76193d7c 2003-09-30 devnull
99 76193d7c 2003-09-30 devnull int
100 76193d7c 2003-09-30 devnull ctlkeyboard(Keyboardctl *kc, char *m)
101 76193d7c 2003-09-30 devnull {
102 76193d7c 2003-09-30 devnull return write(kc->ctlfd, m, strlen(m));
103 76193d7c 2003-09-30 devnull }