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