tusing a global stack for focus recovery on arrange() - seems to work great - d… | |
git clone git://src.adamsgaard.dk/dwm | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit 15abade2720158fd35dcf59aa2cd5cbb325a849c | |
parent 7ab8c8728168234f6b9e99d1be384323d1246b10 | |
Author: Anselm R. Garbe <[email protected]> | |
Date: Thu, 7 Sep 2006 17:53:40 +0200 | |
using a global stack for focus recovery on arrange() - seems to work great | |
Diffstat: | |
M client.c | 16 ++++++++++++++-- | |
M dwm.h | 3 ++- | |
M main.c | 1 + | |
M view.c | 14 +++++++++----- | |
4 files changed, 26 insertions(+), 8 deletions(-) | |
--- | |
diff --git a/client.c b/client.c | |
t@@ -11,6 +11,14 @@ | |
/* static functions */ | |
static void | |
+detachstack(Client *c) | |
+{ | |
+ Client **tc; | |
+ for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext); | |
+ *tc = c->snext; | |
+} | |
+ | |
+static void | |
grabbuttons(Client *c, Bool focus) | |
{ | |
XUngrabButton(dpy, AnyButton, AnyModifier, c->win); | |
t@@ -99,6 +107,9 @@ focus(Client *c) | |
} | |
} | |
if(c) { | |
+ detachstack(c); | |
+ c->snext = stack; | |
+ stack = c; | |
grabbuttons(c, True); | |
drawtitle(c); | |
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); | |
t@@ -198,7 +209,6 @@ killclient(Arg *arg) | |
void | |
manage(Window w, XWindowAttributes *wa) | |
{ | |
- unsigned int i; | |
Client *c; | |
Window trans; | |
XSetWindowAttributes twa; | |
t@@ -247,7 +257,8 @@ manage(Window w, XWindowAttributes *wa) | |
if(clients) | |
clients->prev = c; | |
c->next = clients; | |
- clients = c; | |
+ c->snext = stack; | |
+ stack = clients = c; | |
settitle(c); | |
ban(c); | |
t@@ -421,6 +432,7 @@ unmanage(Client *c) | |
XUngrabButton(dpy, AnyButton, AnyModifier, c->win); | |
XDestroyWindow(dpy, c->twin); | |
+ detachstack(c); | |
free(c->tags); | |
free(c); | |
diff --git a/dwm.h b/dwm.h | |
t@@ -61,6 +61,7 @@ struct Client { | |
Bool *tags; | |
Client *next; | |
Client *prev; | |
+ Client *snext; | |
Window win; | |
Window twin; | |
}; | |
t@@ -73,7 +74,7 @@ extern void (*handler[LASTEvent])(XEvent *); | |
extern void (*arrange)(Arg *); | |
extern Atom wmatom[WMLast], netatom[NetLast]; | |
extern Bool running, issel, maximized, *seltag; | |
-extern Client *clients, *sel; | |
+extern Client *clients, *sel, *stack; | |
extern Cursor cursor[CurLast]; | |
extern DC dc; | |
extern Display *dpy; | |
diff --git a/main.c b/main.c | |
t@@ -27,6 +27,7 @@ Bool issel = True; | |
Bool maximized = False; | |
Client *clients = NULL; | |
Client *sel = NULL; | |
+Client *stack = NULL; | |
Cursor cursor[CurLast]; | |
Display *dpy; | |
DC dc = {0}; | |
diff --git a/view.c b/view.c | |
t@@ -76,8 +76,10 @@ dofloat(Arg *arg) | |
else | |
ban(c); | |
} | |
- if(!sel || !isvisible(sel)) | |
- focus(getnext(clients)); | |
+ if(!sel || !isvisible(sel)) { | |
+ for(sel = stack; sel && !isvisible(sel); sel = sel->snext); | |
+ focus(sel); | |
+ } | |
restack(); | |
} | |
t@@ -138,8 +140,10 @@ dotile(Arg *arg) | |
else | |
ban(c); | |
} | |
- if(!sel || !isvisible(sel)) | |
- focus(getnext(clients)); | |
+ if(!sel || !isvisible(sel)) { | |
+ for(sel = stack; sel && !isvisible(sel); sel = sel->snext); | |
+ focus(sel); | |
+ } | |
restack(); | |
} | |
t@@ -227,7 +231,7 @@ restack() | |
XRaiseWindow(dpy, sel->win); | |
XRaiseWindow(dpy, sel->twin); | |
} | |
- if(arrange != dofloat) | |
+ if(arrange != dofloat) | |
for(c = nexttiled(clients); c; c = nexttiled(c->next)) { | |
XLowerWindow(dpy, c->twin); | |
XLowerWindow(dpy, c->win); |