dwm
dynamic window manager
git clone https://9o.is/git/dwm.git
commit 25c5922fb9dcc246af6e0107c11f84d8c49b62fe parent 787f5526c735bbaf7115b4089c7b807faaaa0613 Author: Jul <jul@9o.is> Date: Mon, 2 Feb 2026 07:01:19 -0500 reorganize nav keys with NUMKEYS and DIRKEYS macros Diffstat:
| M | config.h | | | 57 | +++++++++++++++++++++++---------------------------------- |
| M | dwm.c | | | 41 | +++++++++++++++++++++++++++++------------ |
2 files changed, 52 insertions(+), 46 deletions(-)
diff --git a/config.h b/config.h @@ -44,18 +44,18 @@ static const Layout layouts[] = { /* key definitions */ #define MODKEY Mod4Mask -#define TAGKEYS(KEY,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 } }, \ - { MODKEY|ShiftMask, KEY, shiftboth, { .i = MOVE } }, \ - { MODKEY|Mod1Mask|ControlMask, KEY, shiftswaptags, { .i = MOVE } }, +#define NUMKEYS(KEY,VAL) \ + { MODKEY, KEY, focusstacknum, { .i = (VAL + 1) } }, \ + { MODKEY|ShiftMask, KEY, view, { .ui = 1 << VAL } }, \ + { MODKEY|Mod1Mask, KEY, toggleview, { .ui = 1 << VAL } }, \ + { MODKEY|ControlMask, KEY, tag, { .ui = 1 << VAL } }, \ + { MODKEY|Mod1Mask|ControlMask, KEY, toggletag, { .ui = 1 << VAL } }, +#define DIRKEYS(KEY,VAL) \ + { MODKEY, KEY, focusstack, { .i = VAL } }, \ + { MODKEY|ShiftMask, KEY, shiftview, { .i = VAL } }, \ + { MODKEY|Mod1Mask, KEY, shifttag, { .i = VAL } }, \ + { MODKEY|ControlMask, KEY, shiftboth, { .i = VAL } }, \ + { MODKEY|Mod1Mask|ControlMask, KEY, shiftswaptags, { .i = VAL } }, /* helper for spawning shell commands in the pre dwm-5.0 fashion */ #define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } @@ -88,28 +88,17 @@ static const Key keys[] = { { MODKEY|Mod1Mask, XK_space, toggleforegrounded, {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) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - SHIFTKEYS( XK_Left, -1) - SHIFTKEYS( XK_Right, +1) - { MODKEY, XK_Up, focusstack, {.i = -1 } }, - { MODKEY, XK_Down, focusstack, {.i = +1 } }, + NUMKEYS( XK_1, 0) + NUMKEYS( XK_2, 1) + NUMKEYS( XK_3, 2) + NUMKEYS( XK_4, 3) + NUMKEYS( XK_5, 4) + NUMKEYS( XK_6, 5) + NUMKEYS( XK_7, 6) + NUMKEYS( XK_8, 7) + NUMKEYS( XK_9, 8) + DIRKEYS( XK_Left, -1) + DIRKEYS( XK_Right, +1) }; /* button definitions */ diff --git a/dwm.c b/dwm.c @@ -71,7 +71,6 @@ enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkCounter, typedef union { int i; - int n; unsigned int ui; float f; const void *v; @@ -178,6 +177,7 @@ static void focus(Client *c); static void focusin(XEvent *e); //static void focusmon(const Arg *arg); static void focusstack(const Arg *arg); +static void focusstacknum(const Arg *arg); static Atom getatomprop(Client *c, Atom prop); static int getrootptr(int *x, int *y); static long getstate(Window w); @@ -977,20 +977,11 @@ void focusstack(const Arg *arg) { Client *c = NULL, *i; - int j = 0; if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) return; - 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) { + + 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); @@ -1010,6 +1001,32 @@ focusstack(const Arg *arg) } } +void +focusstacknum(const Arg *arg) +{ + Client *c = NULL; + int j = 0; + + if (!selmon->sel || (selmon->sel->isfullscreen && lockfullscreen)) + return; + + if (arg->i > 0) { + for (c = selmon->clients; c; c = c->next) { + if (ISVISIBLE(c)) { + if (j == arg->i - 1) { + break; + } + j++; + } + } + } + if (c) { + focus(c); + restack(selmon); + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w/2, c->h/2); + } +} + Atom getatomprop(Client *c, Atom prop) {