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
13 e62ba5ec 2004-03-21 devnull int isNew;
14 e62ba5ec 2004-03-21 devnull
15 038e9089 2004-03-21 devnull int
16 038e9089 2004-03-21 devnull manage(Client *c, int mapped)
17 038e9089 2004-03-21 devnull {
18 038e9089 2004-03-21 devnull int fixsize, dohide, doreshape, state;
19 038e9089 2004-03-21 devnull long msize;
20 038e9089 2004-03-21 devnull XClassHint class;
21 038e9089 2004-03-21 devnull XWMHints *hints;
22 c005568a 2004-03-30 devnull XSetWindowAttributes attrs;
23 038e9089 2004-03-21 devnull
24 038e9089 2004-03-21 devnull trace("manage", c, 0);
25 038e9089 2004-03-21 devnull XSelectInput(dpy, c->window, ColormapChangeMask | EnterWindowMask | PropertyChangeMask | FocusChangeMask);
26 038e9089 2004-03-21 devnull
27 038e9089 2004-03-21 devnull /* Get loads of hints */
28 038e9089 2004-03-21 devnull
29 038e9089 2004-03-21 devnull if (XGetClassHint(dpy, c->window, &class) != 0) { /* ``Success'' */
30 038e9089 2004-03-21 devnull c->instance = class.res_name;
31 038e9089 2004-03-21 devnull c->class = class.res_class;
32 e62ba5ec 2004-03-21 devnull c->is9term = 0;
33 e62ba5ec 2004-03-21 devnull if(isNew){
34 e62ba5ec 2004-03-21 devnull c->is9term = strstr(c->class, "term") || strstr(c->class, "Term");
35 e62ba5ec 2004-03-21 devnull isNew = 0;
36 e62ba5ec 2004-03-21 devnull }
37 038e9089 2004-03-21 devnull }
38 038e9089 2004-03-21 devnull else {
39 038e9089 2004-03-21 devnull c->instance = 0;
40 038e9089 2004-03-21 devnull c->class = 0;
41 038e9089 2004-03-21 devnull c->is9term = 0;
42 038e9089 2004-03-21 devnull }
43 038e9089 2004-03-21 devnull c->iconname = getprop(c->window, XA_WM_ICON_NAME);
44 038e9089 2004-03-21 devnull c->name = getprop(c->window, XA_WM_NAME);
45 038e9089 2004-03-21 devnull setlabel(c);
46 038e9089 2004-03-21 devnull
47 038e9089 2004-03-21 devnull hints = XGetWMHints(dpy, c->window);
48 038e9089 2004-03-21 devnull if (XGetWMNormalHints(dpy, c->window, &c->size, &msize) == 0 || c->size.flags == 0)
49 038e9089 2004-03-21 devnull c->size.flags = PSize; /* not specified - punt */
50 038e9089 2004-03-21 devnull
51 038e9089 2004-03-21 devnull getcmaps(c);
52 038e9089 2004-03-21 devnull getproto(c);
53 038e9089 2004-03-21 devnull gettrans(c);
54 038e9089 2004-03-21 devnull if (c->is9term)
55 aa808685 2004-04-19 devnull c->hold = getiprop(c->window, _rio_hold_mode);
56 038e9089 2004-03-21 devnull
57 038e9089 2004-03-21 devnull /* Figure out what to do with the window from hints */
58 038e9089 2004-03-21 devnull
59 038e9089 2004-03-21 devnull if (!getstate(c->window, &state))
60 038e9089 2004-03-21 devnull state = hints ? hints->initial_state : NormalState;
61 038e9089 2004-03-21 devnull dohide = (state == IconicState);
62 038e9089 2004-03-21 devnull
63 038e9089 2004-03-21 devnull fixsize = 0;
64 038e9089 2004-03-21 devnull if ((c->size.flags & (USSize|PSize)))
65 038e9089 2004-03-21 devnull fixsize = 1;
66 038e9089 2004-03-21 devnull if ((c->size.flags & (PMinSize|PMaxSize)) == (PMinSize|PMaxSize) && c->size.min_width == c->size.max_width && c->size.min_height == c->size.max_height)
67 038e9089 2004-03-21 devnull fixsize = 1;
68 038e9089 2004-03-21 devnull doreshape = !mapped;
69 038e9089 2004-03-21 devnull if (fixsize) {
70 038e9089 2004-03-21 devnull if (c->size.flags & USPosition)
71 038e9089 2004-03-21 devnull doreshape = 0;
72 038e9089 2004-03-21 devnull if (dohide && (c->size.flags & PPosition))
73 038e9089 2004-03-21 devnull doreshape = 0;
74 038e9089 2004-03-21 devnull if (c->trans != None)
75 038e9089 2004-03-21 devnull doreshape = 0;
76 038e9089 2004-03-21 devnull }
77 038e9089 2004-03-21 devnull if (c->is9term)
78 038e9089 2004-03-21 devnull fixsize = 0;
79 038e9089 2004-03-21 devnull if (c->size.flags & PBaseSize) {
80 038e9089 2004-03-21 devnull c->min_dx = c->size.base_width;
81 038e9089 2004-03-21 devnull c->min_dy = c->size.base_height;
82 038e9089 2004-03-21 devnull }
83 038e9089 2004-03-21 devnull else if (c->size.flags & PMinSize) {
84 038e9089 2004-03-21 devnull c->min_dx = c->size.min_width;
85 038e9089 2004-03-21 devnull c->min_dy = c->size.min_height;
86 038e9089 2004-03-21 devnull }
87 038e9089 2004-03-21 devnull else if (c->is9term) {
88 038e9089 2004-03-21 devnull c->min_dx = 100;
89 038e9089 2004-03-21 devnull c->min_dy = 50;
90 038e9089 2004-03-21 devnull }
91 038e9089 2004-03-21 devnull else
92 038e9089 2004-03-21 devnull c->min_dx = c->min_dy = 0;
93 038e9089 2004-03-21 devnull
94 038e9089 2004-03-21 devnull if (hints)
95 038e9089 2004-03-21 devnull XFree(hints);
96 038e9089 2004-03-21 devnull
97 038e9089 2004-03-21 devnull /* Now do it!!! */
98 038e9089 2004-03-21 devnull
99 038e9089 2004-03-21 devnull if (doreshape) {
100 cc3c704c 2004-04-05 devnull if(0) fprintf(stderr, "in doreshape is9term=%d fixsize=%d, x=%d, y=%d, min_dx=%d, min_dy=%d, dx=%d, dy=%d\n",
101 cc3c704c 2004-04-05 devnull c->is9term, fixsize, c->x, c->y, c->min_dx, c->min_dy, c->dx, c->dy);
102 038e9089 2004-03-21 devnull if (current && current->screen == c->screen)
103 038e9089 2004-03-21 devnull cmapnofocus(c->screen);
104 038e9089 2004-03-21 devnull if (!c->is9term && c->x==0 && c->y==0) {
105 038e9089 2004-03-21 devnull static int nwin;
106 038e9089 2004-03-21 devnull
107 038e9089 2004-03-21 devnull c->x = 20*nwin+BORDER;
108 038e9089 2004-03-21 devnull c->y = 20*nwin+BORDER;
109 038e9089 2004-03-21 devnull nwin++;
110 038e9089 2004-03-21 devnull nwin %= 10;
111 038e9089 2004-03-21 devnull }
112 038e9089 2004-03-21 devnull
113 1cb3fa80 2004-03-29 devnull if (c->is9term && !(fixsize ? drag(c, Button3) : sweep(c, Button3))) {
114 038e9089 2004-03-21 devnull XKillClient(dpy, c->window);
115 038e9089 2004-03-21 devnull rmclient(c);
116 038e9089 2004-03-21 devnull if (current && current->screen == c->screen)
117 038e9089 2004-03-21 devnull cmapfocus(current);
118 038e9089 2004-03-21 devnull return 0;
119 038e9089 2004-03-21 devnull }
120 88cbb822 2004-04-05 devnull } else
121 038e9089 2004-03-21 devnull gravitate(c, 0);
122 038e9089 2004-03-21 devnull
123 88cbb822 2004-04-05 devnull
124 c005568a 2004-03-30 devnull attrs.border_pixel = c->screen->black;
125 c005568a 2004-03-30 devnull attrs.background_pixel = c->screen->white;
126 c005568a 2004-03-30 devnull attrs.colormap = c->screen->def_cmap;
127 c005568a 2004-03-30 devnull c->parent = XCreateWindow(dpy, c->screen->root,
128 038e9089 2004-03-21 devnull c->x - BORDER, c->y - BORDER,
129 038e9089 2004-03-21 devnull c->dx + 2*BORDER, c->dy + 2*BORDER,
130 1cb3fa80 2004-03-29 devnull 0,
131 c005568a 2004-03-30 devnull c->screen->depth,
132 c005568a 2004-03-30 devnull CopyFromParent,
133 c005568a 2004-03-30 devnull c->screen->vis,
134 c005568a 2004-03-30 devnull CWBackPixel | CWBorderPixel | CWColormap,
135 c005568a 2004-03-30 devnull &attrs);
136 c005568a 2004-03-30 devnull
137 1cb3fa80 2004-03-29 devnull XSelectInput(dpy, c->parent, SubstructureRedirectMask | SubstructureNotifyMask|ButtonPressMask| PointerMotionMask|LeaveWindowMask);
138 038e9089 2004-03-21 devnull if (mapped)
139 038e9089 2004-03-21 devnull c->reparenting = 1;
140 038e9089 2004-03-21 devnull if (doreshape && !fixsize)
141 038e9089 2004-03-21 devnull XResizeWindow(dpy, c->window, c->dx, c->dy);
142 038e9089 2004-03-21 devnull XSetWindowBorderWidth(dpy, c->window, 0);
143 c005568a 2004-03-30 devnull
144 c005568a 2004-03-30 devnull /*
145 c005568a 2004-03-30 devnull * To have something more than only a big white or black border
146 c005568a 2004-03-30 devnull * XXX should replace this by a pattern in the white or black
147 c005568a 2004-03-30 devnull * such that we can see the border also if all our
148 c005568a 2004-03-30 devnull * windows are black and/or white
149 c005568a 2004-03-30 devnull * (black (or white) border around black (or white) window
150 c005568a 2004-03-30 devnull * is not very helpful.
151 c005568a 2004-03-30 devnull */
152 c005568a 2004-03-30 devnull if (c->screen->depth <= 8) {
153 1cb3fa80 2004-03-29 devnull XSetWindowBorderWidth(dpy, c->parent, 1);
154 1cb3fa80 2004-03-29 devnull }
155 c005568a 2004-03-30 devnull
156 038e9089 2004-03-21 devnull XReparentWindow(dpy, c->window, c->parent, BORDER, BORDER);
157 038e9089 2004-03-21 devnull #ifdef SHAPE
158 038e9089 2004-03-21 devnull if (shape) {
159 038e9089 2004-03-21 devnull XShapeSelectInput(dpy, c->window, ShapeNotifyMask);
160 038e9089 2004-03-21 devnull ignore_badwindow = 1; /* magic */
161 038e9089 2004-03-21 devnull setshape(c);
162 038e9089 2004-03-21 devnull ignore_badwindow = 0;
163 038e9089 2004-03-21 devnull }
164 038e9089 2004-03-21 devnull #endif
165 038e9089 2004-03-21 devnull XAddToSaveSet(dpy, c->window);
166 038e9089 2004-03-21 devnull if (dohide)
167 038e9089 2004-03-21 devnull hide(c);
168 038e9089 2004-03-21 devnull else {
169 038e9089 2004-03-21 devnull XMapWindow(dpy, c->window);
170 038e9089 2004-03-21 devnull XMapWindow(dpy, c->parent);
171 038e9089 2004-03-21 devnull XUnmapWindow(dpy, c->screen->sweepwin);
172 038e9089 2004-03-21 devnull if (nostalgia || doreshape)
173 038e9089 2004-03-21 devnull active(c);
174 038e9089 2004-03-21 devnull else if (c->trans != None && current && current->window == c->trans)
175 038e9089 2004-03-21 devnull active(c);
176 038e9089 2004-03-21 devnull else
177 038e9089 2004-03-21 devnull setactive(c, 0);
178 038e9089 2004-03-21 devnull setstate(c, NormalState);
179 038e9089 2004-03-21 devnull }
180 038e9089 2004-03-21 devnull if (current && (current != c))
181 038e9089 2004-03-21 devnull cmapfocus(current);
182 038e9089 2004-03-21 devnull c->init = 1;
183 c005568a 2004-03-30 devnull
184 c005568a 2004-03-30 devnull /*
185 c005568a 2004-03-30 devnull * If we swept the window, let's send a resize event to the
186 c005568a 2004-03-30 devnull * guy who just got resized. It's not clear whether the apps
187 c005568a 2004-03-30 devnull * should notice their new size via other means. Try as I might,
188 c005568a 2004-03-30 devnull * I can't find a way to have them notice during initdraw, so
189 c005568a 2004-03-30 devnull * I solve the problem this way instead. -rsc
190 c005568a 2004-03-30 devnull */
191 c005568a 2004-03-30 devnull if(c->is9term)
192 c005568a 2004-03-30 devnull sendconfig(c);
193 038e9089 2004-03-21 devnull return 1;
194 038e9089 2004-03-21 devnull }
195 038e9089 2004-03-21 devnull
196 038e9089 2004-03-21 devnull void
197 038e9089 2004-03-21 devnull scanwins(ScreenInfo *s)
198 038e9089 2004-03-21 devnull {
199 038e9089 2004-03-21 devnull unsigned int i, nwins;
200 038e9089 2004-03-21 devnull Client *c;
201 038e9089 2004-03-21 devnull Window dw1, dw2, *wins;
202 038e9089 2004-03-21 devnull XWindowAttributes attr;
203 038e9089 2004-03-21 devnull
204 038e9089 2004-03-21 devnull XQueryTree(dpy, s->root, &dw1, &dw2, &wins, &nwins);
205 038e9089 2004-03-21 devnull for (i = 0; i < nwins; i++) {
206 038e9089 2004-03-21 devnull XGetWindowAttributes(dpy, wins[i], &attr);
207 038e9089 2004-03-21 devnull if (attr.override_redirect || wins[i] == s->menuwin)
208 038e9089 2004-03-21 devnull continue;
209 038e9089 2004-03-21 devnull c = getclient(wins[i], 1);
210 038e9089 2004-03-21 devnull if (c != 0 && c->window == wins[i] && !c->init) {
211 038e9089 2004-03-21 devnull c->x = attr.x;
212 038e9089 2004-03-21 devnull c->y = attr.y;
213 038e9089 2004-03-21 devnull c->dx = attr.width;
214 038e9089 2004-03-21 devnull c->dy = attr.height;
215 038e9089 2004-03-21 devnull c->border = attr.border_width;
216 038e9089 2004-03-21 devnull c->screen = s;
217 038e9089 2004-03-21 devnull c->parent = s->root;
218 038e9089 2004-03-21 devnull if (attr.map_state == IsViewable)
219 038e9089 2004-03-21 devnull manage(c, 1);
220 038e9089 2004-03-21 devnull }
221 038e9089 2004-03-21 devnull }
222 038e9089 2004-03-21 devnull XFree((void *) wins); /* cast is to shut stoopid compiler up */
223 038e9089 2004-03-21 devnull }
224 038e9089 2004-03-21 devnull
225 038e9089 2004-03-21 devnull void
226 038e9089 2004-03-21 devnull gettrans(Client *c)
227 038e9089 2004-03-21 devnull {
228 038e9089 2004-03-21 devnull Window trans;
229 038e9089 2004-03-21 devnull
230 038e9089 2004-03-21 devnull trans = None;
231 038e9089 2004-03-21 devnull if (XGetTransientForHint(dpy, c->window, &trans) != 0)
232 038e9089 2004-03-21 devnull c->trans = trans;
233 038e9089 2004-03-21 devnull else
234 038e9089 2004-03-21 devnull c->trans = None;
235 038e9089 2004-03-21 devnull }
236 038e9089 2004-03-21 devnull
237 038e9089 2004-03-21 devnull void
238 038e9089 2004-03-21 devnull withdraw(Client *c)
239 038e9089 2004-03-21 devnull {
240 038e9089 2004-03-21 devnull XUnmapWindow(dpy, c->parent);
241 038e9089 2004-03-21 devnull gravitate(c, 1);
242 038e9089 2004-03-21 devnull XReparentWindow(dpy, c->window, c->screen->root, c->x, c->y);
243 038e9089 2004-03-21 devnull gravitate(c, 0);
244 038e9089 2004-03-21 devnull XRemoveFromSaveSet(dpy, c->window);
245 038e9089 2004-03-21 devnull setstate(c, WithdrawnState);
246 038e9089 2004-03-21 devnull
247 038e9089 2004-03-21 devnull /* flush any errors */
248 038e9089 2004-03-21 devnull ignore_badwindow = 1;
249 038e9089 2004-03-21 devnull XSync(dpy, False);
250 038e9089 2004-03-21 devnull ignore_badwindow = 0;
251 038e9089 2004-03-21 devnull }
252 038e9089 2004-03-21 devnull
253 038e9089 2004-03-21 devnull void
254 038e9089 2004-03-21 devnull gravitate(Client *c, int invert)
255 038e9089 2004-03-21 devnull {
256 038e9089 2004-03-21 devnull int gravity, dx, dy, delta;
257 038e9089 2004-03-21 devnull
258 038e9089 2004-03-21 devnull gravity = NorthWestGravity;
259 038e9089 2004-03-21 devnull if (c->size.flags & PWinGravity)
260 038e9089 2004-03-21 devnull gravity = c->size.win_gravity;
261 038e9089 2004-03-21 devnull
262 038e9089 2004-03-21 devnull delta = c->border-BORDER;
263 038e9089 2004-03-21 devnull switch (gravity) {
264 038e9089 2004-03-21 devnull case NorthWestGravity:
265 038e9089 2004-03-21 devnull dx = 0;
266 038e9089 2004-03-21 devnull dy = 0;
267 038e9089 2004-03-21 devnull break;
268 038e9089 2004-03-21 devnull case NorthGravity:
269 038e9089 2004-03-21 devnull dx = delta;
270 038e9089 2004-03-21 devnull dy = 0;
271 038e9089 2004-03-21 devnull break;
272 038e9089 2004-03-21 devnull case NorthEastGravity:
273 038e9089 2004-03-21 devnull dx = 2*delta;
274 038e9089 2004-03-21 devnull dy = 0;
275 038e9089 2004-03-21 devnull break;
276 038e9089 2004-03-21 devnull case WestGravity:
277 038e9089 2004-03-21 devnull dx = 0;
278 038e9089 2004-03-21 devnull dy = delta;
279 038e9089 2004-03-21 devnull break;
280 038e9089 2004-03-21 devnull case CenterGravity:
281 038e9089 2004-03-21 devnull case StaticGravity:
282 038e9089 2004-03-21 devnull dx = delta;
283 038e9089 2004-03-21 devnull dy = delta;
284 038e9089 2004-03-21 devnull break;
285 038e9089 2004-03-21 devnull case EastGravity:
286 038e9089 2004-03-21 devnull dx = 2*delta;
287 038e9089 2004-03-21 devnull dy = delta;
288 038e9089 2004-03-21 devnull break;
289 038e9089 2004-03-21 devnull case SouthWestGravity:
290 038e9089 2004-03-21 devnull dx = 0;
291 038e9089 2004-03-21 devnull dy = 2*delta;
292 038e9089 2004-03-21 devnull break;
293 038e9089 2004-03-21 devnull case SouthGravity:
294 038e9089 2004-03-21 devnull dx = delta;
295 038e9089 2004-03-21 devnull dy = 2*delta;
296 038e9089 2004-03-21 devnull break;
297 038e9089 2004-03-21 devnull case SouthEastGravity:
298 038e9089 2004-03-21 devnull dx = 2*delta;
299 038e9089 2004-03-21 devnull dy = 2*delta;
300 038e9089 2004-03-21 devnull break;
301 038e9089 2004-03-21 devnull default:
302 aa808685 2004-04-19 devnull fprintf(stderr, "rio: bad window gravity %d for 0x%x\n", gravity, (int)c->window);
303 038e9089 2004-03-21 devnull return;
304 038e9089 2004-03-21 devnull }
305 038e9089 2004-03-21 devnull dx += BORDER;
306 038e9089 2004-03-21 devnull dy += BORDER;
307 038e9089 2004-03-21 devnull if (invert) {
308 038e9089 2004-03-21 devnull dx = -dx;
309 038e9089 2004-03-21 devnull dy = -dy;
310 038e9089 2004-03-21 devnull }
311 038e9089 2004-03-21 devnull c->x += dx;
312 038e9089 2004-03-21 devnull c->y += dy;
313 038e9089 2004-03-21 devnull }
314 038e9089 2004-03-21 devnull
315 038e9089 2004-03-21 devnull static void
316 038e9089 2004-03-21 devnull installcmap(ScreenInfo *s, Colormap cmap)
317 038e9089 2004-03-21 devnull {
318 038e9089 2004-03-21 devnull if (cmap == None)
319 038e9089 2004-03-21 devnull XInstallColormap(dpy, s->def_cmap);
320 038e9089 2004-03-21 devnull else
321 038e9089 2004-03-21 devnull XInstallColormap(dpy, cmap);
322 038e9089 2004-03-21 devnull }
323 038e9089 2004-03-21 devnull
324 038e9089 2004-03-21 devnull void
325 038e9089 2004-03-21 devnull cmapfocus(Client *c)
326 038e9089 2004-03-21 devnull {
327 038e9089 2004-03-21 devnull int i, found;
328 038e9089 2004-03-21 devnull Client *cc;
329 038e9089 2004-03-21 devnull
330 038e9089 2004-03-21 devnull if (c == 0)
331 038e9089 2004-03-21 devnull return;
332 038e9089 2004-03-21 devnull else if (c->ncmapwins != 0) {
333 038e9089 2004-03-21 devnull found = 0;
334 038e9089 2004-03-21 devnull for (i = c->ncmapwins-1; i >= 0; i--) {
335 038e9089 2004-03-21 devnull installcmap(c->screen, c->wmcmaps[i]);
336 038e9089 2004-03-21 devnull if (c->cmapwins[i] == c->window)
337 038e9089 2004-03-21 devnull found++;
338 038e9089 2004-03-21 devnull }
339 038e9089 2004-03-21 devnull if (!found)
340 038e9089 2004-03-21 devnull installcmap(c->screen, c->cmap);
341 038e9089 2004-03-21 devnull }
342 038e9089 2004-03-21 devnull else if (c->trans != None && (cc = getclient(c->trans, 0)) != 0 && cc->ncmapwins != 0)
343 038e9089 2004-03-21 devnull cmapfocus(cc);
344 038e9089 2004-03-21 devnull else
345 038e9089 2004-03-21 devnull installcmap(c->screen, c->cmap);
346 038e9089 2004-03-21 devnull }
347 038e9089 2004-03-21 devnull
348 038e9089 2004-03-21 devnull void
349 038e9089 2004-03-21 devnull cmapnofocus(ScreenInfo *s)
350 038e9089 2004-03-21 devnull {
351 038e9089 2004-03-21 devnull installcmap(s, None);
352 038e9089 2004-03-21 devnull }
353 038e9089 2004-03-21 devnull
354 038e9089 2004-03-21 devnull void
355 038e9089 2004-03-21 devnull getcmaps(Client *c)
356 038e9089 2004-03-21 devnull {
357 038e9089 2004-03-21 devnull int n, i;
358 038e9089 2004-03-21 devnull Window *cw;
359 038e9089 2004-03-21 devnull XWindowAttributes attr;
360 038e9089 2004-03-21 devnull
361 038e9089 2004-03-21 devnull if (!c->init) {
362 78802e69 2004-04-24 devnull ignore_badwindow = 1;
363 038e9089 2004-03-21 devnull XGetWindowAttributes(dpy, c->window, &attr);
364 038e9089 2004-03-21 devnull c->cmap = attr.colormap;
365 78802e69 2004-04-24 devnull XSync(dpy, False);
366 78802e69 2004-04-24 devnull ignore_badwindow = 0;
367 038e9089 2004-03-21 devnull }
368 038e9089 2004-03-21 devnull
369 1cb3fa80 2004-03-29 devnull n = _getprop(c->window, wm_colormaps, XA_WINDOW, 100L, (void*)&cw);
370 038e9089 2004-03-21 devnull if (c->ncmapwins != 0) {
371 038e9089 2004-03-21 devnull XFree((char *)c->cmapwins);
372 038e9089 2004-03-21 devnull free((char *)c->wmcmaps);
373 038e9089 2004-03-21 devnull }
374 038e9089 2004-03-21 devnull if (n <= 0) {
375 038e9089 2004-03-21 devnull c->ncmapwins = 0;
376 038e9089 2004-03-21 devnull return;
377 038e9089 2004-03-21 devnull }
378 038e9089 2004-03-21 devnull
379 038e9089 2004-03-21 devnull c->ncmapwins = n;
380 038e9089 2004-03-21 devnull c->cmapwins = cw;
381 038e9089 2004-03-21 devnull
382 038e9089 2004-03-21 devnull c->wmcmaps = (Colormap*)malloc(n*sizeof(Colormap));
383 038e9089 2004-03-21 devnull for (i = 0; i < n; i++) {
384 038e9089 2004-03-21 devnull if (cw[i] == c->window)
385 038e9089 2004-03-21 devnull c->wmcmaps[i] = c->cmap;
386 038e9089 2004-03-21 devnull else {
387 78802e69 2004-04-24 devnull /* flush any errors (e.g., caused by mozilla tabs) */
388 78802e69 2004-04-24 devnull ignore_badwindow = 1;
389 038e9089 2004-03-21 devnull XSelectInput(dpy, cw[i], ColormapChangeMask);
390 038e9089 2004-03-21 devnull XGetWindowAttributes(dpy, cw[i], &attr);
391 038e9089 2004-03-21 devnull c->wmcmaps[i] = attr.colormap;
392 78802e69 2004-04-24 devnull XSync(dpy, False);
393 78802e69 2004-04-24 devnull ignore_badwindow = 0;
394 038e9089 2004-03-21 devnull }
395 038e9089 2004-03-21 devnull }
396 038e9089 2004-03-21 devnull }
397 038e9089 2004-03-21 devnull
398 038e9089 2004-03-21 devnull void
399 038e9089 2004-03-21 devnull setlabel(Client *c)
400 038e9089 2004-03-21 devnull {
401 038e9089 2004-03-21 devnull char *label, *p;
402 038e9089 2004-03-21 devnull
403 038e9089 2004-03-21 devnull if (c->iconname != 0)
404 038e9089 2004-03-21 devnull label = c->iconname;
405 038e9089 2004-03-21 devnull else if (c->name != 0)
406 038e9089 2004-03-21 devnull label = c->name;
407 038e9089 2004-03-21 devnull else if (c->instance != 0)
408 038e9089 2004-03-21 devnull label = c->instance;
409 038e9089 2004-03-21 devnull else if (c->class != 0)
410 038e9089 2004-03-21 devnull label = c->class;
411 038e9089 2004-03-21 devnull else
412 038e9089 2004-03-21 devnull label = "no label";
413 038e9089 2004-03-21 devnull if ((p = index(label, ':')) != 0)
414 038e9089 2004-03-21 devnull *p = '\0';
415 038e9089 2004-03-21 devnull c->label = label;
416 038e9089 2004-03-21 devnull }
417 038e9089 2004-03-21 devnull
418 038e9089 2004-03-21 devnull #ifdef SHAPE
419 038e9089 2004-03-21 devnull void
420 038e9089 2004-03-21 devnull setshape(Client *c)
421 038e9089 2004-03-21 devnull {
422 038e9089 2004-03-21 devnull int n, order;
423 038e9089 2004-03-21 devnull XRectangle *rect;
424 038e9089 2004-03-21 devnull
425 038e9089 2004-03-21 devnull /* don't try to add a border if the window is non-rectangular */
426 038e9089 2004-03-21 devnull rect = XShapeGetRectangles(dpy, c->window, ShapeBounding, &n, &order);
427 038e9089 2004-03-21 devnull if (n > 1)
428 038e9089 2004-03-21 devnull XShapeCombineShape(dpy, c->parent, ShapeBounding, BORDER, BORDER,
429 038e9089 2004-03-21 devnull c->window, ShapeBounding, ShapeSet);
430 038e9089 2004-03-21 devnull XFree((void*)rect);
431 038e9089 2004-03-21 devnull }
432 038e9089 2004-03-21 devnull #endif
433 038e9089 2004-03-21 devnull
434 038e9089 2004-03-21 devnull int
435 038e9089 2004-03-21 devnull _getprop(Window w, Atom a, Atom type, long len, unsigned char **p)
436 038e9089 2004-03-21 devnull {
437 038e9089 2004-03-21 devnull Atom real_type;
438 038e9089 2004-03-21 devnull int format;
439 038e9089 2004-03-21 devnull unsigned long n, extra;
440 038e9089 2004-03-21 devnull int status;
441 038e9089 2004-03-21 devnull
442 038e9089 2004-03-21 devnull status = XGetWindowProperty(dpy, w, a, 0L, len, False, type, &real_type, &format, &n, &extra, p);
443 038e9089 2004-03-21 devnull if (status != Success || *p == 0)
444 038e9089 2004-03-21 devnull return -1;
445 038e9089 2004-03-21 devnull if (n == 0)
446 038e9089 2004-03-21 devnull XFree((void*) *p);
447 038e9089 2004-03-21 devnull /* could check real_type, format, extra here... */
448 038e9089 2004-03-21 devnull return n;
449 038e9089 2004-03-21 devnull }
450 038e9089 2004-03-21 devnull
451 038e9089 2004-03-21 devnull char *
452 038e9089 2004-03-21 devnull getprop(Window w, Atom a)
453 038e9089 2004-03-21 devnull {
454 038e9089 2004-03-21 devnull unsigned char *p;
455 038e9089 2004-03-21 devnull
456 038e9089 2004-03-21 devnull if (_getprop(w, a, XA_STRING, 100L, &p) <= 0)
457 038e9089 2004-03-21 devnull return 0;
458 038e9089 2004-03-21 devnull return (char *)p;
459 038e9089 2004-03-21 devnull }
460 038e9089 2004-03-21 devnull
461 038e9089 2004-03-21 devnull int
462 038e9089 2004-03-21 devnull get1prop(Window w, Atom a, Atom type)
463 038e9089 2004-03-21 devnull {
464 038e9089 2004-03-21 devnull char **p, *x;
465 038e9089 2004-03-21 devnull
466 1cb3fa80 2004-03-29 devnull if (_getprop(w, a, type, 1L, (void*)&p) <= 0)
467 038e9089 2004-03-21 devnull return 0;
468 038e9089 2004-03-21 devnull x = *p;
469 038e9089 2004-03-21 devnull XFree((void*) p);
470 038e9089 2004-03-21 devnull return (int)x;
471 038e9089 2004-03-21 devnull }
472 038e9089 2004-03-21 devnull
473 038e9089 2004-03-21 devnull Window
474 038e9089 2004-03-21 devnull getwprop(Window w, Atom a)
475 038e9089 2004-03-21 devnull {
476 038e9089 2004-03-21 devnull return get1prop(w, a, XA_WINDOW);
477 038e9089 2004-03-21 devnull }
478 038e9089 2004-03-21 devnull
479 038e9089 2004-03-21 devnull int
480 038e9089 2004-03-21 devnull getiprop(Window w, Atom a)
481 038e9089 2004-03-21 devnull {
482 038e9089 2004-03-21 devnull return get1prop(w, a, XA_INTEGER);
483 038e9089 2004-03-21 devnull }
484 038e9089 2004-03-21 devnull
485 038e9089 2004-03-21 devnull void
486 038e9089 2004-03-21 devnull setstate(Client *c, int state)
487 038e9089 2004-03-21 devnull {
488 038e9089 2004-03-21 devnull long data[2];
489 038e9089 2004-03-21 devnull
490 038e9089 2004-03-21 devnull data[0] = (long) state;
491 038e9089 2004-03-21 devnull data[1] = (long) None;
492 038e9089 2004-03-21 devnull
493 038e9089 2004-03-21 devnull c->state = state;
494 038e9089 2004-03-21 devnull XChangeProperty(dpy, c->window, wm_state, wm_state, 32,
495 038e9089 2004-03-21 devnull PropModeReplace, (unsigned char *)data, 2);
496 038e9089 2004-03-21 devnull }
497 038e9089 2004-03-21 devnull
498 038e9089 2004-03-21 devnull int
499 038e9089 2004-03-21 devnull getstate(Window w, int *state)
500 038e9089 2004-03-21 devnull {
501 038e9089 2004-03-21 devnull long *p = 0;
502 038e9089 2004-03-21 devnull
503 1cb3fa80 2004-03-29 devnull if (_getprop(w, wm_state, wm_state, 2L, (void*)&p) <= 0)
504 038e9089 2004-03-21 devnull return 0;
505 038e9089 2004-03-21 devnull
506 038e9089 2004-03-21 devnull *state = (int) *p;
507 038e9089 2004-03-21 devnull XFree((char *) p);
508 038e9089 2004-03-21 devnull return 1;
509 038e9089 2004-03-21 devnull }
510 038e9089 2004-03-21 devnull
511 038e9089 2004-03-21 devnull void
512 038e9089 2004-03-21 devnull getproto(Client *c)
513 038e9089 2004-03-21 devnull {
514 038e9089 2004-03-21 devnull Atom *p;
515 038e9089 2004-03-21 devnull int i;
516 038e9089 2004-03-21 devnull long n;
517 038e9089 2004-03-21 devnull Window w;
518 038e9089 2004-03-21 devnull
519 038e9089 2004-03-21 devnull w = c->window;
520 038e9089 2004-03-21 devnull c->proto = 0;
521 1cb3fa80 2004-03-29 devnull if ((n = _getprop(w, wm_protocols, XA_ATOM, 20L, (void*)&p)) <= 0)
522 038e9089 2004-03-21 devnull return;
523 038e9089 2004-03-21 devnull
524 038e9089 2004-03-21 devnull for (i = 0; i < n; i++)
525 038e9089 2004-03-21 devnull if (p[i] == wm_delete)
526 038e9089 2004-03-21 devnull c->proto |= Pdelete;
527 038e9089 2004-03-21 devnull else if (p[i] == wm_take_focus)
528 038e9089 2004-03-21 devnull c->proto |= Ptakefocus;
529 c005568a 2004-03-30 devnull else if (p[i] == wm_lose_focus)
530 c005568a 2004-03-30 devnull c->proto |= Plosefocus;
531 038e9089 2004-03-21 devnull
532 038e9089 2004-03-21 devnull XFree((char *) p);
533 038e9089 2004-03-21 devnull }