sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

commit 8aec20ded43b022e84f8f910342f1235e393f560
parent 6eb5972a9b686c80de535e17d37ca854a6889255
Author: Aaron Duxler <aaron.duxler@gmail.com>
Date:   Sun, 21 Jul 2019 22:47:58 +0200

[dwm][patches] update swapfocus to 6.2 and add pertag feature

Diffstat:
Adwm.suckless.org/patches/swapfocus/dwm-swapfocus-6.2.diff | 174+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdwm.suckless.org/patches/swapfocus/index.md | 8++++++++
2 files changed, 182 insertions(+), 0 deletions(-)

diff --git a/dwm.suckless.org/patches/swapfocus/dwm-swapfocus-6.2.diff b/dwm.suckless.org/patches/swapfocus/dwm-swapfocus-6.2.diff @@ -0,0 +1,174 @@ +diff -up a/config.def.h b/config.def.h +--- a/config.def.h 2019-06-26 22:55:48.406595279 +0200 ++++ b/config.def.h 2019-07-21 21:50:32.649343232 +0200 +@@ -66,6 +66,7 @@ static Key keys[] = { + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, ++ { MODKEY, XK_s, swapfocus, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, +diff -up a/dwm.c b/dwm.c +--- a/dwm.c 2019-06-26 22:55:48.409928612 +0200 ++++ b/dwm.c 2019-07-21 22:29:17.400607398 +0200 +@@ -111,6 +111,7 @@ typedef struct { + void (*arrange)(Monitor *); + } Layout; + ++typedef struct Pertag Pertag; + struct Monitor { + char ltsymbol[16]; + float mfact; +@@ -130,6 +131,7 @@ struct Monitor { + Monitor *next; + Window barwin; + const Layout *lt[2]; ++ Pertag *pertag; + }; + + typedef struct { +@@ -206,6 +208,7 @@ static void seturgent(Client *c, int urg + static void showhide(Client *c); + static void sigchld(int unused); + static void spawn(const Arg *arg); ++static void swapfocus(const Arg *arg); + static void tag(const Arg *arg); + static void tagmon(const Arg *arg); + static void tile(Monitor *); +@@ -271,6 +274,11 @@ static Window root, wmcheckwin; + /* configuration, allows nested code to access above variables */ + #include "config.h" + ++struct Pertag { ++ unsigned int curtag, prevtag; /* current and previous tag */ ++ Client *prevclient[LENGTH(tags) + 1]; ++}; ++ + /* compile-time check if all tags fit into an unsigned int bit array. */ + struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; + +@@ -641,6 +649,8 @@ createmon(void) + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; + strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); ++ m->pertag = ecalloc(1, sizeof(Pertag)); ++ m->pertag->curtag = m->pertag->prevtag = 1; + return m; + } + +@@ -1012,6 +1022,7 @@ killclient(const Arg *arg) + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } ++ selmon->pertag->prevclient[selmon->pertag->curtag] = NULL; + } + + void +@@ -1653,6 +1664,28 @@ spawn(const Arg *arg) + } + + void ++swapfocus(const Arg *arg) ++{ ++ if (!selmon->sel) ++ return; ++ if(selmon->pertag->prevclient[selmon->pertag->curtag] != NULL ++ && ISVISIBLE(selmon->pertag->prevclient[selmon->pertag->curtag])){ ++ focus(selmon->pertag->prevclient[selmon->pertag->curtag]); ++ restack(selmon->pertag->prevclient[selmon->pertag->curtag]->mon); ++ } ++ else{ ++ Client *c = NULL; ++ for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); ++ if (!c) ++ for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next); ++ if (c) { ++ focus(c); ++ restack(selmon); ++ } ++ } ++} ++ ++void + tag(const Arg *arg) + { + if (selmon->sel && arg->ui & TAGMASK) { +@@ -1738,9 +1771,22 @@ void + toggleview(const Arg *arg) + { + unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); ++ int i; + + if (newtagset) { + selmon->tagset[selmon->seltags] = newtagset; ++ ++ if (newtagset == ~0) { ++ selmon->pertag->prevtag = selmon->pertag->curtag; ++ selmon->pertag->curtag = 0; ++ } ++ ++ /* test if the user did not select the same tag */ ++ if (!(newtagset & 1 << (selmon->pertag->curtag - 1))) { ++ selmon->pertag->prevtag = selmon->pertag->curtag; ++ for (i = 0; !(newtagset & 1 << i); i++) ; ++ selmon->pertag->curtag = i + 1; ++ } + focus(NULL); + arrange(selmon); + } +@@ -1751,6 +1797,7 @@ unfocus(Client *c, int setfocus) + { + if (!c) + return; ++ selmon->pertag->prevclient[selmon->pertag->curtag] = c; + grabbuttons(c, 0); + XSetWindowBorder(dpy, c->win, scheme[SchemeNorm][ColBorder].pixel); + if (setfocus) { +@@ -2035,12 +2082,30 @@ updatewmhints(Client *c) + void + view(const Arg *arg) + { ++ int i; ++ unsigned int tmptag; ++ + if ((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) + return; + selmon->seltags ^= 1; /* toggle sel tagset */ +- if (arg->ui & TAGMASK) ++ if (arg->ui & TAGMASK){ + selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; ++ selmon->pertag->prevtag = selmon->pertag->curtag; ++ ++ if (arg->ui == ~0) ++ selmon->pertag->curtag = 0; ++ else { ++ for (i = 0; !(arg->ui & 1 << i); i++) ; ++ selmon->pertag->curtag = i + 1; ++ } ++ } else { ++ tmptag = selmon->pertag->prevtag; ++ selmon->pertag->prevtag = selmon->pertag->curtag; ++ selmon->pertag->curtag = tmptag; ++ } ++ Client *unmodified = selmon->pertag->prevclient[selmon->pertag->curtag]; + focus(NULL); ++ selmon->pertag->prevclient[selmon->pertag->curtag] = unmodified; + arrange(selmon); + } + +@@ -2114,12 +2179,13 @@ void + zoom(const Arg *arg) + { + Client *c = selmon->sel; ++ selmon->pertag->prevclient[selmon->pertag->curtag] = nexttiled(selmon->clients); + + if (!selmon->lt[selmon->sellt]->arrange + || (selmon->sel && selmon->sel->isfloating)) + return; + if (c == nexttiled(selmon->clients)) +- if (!c || !(c = nexttiled(c->next))) ++ if (!c || !(c = selmon->pertag->prevclient[selmon->pertag->curtag] = nexttiled(c->next))) + return; + pop(c); + } diff --git a/dwm.suckless.org/patches/swapfocus/index.md b/dwm.suckless.org/patches/swapfocus/index.md @@ -7,8 +7,15 @@ This patch makes it possible to switch focus with one single shortcut (alt-s) instead of having to think if you should use alt-j or alt-k for reaching the last used window. +Changes in 6.2 +---------------- +* Remember the previous tag and previous clients on each tag. +* If there is no previous client on the current tag (because it was moved or killed), + the next client on the current tag is focused. + Download -------- +* [dwm-swapfocus-6.2.diff](dwm-swapfocus-6.2.diff) * [dwm-swapfocus-20160731-56a31dc.diff](dwm-swapfocus-20160731-56a31dc.diff) * [dwm-6.1-swapfocus.diff](dwm-6.1-swapfocus.diff) (1807b) (20140209) * [dwm-swapfocus-6.0.diff](dwm-swapfocus-6.0.diff) (1482b) (20120406) @@ -18,3 +25,4 @@ Author ------ * Lasse Engblom * Jan Christoph Ebersbach - <jceb@e-jc.de> +* Aaron Duxler - <aaron.duxler@gmail.com> (6.2 port)