dwm

my fork of dwm
Index Commits Files Refs README LICENSE
commit 15abade2720158fd35dcf59aa2cd5cbb325a849c
parent 7ab8c8728168234f6b9e99d1be384323d1246b10
Author: Anselm R. Garbe <arg@10kloc.org>
Date:   Thu,  7 Sep 2006 17:53:40 +0200

using a global stack for focus recovery on arrange() - seems to work great
Diffstat:
Mclient.c | 16++++++++++++++--
Mdwm.h | 3++-
Mmain.c | 1+
Mview.c | 14+++++++++-----
4 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/client.c b/client.c
@@ -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);
@@ -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);
@@ -198,7 +209,6 @@ killclient(Arg *arg)
 void
 manage(Window w, XWindowAttributes *wa)
 {
-    unsigned int i;
     Client *c;
     Window trans;
     XSetWindowAttributes twa;
@@ -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);
@@ -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
@@ -61,6 +61,7 @@ struct Client {
     Bool *tags;
     Client *next;
     Client *prev;
+    Client *snext;
     Window win;
     Window twin;
 };
@@ -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
@@ -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
@@ -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();
 }
 
@@ -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();
 }
 
@@ -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);