From 491b0978baa9a688aec49ab8b365df7a8be2537b Mon Sep 17 00:00:00 2001 From: Jason Woofenden Date: Mon, 17 Nov 2014 17:08:03 -0500 Subject: [PATCH] workspaces remember selected client --- dwm.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/dwm.c b/dwm.c index f873a42..f8467d6 100644 --- a/dwm.c +++ b/dwm.c @@ -184,6 +184,7 @@ static void monocle(Monitor *m); static void motionnotify(XEvent *e); static void movemouse(const Arg *arg); static Client *nexttiled(Client *c); +static Client *nextvisible(Client *c); static void pop(Client *); static void propertynotify(XEvent *e); static void quit(const Arg *arg); @@ -421,13 +422,8 @@ attach(Client *c) { void attachstack(Client *c) { - if (c->mon->sel) { - c->snext = c->mon->sel->snext; - c->mon->sel->snext = c; - } else { - c->snext = c->mon->stack; - c->mon->stack = c; - } + c->snext = c->mon->stack; + c->mon->stack = c; } void @@ -686,19 +682,23 @@ detach(Client *c) { *tc = c->next; } +// NOTE: the stack is for z-order and most-recently-focused +// only mon->clients determines position in visible layout void detachstack(Client *c) { Client *prev = NULL, *next_sel = NULL, *i; for(i = c->mon->stack; i && i != c; i = i->snext) { prev = i; - if(ISVISIBLE(i)) - next_sel = i; } if(c == c->mon->sel) { - if (!next_sel) { // if no visible window prev, find first visible - for(i = c->mon->stack; i && !ISVISIBLE(i); i = i->snext) + // find last visible window before c + // WARNING if you detach() before detachstack() this will select last visible window + for(i = nextvisible(c->mon->clients); i && i != c; i = nextvisible(i->next)) + next_sel = i; + // failing that, find first visible window + if (!next_sel) + for(i = nextvisible(c->mon->clients); i && i != c; i = nextvisible(i->next)) next_sel = i; - } c->mon->sel = next_sel; } if (prev) { @@ -1227,6 +1227,12 @@ nexttiled(Client *c) { return c; } +Client * +nextvisible(Client *c) { + for(; c && !ISVISIBLE(c); c = c->next); + return c; +} + void pop(Client *c) { detach(c); @@ -1430,8 +1436,8 @@ sendmon(Client *c, Monitor *m) { if(c->mon == m) return; unfocus(c, True); - detach(c); detachstack(c); + detach(c); c->mon = m; c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ attach(c); @@ -1743,8 +1749,8 @@ unmanage(Client *c, Bool destroyed) { XWindowChanges wc; /* The server grab construct avoids race conditions. */ - detach(c); detachstack(c); + detach(c); if(!destroyed) { wc.border_width = c->oldbw; XGrabServer(dpy); -- 1.7.10.4