dwm

dynamic window manager

git clone https://9o.is/git/dwm.git

commit 787f5526c735bbaf7115b4089c7b807faaaa0613
parent d52905cf5305c0d0d194013765214c119f338b18
Author: Jul <jul@9o.is>
Date:   Mon,  2 Feb 2026 05:43:03 -0500

navigate clients with numbers and tags with symbols

Diffstat:
Mconfig.h | 15+++++++++++++--
Mdwm.c | 13++++++++++++-
2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/config.h b/config.h @@ -45,10 +45,12 @@ static const Layout layouts[] = { /* key definitions */ #define MODKEY Mod4Mask #define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, view, {.ui = 1 << TAG} }, \ { MODKEY|Mod1Mask, KEY, toggleview, {.ui = 1 << TAG} }, \ { MODKEY|ControlMask, KEY, tag, {.ui = 1 << TAG} }, \ { MODKEY|Mod1Mask|ControlMask, KEY, toggletag, {.ui = 1 << TAG} }, +#define CLTKEYS(KEY,CLIENT) \ + { MODKEY, KEY, focusstack, { .n = CLIENT } }, #define SHIFTKEYS(KEY,MOVE) \ { MODKEY, KEY, shiftview, { .i = MOVE } }, \ { MODKEY|Mod1Mask, KEY, shifttag, { .i = MOVE } }, \ @@ -84,8 +86,17 @@ static const Key keys[] = { { MODKEY, XK_space, setlayout, {0} }, { MODKEY|ControlMask, XK_space, togglefloating, {0} }, { MODKEY|Mod1Mask, XK_space, toggleforegrounded, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, view, {.ui = ~0 } }, { MODKEY|Mod1Mask, XK_0, tag, {.ui = ~0 } }, + CLTKEYS( XK_1, 1) + CLTKEYS( XK_2, 2) + CLTKEYS( XK_3, 3) + CLTKEYS( XK_4, 4) + CLTKEYS( XK_5, 5) + CLTKEYS( XK_6, 6) + CLTKEYS( XK_7, 7) + CLTKEYS( XK_8, 9) + CLTKEYS( XK_9, 8) TAGKEYS( XK_1, 0) TAGKEYS( XK_2, 1) TAGKEYS( XK_3, 2) diff --git a/dwm.c b/dwm.c @@ -71,6 +71,7 @@ enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkCounter, typedef union { int i; + int n; unsigned int ui; float f; const void *v; @@ -976,10 +977,20 @@ void focusstack(const Arg *arg) { Client *c = NULL, *i; + int j = 0; if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) return; - if (arg->i > 0) { + if (arg->n > 0) { + for (c = selmon->clients; c; c = c->next) { + if (c->tags & selmon->tagset[selmon->seltags]) { + if (j == arg->n - 1) { + break; + } + j++; + } + } + } else if (arg->i > 0) { for (c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); if (!c) for (c = selmon->clients; c && !ISVISIBLE(c); c = c->next);