tseveral other focus fixes, introduced unfocus() - dwm - [fork] customized buil… | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 18b1312449531c7b77403aafb71611e9e48500ec | |
parent 80ee95473b8b2fd44262029d35fe25e175e9765f | |
Author: Anselm R Garbe <[email protected]> | |
Date: Wed, 24 Jun 2009 19:45:47 +0100 | |
several other focus fixes, introduced unfocus() | |
Diffstat: | |
M dwm.c | 38 +++++++++++++++++++++++------… | |
1 file changed, 29 insertions(+), 9 deletions(-) | |
--- | |
diff --git a/dwm.c b/dwm.c | |
t@@ -1,4 +1,4 @@ | |
-//#define XINULATOR /* debug, simulates dual head */ | |
+#define XINULATOR /* debug, simulates dual head */ | |
/* See LICENSE file for copyright and license details. | |
* | |
* dynamic window manager is designed like any other X client as well. It is | |
t@@ -211,6 +211,7 @@ static void togglebar(const Arg *arg); | |
static void togglefloating(const Arg *arg); | |
static void toggletag(const Arg *arg); | |
static void toggleview(const Arg *arg); | |
+static void unfocus(Client *c); | |
static void unmanage(Client *c); | |
static void unmapnotify(XEvent *e); | |
static void updategeom(void); | |
t@@ -391,9 +392,23 @@ buttonpress(XEvent *e) { | |
unsigned int i, x, click; | |
Arg arg = {0}; | |
Client *c; | |
+ Monitor *m; | |
XButtonPressedEvent *ev = &e->xbutton; | |
click = ClkRootWin; | |
+ /* focus monitor if necessary */ | |
+ for(m = mons; m; m = m->next) | |
+ if(ev->window == m->barwin) { | |
+ if(m != selmon) { | |
+ if(selmon->stack) | |
+ focus(selmon->stack); | |
+ else { | |
+ selmon = m; | |
+ focus(NULL); | |
+ } | |
+ } | |
+ break; | |
+ } | |
if(ev->window == selmon->barwin && ev->x >= selmon->btx) { | |
i = 0; | |
x = selmon->btx; | |
t@@ -757,10 +772,8 @@ void | |
focus(Client *c) { | |
if(!c || !ISVISIBLE(c)) | |
for(c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); | |
- if(selmon->sel && selmon->sel != c) { | |
- grabbuttons(selmon->sel, False); | |
- XSetWindowBorder(dpy, selmon->sel->win, dc.norm[ColBorder]); | |
- } | |
+ if(selmon->sel) | |
+ unfocus(selmon->sel); | |
if(c) { | |
if(c->mon != selmon) | |
selmon = c->mon; | |
t@@ -797,6 +810,7 @@ focusmon(const Arg *arg) { | |
if(m->stack) | |
focus(m->stack); | |
else { | |
+ unfocus(selmon->stack); | |
selmon = m; | |
focus(NULL); | |
} | |
t@@ -1219,8 +1233,7 @@ resize(Client *c, int x, int y, int w, int h) { | |
c->w = wc.width = w; | |
c->h = wc.height = h; | |
wc.border_width = c->bw; | |
- XConfigureWindow(dpy, c->win, | |
- CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); | |
+ XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorde… | |
configure(c); | |
XSync(dpy, False); | |
} | |
t@@ -1590,6 +1603,14 @@ toggleview(const Arg *arg) { | |
} | |
void | |
+unfocus(Client *c) { | |
+ if(!c) | |
+ return; | |
+ grabbuttons(c, False); | |
+ XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]); | |
+} | |
+ | |
+void | |
unmanage(Client *c) { | |
XWindowChanges wc; | |
t@@ -1732,7 +1753,7 @@ updategeom(void) { | |
} | |
/* reassign left over clients of disappeared monitors */ | |
- for(tm = mons; tm; tm = tm->next) { | |
+ for(tm = mons; tm; tm = tm->next) | |
while(tm->clients) { | |
c = tm->clients; | |
tm->clients = c->next; | |
t@@ -1741,7 +1762,6 @@ updategeom(void) { | |
attach(c); | |
attachstack(c); | |
} | |
- } | |
/* select focused monitor */ | |
selmon = newmons; |