dwm-inplacerotate-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-inplacerotate-6.2.diff (3768B)
---
1 From 75012a6ab9cc1b6c319af7f4ae7d682b16a66ce3 Mon Sep 17 00:00:00 2001
2 From: Miles Alan <m@milesalan.com>
3 Date: Sun, 26 Apr 2020 16:05:43 -0500
4 Subject: [PATCH] Add inplacerotate fn to rotate all, master, or stacks clients
5 inplace
6
7 CW (+2) or CCW (-2) Rotates all windows.
8 CW (+1) or CCW (-1) Rotates master xor stack windows (depending on focus).
9
10 Focus position stays 'in-place' so the area of the screen you are focused
11 on remains unchanged.
12 ---
13 config.def.h | 4 ++++
14 dwm.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++
15 2 files changed, 63 insertions(+)
16
17 diff --git a/config.def.h b/config.def.h
18 index 1c0b587..9bcb792 100644
19 --- a/config.def.h
20 +++ b/config.def.h
21 @@ -66,6 +66,10 @@ static Key keys[] = {
22 { MODKEY, XK_b, togglebar, {0} },
23 { MODKEY, XK_j, focusstack, {.i = +1 } },
24 { MODKEY, XK_k, focusstack, {.i = -1 } },
25 + { MODKEY|ShiftMask, XK_j, inplacerotate, {.i = +1} },
26 + { MODKEY|ShiftMask, XK_k, inplacerotate, {.i = -1} },
27 + { MODKEY|ShiftMask, XK_h, inplacerotate, {.i = +2} },
28 + { MODKEY|ShiftMask, XK_l, inplacerotate, {.i = -2} },
29 { MODKEY, XK_i, incnmaster, {.i = +1 } },
30 { MODKEY, XK_d, incnmaster, {.i = -1 } },
31 { MODKEY, XK_h, setmfact, {.f = -0.05} },
32 diff --git a/dwm.c b/dwm.c
33 index 4465af1..3930680 100644
34 --- a/dwm.c
35 +++ b/dwm.c
36 @@ -175,6 +175,7 @@ static int gettextprop(Window w, Atom atom, char *text, unsigned int size);
37 static void grabbuttons(Client *c, int focused);
38 static void grabkeys(void);
39 static void incnmaster(const Arg *arg);
40 +static void inplacerotate(const Arg *arg);
41 static void keypress(XEvent *e);
42 static void killclient(const Arg *arg);
43 static void manage(Window w, XWindowAttributes *wa);
44 @@ -2147,3 +2148,61 @@ main(int argc, char *argv[])
45 XCloseDisplay(dpy);
46 return EXIT_SUCCESS;
47 }
48 +
49 +void
50 +insertclient(Client *item, Client *insertItem, int after) {
51 + Client *c;
52 + if (item == NULL || insertItem == NULL || item == insertItem) return;
53 + detach(insertItem);
54 + if (!after && selmon->clients == item) {
55 + attach(insertItem);
56 + return;
57 + }
58 + if (after) {
59 + c = item;
60 + } else {
61 + for (c = selmon->clients; c; c = c->next) { if (c->next == item) break; }
62 + }
63 + insertItem->next = c->next;
64 + c->next = insertItem;
65 +}
66 +
67 +void
68 +inplacerotate(const Arg *arg)
69 +{
70 + if(!selmon->sel || (selmon->sel->isfloating && !arg->f)) return;
71 +
72 + unsigned int selidx = 0, i = 0;
73 + Client *c = NULL, *stail = NULL, *mhead = NULL, *mtail = NULL, *shead = NULL;
74 +
75 + // Determine positionings for insertclient
76 + for (c = selmon->clients; c; c = c->next) {
77 + if (ISVISIBLE(c) && !(c->isfloating)) {
78 + if (selmon->sel == c) { selidx = i; }
79 + if (i == selmon->nmaster - 1) { mtail = c; }
80 + if (i == selmon->nmaster) { shead = c; }
81 + if (mhead == NULL) { mhead = c; }
82 + stail = c;
83 + i++;
84 + }
85 + }
86 +
87 + // All clients rotate
88 + if (arg->i == 2) insertclient(selmon->clients, stail, 0);
89 + if (arg->i == -2) insertclient(stail, selmon->clients, 1);
90 + // Stack xor master rotate
91 + if (arg->i == -1 && selidx >= selmon->nmaster) insertclient(stail, shead, 1);
92 + if (arg->i == 1 && selidx >= selmon->nmaster) insertclient(shead, stail, 0);
93 + if (arg->i == -1 && selidx < selmon->nmaster) insertclient(mtail, mhead, 1);
94 + if (arg->i == 1 && selidx < selmon->nmaster) insertclient(mhead, mtail, 0);
95 +
96 + // Restore focus position
97 + i = 0;
98 + for (c = selmon->clients; c; c = c->next) {
99 + if (!ISVISIBLE(c) || (c->isfloating)) continue;
100 + if (i == selidx) { focus(c); break; }
101 + i++;
102 + }
103 + arrange(selmon);
104 + focus(c);
105 +}
106 --
107 2.23.1
108