--- dwm-6.0.c 2012-11-24 21:00:20.000000000 -0600 +++ dwm.c 2012-11-25 09:04:05.000000000 -0600 @@ -143,6 +143,7 @@ struct Monitor { Monitor *next; Window barwin; const Layout *lt[2]; + Client *prevclient[32]; }; typedef struct { @@ -224,6 +225,7 @@ static void setup(void); static void showhide(Client *c); static void sigchld(int unused); static void spawn(const Arg *arg); +static void swapfocus(); static void tag(const Arg *arg); static void tagmon(const Arg *arg); static int textnw(const char *text, unsigned int len); @@ -657,6 +659,7 @@ createmon(void) { m->lt[0] = &layouts[0]; m->lt[1] = &layouts[1 % LENGTH(layouts)]; strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); + for(int i = 0; i < 31; i++, m->prevclient[i] = NULL); return m; } @@ -844,6 +847,12 @@ void focus(Client *c) { if(!c || !ISVISIBLE(c)) for(c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); + else { + int n = 0, i; + for (i = c->tags & c->mon->tagset[c->mon->seltags]; i; i >>= 1, n++); + if (selmon->sel != selmon->prevclient[n - 1]) + selmon->prevclient[n - 1] = selmon->sel; + } /* was if(selmon->sel) */ if(selmon->sel && selmon->sel != c) unfocus(selmon->sel, False); @@ -1675,6 +1684,16 @@ spawn(const Arg *arg) { } void +swapfocus(){ + Client *c = selmon->sel; + int n = 0, i; + for (i = c->tags & c->mon->tagset[c->mon->seltags]; i; i >>= 1, n++); + if(n) { + focus(selmon->prevclient[n - 1]); + } +} + +void tag(const Arg *arg) { if(selmon->sel && arg->ui & TAGMASK) { selmon->sel->tags = arg->ui & TAGMASK;