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"
15 038e9089 2004-03-21 devnull mainloop(int shape_event)
17 038e9089 2004-03-21 devnull XEvent ev;
20 038e9089 2004-03-21 devnull getevent(&ev);
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");
28 ac33a34a 2005-07-13 devnull switch (ev.type){
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);
35 aa808685 2004-04-19 devnull fprintf(stderr, "rio: unknown ev.type %d\n", ev.type);
37 ac33a34a 2005-07-13 devnull case KeyPress:
38 ac33a34a 2005-07-13 devnull keypress(&ev.xkey);
40 ac33a34a 2005-07-13 devnull case KeyRelease:
41 ac33a34a 2005-07-13 devnull keyrelease(&ev.xkey);
43 038e9089 2004-03-21 devnull case ButtonPress:
44 038e9089 2004-03-21 devnull button(&ev.xbutton);
46 038e9089 2004-03-21 devnull case ButtonRelease:
48 038e9089 2004-03-21 devnull case MapRequest:
49 038e9089 2004-03-21 devnull mapreq(&ev.xmaprequest);
51 038e9089 2004-03-21 devnull case ConfigureRequest:
52 038e9089 2004-03-21 devnull configurereq(&ev.xconfigurerequest);
54 038e9089 2004-03-21 devnull case CirculateRequest:
55 038e9089 2004-03-21 devnull circulatereq(&ev.xcirculaterequest);
57 038e9089 2004-03-21 devnull case UnmapNotify:
58 038e9089 2004-03-21 devnull unmap(&ev.xunmap);
60 038e9089 2004-03-21 devnull case CreateNotify:
61 038e9089 2004-03-21 devnull newwindow(&ev.xcreatewindow);
63 038e9089 2004-03-21 devnull case DestroyNotify:
64 038e9089 2004-03-21 devnull destroy(ev.xdestroywindow.window);
66 038e9089 2004-03-21 devnull case ClientMessage:
67 038e9089 2004-03-21 devnull clientmesg(&ev.xclient);
69 038e9089 2004-03-21 devnull case ColormapNotify:
70 038e9089 2004-03-21 devnull cmap(&ev.xcolormap);
72 038e9089 2004-03-21 devnull case PropertyNotify:
73 038e9089 2004-03-21 devnull property(&ev.xproperty);
75 038e9089 2004-03-21 devnull case SelectionClear:
76 aa808685 2004-04-19 devnull fprintf(stderr, "rio: SelectionClear (this should not happen)\n");
78 038e9089 2004-03-21 devnull case SelectionNotify:
79 aa808685 2004-04-19 devnull fprintf(stderr, "rio: SelectionNotify (this should not happen)\n");
81 038e9089 2004-03-21 devnull case SelectionRequest:
82 aa808685 2004-04-19 devnull fprintf(stderr, "rio: SelectionRequest (this should not happen)\n");
84 038e9089 2004-03-21 devnull case EnterNotify:
85 038e9089 2004-03-21 devnull enter(&ev.xcrossing);
87 1cb3fa80 2004-03-29 devnull case LeaveNotify:
88 1cb3fa80 2004-03-29 devnull leave(&ev.xcrossing);
90 038e9089 2004-03-21 devnull case ReparentNotify:
91 038e9089 2004-03-21 devnull reparent(&ev.xreparent);
93 038e9089 2004-03-21 devnull case FocusIn:
94 038e9089 2004-03-21 devnull focusin(&ev.xfocus);
96 038e9089 2004-03-21 devnull case MotionNotify:
97 1cb3fa80 2004-03-29 devnull motionnotify(&ev.xmotion);
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);
115 038e9089 2004-03-21 devnull configurereq(XConfigureRequestEvent *e)
117 038e9089 2004-03-21 devnull XWindowChanges wc;
118 038e9089 2004-03-21 devnull Client *c;
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);
124 038e9089 2004-03-21 devnull e->value_mask &= ~CWSibling;
127 038e9089 2004-03-21 devnull gravitate(c, 1);
128 ac33a34a 2005-07-13 devnull if(e->value_mask & CWX)
129 038e9089 2004-03-21 devnull c->x = e->x;
130 ac33a34a 2005-07-13 devnull if(e->value_mask & CWY)
131 038e9089 2004-03-21 devnull c->y = e->y;
132 ac33a34a 2005-07-13 devnull if(e->value_mask & CWWidth)
133 038e9089 2004-03-21 devnull c->dx = e->width;
134 ac33a34a 2005-07-13 devnull if(e->value_mask & CWHeight)
135 038e9089 2004-03-21 devnull c->dy = e->height;
136 ac33a34a 2005-07-13 devnull if(e->value_mask & CWBorderWidth)
137 038e9089 2004-03-21 devnull c->border = e->border_width;
138 038e9089 2004-03-21 devnull gravitate(c, 0);
139 ac33a34a 2005-07-13 devnull if(e->value_mask & CWStackMode){
140 ac33a34a 2005-07-13 devnull if(e->detail == Above)
143 bdf49b7e 2004-08-13 devnull e->value_mask &= ~CWStackMode;
145 ac33a34a 2005-07-13 devnull if(c->parent != c->screen->root && c->window == e->window){
146 038e9089 2004-03-21 devnull wc.x = c->x-BORDER;
147 038e9089 2004-03-21 devnull wc.y = c->y-BORDER;
148 038e9089 2004-03-21 devnull wc.width = c->dx+2*BORDER;
149 038e9089 2004-03-21 devnull wc.height = c->dy+2*BORDER;
150 038e9089 2004-03-21 devnull wc.border_width = 1;
151 038e9089 2004-03-21 devnull wc.sibling = None;
152 038e9089 2004-03-21 devnull wc.stack_mode = e->detail;
153 038e9089 2004-03-21 devnull XConfigureWindow(dpy, c->parent, e->value_mask, &wc);
154 038e9089 2004-03-21 devnull sendconfig(c);
155 ac33a34a 2005-07-13 devnull if(e->value_mask & CWStackMode){
157 2c1b986e 2004-08-13 devnull active(c);
162 ac33a34a 2005-07-13 devnull if(c && c->init){
163 038e9089 2004-03-21 devnull wc.x = BORDER;
164 038e9089 2004-03-21 devnull wc.y = BORDER;
167 038e9089 2004-03-21 devnull wc.x = e->x;
168 038e9089 2004-03-21 devnull wc.y = e->y;
170 038e9089 2004-03-21 devnull wc.width = e->width;
171 038e9089 2004-03-21 devnull wc.height = e->height;
172 038e9089 2004-03-21 devnull wc.border_width = 0;
173 038e9089 2004-03-21 devnull wc.sibling = None;
174 038e9089 2004-03-21 devnull wc.stack_mode = Above;
175 038e9089 2004-03-21 devnull e->value_mask &= ~CWStackMode;
176 038e9089 2004-03-21 devnull e->value_mask |= CWBorderWidth;
178 038e9089 2004-03-21 devnull XConfigureWindow(dpy, e->window, e->value_mask, &wc);
182 038e9089 2004-03-21 devnull mapreq(XMapRequestEvent *e)
184 038e9089 2004-03-21 devnull Client *c;
187 038e9089 2004-03-21 devnull curtime = CurrentTime;
188 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
189 038e9089 2004-03-21 devnull trace("mapreq", c, e);
191 ac33a34a 2005-07-13 devnull if(c == 0 || c->window != e->window){
192 038e9089 2004-03-21 devnull /* workaround for stupid NCDware */
193 aa808685 2004-04-19 devnull fprintf(stderr, "rio: bad mapreq c %p w %x, rescanning\n",
194 e62ba5ec 2004-03-21 devnull c, (int)e->window);
195 ac33a34a 2005-07-13 devnull for(i = 0; i < num_screens; i++)
196 038e9089 2004-03-21 devnull scanwins(&screens[i]);
197 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
198 ac33a34a 2005-07-13 devnull if(c == 0 || c->window != e->window){
199 aa808685 2004-04-19 devnull fprintf(stderr, "rio: window not found after rescan\n");
204 ac33a34a 2005-07-13 devnull switch (c->state){
205 038e9089 2004-03-21 devnull case WithdrawnState:
206 ac33a34a 2005-07-13 devnull if(c->parent == c->screen->root){
207 ac33a34a 2005-07-13 devnull if(!manage(c, 0))
211 038e9089 2004-03-21 devnull XReparentWindow(dpy, c->window, c->parent, BORDER-1, BORDER-1);
212 038e9089 2004-03-21 devnull XAddToSaveSet(dpy, c->window);
213 038e9089 2004-03-21 devnull /* fall through... */
214 038e9089 2004-03-21 devnull case NormalState:
215 038e9089 2004-03-21 devnull XMapWindow(dpy, c->window);
216 038e9089 2004-03-21 devnull XMapRaised(dpy, c->parent);
218 038e9089 2004-03-21 devnull setstate(c, NormalState);
219 ac33a34a 2005-07-13 devnull if(c->trans != None && current && c->trans == current->window)
220 038e9089 2004-03-21 devnull active(c);
222 038e9089 2004-03-21 devnull case IconicState:
223 038e9089 2004-03-21 devnull unhidec(c, 1);
229 038e9089 2004-03-21 devnull unmap(XUnmapEvent *e)
231 038e9089 2004-03-21 devnull Client *c;
233 038e9089 2004-03-21 devnull curtime = CurrentTime;
234 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
236 ac33a34a 2005-07-13 devnull switch (c->state){
237 038e9089 2004-03-21 devnull case IconicState:
238 ac33a34a 2005-07-13 devnull if(e->send_event){
239 038e9089 2004-03-21 devnull unhidec(c, 0);
240 038e9089 2004-03-21 devnull withdraw(c);
243 038e9089 2004-03-21 devnull case NormalState:
244 ac33a34a 2005-07-13 devnull if(c == current)
245 038e9089 2004-03-21 devnull nofocus();
246 ac33a34a 2005-07-13 devnull if(!c->reparenting)
247 038e9089 2004-03-21 devnull withdraw(c);
250 038e9089 2004-03-21 devnull c->reparenting = 0;
255 038e9089 2004-03-21 devnull circulatereq(XCirculateRequestEvent *e)
257 038e9089 2004-03-21 devnull fprintf(stderr, "It must be the warlock Krill!\n"); /* ☺ */
261 038e9089 2004-03-21 devnull newwindow(XCreateWindowEvent *e)
263 038e9089 2004-03-21 devnull Client *c;
264 038e9089 2004-03-21 devnull ScreenInfo *s;
266 038e9089 2004-03-21 devnull /* we don't set curtime as nothing here uses it */
267 ac33a34a 2005-07-13 devnull if(e->override_redirect)
269 038e9089 2004-03-21 devnull c = getclient(e->window, 1);
270 ac33a34a 2005-07-13 devnull if(c && c->window == e->window && (s = getscreen(e->parent))){
271 038e9089 2004-03-21 devnull c->x = e->x;
272 038e9089 2004-03-21 devnull c->y = e->y;
273 038e9089 2004-03-21 devnull c->dx = e->width;
274 038e9089 2004-03-21 devnull c->dy = e->height;
275 038e9089 2004-03-21 devnull c->border = e->border_width;
276 038e9089 2004-03-21 devnull c->screen = s;
277 ac33a34a 2005-07-13 devnull if(c->parent == None)
278 038e9089 2004-03-21 devnull c->parent = c->screen->root;
283 038e9089 2004-03-21 devnull destroy(Window w)
286 038e9089 2004-03-21 devnull Client *c;
288 038e9089 2004-03-21 devnull curtime = CurrentTime;
289 038e9089 2004-03-21 devnull c = getclient(w, 0);
290 ac33a34a 2005-07-13 devnull if(c == 0)
293 d52fb463 2005-08-11 devnull if(numvirtuals > 1)
294 d52fb463 2005-08-11 devnull for(i=0; i<numvirtuals; i++)
295 d52fb463 2005-08-11 devnull if(currents[i] == c)
296 d52fb463 2005-08-11 devnull currents[i] = 0;
298 038e9089 2004-03-21 devnull rmclient(c);
300 038e9089 2004-03-21 devnull /* flush any errors generated by the window's sudden demise */
301 038e9089 2004-03-21 devnull ignore_badwindow = 1;
302 038e9089 2004-03-21 devnull XSync(dpy, False);
303 038e9089 2004-03-21 devnull ignore_badwindow = 0;
307 038e9089 2004-03-21 devnull clientmesg(XClientMessageEvent *e)
309 038e9089 2004-03-21 devnull Client *c;
311 038e9089 2004-03-21 devnull curtime = CurrentTime;
312 ac33a34a 2005-07-13 devnull if(e->message_type == exit_rio){
313 038e9089 2004-03-21 devnull cleanup();
314 038e9089 2004-03-21 devnull exit(0);
316 ac33a34a 2005-07-13 devnull if(e->message_type == restart_rio){
317 aa808685 2004-04-19 devnull fprintf(stderr, "*** rio restarting ***\n");
318 038e9089 2004-03-21 devnull cleanup();
319 038e9089 2004-03-21 devnull execvp(myargv[0], myargv);
320 aa808685 2004-04-19 devnull perror("rio: exec failed");
321 038e9089 2004-03-21 devnull exit(1);
323 75e12c22 2005-08-10 devnull if(e->message_type == wm_protocols)
325 ac33a34a 2005-07-13 devnull if(e->message_type == wm_change_state){
326 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
327 ac33a34a 2005-07-13 devnull if(e->format == 32 && e->data.l[0] == IconicState && c != 0){
328 ac33a34a 2005-07-13 devnull if(normal(c))
329 038e9089 2004-03-21 devnull hide(c);
332 aa808685 2004-04-19 devnull fprintf(stderr, "rio: WM_CHANGE_STATE: format %d data %d w 0x%x\n",
333 e62ba5ec 2004-03-21 devnull (int)e->format, (int)e->data.l[0], (int)e->window);
336 aa808685 2004-04-19 devnull fprintf(stderr, "rio: strange ClientMessage, type 0x%x window 0x%x\n",
337 e62ba5ec 2004-03-21 devnull (int)e->message_type, (int)e->window);
341 038e9089 2004-03-21 devnull cmap(XColormapEvent *e)
343 038e9089 2004-03-21 devnull Client *c;
346 038e9089 2004-03-21 devnull /* we don't set curtime as nothing here uses it */
347 ac33a34a 2005-07-13 devnull if(e->new){
348 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
350 038e9089 2004-03-21 devnull c->cmap = e->colormap;
351 ac33a34a 2005-07-13 devnull if(c == current)
352 038e9089 2004-03-21 devnull cmapfocus(c);
355 ac33a34a 2005-07-13 devnull for(c = clients; c; c = c->next){
356 ac33a34a 2005-07-13 devnull for(i = 0; i < c->ncmapwins; i++)
357 ac33a34a 2005-07-13 devnull if(c->cmapwins[i] == e->window){
358 038e9089 2004-03-21 devnull c->wmcmaps[i] = e->colormap;
359 ac33a34a 2005-07-13 devnull if(c == current)
360 038e9089 2004-03-21 devnull cmapfocus(c);
368 038e9089 2004-03-21 devnull property(XPropertyEvent *e)
371 038e9089 2004-03-21 devnull int delete;
372 038e9089 2004-03-21 devnull Client *c;
373 78802e69 2004-04-24 devnull long msize;
375 038e9089 2004-03-21 devnull /* we don't set curtime as nothing here uses it */
376 038e9089 2004-03-21 devnull a = e->atom;
377 038e9089 2004-03-21 devnull delete = (e->state == PropertyDelete);
378 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
379 ac33a34a 2005-07-13 devnull if(c == 0)
382 ac33a34a 2005-07-13 devnull switch (a){
383 038e9089 2004-03-21 devnull case XA_WM_ICON_NAME:
384 ac33a34a 2005-07-13 devnull if(c->iconname != 0)
385 038e9089 2004-03-21 devnull XFree((char*) c->iconname);
386 038e9089 2004-03-21 devnull c->iconname = delete ? 0 : getprop(c->window, a);
387 038e9089 2004-03-21 devnull setlabel(c);
388 038e9089 2004-03-21 devnull renamec(c, c->label);
390 038e9089 2004-03-21 devnull case XA_WM_NAME:
391 ac33a34a 2005-07-13 devnull if(c->name != 0)
392 038e9089 2004-03-21 devnull XFree((char*) c->name);
393 038e9089 2004-03-21 devnull c->name = delete ? 0 : getprop(c->window, a);
394 038e9089 2004-03-21 devnull setlabel(c);
395 038e9089 2004-03-21 devnull renamec(c, c->label);
397 038e9089 2004-03-21 devnull case XA_WM_TRANSIENT_FOR:
398 038e9089 2004-03-21 devnull gettrans(c);
400 78802e69 2004-04-24 devnull case XA_WM_HINTS:
401 78802e69 2004-04-24 devnull case XA_WM_SIZE_HINTS:
402 78802e69 2004-04-24 devnull case XA_WM_ZOOM_HINTS:
403 78802e69 2004-04-24 devnull /* placeholders to not forget. ignore for now. -Axel */
405 78802e69 2004-04-24 devnull case XA_WM_NORMAL_HINTS:
406 ac33a34a 2005-07-13 devnull if(XGetWMNormalHints(dpy, c->window, &c->size, &msize) == 0 || c->size.flags == 0)
407 78802e69 2004-04-24 devnull c->size.flags = PSize; /* not specified - punt */
410 ac33a34a 2005-07-13 devnull if(a == _rio_hold_mode){
411 aa808685 2004-04-19 devnull c->hold = getiprop(c->window, _rio_hold_mode);
412 ac33a34a 2005-07-13 devnull if(c == current)
413 038e9089 2004-03-21 devnull draw_border(c, 1);
415 ac33a34a 2005-07-13 devnull else if(a == wm_colormaps){
416 038e9089 2004-03-21 devnull getcmaps(c);
417 ac33a34a 2005-07-13 devnull if(c == current)
418 038e9089 2004-03-21 devnull cmapfocus(c);
423 038e9089 2004-03-21 devnull reparent(XReparentEvent *e)
425 038e9089 2004-03-21 devnull Client *c;
426 038e9089 2004-03-21 devnull XWindowAttributes attr;
427 038e9089 2004-03-21 devnull ScreenInfo *s;
429 038e9089 2004-03-21 devnull /* we don't set curtime as nothing here uses it */
430 ac33a34a 2005-07-13 devnull if(!getscreen(e->event) || e->override_redirect)
432 ac33a34a 2005-07-13 devnull if((s = getscreen(e->parent)) != 0){
433 038e9089 2004-03-21 devnull c = getclient(e->window, 1);
434 ac33a34a 2005-07-13 devnull if(c != 0 && (c->dx == 0 || c->dy == 0)){
435 78802e69 2004-04-24 devnull /* flush any errors */
436 78802e69 2004-04-24 devnull ignore_badwindow = 1;
437 038e9089 2004-03-21 devnull XGetWindowAttributes(dpy, c->window, &attr);
438 78802e69 2004-04-24 devnull XSync(dpy, False);
439 78802e69 2004-04-24 devnull ignore_badwindow = 0;
441 038e9089 2004-03-21 devnull c->x = attr.x;
442 038e9089 2004-03-21 devnull c->y = attr.y;
443 038e9089 2004-03-21 devnull c->dx = attr.width;
444 038e9089 2004-03-21 devnull c->dy = attr.height;
445 038e9089 2004-03-21 devnull c->border = attr.border_width;
446 038e9089 2004-03-21 devnull c->screen = s;
447 ac33a34a 2005-07-13 devnull if(c->parent == None)
448 038e9089 2004-03-21 devnull c->parent = c->screen->root;
452 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
453 ac33a34a 2005-07-13 devnull if(c != 0 && (c->parent == c->screen->root || withdrawn(c)))
454 038e9089 2004-03-21 devnull rmclient(c);
458 038e9089 2004-03-21 devnull #ifdef SHAPE
460 038e9089 2004-03-21 devnull shapenotify(XShapeEvent *e)
462 038e9089 2004-03-21 devnull Client *c;
464 038e9089 2004-03-21 devnull /* we don't set curtime as nothing here uses it */
465 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
466 ac33a34a 2005-07-13 devnull if(c == 0)
469 038e9089 2004-03-21 devnull setshape(c);
474 038e9089 2004-03-21 devnull enter(XCrossingEvent *e)
476 038e9089 2004-03-21 devnull Client *c;
478 038e9089 2004-03-21 devnull curtime = e->time;
479 d52fb463 2005-08-11 devnull if(!ffm)
480 ac33a34a 2005-07-13 devnull if(e->mode != NotifyGrab || e->detail != NotifyNonlinearVirtual)
482 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
483 ac33a34a 2005-07-13 devnull if(c != 0 && c != current){
484 038e9089 2004-03-21 devnull /* someone grabbed the pointer; make them current */
485 d52fb463 2005-08-11 devnull if(!ffm)
486 d52fb463 2005-08-11 devnull XMapRaised(dpy, c->parent);
488 038e9089 2004-03-21 devnull active(c);
493 1cb3fa80 2004-03-29 devnull leave(XCrossingEvent *e)
495 1cb3fa80 2004-03-29 devnull Client *c;
497 1cb3fa80 2004-03-29 devnull c = getclient(e->window, 0);
499 c005568a 2004-03-30 devnull XUndefineCursor(dpy, c->parent);
500 1cb3fa80 2004-03-29 devnull /* XDefineCursor(dpy, c->parent, c->screen->arrow); */
504 038e9089 2004-03-21 devnull focusin(XFocusChangeEvent *e)
506 038e9089 2004-03-21 devnull Client *c;
508 038e9089 2004-03-21 devnull curtime = CurrentTime;
509 ac33a34a 2005-07-13 devnull if(e->detail != NotifyNonlinearVirtual)
511 038e9089 2004-03-21 devnull c = getclient(e->window, 0);
512 ac33a34a 2005-07-13 devnull if(c != 0 && c->window == e->window && c != current){
513 038e9089 2004-03-21 devnull /* someone grabbed keyboard or seized focus; make them current */
514 038e9089 2004-03-21 devnull XMapRaised(dpy, c->parent);
516 038e9089 2004-03-21 devnull active(c);
520 c005568a 2004-03-30 devnull BorderOrient
521 c005568a 2004-03-30 devnull borderorient(Client *c, int x, int y)
523 ac33a34a 2005-07-13 devnull if(x <= BORDER){
524 ac33a34a 2005-07-13 devnull if(y <= CORNER){
525 ac33a34a 2005-07-13 devnull if(debug) fprintf(stderr, "topleft\n");
526 c005568a 2004-03-30 devnull return BorderWNW;
528 ac33a34a 2005-07-13 devnull if(y >= (c->dy + 2*BORDER) - CORNER){
529 ac33a34a 2005-07-13 devnull if(debug) fprintf(stderr, "botleft\n");
530 c005568a 2004-03-30 devnull return BorderWSW;
532 ac33a34a 2005-07-13 devnull if(y > CORNER &&
533 ac33a34a 2005-07-13 devnull y < (c->dy + 2*BORDER) - CORNER){
534 ac33a34a 2005-07-13 devnull if(debug) fprintf(stderr, "left\n");
535 1cb3fa80 2004-03-29 devnull return BorderW;
537 ac33a34a 2005-07-13 devnull } else if(x <= CORNER){
538 ac33a34a 2005-07-13 devnull if(y <= BORDER){
539 ac33a34a 2005-07-13 devnull if(debug) fprintf(stderr, "topleft\n");
540 c005568a 2004-03-30 devnull return BorderNNW;
542 ac33a34a 2005-07-13 devnull if (y >= (c->dy + BORDER)){
543 ac33a34a 2005-07-13 devnull if(debug) fprintf(stderr, "botleft\n");
544 c005568a 2004-03-30 devnull return BorderSSW;
546 ac33a34a 2005-07-13 devnull } else if(x >= (c->dx + BORDER)){
547 ac33a34a 2005-07-13 devnull if(y <= CORNER){
548 ac33a34a 2005-07-13 devnull if(debug) fprintf(stderr, "topright\n");
549 c005568a 2004-03-30 devnull return BorderENE;
551 ac33a34a 2005-07-13 devnull if(y >= (c->dy + 2*BORDER) - CORNER){
552 ac33a34a 2005-07-13 devnull if(debug) fprintf(stderr, "botright\n");
553 c005568a 2004-03-30 devnull return BorderESE;
555 ac33a34a 2005-07-13 devnull if(y > CORNER &&
556 ac33a34a 2005-07-13 devnull y < (c->dy + 2*BORDER) - CORNER){
557 ac33a34a 2005-07-13 devnull if(debug) fprintf(stderr, "right\n");
558 1cb3fa80 2004-03-29 devnull return BorderE;
560 ac33a34a 2005-07-13 devnull } else if(x >= (c->dx + 2*BORDER) - CORNER){
561 ac33a34a 2005-07-13 devnull if(y <= BORDER){
562 ac33a34a 2005-07-13 devnull if(debug) fprintf(stderr, "topright\n");
563 c005568a 2004-03-30 devnull return BorderNNE;
565 ac33a34a 2005-07-13 devnull if (y >= (c->dy + BORDER)){
566 ac33a34a 2005-07-13 devnull if(debug) fprintf(stderr, "botright\n");
567 c005568a 2004-03-30 devnull return BorderSSE;
569 ac33a34a 2005-07-13 devnull } else if(x > CORNER &&
570 ac33a34a 2005-07-13 devnull x < (c->dx + 2*BORDER) - CORNER){
571 ac33a34a 2005-07-13 devnull if(y <= BORDER){
572 ac33a34a 2005-07-13 devnull if(debug) fprintf(stderr, "top\n");
573 1cb3fa80 2004-03-29 devnull return BorderN;
575 ac33a34a 2005-07-13 devnull if(y >= (c->dy + BORDER)){
576 ac33a34a 2005-07-13 devnull if(debug) fprintf(stderr, "bot\n");
577 1cb3fa80 2004-03-29 devnull return BorderS;
580 1cb3fa80 2004-03-29 devnull return BorderUnknown;
584 1cb3fa80 2004-03-29 devnull motionnotify(XMotionEvent *e)
586 1cb3fa80 2004-03-29 devnull Client *c;
587 c005568a 2004-03-30 devnull BorderOrient bl;
589 1cb3fa80 2004-03-29 devnull c = getclient(e->window, 0);
591 c005568a 2004-03-30 devnull bl = borderorient(c, e->x, e->y);
592 ac33a34a 2005-07-13 devnull if(bl == BorderUnknown)
593 1cb3fa80 2004-03-29 devnull XUndefineCursor(dpy, c->parent);
595 1cb3fa80 2004-03-29 devnull XDefineCursor(dpy, c->parent, c->screen->bordcurs[bl]);