Blob


1 #include "x11-inc.h"
3 #include <u.h>
4 #include <libc.h>
5 #include <draw.h>
6 #include <cursor.h>
7 #include <event.h>
9 #include <memdraw.h>
10 #include "x11-memdraw.h"
12 ulong
13 event(Event *e)
14 {
15 return eread(~0UL, e);
16 }
18 ulong
19 eread(ulong keys, Event *e)
20 {
21 ulong xmask;
22 XEvent xevent;
24 xmask = ExposureMask;
26 if(keys&Emouse)
27 xmask |= MouseMask|StructureNotifyMask;
28 if(keys&Ekeyboard)
29 xmask |= KeyPressMask;
31 XSelectInput(_x.display, _x.drawable, xmask);
32 again:
33 XWindowEvent(_x.display, _x.drawable, xmask, &xevent);
35 switch(xevent.type){
36 case Expose:
37 xexpose(&xevent, _x.display);
38 goto again;
39 case ConfigureNotify:
40 if(xconfigure(&xevent, _x.display))
41 eresized(1);
42 goto again;
43 case ButtonPress:
44 case ButtonRelease:
45 case MotionNotify:
46 if(xtoplan9mouse(&xevent, &e->mouse) < 0)
47 goto again;
48 return Emouse;
49 case KeyPress:
50 e->kbdc = xtoplan9kbd(&xevent);
51 if(e->kbdc == -1)
52 goto again;
53 return Ekeyboard;
54 default:
55 return 0;
56 }
57 }
59 void
60 einit(ulong keys)
61 {
62 keys &= ~(Emouse|Ekeyboard);
63 if(keys){
64 fprint(2, "unknown keys in einit\n");
65 abort();
66 }
67 }
69 int
70 ekbd(void)
71 {
72 Event e;
74 eread(Ekeyboard, &e);
75 return e.kbdc;
76 }
78 Mouse
79 emouse(void)
80 {
81 Event e;
83 eread(Emouse, &e);
84 return e.mouse;
85 }
87 int
88 ecanread(ulong keys)
89 {
90 int can;
92 can = 0;
93 if(keys&Emouse)
94 can |= ecanmouse();
95 if(keys&Ekeyboard)
96 can |= ecankbd();
97 return can;
98 }
100 int
101 ecanmouse(void)
103 XEvent xe;
104 Mouse m;
106 again:
107 if(XCheckWindowEvent(_x.display, _x.drawable, MouseMask, &xe)){
108 if(xtoplan9mouse(&xe, &m) < 0)
109 goto again;
110 XPutBackEvent(_x.display, &xe);
111 return 1;
113 return 0;
116 int
117 ecankbd(void)
119 XEvent xe;
121 again:
122 if(XCheckWindowEvent(_x.display, _x.drawable, KeyPressMask, &xe)){
123 if(xtoplan9kbd(&xe) == -1)
124 goto again;
125 XPutBackEvent(_x.display, &xe);
126 return 1;
128 return 0;
131 void
132 emoveto(Point p)
134 xmoveto(p);