Blame


1 038e9089 2004-03-21 devnull /* Copyright (c) 1994-1996 David Hogan, see README for licence details */
2 038e9089 2004-03-21 devnull #include <stdio.h>
3 e62ba5ec 2004-03-21 devnull #include <stdlib.h>
4 038e9089 2004-03-21 devnull #include <X11/X.h>
5 038e9089 2004-03-21 devnull #include <X11/Xos.h>
6 038e9089 2004-03-21 devnull #include <X11/Xlib.h>
7 038e9089 2004-03-21 devnull #include <X11/Xutil.h>
8 038e9089 2004-03-21 devnull #include <X11/Xatom.h>
9 038e9089 2004-03-21 devnull #include <X11/extensions/shape.h>
10 038e9089 2004-03-21 devnull #include "dat.h"
11 038e9089 2004-03-21 devnull #include "fns.h"
12 038e9089 2004-03-21 devnull #include "patchlevel.h"
13 038e9089 2004-03-21 devnull
14 038e9089 2004-03-21 devnull void
15 038e9089 2004-03-21 devnull mainloop(int shape_event)
16 038e9089 2004-03-21 devnull {
17 038e9089 2004-03-21 devnull XEvent ev;
18 038e9089 2004-03-21 devnull
19 038e9089 2004-03-21 devnull for (;;) {
20 038e9089 2004-03-21 devnull getevent(&ev);
21 038e9089 2004-03-21 devnull
22 038e9089 2004-03-21 devnull #ifdef DEBUG_EV
23 038e9089 2004-03-21 devnull if (debug) {
24 038e9089 2004-03-21 devnull ShowEvent(&ev);
25 038e9089 2004-03-21 devnull printf("\n");
26 038e9089 2004-03-21 devnull }
27 038e9089 2004-03-21 devnull #endif
28 038e9089 2004-03-21 devnull switch (ev.type) {
29 038e9089 2004-03-21 devnull default:
30 038e9089 2004-03-21 devnull #ifdef SHAPE
31 038e9089 2004-03-21 devnull if (shape && ev.type == shape_event)
32 038e9089 2004-03-21 devnull shapenotify((XShapeEvent *)&ev);
33 038e9089 2004-03-21 devnull else
34 038e9089 2004-03-21 devnull #endif
35 aa808685 2004-04-19 devnull fprintf(stderr, "rio: unknown ev.type %d\n", ev.type);
36 038e9089 2004-03-21 devnull break;
37 038e9089 2004-03-21 devnull case ButtonPress:
38 038e9089 2004-03-21 devnull button(&ev.xbutton);
39 038e9089 2004-03-21 devnull break;
40 038e9089 2004-03-21 devnull case ButtonRelease:
41 038e9089 2004-03-21 devnull break;
42 038e9089 2004-03-21 devnull case MapRequest:
43 038e9089 2004-03-21 devnull mapreq(&ev.xmaprequest);
44 038e9089 2004-03-21 devnull break;
45 038e9089 2004-03-21 devnull case ConfigureRequest:
46 038e9089 2004-03-21 devnull configurereq(&ev.xconfigurerequest);
47 038e9089 2004-03-21 devnull break;
48 038e9089 2004-03-21 devnull case CirculateRequest:
49 038e9089 2004-03-21 devnull circulatereq(&ev.xcirculaterequest);
50 038e9089 2004-03-21 devnull break;
51 038e9089 2004-03-21 devnull case UnmapNotify:
52 038e9089 2004-03-21 devnull unmap(&ev.xunmap);
53 038e9089 2004-03-21 devnull break;
54 038e9089 2004-03-21 devnull case CreateNotify:
55 038e9089 2004-03-21 devnull newwindow(&ev.xcreatewindow);
56 038e9089 2004-03-21 devnull break;
57 038e9089 2004-03-21 devnull case DestroyNotify:
58 038e9089 2004-03-21 devnull destroy(ev.xdestroywindow.window);
59 038e9089 2004-03-21 devnull break;
60 038e9089 2004-03-21 devnull case ClientMessage:
61 038e9089 2004-03-21 devnull clientmesg(&ev.xclient);
62 038e9089 2004-03-21 devnull break;
63 038e9089 2004-03-21 devnull case ColormapNotify:
64 038e9089 2004-03-21 devnull cmap(&ev.xcolormap);
65 038e9089 2004-03-21 devnull break;
66 038e9089 2004-03-21 devnull case PropertyNotify:
67 038e9089 2004-03-21 devnull property(&ev.xproperty);
68 038e9089 2004-03-21 devnull break;
69 038e9089 2004-03-21 devnull case SelectionClear:
70 aa808685 2004-04-19 devnull fprintf(stderr, "rio: SelectionClear (this should not happen)\n");
71 038e9089 2004-03-21 devnull break;
72 038e9089 2004-03-21 devnull case SelectionNotify:
73 aa808685 2004-04-19 devnull fprintf(stderr, "rio: SelectionNotify (this should not happen)\n");
74 038e9089 2004-03-21 devnull break;
75 038e9089 2004-03-21 devnull case SelectionRequest:
76 aa808685 2004-04-19 devnull fprintf(stderr, "rio: SelectionRequest (this should not happen)\n");
77 038e9089 2004-03-21 devnull break;
78 038e9089 2004-03-21 devnull case EnterNotify:
79 038e9089 2004-03-21 devnull enter(&ev.xcrossing);
80 038e9089 2004-03-21 devnull break;
81 1cb3fa80 2004-03-29 devnull case LeaveNotify:
82 1cb3fa80 2004-03-29 devnull leave(&ev.xcrossing);
83 1cb3fa80 2004-03-29 devnull break;
84 038e9089 2004-03-21 devnull case ReparentNotify:
85 038e9089 2004-03-21 devnull reparent(&ev.xreparent);
86 038e9089 2004-03-21 devnull break;
87 038e9089 2004-03-21 devnull case FocusIn:
88 038e9089 2004-03-21 devnull focusin(&ev.xfocus);
89 038e9089 2004-03-21 devnull break;
90 038e9089 2004-03-21 devnull case MotionNotify:
91 1cb3fa80 2004-03-29 devnull motionnotify(&ev.xmotion);
92 1cb3fa80 2004-03-29 devnull break;
93 038e9089 2004-03-21 devnull case Expose:
94 038e9089 2004-03-21 devnull case NoExpose:
95 038e9089 2004-03-21 devnull case FocusOut:
96 038e9089 2004-03-21 devnull case ConfigureNotify:
97 038e9089 2004-03-21 devnull case MapNotify:
98 038e9089 2004-03-21 devnull case MappingNotify:
99 e62ba5ec 2004-03-21 devnull case GraphicsExpose:
100 038e9089 2004-03-21 devnull /* not interested */
101 038e9089 2004-03-21 devnull trace("ignore", 0, &ev);
102 038e9089 2004-03-21 devnull break;
103 038e9089 2004-03-21 devnull }
104 038e9089 2004-03-21 devnull }
105 038e9089 2004-03-21 devnull }
106 038e9089 2004-03-21 devnull
107 038e9089 2004-03-21 devnull
108 038e9089 2004-03-21 devnull void
109 038e9089 2004-03-21 devnull configurereq(XConfigureRequestEvent *e)
110 038e9089 2004-03-21 devnull {
111 038e9089 2004-03-21 devnull XWindowChanges wc;
112 038e9089 2004-03-21 devnull Client *c;
113 038e9089 2004-03-21 devnull
114 038e9089 2004-03-21 devnull /* we don't set curtime as nothing here uses it */
115 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
116 038e9089 2004-03-21 devnull trace("configurereq", c, e);
117 038e9089 2004-03-21 devnull
118 038e9089 2004-03-21 devnull e->value_mask &= ~CWSibling;
119 038e9089 2004-03-21 devnull
120 038e9089 2004-03-21 devnull if (c) {
121 038e9089 2004-03-21 devnull gravitate(c, 1);
122 038e9089 2004-03-21 devnull if (e->value_mask & CWX)
123 038e9089 2004-03-21 devnull c->x = e->x;
124 038e9089 2004-03-21 devnull if (e->value_mask & CWY)
125 038e9089 2004-03-21 devnull c->y = e->y;
126 038e9089 2004-03-21 devnull if (e->value_mask & CWWidth)
127 038e9089 2004-03-21 devnull c->dx = e->width;
128 038e9089 2004-03-21 devnull if (e->value_mask & CWHeight)
129 038e9089 2004-03-21 devnull c->dy = e->height;
130 038e9089 2004-03-21 devnull if (e->value_mask & CWBorderWidth)
131 038e9089 2004-03-21 devnull c->border = e->border_width;
132 038e9089 2004-03-21 devnull gravitate(c, 0);
133 bdf49b7e 2004-08-13 devnull if (e->value_mask & CWStackMode) {
134 bdf49b7e 2004-08-13 devnull if (e->detail == Above)
135 bdf49b7e 2004-08-13 devnull top(c);
136 bdf49b7e 2004-08-13 devnull else
137 bdf49b7e 2004-08-13 devnull e->value_mask &= ~CWStackMode;
138 bdf49b7e 2004-08-13 devnull }
139 038e9089 2004-03-21 devnull if (c->parent != c->screen->root && c->window == e->window) {
140 038e9089 2004-03-21 devnull wc.x = c->x-BORDER;
141 038e9089 2004-03-21 devnull wc.y = c->y-BORDER;
142 038e9089 2004-03-21 devnull wc.width = c->dx+2*BORDER;
143 038e9089 2004-03-21 devnull wc.height = c->dy+2*BORDER;
144 038e9089 2004-03-21 devnull wc.border_width = 1;
145 038e9089 2004-03-21 devnull wc.sibling = None;
146 038e9089 2004-03-21 devnull wc.stack_mode = e->detail;
147 038e9089 2004-03-21 devnull XConfigureWindow(dpy, c->parent, e->value_mask, &wc);
148 038e9089 2004-03-21 devnull sendconfig(c);
149 bdf49b7e 2004-08-13 devnull if (e->value_mask & CWStackMode) {
150 2c1b986e 2004-08-13 devnull top(c);
151 2c1b986e 2004-08-13 devnull active(c);
152 bdf49b7e 2004-08-13 devnull }
153 2c1b986e 2004-08-13 devnull }
154 038e9089 2004-03-21 devnull }
155 038e9089 2004-03-21 devnull
156 038e9089 2004-03-21 devnull if (c && c->init) {
157 038e9089 2004-03-21 devnull wc.x = BORDER;
158 038e9089 2004-03-21 devnull wc.y = BORDER;
159 038e9089 2004-03-21 devnull }
160 038e9089 2004-03-21 devnull else {
161 038e9089 2004-03-21 devnull wc.x = e->x;
162 038e9089 2004-03-21 devnull wc.y = e->y;
163 038e9089 2004-03-21 devnull }
164 038e9089 2004-03-21 devnull wc.width = e->width;
165 038e9089 2004-03-21 devnull wc.height = e->height;
166 038e9089 2004-03-21 devnull wc.border_width = 0;
167 038e9089 2004-03-21 devnull wc.sibling = None;
168 038e9089 2004-03-21 devnull wc.stack_mode = Above;
169 038e9089 2004-03-21 devnull e->value_mask &= ~CWStackMode;
170 038e9089 2004-03-21 devnull e->value_mask |= CWBorderWidth;
171 038e9089 2004-03-21 devnull
172 038e9089 2004-03-21 devnull XConfigureWindow(dpy, e->window, e->value_mask, &wc);
173 038e9089 2004-03-21 devnull }
174 038e9089 2004-03-21 devnull
175 038e9089 2004-03-21 devnull void
176 038e9089 2004-03-21 devnull mapreq(XMapRequestEvent *e)
177 038e9089 2004-03-21 devnull {
178 038e9089 2004-03-21 devnull Client *c;
179 038e9089 2004-03-21 devnull int i;
180 038e9089 2004-03-21 devnull
181 038e9089 2004-03-21 devnull curtime = CurrentTime;
182 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
183 038e9089 2004-03-21 devnull trace("mapreq", c, e);
184 038e9089 2004-03-21 devnull
185 038e9089 2004-03-21 devnull if (c == 0 || c->window != e->window) {
186 038e9089 2004-03-21 devnull /* workaround for stupid NCDware */
187 aa808685 2004-04-19 devnull fprintf(stderr, "rio: bad mapreq c %p w %x, rescanning\n",
188 e62ba5ec 2004-03-21 devnull c, (int)e->window);
189 038e9089 2004-03-21 devnull for (i = 0; i < num_screens; i++)
190 038e9089 2004-03-21 devnull scanwins(&screens[i]);
191 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
192 038e9089 2004-03-21 devnull if (c == 0 || c->window != e->window) {
193 aa808685 2004-04-19 devnull fprintf(stderr, "rio: window not found after rescan\n");
194 038e9089 2004-03-21 devnull return;
195 038e9089 2004-03-21 devnull }
196 038e9089 2004-03-21 devnull }
197 038e9089 2004-03-21 devnull
198 038e9089 2004-03-21 devnull switch (c->state) {
199 038e9089 2004-03-21 devnull case WithdrawnState:
200 038e9089 2004-03-21 devnull if (c->parent == c->screen->root) {
201 038e9089 2004-03-21 devnull if (!manage(c, 0))
202 038e9089 2004-03-21 devnull return;
203 038e9089 2004-03-21 devnull break;
204 038e9089 2004-03-21 devnull }
205 038e9089 2004-03-21 devnull XReparentWindow(dpy, c->window, c->parent, BORDER-1, BORDER-1);
206 038e9089 2004-03-21 devnull XAddToSaveSet(dpy, c->window);
207 038e9089 2004-03-21 devnull /* fall through... */
208 038e9089 2004-03-21 devnull case NormalState:
209 038e9089 2004-03-21 devnull XMapWindow(dpy, c->window);
210 038e9089 2004-03-21 devnull XMapRaised(dpy, c->parent);
211 038e9089 2004-03-21 devnull top(c);
212 038e9089 2004-03-21 devnull setstate(c, NormalState);
213 038e9089 2004-03-21 devnull if (c->trans != None && current && c->trans == current->window)
214 038e9089 2004-03-21 devnull active(c);
215 038e9089 2004-03-21 devnull break;
216 038e9089 2004-03-21 devnull case IconicState:
217 038e9089 2004-03-21 devnull unhidec(c, 1);
218 038e9089 2004-03-21 devnull break;
219 038e9089 2004-03-21 devnull }
220 038e9089 2004-03-21 devnull }
221 038e9089 2004-03-21 devnull
222 038e9089 2004-03-21 devnull void
223 038e9089 2004-03-21 devnull unmap(XUnmapEvent *e)
224 038e9089 2004-03-21 devnull {
225 038e9089 2004-03-21 devnull Client *c;
226 038e9089 2004-03-21 devnull
227 038e9089 2004-03-21 devnull curtime = CurrentTime;
228 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
229 038e9089 2004-03-21 devnull if (c) {
230 038e9089 2004-03-21 devnull switch (c->state) {
231 038e9089 2004-03-21 devnull case IconicState:
232 038e9089 2004-03-21 devnull if (e->send_event) {
233 038e9089 2004-03-21 devnull unhidec(c, 0);
234 038e9089 2004-03-21 devnull withdraw(c);
235 038e9089 2004-03-21 devnull }
236 038e9089 2004-03-21 devnull break;
237 038e9089 2004-03-21 devnull case NormalState:
238 038e9089 2004-03-21 devnull if (c == current)
239 038e9089 2004-03-21 devnull nofocus();
240 038e9089 2004-03-21 devnull if (!c->reparenting)
241 038e9089 2004-03-21 devnull withdraw(c);
242 038e9089 2004-03-21 devnull break;
243 038e9089 2004-03-21 devnull }
244 038e9089 2004-03-21 devnull c->reparenting = 0;
245 038e9089 2004-03-21 devnull }
246 038e9089 2004-03-21 devnull }
247 038e9089 2004-03-21 devnull
248 038e9089 2004-03-21 devnull void
249 038e9089 2004-03-21 devnull circulatereq(XCirculateRequestEvent *e)
250 038e9089 2004-03-21 devnull {
251 038e9089 2004-03-21 devnull fprintf(stderr, "It must be the warlock Krill!\n"); /* ☺ */
252 038e9089 2004-03-21 devnull }
253 038e9089 2004-03-21 devnull
254 038e9089 2004-03-21 devnull void
255 038e9089 2004-03-21 devnull newwindow(XCreateWindowEvent *e)
256 038e9089 2004-03-21 devnull {
257 038e9089 2004-03-21 devnull Client *c;
258 038e9089 2004-03-21 devnull ScreenInfo *s;
259 038e9089 2004-03-21 devnull
260 038e9089 2004-03-21 devnull /* we don't set curtime as nothing here uses it */
261 038e9089 2004-03-21 devnull if (e->override_redirect)
262 038e9089 2004-03-21 devnull return;
263 038e9089 2004-03-21 devnull c = getclient(e->window, 1);
264 038e9089 2004-03-21 devnull if (c && c->window == e->window && (s = getscreen(e->parent))) {
265 038e9089 2004-03-21 devnull c->x = e->x;
266 038e9089 2004-03-21 devnull c->y = e->y;
267 038e9089 2004-03-21 devnull c->dx = e->width;
268 038e9089 2004-03-21 devnull c->dy = e->height;
269 038e9089 2004-03-21 devnull c->border = e->border_width;
270 038e9089 2004-03-21 devnull c->screen = s;
271 038e9089 2004-03-21 devnull if (c->parent == None)
272 038e9089 2004-03-21 devnull c->parent = c->screen->root;
273 038e9089 2004-03-21 devnull }
274 038e9089 2004-03-21 devnull }
275 038e9089 2004-03-21 devnull
276 038e9089 2004-03-21 devnull void
277 038e9089 2004-03-21 devnull destroy(Window w)
278 038e9089 2004-03-21 devnull {
279 038e9089 2004-03-21 devnull Client *c;
280 038e9089 2004-03-21 devnull
281 038e9089 2004-03-21 devnull curtime = CurrentTime;
282 038e9089 2004-03-21 devnull c = getclient(w, 0);
283 038e9089 2004-03-21 devnull if (c == 0)
284 038e9089 2004-03-21 devnull return;
285 038e9089 2004-03-21 devnull
286 038e9089 2004-03-21 devnull rmclient(c);
287 038e9089 2004-03-21 devnull
288 038e9089 2004-03-21 devnull /* flush any errors generated by the window's sudden demise */
289 038e9089 2004-03-21 devnull ignore_badwindow = 1;
290 038e9089 2004-03-21 devnull XSync(dpy, False);
291 038e9089 2004-03-21 devnull ignore_badwindow = 0;
292 038e9089 2004-03-21 devnull }
293 038e9089 2004-03-21 devnull
294 038e9089 2004-03-21 devnull void
295 038e9089 2004-03-21 devnull clientmesg(XClientMessageEvent *e)
296 038e9089 2004-03-21 devnull {
297 038e9089 2004-03-21 devnull Client *c;
298 038e9089 2004-03-21 devnull
299 038e9089 2004-03-21 devnull curtime = CurrentTime;
300 aa808685 2004-04-19 devnull if (e->message_type == exit_rio) {
301 038e9089 2004-03-21 devnull cleanup();
302 038e9089 2004-03-21 devnull exit(0);
303 038e9089 2004-03-21 devnull }
304 aa808685 2004-04-19 devnull if (e->message_type == restart_rio) {
305 aa808685 2004-04-19 devnull fprintf(stderr, "*** rio restarting ***\n");
306 038e9089 2004-03-21 devnull cleanup();
307 038e9089 2004-03-21 devnull execvp(myargv[0], myargv);
308 aa808685 2004-04-19 devnull perror("rio: exec failed");
309 038e9089 2004-03-21 devnull exit(1);
310 038e9089 2004-03-21 devnull }
311 038e9089 2004-03-21 devnull if (e->message_type == wm_change_state) {
312 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
313 038e9089 2004-03-21 devnull if (e->format == 32 && e->data.l[0] == IconicState && c != 0) {
314 038e9089 2004-03-21 devnull if (normal(c))
315 038e9089 2004-03-21 devnull hide(c);
316 038e9089 2004-03-21 devnull }
317 038e9089 2004-03-21 devnull else
318 aa808685 2004-04-19 devnull fprintf(stderr, "rio: WM_CHANGE_STATE: format %d data %d w 0x%x\n",
319 e62ba5ec 2004-03-21 devnull (int)e->format, (int)e->data.l[0], (int)e->window);
320 038e9089 2004-03-21 devnull return;
321 038e9089 2004-03-21 devnull }
322 aa808685 2004-04-19 devnull fprintf(stderr, "rio: strange ClientMessage, type 0x%x window 0x%x\n",
323 e62ba5ec 2004-03-21 devnull (int)e->message_type, (int)e->window);
324 038e9089 2004-03-21 devnull }
325 038e9089 2004-03-21 devnull
326 038e9089 2004-03-21 devnull void
327 038e9089 2004-03-21 devnull cmap(XColormapEvent *e)
328 038e9089 2004-03-21 devnull {
329 038e9089 2004-03-21 devnull Client *c;
330 038e9089 2004-03-21 devnull int i;
331 038e9089 2004-03-21 devnull
332 038e9089 2004-03-21 devnull /* we don't set curtime as nothing here uses it */
333 038e9089 2004-03-21 devnull if (e->new) {
334 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
335 038e9089 2004-03-21 devnull if (c) {
336 038e9089 2004-03-21 devnull c->cmap = e->colormap;
337 038e9089 2004-03-21 devnull if (c == current)
338 038e9089 2004-03-21 devnull cmapfocus(c);
339 038e9089 2004-03-21 devnull }
340 038e9089 2004-03-21 devnull else
341 038e9089 2004-03-21 devnull for (c = clients; c; c = c->next) {
342 038e9089 2004-03-21 devnull for (i = 0; i < c->ncmapwins; i++)
343 038e9089 2004-03-21 devnull if (c->cmapwins[i] == e->window) {
344 038e9089 2004-03-21 devnull c->wmcmaps[i] = e->colormap;
345 038e9089 2004-03-21 devnull if (c == current)
346 038e9089 2004-03-21 devnull cmapfocus(c);
347 038e9089 2004-03-21 devnull return;
348 038e9089 2004-03-21 devnull }
349 038e9089 2004-03-21 devnull }
350 038e9089 2004-03-21 devnull }
351 038e9089 2004-03-21 devnull }
352 038e9089 2004-03-21 devnull
353 038e9089 2004-03-21 devnull void
354 038e9089 2004-03-21 devnull property(XPropertyEvent *e)
355 038e9089 2004-03-21 devnull {
356 038e9089 2004-03-21 devnull Atom a;
357 038e9089 2004-03-21 devnull int delete;
358 038e9089 2004-03-21 devnull Client *c;
359 78802e69 2004-04-24 devnull long msize;
360 038e9089 2004-03-21 devnull
361 038e9089 2004-03-21 devnull /* we don't set curtime as nothing here uses it */
362 038e9089 2004-03-21 devnull a = e->atom;
363 038e9089 2004-03-21 devnull delete = (e->state == PropertyDelete);
364 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
365 038e9089 2004-03-21 devnull if (c == 0)
366 038e9089 2004-03-21 devnull return;
367 038e9089 2004-03-21 devnull
368 038e9089 2004-03-21 devnull switch (a) {
369 038e9089 2004-03-21 devnull case XA_WM_ICON_NAME:
370 038e9089 2004-03-21 devnull if (c->iconname != 0)
371 038e9089 2004-03-21 devnull XFree((char*) c->iconname);
372 038e9089 2004-03-21 devnull c->iconname = delete ? 0 : getprop(c->window, a);
373 038e9089 2004-03-21 devnull setlabel(c);
374 038e9089 2004-03-21 devnull renamec(c, c->label);
375 038e9089 2004-03-21 devnull return;
376 038e9089 2004-03-21 devnull case XA_WM_NAME:
377 038e9089 2004-03-21 devnull if (c->name != 0)
378 038e9089 2004-03-21 devnull XFree((char*) c->name);
379 038e9089 2004-03-21 devnull c->name = delete ? 0 : getprop(c->window, a);
380 038e9089 2004-03-21 devnull setlabel(c);
381 038e9089 2004-03-21 devnull renamec(c, c->label);
382 038e9089 2004-03-21 devnull return;
383 038e9089 2004-03-21 devnull case XA_WM_TRANSIENT_FOR:
384 038e9089 2004-03-21 devnull gettrans(c);
385 038e9089 2004-03-21 devnull return;
386 78802e69 2004-04-24 devnull case XA_WM_HINTS:
387 78802e69 2004-04-24 devnull case XA_WM_SIZE_HINTS:
388 78802e69 2004-04-24 devnull case XA_WM_ZOOM_HINTS:
389 78802e69 2004-04-24 devnull /* placeholders to not forget. ignore for now. -Axel */
390 78802e69 2004-04-24 devnull return;
391 78802e69 2004-04-24 devnull case XA_WM_NORMAL_HINTS:
392 78802e69 2004-04-24 devnull if (XGetWMNormalHints(dpy, c->window, &c->size, &msize) == 0 || c->size.flags == 0)
393 78802e69 2004-04-24 devnull c->size.flags = PSize; /* not specified - punt */
394 78802e69 2004-04-24 devnull return;
395 038e9089 2004-03-21 devnull }
396 aa808685 2004-04-19 devnull if (a == _rio_hold_mode) {
397 aa808685 2004-04-19 devnull c->hold = getiprop(c->window, _rio_hold_mode);
398 038e9089 2004-03-21 devnull if (c == current)
399 038e9089 2004-03-21 devnull draw_border(c, 1);
400 038e9089 2004-03-21 devnull }
401 038e9089 2004-03-21 devnull else if (a == wm_colormaps) {
402 038e9089 2004-03-21 devnull getcmaps(c);
403 038e9089 2004-03-21 devnull if (c == current)
404 038e9089 2004-03-21 devnull cmapfocus(c);
405 038e9089 2004-03-21 devnull }
406 038e9089 2004-03-21 devnull }
407 038e9089 2004-03-21 devnull
408 038e9089 2004-03-21 devnull void
409 038e9089 2004-03-21 devnull reparent(XReparentEvent *e)
410 038e9089 2004-03-21 devnull {
411 038e9089 2004-03-21 devnull Client *c;
412 038e9089 2004-03-21 devnull XWindowAttributes attr;
413 038e9089 2004-03-21 devnull ScreenInfo *s;
414 038e9089 2004-03-21 devnull
415 038e9089 2004-03-21 devnull /* we don't set curtime as nothing here uses it */
416 038e9089 2004-03-21 devnull if (!getscreen(e->event) || e->override_redirect)
417 038e9089 2004-03-21 devnull return;
418 038e9089 2004-03-21 devnull if ((s = getscreen(e->parent)) != 0) {
419 038e9089 2004-03-21 devnull c = getclient(e->window, 1);
420 038e9089 2004-03-21 devnull if (c != 0 && (c->dx == 0 || c->dy == 0)) {
421 78802e69 2004-04-24 devnull /* flush any errors */
422 78802e69 2004-04-24 devnull ignore_badwindow = 1;
423 038e9089 2004-03-21 devnull XGetWindowAttributes(dpy, c->window, &attr);
424 78802e69 2004-04-24 devnull XSync(dpy, False);
425 78802e69 2004-04-24 devnull ignore_badwindow = 0;
426 78802e69 2004-04-24 devnull
427 038e9089 2004-03-21 devnull c->x = attr.x;
428 038e9089 2004-03-21 devnull c->y = attr.y;
429 038e9089 2004-03-21 devnull c->dx = attr.width;
430 038e9089 2004-03-21 devnull c->dy = attr.height;
431 038e9089 2004-03-21 devnull c->border = attr.border_width;
432 038e9089 2004-03-21 devnull c->screen = s;
433 038e9089 2004-03-21 devnull if (c->parent == None)
434 038e9089 2004-03-21 devnull c->parent = c->screen->root;
435 038e9089 2004-03-21 devnull }
436 038e9089 2004-03-21 devnull }
437 038e9089 2004-03-21 devnull else {
438 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
439 038e9089 2004-03-21 devnull if (c != 0 && (c->parent == c->screen->root || withdrawn(c)))
440 038e9089 2004-03-21 devnull rmclient(c);
441 038e9089 2004-03-21 devnull }
442 038e9089 2004-03-21 devnull }
443 038e9089 2004-03-21 devnull
444 038e9089 2004-03-21 devnull #ifdef SHAPE
445 038e9089 2004-03-21 devnull void
446 038e9089 2004-03-21 devnull shapenotify(XShapeEvent *e)
447 038e9089 2004-03-21 devnull {
448 038e9089 2004-03-21 devnull Client *c;
449 038e9089 2004-03-21 devnull
450 038e9089 2004-03-21 devnull /* we don't set curtime as nothing here uses it */
451 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
452 038e9089 2004-03-21 devnull if (c == 0)
453 038e9089 2004-03-21 devnull return;
454 038e9089 2004-03-21 devnull
455 038e9089 2004-03-21 devnull setshape(c);
456 038e9089 2004-03-21 devnull }
457 038e9089 2004-03-21 devnull #endif
458 038e9089 2004-03-21 devnull
459 038e9089 2004-03-21 devnull void
460 038e9089 2004-03-21 devnull enter(XCrossingEvent *e)
461 038e9089 2004-03-21 devnull {
462 038e9089 2004-03-21 devnull Client *c;
463 038e9089 2004-03-21 devnull
464 038e9089 2004-03-21 devnull curtime = e->time;
465 038e9089 2004-03-21 devnull if (e->mode != NotifyGrab || e->detail != NotifyNonlinearVirtual)
466 038e9089 2004-03-21 devnull return;
467 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
468 038e9089 2004-03-21 devnull if (c != 0 && c != current) {
469 038e9089 2004-03-21 devnull /* someone grabbed the pointer; make them current */
470 038e9089 2004-03-21 devnull XMapRaised(dpy, c->parent);
471 038e9089 2004-03-21 devnull top(c);
472 038e9089 2004-03-21 devnull active(c);
473 038e9089 2004-03-21 devnull }
474 038e9089 2004-03-21 devnull }
475 038e9089 2004-03-21 devnull
476 038e9089 2004-03-21 devnull void
477 1cb3fa80 2004-03-29 devnull leave(XCrossingEvent *e)
478 1cb3fa80 2004-03-29 devnull {
479 1cb3fa80 2004-03-29 devnull Client *c;
480 1cb3fa80 2004-03-29 devnull
481 1cb3fa80 2004-03-29 devnull c = getclient(e->window, 0);
482 c005568a 2004-03-30 devnull if (c)
483 c005568a 2004-03-30 devnull XUndefineCursor(dpy, c->parent);
484 1cb3fa80 2004-03-29 devnull /* XDefineCursor(dpy, c->parent, c->screen->arrow); */
485 1cb3fa80 2004-03-29 devnull }
486 1cb3fa80 2004-03-29 devnull
487 1cb3fa80 2004-03-29 devnull void
488 038e9089 2004-03-21 devnull focusin(XFocusChangeEvent *e)
489 038e9089 2004-03-21 devnull {
490 038e9089 2004-03-21 devnull Client *c;
491 038e9089 2004-03-21 devnull
492 038e9089 2004-03-21 devnull curtime = CurrentTime;
493 038e9089 2004-03-21 devnull if (e->detail != NotifyNonlinearVirtual)
494 038e9089 2004-03-21 devnull return;
495 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
496 038e9089 2004-03-21 devnull if (c != 0 && c->window == e->window && c != current) {
497 038e9089 2004-03-21 devnull /* someone grabbed keyboard or seized focus; make them current */
498 038e9089 2004-03-21 devnull XMapRaised(dpy, c->parent);
499 038e9089 2004-03-21 devnull top(c);
500 038e9089 2004-03-21 devnull active(c);
501 1cb3fa80 2004-03-29 devnull }
502 1cb3fa80 2004-03-29 devnull }
503 1cb3fa80 2004-03-29 devnull
504 c005568a 2004-03-30 devnull BorderOrient
505 c005568a 2004-03-30 devnull borderorient(Client *c, int x, int y)
506 1cb3fa80 2004-03-29 devnull {
507 1cb3fa80 2004-03-29 devnull if (x <= BORDER) {
508 1cb3fa80 2004-03-29 devnull if (y <= CORNER) {
509 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "topleft\n");
510 c005568a 2004-03-30 devnull return BorderWNW;
511 1cb3fa80 2004-03-29 devnull }
512 1cb3fa80 2004-03-29 devnull if (y >= (c->dy + 2*BORDER) - CORNER) {
513 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "botleft\n");
514 c005568a 2004-03-30 devnull return BorderWSW;
515 1cb3fa80 2004-03-29 devnull }
516 1cb3fa80 2004-03-29 devnull if (y > CORNER &&
517 3ddda821 2004-12-28 devnull y < (c->dy + 2*BORDER) - CORNER) {
518 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "left\n");
519 1cb3fa80 2004-03-29 devnull return BorderW;
520 1cb3fa80 2004-03-29 devnull }
521 1cb3fa80 2004-03-29 devnull } else if (x <= CORNER) {
522 1cb3fa80 2004-03-29 devnull if (y <= BORDER) {
523 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "topleft\n");
524 c005568a 2004-03-30 devnull return BorderNNW;
525 1cb3fa80 2004-03-29 devnull }
526 1cb3fa80 2004-03-29 devnull if (y >= (c->dy + BORDER)) {
527 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "botleft\n");
528 c005568a 2004-03-30 devnull return BorderSSW;
529 1cb3fa80 2004-03-29 devnull }
530 1cb3fa80 2004-03-29 devnull } else if (x >= (c->dx + BORDER)) {
531 1cb3fa80 2004-03-29 devnull if (y <= CORNER) {
532 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "topright\n");
533 c005568a 2004-03-30 devnull return BorderENE;
534 1cb3fa80 2004-03-29 devnull }
535 1cb3fa80 2004-03-29 devnull if (y >= (c->dy + 2*BORDER) - CORNER) {
536 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "botright\n");
537 c005568a 2004-03-30 devnull return BorderESE;
538 1cb3fa80 2004-03-29 devnull }
539 1cb3fa80 2004-03-29 devnull if (y > CORNER &&
540 1cb3fa80 2004-03-29 devnull y < (c->dy + 2*BORDER) - CORNER) {
541 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "right\n");
542 1cb3fa80 2004-03-29 devnull return BorderE;
543 1cb3fa80 2004-03-29 devnull }
544 1cb3fa80 2004-03-29 devnull } else if (x >= (c->dx + 2*BORDER) - CORNER) {
545 1cb3fa80 2004-03-29 devnull if (y <= BORDER) {
546 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "topright\n");
547 c005568a 2004-03-30 devnull return BorderNNE;
548 1cb3fa80 2004-03-29 devnull }
549 1cb3fa80 2004-03-29 devnull if (y >= (c->dy + BORDER)) {
550 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "botright\n");
551 c005568a 2004-03-30 devnull return BorderSSE;
552 1cb3fa80 2004-03-29 devnull }
553 1cb3fa80 2004-03-29 devnull } else if (x > CORNER &&
554 3ddda821 2004-12-28 devnull x < (c->dx + 2*BORDER) - CORNER) {
555 1cb3fa80 2004-03-29 devnull if (y <= BORDER) {
556 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "top\n");
557 1cb3fa80 2004-03-29 devnull return BorderN;
558 1cb3fa80 2004-03-29 devnull }
559 1cb3fa80 2004-03-29 devnull if (y >= (c->dy + BORDER)) {
560 1cb3fa80 2004-03-29 devnull if (debug) fprintf(stderr, "bot\n");
561 1cb3fa80 2004-03-29 devnull return BorderS;
562 1cb3fa80 2004-03-29 devnull }
563 038e9089 2004-03-21 devnull }
564 1cb3fa80 2004-03-29 devnull return BorderUnknown;
565 038e9089 2004-03-21 devnull }
566 1cb3fa80 2004-03-29 devnull
567 1cb3fa80 2004-03-29 devnull void
568 1cb3fa80 2004-03-29 devnull motionnotify(XMotionEvent *e)
569 1cb3fa80 2004-03-29 devnull {
570 1cb3fa80 2004-03-29 devnull Client *c;
571 c005568a 2004-03-30 devnull BorderOrient bl;
572 1cb3fa80 2004-03-29 devnull
573 1cb3fa80 2004-03-29 devnull c = getclient(e->window, 0);
574 1cb3fa80 2004-03-29 devnull if (c) {
575 c005568a 2004-03-30 devnull bl = borderorient(c, e->x, e->y);
576 1cb3fa80 2004-03-29 devnull if (bl == BorderUnknown)
577 1cb3fa80 2004-03-29 devnull XUndefineCursor(dpy, c->parent);
578 1cb3fa80 2004-03-29 devnull else
579 1cb3fa80 2004-03-29 devnull XDefineCursor(dpy, c->parent, c->screen->bordcurs[bl]);
580 1cb3fa80 2004-03-29 devnull }
581 1cb3fa80 2004-03-29 devnull }