Mercurial > aewl
comparison client.c @ 75:f08271b7cb20
rearranged several stuff
author | Anselm R. Garbe <garbeam@wmii.de> |
---|---|
date | Sat, 15 Jul 2006 16:30:50 +0200 |
parents | 5370ef170cc9 |
children | 4bd49f404f10 |
comparison
equal
deleted
inserted
replaced
74:5370ef170cc9 | 75:f08271b7cb20 |
---|---|
9 #include <X11/Xatom.h> | 9 #include <X11/Xatom.h> |
10 #include <X11/Xutil.h> | 10 #include <X11/Xutil.h> |
11 | 11 |
12 #include "dwm.h" | 12 #include "dwm.h" |
13 | 13 |
14 static Rule rule[] = { | |
15 /* class instance tags floating */ | |
16 { "Firefox-bin", "Gecko", { [Twww] = "www" }, False }, | |
17 }; | |
18 | |
19 Client * | |
20 getnext(Client *c) | |
21 { | |
22 for(; c && !c->tags[tsel]; c = c->next); | |
23 return c; | |
24 } | |
25 | |
26 void | 14 void |
27 ban(Client *c) | 15 ban(Client *c) |
28 { | 16 { |
29 XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); | 17 XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); |
30 XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); | 18 XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); |
31 } | 19 } |
32 | 20 |
33 static void | 21 static void |
34 resize_title(Client *c) | 22 resizetitle(Client *c) |
35 { | 23 { |
36 int i; | 24 int i; |
37 | 25 |
38 c->tw = 0; | 26 c->tw = 0; |
39 for(i = 0; i < TLast; i++) | 27 for(i = 0; i < TLast; i++) |
70 strncpy(c->name, *list, sizeof(c->name)); | 58 strncpy(c->name, *list, sizeof(c->name)); |
71 XFreeStringList(list); | 59 XFreeStringList(list); |
72 } | 60 } |
73 } | 61 } |
74 XFree(name.value); | 62 XFree(name.value); |
75 resize_title(c); | 63 resizetitle(c); |
76 } | 64 } |
77 | 65 |
78 void | 66 void |
79 setsize(Client *c) | 67 setsize(Client *c) |
80 { | 68 { |
139 drawtitle(old); | 127 drawtitle(old); |
140 drawtitle(c); | 128 drawtitle(c); |
141 XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); | 129 XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); |
142 XFlush(dpy); | 130 XFlush(dpy); |
143 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | 131 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
144 } | |
145 | |
146 static void | |
147 init_tags(Client *c) | |
148 { | |
149 XClassHint ch; | |
150 static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0; | |
151 unsigned int i, j; | |
152 Bool matched = False; | |
153 | |
154 if(!len) { | |
155 c->tags[tsel] = tags[tsel]; | |
156 return; | |
157 } | |
158 | |
159 if(XGetClassHint(dpy, c->win, &ch)) { | |
160 if(ch.res_class && ch.res_name) { | |
161 for(i = 0; i < len; i++) | |
162 if(!strncmp(rule[i].class, ch.res_class, sizeof(rule[i].class)) | |
163 && !strncmp(rule[i].instance, ch.res_name, sizeof(rule[i].instance))) | |
164 { | |
165 for(j = 0; j < TLast; j++) | |
166 c->tags[j] = rule[i].tags[j]; | |
167 c->floating = rule[i].floating; | |
168 matched = True; | |
169 break; | |
170 } | |
171 } | |
172 if(ch.res_class) | |
173 XFree(ch.res_class); | |
174 if(ch.res_name) | |
175 XFree(ch.res_name); | |
176 } | |
177 | |
178 if(!matched) | |
179 c->tags[tsel] = tags[tsel]; | |
180 } | 132 } |
181 | 133 |
182 void | 134 void |
183 manage(Window w, XWindowAttributes *wa) | 135 manage(Window w, XWindowAttributes *wa) |
184 { | 136 { |
194 c->ty = c->y += bh; | 146 c->ty = c->y += bh; |
195 c->tw = c->w = wa->width; | 147 c->tw = c->w = wa->width; |
196 c->h = wa->height; | 148 c->h = wa->height; |
197 c->th = bh; | 149 c->th = bh; |
198 c->border = 1; | 150 c->border = 1; |
199 c->proto = proto(c->win); | 151 c->proto = getproto(c->win); |
200 setsize(c); | 152 setsize(c); |
201 XSelectInput(dpy, c->win, | 153 XSelectInput(dpy, c->win, |
202 StructureNotifyMask | PropertyChangeMask | EnterWindowMask); | 154 StructureNotifyMask | PropertyChangeMask | EnterWindowMask); |
203 XGetTransientForHint(dpy, c->win, &trans); | 155 XGetTransientForHint(dpy, c->win, &trans); |
204 twa.override_redirect = 1; | 156 twa.override_redirect = 1; |
209 0, DefaultDepth(dpy, screen), CopyFromParent, | 161 0, DefaultDepth(dpy, screen), CopyFromParent, |
210 DefaultVisual(dpy, screen), | 162 DefaultVisual(dpy, screen), |
211 CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); | 163 CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); |
212 | 164 |
213 settitle(c); | 165 settitle(c); |
214 init_tags(c); | 166 settags(c); |
215 | 167 |
216 for(l = &clients; *l; l = &(*l)->next); | 168 for(l = &clients; *l; l = &(*l)->next); |
217 c->next = *l; /* *l == nil */ | 169 c->next = *l; /* *l == nil */ |
218 *l = c; | 170 *l = c; |
219 | 171 |
222 XGrabButton(dpy, Button2, Mod1Mask, c->win, False, ButtonPressMask, | 174 XGrabButton(dpy, Button2, Mod1Mask, c->win, False, ButtonPressMask, |
223 GrabModeAsync, GrabModeSync, None, None); | 175 GrabModeAsync, GrabModeSync, None, None); |
224 XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask, | 176 XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask, |
225 GrabModeAsync, GrabModeSync, None, None); | 177 GrabModeAsync, GrabModeSync, None, None); |
226 | 178 |
227 if(!c->floating) | 179 if(!c->dofloat) |
228 c->floating = trans | 180 c->dofloat = trans |
229 || ((c->maxw == c->minw) && (c->maxh == c->minh)); | 181 || ((c->maxw == c->minw) && (c->maxh == c->minh)); |
230 | 182 |
231 arrange(NULL); | 183 arrange(NULL); |
232 /* mapping the window now prevents flicker */ | 184 /* mapping the window now prevents flicker */ |
233 if(c->tags[tsel]) { | 185 if(c->tags[tsel]) { |
319 c->h = c->minh; | 271 c->h = c->minh; |
320 if(c->maxw && c->w > c->maxw) | 272 if(c->maxw && c->w > c->maxw) |
321 c->w = c->maxw; | 273 c->w = c->maxw; |
322 if(c->maxh && c->h > c->maxh) | 274 if(c->maxh && c->h > c->maxh) |
323 c->h = c->maxh; | 275 c->h = c->maxh; |
324 resize_title(c); | 276 resizetitle(c); |
325 XSetWindowBorderWidth(dpy, c->win, 1); | 277 XSetWindowBorderWidth(dpy, c->win, 1); |
326 XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); | 278 XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); |
327 e.type = ConfigureNotify; | 279 e.type = ConfigureNotify; |
328 e.event = c->win; | 280 e.event = c->win; |
329 e.window = c->win; | 281 e.window = c->win; |
337 XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e); | 289 XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e); |
338 XFlush(dpy); | 290 XFlush(dpy); |
339 } | 291 } |
340 | 292 |
341 static int | 293 static int |
342 dummy_xerror(Display *dsply, XErrorEvent *err) | 294 xerrordummy(Display *dsply, XErrorEvent *ee) |
343 { | 295 { |
344 return 0; | 296 return 0; |
345 } | 297 } |
346 | 298 |
347 void | 299 void |
348 unmanage(Client *c) | 300 unmanage(Client *c) |
349 { | 301 { |
350 Client **l; | 302 Client **l; |
351 | 303 |
352 XGrabServer(dpy); | 304 XGrabServer(dpy); |
353 XSetErrorHandler(dummy_xerror); | 305 XSetErrorHandler(xerrordummy); |
354 | 306 |
355 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); | 307 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
356 XDestroyWindow(dpy, c->title); | 308 XDestroyWindow(dpy, c->title); |
357 | 309 |
358 for(l = &clients; *l && *l != c; l = &(*l)->next); | 310 for(l = &clients; *l && *l != c; l = &(*l)->next); |
372 if(sel) | 324 if(sel) |
373 focus(sel); | 325 focus(sel); |
374 } | 326 } |
375 | 327 |
376 Client * | 328 Client * |
377 gettitle(Window w) | 329 getctitle(Window w) |
378 { | 330 { |
379 Client *c; | 331 Client *c; |
380 for(c = clients; c; c = c->next) | 332 for(c = clients; c; c = c->next) |
381 if(c->title == w) | 333 if(c->title == w) |
382 return c; | 334 return c; |
390 for(c = clients; c; c = c->next) | 342 for(c = clients; c; c = c->next) |
391 if(c->win == w) | 343 if(c->win == w) |
392 return c; | 344 return c; |
393 return NULL; | 345 return NULL; |
394 } | 346 } |
347 | |
348 void | |
349 zoom(Arg *arg) | |
350 { | |
351 Client **l, *c; | |
352 | |
353 if(!sel) | |
354 return; | |
355 | |
356 if(sel == getnext(clients) && sel->next) { | |
357 if((c = getnext(sel->next))) | |
358 sel = c; | |
359 } | |
360 | |
361 for(l = &clients; *l && *l != sel; l = &(*l)->next); | |
362 *l = sel->next; | |
363 | |
364 sel->next = clients; /* pop */ | |
365 clients = sel; | |
366 arrange(NULL); | |
367 focus(sel); | |
368 } | |
369 | |
370 void | |
371 maximize(Arg *arg) | |
372 { | |
373 if(!sel) | |
374 return; | |
375 sel->x = sx; | |
376 sel->y = sy + bh; | |
377 sel->w = sw - 2 * sel->border; | |
378 sel->h = sh - 2 * sel->border - bh; | |
379 higher(sel); | |
380 resize(sel, False); | |
381 } | |
382 | |
383 void | |
384 focusprev(Arg *arg) | |
385 { | |
386 Client *c; | |
387 | |
388 if(!sel) | |
389 return; | |
390 | |
391 if((c = sel->revert && sel->revert->tags[tsel] ? sel->revert : NULL)) { | |
392 higher(c); | |
393 focus(c); | |
394 } | |
395 } | |
396 | |
397 void | |
398 focusnext(Arg *arg) | |
399 { | |
400 Client *c; | |
401 | |
402 if(!sel) | |
403 return; | |
404 | |
405 if(!(c = getnext(sel->next))) | |
406 c = getnext(clients); | |
407 if(c) { | |
408 higher(c); | |
409 c->revert = sel; | |
410 focus(c); | |
411 } | |
412 } | |
413 | |
414 void | |
415 killclient(Arg *arg) | |
416 { | |
417 if(!sel) | |
418 return; | |
419 if(sel->proto & WM_PROTOCOL_DELWIN) | |
420 sendevent(sel->win, wm_atom[WMProtocols], wm_atom[WMDelete]); | |
421 else | |
422 XKillClient(dpy, sel->win); | |
423 } |