[wiki] [sites] [dwm][shift-tools] Update the patch - fix shift-tools.c if statement `if (!(c->tags))` since it was a leftover of the scratchpad variant - don't repeat code, use a function :) - description: better wording || explosion-mental

From: <git_AT_suckless.org>
Date: Mon, 04 Jul 2022 19:54:20 +0200

commit 8ddf8523e8eec6b94f905c895a62c5d5b266af04
Author: explosion-mental <explosion0mental_AT_gmail.com>
Date: Mon Jul 4 12:52:10 2022 -0500

    [dwm][shift-tools] Update the patch
    - fix shift-tools.c if statement `if (!(c->tags))` since it was a
      leftover of the scratchpad variant
    - don't repeat code, use a function :)
    - description: better wording

diff --git a/dwm.suckless.org/patches/shift-tools/index.md b/dwm.suckless.org/patches/shift-tools/index.md
index e33a6c97..fbb6b1b8 100644
--- a/dwm.suckless.org/patches/shift-tools/index.md
+++ b/dwm.suckless.org/patches/shift-tools/index.md
_AT_@ -5,32 +5,41 @@ Description
 -----------
 A group of functions that shift. Inspired by
 [shiftview](https://lists.suckless.org/dev/1104/7590.html),
-[focusadjacenttag](../focusadjacenttag) and [swaptags](../swaptags). There is also a
-[version](shift-tools-scratchpads.c) compatible with the
-[scratchpads](../scratchpads) patch with only needs you to include the file
-`#include "shift-tools-scratchpads.c"` before the keys[] array.
+[focusadjacenttag](../focusadjacenttag) and [swaptags](../swaptags).
 
 
+Usually you just `#include "shift-tools.c"` before the `keys[]` array to use
+these function, since no internal changes are needed other than to add the
+keybindings to `config.h`.
 
-* **shifttag** - moves the current selected client to the adjacent tag.
-* **shifttagclients** moves the current selected client to the adjacent tag
- that has at least one client, if none it acts as shifttag.
-* **shiftview** view adjacent tag.
-* **shiftviewclients** view the closes tag that has a client. If none acts as
- shiftview.
-* **shiftboth** shifttag and shiftview. Basically moves the window to the
- next/prev tag and follows it.
-* **shiftswaptags** - its a shift implementation on the swaptags function,
- which in short 'swaps tags' (swaps all clients with the clients on the
- adjacent tag). A pretty useful example of this is chosing a tag empty and
- sending all your clients to that tag.
-* **swapfunction** - used on shiftswaptags, original code on
- [swaptags](../swaptags).
 
+There is also a [version](shift-tools-scratchpads.c) compatible with the
+[scratchpads](../scratchpads) patch: `#include "shift-tools-scratchpads.c"`
 
 
-Remember that these functions _shift_, which means you can go from tag 1 to 9
-or 9 to 1. Also remember that the default argument is 1/-1 and you can change it.
+Whenever I say `next/prev` I'm describing the function with argument `+1/-1`,
+default and generally what you will use. Changing these do make a difference on
+how many tags the function should `shift`.
+
+
+* **shifttag** - send a window to the next/prev tag.
+* **shifttagclients** - send a window to the next/prev tag that has a client,
+ else it moves it to the next/prev one.
+* **shiftview** - view the next/prev tag.
+* **shiftviewclients** - view the next/prev tag that has a client, else view
+ the next/prev tag.
+* **shiftboth** - move the active window to the next/prev tag and view it's new
+ tag.
+* **shiftswaptags** - swaps "tags" (all the clients on it) with the next/prev
+ tag.
+
+* helpers:
+ * **swaptags** - used on shiftswaptags, original code on [swaptags](../swaptags).
+ * **shift** - shift bits in acordance to the LENGTH of the `tags`.
+
+
+Remember that these functions _shift_, which means you can go from tag 1 (the
+first tag) to 9 (or whatever is your last tag).
 
 Download
 --------
diff --git a/dwm.suckless.org/patches/shift-tools/shift-tools.c b/dwm.suckless.org/patches/shift-tools/shift-tools.c
index 1d71b91b..29b00bc6 100644
--- a/dwm.suckless.org/patches/shift-tools/shift-tools.c
+++ b/dwm.suckless.org/patches/shift-tools/shift-tools.c
_AT_@ -1,100 +1,84 @@
-/* Sends a window to the next/prev tag */
+void
+shift(unsigned int *tag, int i)
+{
+ if (i > 0) /* left circular shift */
+ *tag = ((*tag << i) | (*tag >> (LENGTH(tags) - i)));
+ else /* right circular shift */
+ *tag = (*tag >> (- i) | *tag << (LENGTH(tags) + i));
+}
+
+/* send a window to the next/prev tag */
 void
 shifttag(const Arg *arg)
 {
- Arg shifted;
- shifted.ui = selmon->tagset[selmon->seltags];
+ Arg shifted = { .ui = selmon->tagset[selmon->seltags] };
 
+ if (!selmon->clients)
+ return;
 
- if (arg->i > 0) /* left circular shift */
- shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i)));
- else /* right circular shift */
- shifted.ui = (shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i));
+ shift(&shifted.ui, arg->i);
         tag(&shifted);
 }
