Blame


1 76193d7c 2003-09-30 devnull #include <u.h>
2 be22ae2d 2004-03-26 devnull #include "x11-inc.h"
3 76193d7c 2003-09-30 devnull #include <libc.h>
4 76193d7c 2003-09-30 devnull #include <draw.h>
5 76193d7c 2003-09-30 devnull #include <cursor.h>
6 76193d7c 2003-09-30 devnull #include <event.h>
7 76193d7c 2003-09-30 devnull #include <memdraw.h>
8 76193d7c 2003-09-30 devnull #include "x11-memdraw.h"
9 76193d7c 2003-09-30 devnull
10 fc7c0c59 2005-01-18 devnull /*
11 fc7c0c59 2005-01-18 devnull * Should change this to support etimer and estartfn again.
12 fc7c0c59 2005-01-18 devnull * The main eread() would prepare a select mask from the keys
13 fc7c0c59 2005-01-18 devnull * and then call select() to wait for input. Then it would read an
14 fc7c0c59 2005-01-18 devnull * event from the readied fd and return it. Use XCheckWindowEvent
15 fc7c0c59 2005-01-18 devnull * to poll the X connection.
16 fc7c0c59 2005-01-18 devnull */
17 fc7c0c59 2005-01-18 devnull
18 76193d7c 2003-09-30 devnull ulong
19 76193d7c 2003-09-30 devnull event(Event *e)
20 76193d7c 2003-09-30 devnull {
21 76193d7c 2003-09-30 devnull return eread(~0UL, e);
22 76193d7c 2003-09-30 devnull }
23 76193d7c 2003-09-30 devnull
24 59d7d92e 2003-10-13 devnull static void
25 59d7d92e 2003-10-13 devnull eflush(void)
26 59d7d92e 2003-10-13 devnull {
27 59d7d92e 2003-10-13 devnull /* avoid generating a message if there's nothing to show. */
28 59d7d92e 2003-10-13 devnull /* this test isn't perfect, though; could do flushimage(display, 0) then call extract */
29 59d7d92e 2003-10-13 devnull /* also: make sure we don't interfere if we're multiprocessing the display */
30 59d7d92e 2003-10-13 devnull if(display->locking){
31 59d7d92e 2003-10-13 devnull /* if locking is being done by program, this means it can't depend on automatic flush in emouse() etc. */
32 59d7d92e 2003-10-13 devnull if(canqlock(&display->qlock)){
33 59d7d92e 2003-10-13 devnull if(display->bufp > display->buf)
34 59d7d92e 2003-10-13 devnull flushimage(display, 1);
35 59d7d92e 2003-10-13 devnull unlockdisplay(display);
36 59d7d92e 2003-10-13 devnull }
37 59d7d92e 2003-10-13 devnull }else
38 59d7d92e 2003-10-13 devnull if(display->bufp > display->buf)
39 59d7d92e 2003-10-13 devnull flushimage(display, 1);
40 59d7d92e 2003-10-13 devnull }
41 59d7d92e 2003-10-13 devnull
42 76193d7c 2003-09-30 devnull ulong
43 76193d7c 2003-09-30 devnull eread(ulong keys, Event *e)
44 76193d7c 2003-09-30 devnull {
45 16a70966 2003-11-23 devnull int r;
46 76193d7c 2003-09-30 devnull ulong xmask;
47 76193d7c 2003-09-30 devnull XEvent xevent;
48 76193d7c 2003-09-30 devnull
49 76193d7c 2003-09-30 devnull xmask = ExposureMask;
50 76193d7c 2003-09-30 devnull
51 59d7d92e 2003-10-13 devnull eflush();
52 59d7d92e 2003-10-13 devnull
53 76193d7c 2003-09-30 devnull if(keys&Emouse)
54 76193d7c 2003-09-30 devnull xmask |= MouseMask|StructureNotifyMask;
55 16a70966 2003-11-23 devnull if(keys&Ekeyboard){
56 76193d7c 2003-09-30 devnull xmask |= KeyPressMask;
57 32f69c36 2003-12-11 devnull if((r = _xtoplan9kbd(nil)) >= 0){
58 16a70966 2003-11-23 devnull e->kbdc = r;
59 16a70966 2003-11-23 devnull return Ekeyboard;
60 16a70966 2003-11-23 devnull }
61 16a70966 2003-11-23 devnull }
62 76193d7c 2003-09-30 devnull
63 1818ce0f 2005-01-04 devnull xmask |= EnterWindowMask|LeaveWindowMask;
64 1818ce0f 2005-01-04 devnull
65 76193d7c 2003-09-30 devnull XSelectInput(_x.display, _x.drawable, xmask);
66 76193d7c 2003-09-30 devnull again:
67 76193d7c 2003-09-30 devnull XWindowEvent(_x.display, _x.drawable, xmask, &xevent);
68 76193d7c 2003-09-30 devnull
69 76193d7c 2003-09-30 devnull switch(xevent.type){
70 76193d7c 2003-09-30 devnull case Expose:
71 32f69c36 2003-12-11 devnull _xexpose(&xevent, _x.display);
72 76193d7c 2003-09-30 devnull goto again;
73 16a70966 2003-11-23 devnull case DestroyNotify:
74 32f69c36 2003-12-11 devnull if(_xdestroy(&xevent, _x.display))
75 16a70966 2003-11-23 devnull postnote(PNGROUP, getpgrp(), "hangup");
76 16a70966 2003-11-23 devnull goto again;
77 76193d7c 2003-09-30 devnull case ConfigureNotify:
78 32f69c36 2003-12-11 devnull if(_xconfigure(&xevent, _x.display))
79 76193d7c 2003-09-30 devnull eresized(1);
80 76193d7c 2003-09-30 devnull goto again;
81 76193d7c 2003-09-30 devnull case ButtonPress:
82 76193d7c 2003-09-30 devnull case ButtonRelease:
83 76193d7c 2003-09-30 devnull case MotionNotify:
84 32f69c36 2003-12-11 devnull if(_xtoplan9mouse(_x.display, &xevent, &e->mouse) < 0)
85 76193d7c 2003-09-30 devnull goto again;
86 76193d7c 2003-09-30 devnull return Emouse;
87 76193d7c 2003-09-30 devnull case KeyPress:
88 32f69c36 2003-12-11 devnull e->kbdc = _xtoplan9kbd(&xevent);
89 76193d7c 2003-09-30 devnull if(e->kbdc == -1)
90 76193d7c 2003-09-30 devnull goto again;
91 76193d7c 2003-09-30 devnull return Ekeyboard;
92 76193d7c 2003-09-30 devnull default:
93 8e06ea1b 2005-09-15 devnull goto again;
94 76193d7c 2003-09-30 devnull }
95 76193d7c 2003-09-30 devnull }
96 76193d7c 2003-09-30 devnull
97 76193d7c 2003-09-30 devnull void
98 76193d7c 2003-09-30 devnull einit(ulong keys)
99 76193d7c 2003-09-30 devnull {
100 76193d7c 2003-09-30 devnull keys &= ~(Emouse|Ekeyboard);
101 76193d7c 2003-09-30 devnull if(keys){
102 76193d7c 2003-09-30 devnull fprint(2, "unknown keys in einit\n");
103 76193d7c 2003-09-30 devnull abort();
104 76193d7c 2003-09-30 devnull }
105 76193d7c 2003-09-30 devnull }
106 76193d7c 2003-09-30 devnull
107 76193d7c 2003-09-30 devnull int
108 76193d7c 2003-09-30 devnull ekbd(void)
109 76193d7c 2003-09-30 devnull {
110 76193d7c 2003-09-30 devnull Event e;
111 76193d7c 2003-09-30 devnull
112 76193d7c 2003-09-30 devnull eread(Ekeyboard, &e);
113 76193d7c 2003-09-30 devnull return e.kbdc;
114 76193d7c 2003-09-30 devnull }
115 76193d7c 2003-09-30 devnull
116 76193d7c 2003-09-30 devnull Mouse
117 76193d7c 2003-09-30 devnull emouse(void)
118 76193d7c 2003-09-30 devnull {
119 76193d7c 2003-09-30 devnull Event e;
120 76193d7c 2003-09-30 devnull
121 76193d7c 2003-09-30 devnull eread(Emouse, &e);
122 76193d7c 2003-09-30 devnull return e.mouse;
123 76193d7c 2003-09-30 devnull }
124 76193d7c 2003-09-30 devnull
125 76193d7c 2003-09-30 devnull int
126 76193d7c 2003-09-30 devnull ecanread(ulong keys)
127 76193d7c 2003-09-30 devnull {
128 76193d7c 2003-09-30 devnull int can;
129 76193d7c 2003-09-30 devnull
130 76193d7c 2003-09-30 devnull can = 0;
131 76193d7c 2003-09-30 devnull if(keys&Emouse)
132 76193d7c 2003-09-30 devnull can |= ecanmouse();
133 76193d7c 2003-09-30 devnull if(keys&Ekeyboard)
134 76193d7c 2003-09-30 devnull can |= ecankbd();
135 76193d7c 2003-09-30 devnull return can;
136 76193d7c 2003-09-30 devnull }
137 76193d7c 2003-09-30 devnull
138 76193d7c 2003-09-30 devnull int
139 76193d7c 2003-09-30 devnull ecanmouse(void)
140 76193d7c 2003-09-30 devnull {
141 76193d7c 2003-09-30 devnull XEvent xe;
142 76193d7c 2003-09-30 devnull Mouse m;
143 76193d7c 2003-09-30 devnull
144 59d7d92e 2003-10-13 devnull eflush();
145 76193d7c 2003-09-30 devnull again:
146 76193d7c 2003-09-30 devnull if(XCheckWindowEvent(_x.display, _x.drawable, MouseMask, &xe)){
147 32f69c36 2003-12-11 devnull if(_xtoplan9mouse(_x.display, &xe, &m) < 0)
148 76193d7c 2003-09-30 devnull goto again;
149 76193d7c 2003-09-30 devnull XPutBackEvent(_x.display, &xe);
150 76193d7c 2003-09-30 devnull return 1;
151 76193d7c 2003-09-30 devnull }
152 76193d7c 2003-09-30 devnull return 0;
153 76193d7c 2003-09-30 devnull }
154 76193d7c 2003-09-30 devnull
155 76193d7c 2003-09-30 devnull int
156 76193d7c 2003-09-30 devnull ecankbd(void)
157 76193d7c 2003-09-30 devnull {
158 76193d7c 2003-09-30 devnull XEvent xe;
159 16a70966 2003-11-23 devnull int r;
160 76193d7c 2003-09-30 devnull
161 59d7d92e 2003-10-13 devnull eflush();
162 32f69c36 2003-12-11 devnull if((r = _xtoplan9kbd(nil)) >= 0){
163 32f69c36 2003-12-11 devnull _xtoplan9kbd((XEvent*)-1);
164 16a70966 2003-11-23 devnull return 1;
165 16a70966 2003-11-23 devnull }
166 76193d7c 2003-09-30 devnull again:
167 76193d7c 2003-09-30 devnull if(XCheckWindowEvent(_x.display, _x.drawable, KeyPressMask, &xe)){
168 32f69c36 2003-12-11 devnull if(_xtoplan9kbd(&xe) == -1)
169 76193d7c 2003-09-30 devnull goto again;
170 76193d7c 2003-09-30 devnull XPutBackEvent(_x.display, &xe);
171 76193d7c 2003-09-30 devnull return 1;
172 76193d7c 2003-09-30 devnull }
173 76193d7c 2003-09-30 devnull return 0;
174 76193d7c 2003-09-30 devnull }
175 76193d7c 2003-09-30 devnull
176 76193d7c 2003-09-30 devnull void
177 76193d7c 2003-09-30 devnull emoveto(Point p)
178 76193d7c 2003-09-30 devnull {
179 32f69c36 2003-12-11 devnull _xmoveto(p);
180 76193d7c 2003-09-30 devnull }
181 76193d7c 2003-09-30 devnull
182 59d7d92e 2003-10-13 devnull void
183 59d7d92e 2003-10-13 devnull esetcursor(Cursor *c)
184 59d7d92e 2003-10-13 devnull {
185 32f69c36 2003-12-11 devnull _xsetcursor(c);
186 59d7d92e 2003-10-13 devnull }
187 59d7d92e 2003-10-13 devnull