URI: 
       movestack - dwm - dynamic window manager
  HTML git clone https://git.parazyd.org/dwm
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 64ec191cb2bf0410d2ad23665dac3712fe26f70b
   DIR parent d828c0def978069ab512aee073135fd3f79f02cf
  HTML Author: parazyd <parazyd@dyne.org>
       Date:   Sun, 24 Apr 2022 10:47:07 +0200
       
       movestack
       
       Diffstat:
         M config.def.h                        |       4 ++++
         M config.h                            |       3 +++
         A movestack.c                         |      49 +++++++++++++++++++++++++++++++
       
       3 files changed, 56 insertions(+), 0 deletions(-)
       ---
   DIR diff --git a/config.def.h b/config.def.h
       @@ -68,6 +68,8 @@ static const char *termcmd[]  = { "st", NULL };
        static const char scratchpadname[] = "scratchpad";
        static const char *scratchpadcmd[] = { "st", "-t", scratchpadname, "-g", "120x34", NULL };
        
       +#include "movestack.c"
       +
        static const Key keys[] = {
                /* modifier                     key        function        argument */
                { MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
       @@ -80,6 +82,8 @@ static const Key keys[] = {
                { MODKEY,                       XK_d,      incnmaster,     {.i = -1 } },
                { MODKEY,                       XK_h,      setmfact,       {.f = -0.05} },
                { MODKEY,                       XK_l,      setmfact,       {.f = +0.05} },
       +        { MODKEY|ShiftMask,             XK_j,      movestack,      {.i = +1 } },
       +        { MODKEY|ShiftMask,             XK_k,      movestack,      {.i = -1 } },
                { MODKEY,                       XK_Return, zoom,           {0} },
                { MODKEY,                       XK_Tab,    view,           {0} },
                { MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
   DIR diff --git a/config.h b/config.h
       @@ -81,6 +81,7 @@ static const char *glyphcmd[] = { "glyph", NULL };
        
        static const char *rickcmd[] = { "mpv", "--no-video", "never_gonna_give_you_up.mp3", NULL };
        
       +#include "movestack.c"
        static Key keys[] = {
                /* modifier                     key        function        argument */
                { MODKEY,                       XK_p,      spawn,          {.v = dmenucmd } },
       @@ -101,6 +102,8 @@ static Key keys[] = {
                { MODKEY,                       XK_d,      incnmaster,     {.i = -1 } },
                { MODKEY,                       XK_h,      setmfact,       {.f = -0.05} },
                { MODKEY,                       XK_l,      setmfact,       {.f = +0.05} },
       +        { MODKEY|ShiftMask,             XK_j,      movestack,      {.i = +1 } },
       +        { MODKEY|ShiftMask,             XK_k,      movestack,      {.i = -1 } },
                // { MODKEY,                       XK_Return, zoom,           {0} },
                { MODKEY,                       XK_Tab,    view,           {0} },
                { MODKEY|ShiftMask,             XK_c,      killclient,     {0} },
   DIR diff --git a/movestack.c b/movestack.c
       @@ -0,0 +1,48 @@
       +void
       +movestack(const Arg *arg) {
       +        Client *c = NULL, *p = NULL, *pc = NULL, *i;
       +
       +        if(arg->i > 0) {
       +                /* find the client after selmon->sel */
       +                for(c = selmon->sel->next; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
       +                if(!c)
       +                        for(c = selmon->clients; c && (!ISVISIBLE(c) || c->isfloating); c = c->next);
       +
       +        }
       +        else {
       +                /* find the client before selmon->sel */
       +                for(i = selmon->clients; i != selmon->sel; i = i->next)
       +                        if(ISVISIBLE(i) && !i->isfloating)
       +                                c = i;
       +                if(!c)
       +                        for(; i; i = i->next)
       +                                if(ISVISIBLE(i) && !i->isfloating)
       +                                        c = i;
       +        }
       +        /* find the client before selmon->sel and c */
       +        for(i = selmon->clients; i && (!p || !pc); i = i->next) {
       +                if(i->next == selmon->sel)
       +                        p = i;
       +                if(i->next == c)
       +                        pc = i;
       +        }
       +
       +        /* swap c and selmon->sel selmon->clients in the selmon->clients list */
       +        if(c && c != selmon->sel) {
       +                Client *temp = selmon->sel->next==c?selmon->sel:selmon->sel->next;
       +                selmon->sel->next = c->next==selmon->sel?c:c->next;
       +                c->next = temp;
       +
       +                if(p && p != c)
       +                        p->next = c;
       +                if(pc && pc != selmon->sel)
       +                        pc->next = selmon->sel;
       +
       +                if(selmon->sel == selmon->clients)
       +                        selmon->clients = c;
       +                else if(c == selmon->clients)
       +                        selmon->clients = selmon->sel;
       +
       +                arrange(selmon);
       +        }
       +}
       +\ No newline at end of file