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