-/* Sends a window to the next/prev tag that has a client, else it moves it to the next/prev one. */
+
+/* send a window to the next/prev tag that has a client, else it moves it to
+ * the next/prev one. */
 void
 shifttagclients(const Arg *arg)
 {
-
- Arg shifted;
+ Arg shifted = { .ui = selmon->tagset[selmon->seltags] };
         Client *c;
         unsigned int tagmask = 0;
- shifted.ui = selmon->tagset[selmon->seltags];
 
         for (c = selmon->clients; c; c = c->next)
- if (!(c->tags))
- tagmask = tagmask | c->tags;
-
-
- if (arg->i > 0) /* left circular shift */
- do {
- shifted.ui = (shifted.ui << arg->i)
- | (shifted.ui >> (LENGTH(tags) - arg->i));
- } while (tagmask && !(shifted.ui & tagmask));
- else /* right circular shift */
- do {
- shifted.ui = (shifted.ui >> (- arg->i)
- | shifted.ui << (LENGTH(tags) + arg->i));
- } while (tagmask && !(shifted.ui & tagmask));
+ tagmask = tagmask | c->tags;
+
+ do
+ shift(&shifted.ui, arg->i);
+ while (tagmask && !(shifted.ui & tagmask));
+
         tag(&shifted);
 }
-/* Navigate to the next/prev tag */
+
+/* view the next/prev tag */
 void
 shiftview(const Arg *arg)
 {
- Arg shifted;
- shifted.ui = selmon->tagset[selmon->seltags];
+ Arg shifted = { .ui = selmon->tagset[selmon->seltags] };
 
- if (arg->i > 0) {/* left circular shift */
- shifted.ui = (shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i));
- } else { /* right circular shift */
- shifted.ui = (shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i));
- }
+ shift(&shifted.ui, arg->i);
         view(&shifted);
 }
-/* Navigate to the next/prev tag that has a client, else moves it to the next/prev tag */
+
+/* view the next/prev tag that has a client, else view the next/prev tag */
 void
 shiftviewclients(const Arg *arg)
 {
- Arg shifted;
+ Arg shifted = { .ui = selmon->tagset[selmon->seltags] };
         Client *c;
         unsigned int tagmask = 0;
- shifted.ui = selmon->tagset[selmon->seltags];
 
         for (c = selmon->clients; c; c = c->next)
- if (!(c->tags))
- tagmask = tagmask | c->tags;
-
-
- if (arg->i > 0) /* left circular shift */
- do {
- shifted.ui = (shifted.ui << arg->i)
- | (shifted.ui >> (LENGTH(tags) - arg->i));
- } while (tagmask && !(shifted.ui & tagmask));
- else /* right circular shift */
- do {
- shifted.ui = (shifted.ui >> (- arg->i)
- | shifted.ui << (LENGTH(tags) + arg->i));
- } while (tagmask && !(shifted.ui & tagmask));
+ tagmask = tagmask | c->tags;
+
+ do
+ shift(&shifted.ui, arg->i);
+ while (tagmask && !(shifted.ui & tagmask));
+
         view(&shifted);
 }
-/* move the current active window to the next/prev tag and view it. More like following the window */
+
+/* move the active window to the next/prev tag and view it's new tag */
 void
 shiftboth(const Arg *arg)
 {
- Arg shifted;
- shifted.ui = selmon->tagset[selmon->seltags];
+ Arg shifted = { .ui = selmon->tagset[selmon->seltags] };
 
- if (arg->i > 0) /* left circular shift */
- shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i)));
- else /* right circular shift */
- shifted.ui = ((shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i)));
+ shift(&shifted.ui, arg->i);
         tag(&shifted);
         view(&shifted);
 }
-//helper function for shiftswaptags found on:
-//https://github.com/moizifty/DWM-Build/blob/65379c62640788881486401a0d8c79333751b02f/config.h#L48
+
+/* swaptags: https://dwm.suckless.org/patches/swaptags, used below */
 void
 swaptags(const Arg *arg)
 {
_AT_@ -108,29 +92,23 @@ swaptags(const Arg *arg)
         for (c = selmon->clients; c != NULL; c = c->next) {
                 if ((c->tags & newtag) || (c->tags & curtag))
                         c->tags ^= curtag ^ newtag;
-
                 if (!c->tags)
                         c->tags = newtag;
         }
 
- //move to the swaped tag
+ //uncomment to 'view' the new swaped tag
         //selmon->tagset[selmon->seltags] = newtag;
 
         focus(NULL);
         arrange(selmon);
 }
-/* swaps "tags" (all the clients) with the next/prev tag. */
+
+/* swaps "tags" (all the clients on it) with the next/prev tag */
 void
 shiftswaptags(const Arg *arg)
 {
- Arg shifted;
- shifted.ui = selmon->tagset[selmon->seltags];
+ Arg shifted = { .ui = selmon->tagset[selmon->seltags] };
 
- if (arg->i > 0) /* left circular shift */
- shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i)));
- else /* right circular shift */
- shifted.ui = ((shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i)));
+ shift(&shifted.ui, arg->i);
         swaptags(&shifted);
- // uncomment if you also want to "go" (view) the tag where the the clients are going
- //view(&shifted);
 }
Received on Mon Jul 04 2022 - 19:54:20 CEST

This archive was generated by hypermail 2.3.0 : Mon Jul 04 2022 - 20:00:39 CEST