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