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