dwm-shif-tools-6.2.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-shif-tools-6.2.diff (7404B)
---
1 From d57c8508c9f26be40667d402a2daaa2b27ae759f Mon Sep 17 00:00:00 2001
2 From: explosion-mental <explosion0mental@gmail.com>
3 Date: Wed, 11 Aug 2021 21:05:44 -0500
4 Subject: [PATCH] shift-tools - shifttag, moves the current selected client to
5 the adjacent tag - shifttagclients, moves the current selected client to the
6 adjacent tag that has at least one client else acts as shifttag -
7 shiftview, view adjacent tag - shiftviewclients, view the closes tag that has
8 a client. If none acts as shiftview - shiftboth, shifttag and shiftview.
9 Basically moves the window to the next/prev tag and follows it. -
10 shiftswaptags, its a shift implementation on the swaptags function (see
11 https://github.com/moizifty/DWM-Build/blob/65379c62640788881486401a0d8c79333751b02f/config.h#L48
12 for more details), which in short 'swaps tags' (swaps all clients with
13 the clients on the adjacent tag). A pretty useful example of this is
14 chosing a tag empty and sending all your clients to that tag. - swapfunction
15 is the 'helper' function for the shiftswaptags. remember that these functions
16 **shift**, which means you can go from tag 1 to 9 or 9 to 1. Also remember
17 that the default argument is 1 and you can change it.
18
19 ---
20 config.def.h | 9 ++++
21 shift-tools.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++
22 2 files changed, 144 insertions(+)
23 create mode 100644 shift-tools.c
24
25 diff --git a/config.def.h b/config.def.h
26 index 1c0b587..1390d17 100644
27 --- a/config.def.h
28 +++ b/config.def.h
29 @@ -58,9 +58,14 @@ static const Layout layouts[] = {
30 static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
31 static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
32 static const char *termcmd[] = { "st", NULL };
33 +#include "shift-tools.c"
34
35 static Key keys[] = {
36 /* modifier key function argument */
37 + { MODKEY, XK_o, shiftviewclients, { .i = +1 } },
38 + { MODKEY|ShiftMask, XK_o, shiftview, { .i = +1 } },
39 + { MODKEY|ShiftMask, XK_i, shiftview, { .i = -1 } },
40 + { MODKEY, XK_i, shiftviewclients, { .i = -1 } },
41 { MODKEY, XK_p, spawn, {.v = dmenucmd } },
42 { MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
43 { MODKEY, XK_b, togglebar, {0} },
44 @@ -69,6 +74,10 @@ static Key keys[] = {
45 { MODKEY, XK_i, incnmaster, {.i = +1 } },
46 { MODKEY, XK_d, incnmaster, {.i = -1 } },
47 { MODKEY, XK_h, setmfact, {.f = -0.05} },
48 + { MODKEY|ShiftMask, XK_h, shiftboth, { .i = -1 } },
49 + { MODKEY|ControlMask, XK_h, shiftswaptags, { .i = -1 } },
50 + { MODKEY|ControlMask, XK_l, shiftswaptags, { .i = +1 } },
51 + { MODKEY|ShiftMask, XK_l, shiftboth, { .i = +1 } },
52 { MODKEY, XK_l, setmfact, {.f = +0.05} },
53 { MODKEY, XK_Return, zoom, {0} },
54 { MODKEY, XK_Tab, view, {0} },
55 diff --git a/shift-tools.c b/shift-tools.c
56 new file mode 100644
57 index 0000000..cf130c8
58 --- /dev/null
59 +++ b/shift-tools.c
60 @@ -0,0 +1,135 @@
61 +/* Sends a window to the next/prev tag */
62 +void
63 +shifttag(const Arg *arg)
64 +{
65 + Arg shifted;
66 + shifted.ui = selmon->tagset[selmon->seltags];
67 +
68 +
69 + if (arg->i > 0) /* left circular shift */
70 + shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i)));
71 + else /* right circular shift */
72 + shifted.ui = (shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i));
73 + tag(&shifted);
74 +}
75 +/* Sends a window to the next/prev tag that has a client, else it moves it to the next/prev one. */
76 +void
77 +shifttagclients(const Arg *arg)
78 +{
79 +
80 + Arg shifted;
81 + Client *c;
82 + unsigned int tagmask = 0;
83 + shifted.ui = selmon->tagset[selmon->seltags];
84 +
85 + for (c = selmon->clients; c; c = c->next)
86 + if (!(c->tags))
87 + tagmask = tagmask | c->tags;
88 +
89 +
90 + if (arg->i > 0) /* left circular shift */
91 + do {
92 + shifted.ui = (shifted.ui << arg->i)
93 + | (shifted.ui >> (LENGTH(tags) - arg->i));
94 + } while (tagmask && !(shifted.ui & tagmask));
95 + else /* right circular shift */
96 + do {
97 + shifted.ui = (shifted.ui >> (- arg->i)
98 + | shifted.ui << (LENGTH(tags) + arg->i));
99 + } while (tagmask && !(shifted.ui & tagmask));
100 + tag(&shifted);
101 +}
102 +/* Navigate to the next/prev tag */
103 +void
104 +shiftview(const Arg *arg)
105 +{
106 + Arg shifted;
107 + shifted.ui = selmon->tagset[selmon->seltags];
108 +
109 + if (arg->i > 0) /* left circular shift */
110 + shifted.ui = (shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i));
111 + else /* right circular shift */
112 + shifted.ui = (shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i));
113 + view(&shifted);
114 +}
115 +/* Navigate to the next/prev tag that has a client, else moves it to the next/prev tag */
116 +void
117 +shiftviewclients(const Arg *arg)
118 +{
119 + Arg shifted;
120 + Client *c;
121 + unsigned int tagmask = 0;
122 + shifted.ui = selmon->tagset[selmon->seltags];
123 +
124 + for (c = selmon->clients; c; c = c->next)
125 + if (!(c->tags))
126 + tagmask = tagmask | c->tags;
127 +
128 +
129 + if (arg->i > 0) /* left circular shift */
130 + do {
131 + shifted.ui = (shifted.ui << arg->i)
132 + | (shifted.ui >> (LENGTH(tags) - arg->i));
133 + } while (tagmask && !(shifted.ui & tagmask));
134 + else /* right circular shift */
135 + do {
136 + shifted.ui = (shifted.ui >> (- arg->i)
137 + | shifted.ui << (LENGTH(tags) + arg->i));
138 + } while (tagmask && !(shifted.ui & tagmask));
139 + view(&shifted);
140 +}
141 +/* move the current active window to the next/prev tag and view it. More like following the window */
142 +void
143 +shiftboth(const Arg *arg)
144 +{
145 + Arg shifted;
146 + shifted.ui = selmon->tagset[selmon->seltags];
147 +
148 + if (arg->i > 0) /* left circular shift */
149 + shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i)));
150 + else /* right circular shift */
151 + shifted.ui = ((shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i)));
152 + tag(&shifted);
153 + view(&shifted);
154 +}
155 +//helper function for shiftswaptags.
156 +//see: https://github.com/moizifty/DWM-Build/blob/65379c62640788881486401a0d8c79333751b02f/config.h#L48
157 +void
158 +swaptags(const Arg *arg)
159 +{
160 + Client *c;
161 + unsigned int newtag = arg->ui & TAGMASK;
162 + unsigned int curtag = selmon->tagset[selmon->seltags];
163 +
164 + if (newtag == curtag || !curtag || (curtag & (curtag-1)))
165 + return;
166 +
167 + for (c = selmon->clients; c != NULL; c = c->next) {
168 + if ((c->tags & newtag) || (c->tags & curtag))
169 + c->tags ^= curtag ^ newtag;
170 +
171 + if (!c->tags)
172 + c->tags = newtag;
173 + }
174 +
175 + //move to the swaped tag
176 + //selmon->tagset[selmon->seltags] = newtag;
177 +
178 + focus(NULL);
179 + arrange(selmon);
180 +}
181 +/* swaps "tags" (all the clients) with the next/prev tag. */
182 +void
183 +shiftswaptags(const Arg *arg)
184 +{
185 + Arg shifted;
186 + shifted.ui = selmon->tagset[selmon->seltags];
187 +
188 + if (arg->i > 0) /* left circular shift */
189 + shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i)));
190 + else /* right circular shift */
191 + shifted.ui = ((shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i)));
192 + swaptags(&shifted);
193 + // uncomment if you also want to "go" (view) the tag where the the clients are going
194 + //view(&shifted);
195 +}
196 --
197 2.32.0
198