2
0
mirror of https://github.com/bakkeby/patches synced 2024-11-19 15:25:38 +00:00
patches/dwm/dwm-shiftviewclients-6.2.diff

87 lines
2.7 KiB
Diff

From 778ab761611dd05fbb8841f51eb4184b7ce32c8d Mon Sep 17 00:00:00 2001
From: bakkeby <bakkeby@gmail.com>
Date: Sun, 3 May 2020 15:55:08 +0200
Subject: [PATCH] This variant of the shiftview patch adds left and right
circular shift through tags, but skips tags where there are no clients.
---
config.def.h | 2 ++
dwm.c | 41 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 43 insertions(+)
diff --git a/config.def.h b/config.def.h
index 1c0b587..ad3a5fd 100644
--- a/config.def.h
+++ b/config.def.h
@@ -72,6 +72,8 @@ static Key keys[] = {
{ MODKEY, XK_l, setmfact, {.f = +0.05} },
{ MODKEY, XK_Return, zoom, {0} },
{ MODKEY, XK_Tab, view, {0} },
+ { MODKEY|ShiftMask, XK_Tab, shiftviewclients, { .i = +1 } },
+ { MODKEY|ShiftMask, XK_backslash, shiftviewclients, { .i = -1 } },
{ MODKEY|ShiftMask, XK_c, killclient, {0} },
{ MODKEY, XK_t, setlayout, {.v = &layouts[0]} },
{ MODKEY, XK_f, setlayout, {.v = &layouts[1]} },
diff --git a/dwm.c b/dwm.c
index 4465af1..55d5035 100644
--- a/dwm.c
+++ b/dwm.c
@@ -203,6 +203,7 @@ static void setlayout(const Arg *arg);
static void setmfact(const Arg *arg);
static void setup(void);
static void seturgent(Client *c, int urg);
+static void shiftviewclients(const Arg *arg);
static void showhide(Client *c);
static void sigchld(int unused);
static void spawn(const Arg *arg);
@@ -1610,6 +1611,46 @@ seturgent(Client *c, int urg)
XFree(wmh);
}
+void
+shiftviewclients(const Arg *arg)
+{
+ Arg shifted;
+ Client *c;
+ unsigned int tagmask = 0;
+
+ for (c = selmon->clients; c; c = c->next)
+ #if SCRATCHPADS_PATCH
+ if (!(c->tags & SPTAGMASK))
+ tagmask = tagmask | c->tags;
+ #else
+ tagmask = tagmask | c->tags;
+ #endif // SCRATCHPADS_PATCH
+
+ #if SCRATCHPADS_PATCH
+ shifted.ui = selmon->tagset[selmon->seltags] & ~SPTAGMASK;
+ #else
+ shifted.ui = selmon->tagset[selmon->seltags];
+ #endif // SCRATCHPADS_PATCH
+ if (arg->i > 0) // left circular shift
+ do {
+ shifted.ui = (shifted.ui << arg->i)
+ | (shifted.ui >> (LENGTH(tags) - arg->i));
+ #if SCRATCHPADS_PATCH
+ shifted.ui &= ~SPTAGMASK;
+ #endif // SCRATCHPADS_PATCH
+ } while (tagmask && !(shifted.ui & tagmask));
+ else // right circular shift
+ do {
+ shifted.ui = (shifted.ui >> (- arg->i)
+ | shifted.ui << (LENGTH(tags) + arg->i));
+ #if SCRATCHPADS_PATCH
+ shifted.ui &= ~SPTAGMASK;
+ #endif // SCRATCHPADS_PATCH
+ } while (tagmask && !(shifted.ui & tagmask));
+
+ view(&shifted);
+}
+
void
showhide(Client *c)
{
--
2.17.1