Sfoglia il codice sorgente

using a global stack for focus recovery on arrange() - seems to work great

Anselm R. Garbe 19 anni fa
parent
commit
15abade272
4 ha cambiato i file con 26 aggiunte e 8 eliminazioni
  1. 14 2
      client.c
  2. 2 1
      dwm.h
  3. 1 0
      main.c
  4. 9 5
      view.c

+ 14 - 2
client.c

@@ -10,6 +10,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)
 {
@@ -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);
 

+ 2 - 1
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;

+ 1 - 0
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};

+ 9 - 5
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);