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