dwm-attachdirection-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-attachdirection-6.2.diff (5911B)
---
1 From faa0d3a06229906b8cd30cdeb4360ee9608f74bd Mon Sep 17 00:00:00 2001
2 From: MLquest8 <miskuzius@gmail.com>
3 Date: Thu, 18 Jun 2020 15:14:56 +0400
4 Subject: [PATCH] attachdirection updated. Added attachtop option(5) that
5 attaches the newest client below the last master/on top of the stack.
6
7 ---
8 config.def.h | 1 +
9 dwm.c | 146 +++++++++++++++++++++++++++++++++++++++++++++++++--
10 2 files changed, 143 insertions(+), 4 deletions(-)
11
12 diff --git a/config.def.h b/config.def.h
13 index 1c0b587..d7c089b 100644
14 --- a/config.def.h
15 +++ b/config.def.h
16 @@ -35,6 +35,7 @@ static const Rule rules[] = {
17 static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */
18 static const int nmaster = 1; /* number of clients in master area */
19 static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
20 +static const int attachdirection = 0; /* 0 default, 1 above, 2 aside, 3 below, 4 bottom, 5 top */
21
22 static const Layout layouts[] = {
23 /* symbol arrange function */
24 diff --git a/dwm.c b/dwm.c
25 index 9fd0286..2c1b143 100644
26 --- a/dwm.c
27 +++ b/dwm.c
28 @@ -49,7 +49,8 @@
29 #define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
30 #define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \
31 * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy)))
32 -#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags]))
33 +#define ISVISIBLEONTAG(C, T) ((C->tags & T))
34 +#define ISVISIBLE(C) ISVISIBLEONTAG(C, C->mon->tagset[C->mon->seltags])
35 #define LENGTH(X) (sizeof X / sizeof X[0])
36 #define MOUSEMASK (BUTTONMASK|PointerMotionMask)
37 #define WIDTH(X) ((X)->w + 2 * (X)->bw)
38 @@ -147,6 +148,11 @@ static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interac
39 static void arrange(Monitor *m);
40 static void arrangemon(Monitor *m);
41 static void attach(Client *c);
42 +static void attachabove(Client *c);
43 +static void attachaside(Client *c);
44 +static void attachbelow(Client *c);
45 +static void attachbottom(Client *c);
46 +static void attachtop(Client *c);
47 static void attachstack(Client *c);
48 static void buttonpress(XEvent *e);
49 static void checkotherwm(void);
50 @@ -184,6 +190,7 @@ static void maprequest(XEvent *e);
51 static void monocle(Monitor *m);
52 static void motionnotify(XEvent *e);
53 static void movemouse(const Arg *arg);
54 +static Client *nexttagged(Client *c);
55 static Client *nexttiled(Client *c);
56 static void pop(Client *);
57 static void propertynotify(XEvent *e);
58 @@ -407,6 +414,73 @@ attach(Client *c)
59 c->mon->clients = c;
60 }
61
62 +void
63 +attachabove(Client *c)
64 +{
65 + if (c->mon->sel == NULL || c->mon->sel == c->mon->clients || c->mon->sel->isfloating) {
66 + attach(c);
67 + return;
68 + }
69 +
70 + Client *at;
71 + for (at = c->mon->clients; at->next != c->mon->sel; at = at->next);
72 + c->next = at->next;
73 + at->next = c;
74 +}
75 +
76 +void
77 +attachaside(Client *c) {
78 + Client *at = nexttagged(c);
79 + if(!at) {
80 + attach(c);
81 + return;
82 + }
83 + c->next = at->next;
84 + at->next = c;
85 +}
86 +
87 +void
88 +attachbelow(Client *c)
89 +{
90 + if(c->mon->sel == NULL || c->mon->sel == c || c->mon->sel->isfloating) {
91 + attach(c);
92 + return;
93 + }
94 + c->next = c->mon->sel->next;
95 + c->mon->sel->next = c;
96 +}
97 +
98 +void
99 +attachbottom(Client *c)
100 +{
101 + Client *below = c->mon->clients;
102 + for (; below && below->next; below = below->next);
103 + c->next = NULL;
104 + if (below)
105 + below->next = c;
106 + else
107 + c->mon->clients = c;
108 +}
109 +
110 +void
111 +attachtop(Client *c)
112 +{
113 + int n;
114 + Monitor *m = selmon;
115 + Client *below;
116 +
117 + for (n = 1, below = c->mon->clients;
118 + below && below->next && (below->isfloating || !ISVISIBLEONTAG(below, c->tags) || n != m->nmaster);
119 + n = below->isfloating || !ISVISIBLEONTAG(below, c->tags) ? n + 0 : n + 1, below = below->next);
120 + c->next = NULL;
121 + if (below) {
122 + c->next = below->next;
123 + below->next = c;
124 + }
125 + else
126 + c->mon->clients = c;
127 +}
128 +
129 void
130 attachstack(Client *c)
131 {
132 @@ -1063,7 +1137,25 @@ manage(Window w, XWindowAttributes *wa)
133 c->isfloating = c->oldstate = trans != None || c->isfixed;
134 if (c->isfloating)
135 XRaiseWindow(dpy, c->win);
136 - attach(c);
137 + switch(attachdirection){
138 + case 1:
139 + attachabove(c);
140 + break;
141 + case 2:
142 + attachaside(c);
143 + break;
144 + case 3:
145 + attachbelow(c);
146 + break;
147 + case 4:
148 + attachbottom(c);
149 + break;
150 + case 5:
151 + attachtop(c);
152 + break;
153 + default:
154 + attach(c);
155 + }
156 attachstack(c);
157 XChangeProperty(dpy, root, netatom[NetClientList], XA_WINDOW, 32, PropModeAppend,
158 (unsigned char *) &(c->win), 1);
159 @@ -1193,6 +1285,16 @@ movemouse(const Arg *arg)
160 }
161 }
162
163 +Client *
164 +nexttagged(Client *c) {
165 + Client *walked = c->mon->clients;
166 + for(;
167 + walked && (walked->isfloating || !ISVISIBLEONTAG(walked, c->tags));
168 + walked = walked->next
169 + );
170 + return walked;
171 +}
172 +
173 Client *
174 nexttiled(Client *c)
175 {
176 @@ -1418,7 +1520,25 @@ sendmon(Client *c, Monitor *m)
177 detachstack(c);
178 c->mon = m;
179 c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
180 - attach(c);
181 + switch(attachdirection){
182 + case 1:
183 + attachabove(c);
184 + break;
185 + case 2:
186 + attachaside(c);
187 + break;
188 + case 3:
189 + attachbelow(c);
190 + break;
191 + case 4:
192 + attachbottom(c);
193 + break;
194 + case 5:
195 + attachtop(c);
196 + break;
197 + default:
198 + attach(c);
199 + }
200 attachstack(c);
201 focus(NULL);
202 arrange(NULL);
203 @@ -1900,7 +2020,25 @@ updategeom(void)
204 m->clients = c->next;
205 detachstack(c);
206 c->mon = mons;
207 - attach(c);
208 + switch(attachdirection){
209 + case 1:
210 + attachabove(c);
211 + break;
212 + case 2:
213 + attachaside(c);
214 + break;
215 + case 3:
216 + attachbelow(c);
217 + break;
218 + case 4:
219 + attachbottom(c);
220 + break;
221 + case 5:
222 + attachtop(c);
223 + break;
224 + default:
225 + attach(c);
226 + }
227 attachstack(c);
228 }
229 if (m == selmon)
230 --
231 2.26.2
232