blob: 188e52bf467d1fd352b4755cdd4f9f42d5aa2716 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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;
}
|