diff --git a/config.def.h b/config.def.h index ba9e641..5d5ad6f 100644 --- a/config.def.h +++ b/config.def.h @@ -820,6 +820,8 @@ static Key keys[] = { { MODKEY|Mod4Mask, XK_k, rotatestack, {.i = -1 } }, #endif // ROTATESTACK_PATCH #if INPLACEROTATE_PATCH + { MODKEY|Mod4Mask, XK_j, inplacerotate, {.i = +2 } }, // same as rotatestack + { MODKEY|Mod4Mask, XK_k, inplacerotate, {.i = -2 } }, // same as reotatestack { MODKEY|Mod4Mask|ShiftMask, XK_j, inplacerotate, {.i = +1} }, { MODKEY|Mod4Mask|ShiftMask, XK_k, inplacerotate, {.i = -1} }, #endif // INPLACEROTATE_PATCH diff --git a/patch/inplacerotate.c b/patch/inplacerotate.c index 28eb289..fe6befb 100644 --- a/patch/inplacerotate.c +++ b/patch/inplacerotate.c @@ -2,7 +2,8 @@ void insertclient(Client *item, Client *insertItem, int after) { Client *c; - if (item == NULL || insertItem == NULL || item == insertItem) return; + if (item == NULL || insertItem == NULL || item == insertItem) + return; detach(insertItem); if (!after && selmon->clients == item) { attach(insertItem); @@ -11,7 +12,10 @@ insertclient(Client *item, Client *insertItem, int after) if (after) { c = item; } else { - for (c = selmon->clients; c; c = c->next) { if (c->next == item) break; } + for (c = selmon->clients; c; c = c->next) { + if (c->next == item) + break; + } } insertItem->next = c->next; c->next = insertItem; @@ -20,32 +24,58 @@ insertclient(Client *item, Client *insertItem, int after) void inplacerotate(const Arg *arg) { - if (!selmon->sel || (selmon->sel->isfloating && !arg->f)) return; + if (!selmon->sel || (selmon->sel->isfloating && !arg->f)) + return; unsigned int selidx = 0, i = 0; Client *c = NULL, *stail = NULL, *mhead = NULL, *mtail = NULL, *shead = NULL; - // Shift client + // Determine positionings for insertclient for (c = selmon->clients; c; c = c->next) { if (ISVISIBLE(c) && !(c->isfloating)) { - if (selmon->sel == c) { selidx = i; } - if (i == selmon->nmaster - 1) { mtail = c; } - if (i == selmon->nmaster) { shead = c; } - if (mhead == NULL) { mhead = c; } + if (selmon->sel == c) + selidx = i; + if (i == selmon->nmaster - 1) + mtail = c; + if (i == selmon->nmaster) + shead = c; + if (mhead == NULL) + mhead = c; stail = c; i++; } } - if (arg->i < 0 && selidx >= selmon->nmaster) insertclient(stail, shead, 1); - if (arg->i > 0 && selidx >= selmon->nmaster) insertclient(shead, stail, 0); - if (arg->i < 0 && selidx < selmon->nmaster) insertclient(mtail, mhead, 1); - if (arg->i > 0 && selidx < selmon->nmaster) insertclient(mhead, mtail, 0); + + switch(arg->i) { + case 1: + if (selidx >= selmon->nmaster) + insertclient(shead, stail, 0); + else + insertclient(mhead, mtail, 0); + break; + case -1: + if (selidx >= selmon->nmaster) + insertclient(stail, shead, 1); + else + insertclient(mtail, mhead, 1); + break; + case 2: + insertclient(selmon->clients, stail, 0); + break; + case -2: + insertclient(stail, selmon->clients, 1); + break; + } // Restore focus position i = 0; for (c = selmon->clients; c; c = c->next) { - if (!ISVISIBLE(c) || (c->isfloating)) continue; - if (i == selidx) { focus(c); break; } + if (!ISVISIBLE(c) || (c->isfloating)) + continue; + if (i == selidx) { + focus(c); + break; + } i++; } arrange(selmon);