Mercurial > aewl
comparison wm.c @ 13:5cc5e55a132d
added protocol killing stuff
author | Anselm R. Garbe <garbeam@wmii.de> |
---|---|
date | Tue, 11 Jul 2006 16:14:22 +0200 |
parents | 703255003abb |
children | 5c078b66347b |
comparison
equal
deleted
inserted
replaced
12:a2b399582afe | 13:5cc5e55a132d |
---|---|
14 #include "wm.h" | 14 #include "wm.h" |
15 | 15 |
16 /* X structs */ | 16 /* X structs */ |
17 Display *dpy; | 17 Display *dpy; |
18 Window root, barwin; | 18 Window root, barwin; |
19 Atom net_atom[NetLast]; | 19 Atom wm_atom[WMLast], net_atom[NetLast]; |
20 Cursor cursor[CurLast]; | 20 Cursor cursor[CurLast]; |
21 XRectangle rect, barrect; | 21 XRectangle rect, barrect; |
22 Bool running = True; | 22 Bool running = True; |
23 Bool sel_screen; | |
23 | 24 |
24 char *bartext, tag[256]; | 25 char *bartext, tag[256]; |
25 int screen, sel_screen; | 26 int screen; |
26 | 27 |
27 Brush brush = {0}; | 28 Brush brush = {0}; |
28 Client *clients = NULL; | 29 Client *clients = NULL; |
29 | 30 Client *stack = NULL; |
30 enum { WM_PROTOCOL_DELWIN = 1 }; | |
31 | 31 |
32 static Bool other_wm_running; | 32 static Bool other_wm_running; |
33 static char version[] = "gridwm - " VERSION ", (C)opyright MMVI Anselm R. Garbe\n"; | 33 static char version[] = "gridwm - " VERSION ", (C)opyright MMVI Anselm R. Garbe\n"; |
34 static int (*x_error_handler) (Display *, XErrorEvent *); | 34 static int (*x_error_handler) (Display *, XErrorEvent *); |
35 | 35 |
58 manage(wins[i], &wa); | 58 manage(wins[i], &wa); |
59 } | 59 } |
60 } | 60 } |
61 if(wins) | 61 if(wins) |
62 XFree(wins); | 62 XFree(wins); |
63 } | |
64 | |
65 static int | |
66 win_property(Window w, Atom a, Atom t, long l, unsigned char **prop) | |
67 { | |
68 Atom real; | |
69 int format; | |
70 unsigned long res, extra; | |
71 int status; | |
72 | |
73 status = XGetWindowProperty(dpy, w, a, 0L, l, False, t, &real, &format, | |
74 &res, &extra, prop); | |
75 | |
76 if(status != Success || *prop == 0) { | |
77 return 0; | |
78 } | |
79 if(res == 0) { | |
80 free((void *) *prop); | |
81 } | |
82 return res; | |
83 } | |
84 | |
85 int | |
86 win_proto(Window w) | |
87 { | |
88 Atom *protocols; | |
89 long res; | |
90 int protos = 0; | |
91 int i; | |
92 | |
93 res = win_property(w, wm_atom[WMProtocols], XA_ATOM, 20L, | |
94 ((unsigned char **) &protocols)); | |
95 if(res <= 0) { | |
96 return protos; | |
97 } | |
98 for(i = 0; i < res; i++) { | |
99 if(protocols[i] == wm_atom[WMDelete]) | |
100 protos |= WM_PROTOCOL_DELWIN; | |
101 } | |
102 free((char *) protocols); | |
103 return protos; | |
104 } | |
105 | |
106 void | |
107 send_message(Window w, Atom a, long value) | |
108 { | |
109 XEvent e; | |
110 | |
111 e.type = ClientMessage; | |
112 e.xclient.window = w; | |
113 e.xclient.message_type = a; | |
114 e.xclient.format = 32; | |
115 e.xclient.data.l[0] = value; | |
116 e.xclient.data.l[1] = CurrentTime; | |
117 XSendEvent(dpy, w, False, NoEventMask, &e); | |
118 XFlush(dpy); | |
63 } | 119 } |
64 | 120 |
65 /* | 121 /* |
66 * There's no way to check accesses to destroyed windows, thus | 122 * There's no way to check accesses to destroyed windows, thus |
67 * those cases are ignored (especially on UnmapNotify's). | 123 * those cases are ignored (especially on UnmapNotify's). |
158 | 214 |
159 XSetErrorHandler(0); | 215 XSetErrorHandler(0); |
160 x_error_handler = XSetErrorHandler(error_handler); | 216 x_error_handler = XSetErrorHandler(error_handler); |
161 | 217 |
162 /* init atoms */ | 218 /* init atoms */ |
219 wm_atom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); | |
220 wm_atom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); | |
163 net_atom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); | 221 net_atom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); |
164 net_atom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); | 222 net_atom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); |
165 | 223 |
166 XChangeProperty(dpy, root, net_atom[NetSupported], XA_ATOM, 32, | 224 XChangeProperty(dpy, root, net_atom[NetSupported], XA_ATOM, 32, |
167 PropModeReplace, (unsigned char *) net_atom, NetLast); | 225 PropModeReplace, (unsigned char *) net_atom, NetLast); |