Introduction
Introduction Statistics Contact Development Disclaimer Help
dwm-cfacts-vanitygaps-6.2.diff - sites - public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log
Files
Refs
---
dwm-cfacts-vanitygaps-6.2.diff (26794B)
---
1 From 051e4de72079bb0b8e50d2faa61b9a0ef36434b5 Mon Sep 17 00:00:00 2001
2 From: bakkeby <[email protected]>
3 Date: Fri, 8 May 2020 16:51:00 +0200
4 Subject: [PATCH 2/2] vanitygaps - adds gaps to layouts
5
6 This patch differentiates between inner and outer gaps as well as
7 horizontal and vertical gaps.
8
9 The logic of these layouts also aims to be pixel perfect by ensuring
10 an even split of the available space and re-distributing the remainder
11 among the available clients.
12 ---
13 config.def.h | 38 ++-
14 dwm.c | 43 +--
15 vanitygaps.c | 822 +++++++++++++++++++++++++++++++++++++++++++++++++++
16 3 files changed, 867 insertions(+), 36 deletions(-)
17 create mode 100644 vanitygaps.c
18
19 diff --git a/config.def.h b/config.def.h
20 index 83910c1..91a9cfc 100644
21 --- a/config.def.h
22 +++ b/config.def.h
23 @@ -3,6 +3,11 @@
24 /* appearance */
25 static const unsigned int borderpx = 1; /* border pixel of wind…
26 static const unsigned int snap = 32; /* snap pixel */
27 +static const unsigned int gappih = 20; /* horiz inner gap betw…
28 +static const unsigned int gappiv = 10; /* vert inner gap betwe…
29 +static const unsigned int gappoh = 10; /* horiz outer gap betw…
30 +static const unsigned int gappov = 30; /* vert outer gap betwe…
31 +static int smartgaps = 0; /* 1 means no outer gap…
32 static const int showbar = 1; /* 0 means no bar */
33 static const int topbar = 1; /* 0 means bottom bar */
34 static const char *fonts[] = { "monospace:size=10" };
35 @@ -36,11 +41,26 @@ static const float mfact = 0.55; /* factor of ma…
36 static const int nmaster = 1; /* number of clients in master are…
37 static const int resizehints = 1; /* 1 means respect size hints in t…
38
39 +#define FORCE_VSPLIT 1 /* nrowgrid layout: force two clients to always…
40 +#include "vanitygaps.c"
41 +
42 static const Layout layouts[] = {
43 /* symbol arrange function */
44 { "[]=", tile }, /* first entry is default */
45 - { "><>", NULL }, /* no layout function means floating b…
46 { "[M]", monocle },
47 + { "[@]", spiral },
48 + { "[\\]", dwindle },
49 + { "H[]", deck },
50 + { "TTT", bstack },
51 + { "===", bstackhoriz },
52 + { "HHH", grid },
53 + { "###", nrowgrid },
54 + { "---", horizgrid },
55 + { ":::", gaplessgrid },
56 + { "|M|", centeredmaster },
57 + { ">M>", centeredfloatingmaster },
58 + { "><>", NULL }, /* no layout function means floating b…
59 + { NULL, NULL },
60 };
61
62 /* key definitions */
63 @@ -74,6 +94,22 @@ static Key keys[] = {
64 { MODKEY|ShiftMask, XK_l, setcfact, {.f …
65 { MODKEY|ShiftMask, XK_o, setcfact, {.f …
66 { MODKEY, XK_Return, zoom, {0} …
67 + { MODKEY|Mod4Mask, XK_u, incrgaps, {.i …
68 + { MODKEY|Mod4Mask|ShiftMask, XK_u, incrgaps, {.i …
69 + { MODKEY|Mod4Mask, XK_i, incrigaps, {.i …
70 + { MODKEY|Mod4Mask|ShiftMask, XK_i, incrigaps, {.i …
71 + { MODKEY|Mod4Mask, XK_o, incrogaps, {.i …
72 + { MODKEY|Mod4Mask|ShiftMask, XK_o, incrogaps, {.i …
73 + { MODKEY|Mod4Mask, XK_6, incrihgaps, {.i …
74 + { MODKEY|Mod4Mask|ShiftMask, XK_6, incrihgaps, {.i …
75 + { MODKEY|Mod4Mask, XK_7, incrivgaps, {.i …
76 + { MODKEY|Mod4Mask|ShiftMask, XK_7, incrivgaps, {.i …
77 + { MODKEY|Mod4Mask, XK_8, incrohgaps, {.i …
78 + { MODKEY|Mod4Mask|ShiftMask, XK_8, incrohgaps, {.i …
79 + { MODKEY|Mod4Mask, XK_9, incrovgaps, {.i …
80 + { MODKEY|Mod4Mask|ShiftMask, XK_9, incrovgaps, {.i …
81 + { MODKEY|Mod4Mask, XK_0, togglegaps, {0} …
82 + { MODKEY|Mod4Mask|ShiftMask, XK_0, defaultgaps, {0} …
83 { MODKEY, XK_Tab, view, {0} …
84 { MODKEY|ShiftMask, XK_c, killclient, {0} …
85 { MODKEY, XK_t, setlayout, {.v …
86 diff --git a/dwm.c b/dwm.c
87 index 5592c57..7d503cb 100644
88 --- a/dwm.c
89 +++ b/dwm.c
90 @@ -120,6 +120,10 @@ struct Monitor {
91 int by; /* bar geometry */
92 int mx, my, mw, mh; /* screen size */
93 int wx, wy, ww, wh; /* window area */
94 + int gappih; /* horizontal gap between windows */
95 + int gappiv; /* vertical gap between windows */
96 + int gappoh; /* horizontal outer gaps */
97 + int gappov; /* vertical outer gaps */
98 unsigned int seltags;
99 unsigned int sellt;
100 unsigned int tagset[2];
101 @@ -210,7 +214,6 @@ static void sigchld(int unused);
102 static void spawn(const Arg *arg);
103 static void tag(const Arg *arg);
104 static void tagmon(const Arg *arg);
105 -static void tile(Monitor *);
106 static void togglebar(const Arg *arg);
107 static void togglefloating(const Arg *arg);
108 static void toggletag(const Arg *arg);
109 @@ -640,6 +643,10 @@ createmon(void)
110 m->nmaster = nmaster;
111 m->showbar = showbar;
112 m->topbar = topbar;
113 + m->gappih = gappih;
114 + m->gappiv = gappiv;
115 + m->gappoh = gappoh;
116 + m->gappov = gappov;
117 m->lt[0] = &layouts[0];
118 m->lt[1] = &layouts[1 % LENGTH(layouts)];
119 strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
120 @@ -1691,40 +1698,6 @@ tagmon(const Arg *arg)
121 sendmon(selmon->sel, dirtomon(arg->i));
122 }
123
124 -void
125 -tile(Monitor *m)
126 -{
127 - unsigned int i, n, h, mw, my, ty;
128 - float mfacts = 0, sfacts = 0;
129 - Client *c;
130 -
131 - for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
132 - if (n < m->nmaster)
133 - mfacts += c->cfact;
134 - else
135 - sfacts += c->cfact;
136 - }
137 - if (n == 0)
138 - return;
139 -
140 - if (n > m->nmaster)
141 - mw = m->nmaster ? m->ww * m->mfact : 0;
142 - else
143 - mw = m->ww;
144 - for (i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttil…
145 - if (i < m->nmaster) {
146 - h = (m->wh - my) * (c->cfact / mfacts);
147 - resize(c, m->wx, m->wy + my, mw - (2*c->bw), h …
148 - my += HEIGHT(c);
149 - mfacts -= c->cfact;
150 - } else {
151 - h = (m->wh - ty) * (c->cfact / sfacts);
152 - resize(c, m->wx + mw, m->wy + ty, m->ww - mw - …
153 - ty += HEIGHT(c);
154 - sfacts -= c->cfact;
155 - }
156 -}
157 -
158 void
159 togglebar(const Arg *arg)
160 {
161 diff --git a/vanitygaps.c b/vanitygaps.c
162 new file mode 100644
163 index 0000000..1a816b6
164 --- /dev/null
165 +++ b/vanitygaps.c
166 @@ -0,0 +1,822 @@
167 +/* Key binding functions */
168 +static void defaultgaps(const Arg *arg);
169 +static void incrgaps(const Arg *arg);
170 +static void incrigaps(const Arg *arg);
171 +static void incrogaps(const Arg *arg);
172 +static void incrohgaps(const Arg *arg);
173 +static void incrovgaps(const Arg *arg);
174 +static void incrihgaps(const Arg *arg);
175 +static void incrivgaps(const Arg *arg);
176 +static void togglegaps(const Arg *arg);
177 +/* Layouts (delete the ones you do not need) */
178 +static void bstack(Monitor *m);
179 +static void bstackhoriz(Monitor *m);
180 +static void centeredmaster(Monitor *m);
181 +static void centeredfloatingmaster(Monitor *m);
182 +static void deck(Monitor *m);
183 +static void dwindle(Monitor *m);
184 +static void fibonacci(Monitor *m, int s);
185 +static void grid(Monitor *m);
186 +static void nrowgrid(Monitor *m);
187 +static void spiral(Monitor *m);
188 +static void tile(Monitor *m);
189 +/* Internals */
190 +static void getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, uns…
191 +static void getfacts(Monitor *m, int msize, int ssize, float *mf, float…
192 +static void setgaps(int oh, int ov, int ih, int iv);
193 +
194 +/* Settings */
195 +#if !PERTAG_PATCH
196 +static int enablegaps = 1;
197 +#endif // PERTAG_PATCH
198 +
199 +void
200 +setgaps(int oh, int ov, int ih, int iv)
201 +{
202 + if (oh < 0) oh = 0;
203 + if (ov < 0) ov = 0;
204 + if (ih < 0) ih = 0;
205 + if (iv < 0) iv = 0;
206 +
207 + selmon->gappoh = oh;
208 + selmon->gappov = ov;
209 + selmon->gappih = ih;
210 + selmon->gappiv = iv;
211 + arrange(selmon);
212 +}
213 +
214 +void
215 +togglegaps(const Arg *arg)
216 +{
217 + #if PERTAG_PATCH
218 + selmon->pertag->enablegaps[selmon->pertag->curtag] = !selmon->p…
219 + #else
220 + enablegaps = !enablegaps;
221 + #endif // PERTAG_PATCH
222 + arrange(NULL);
223 +}
224 +
225 +void
226 +defaultgaps(const Arg *arg)
227 +{
228 + setgaps(gappoh, gappov, gappih, gappiv);
229 +}
230 +
231 +void
232 +incrgaps(const Arg *arg)
233 +{
234 + setgaps(
235 + selmon->gappoh + arg->i,
236 + selmon->gappov + arg->i,
237 + selmon->gappih + arg->i,
238 + selmon->gappiv + arg->i
239 + );
240 +}
241 +
242 +void
243 +incrigaps(const Arg *arg)
244 +{
245 + setgaps(
246 + selmon->gappoh,
247 + selmon->gappov,
248 + selmon->gappih + arg->i,
249 + selmon->gappiv + arg->i
250 + );
251 +}
252 +
253 +void
254 +incrogaps(const Arg *arg)
255 +{
256 + setgaps(
257 + selmon->gappoh + arg->i,
258 + selmon->gappov + arg->i,
259 + selmon->gappih,
260 + selmon->gappiv
261 + );
262 +}
263 +
264 +void
265 +incrohgaps(const Arg *arg)
266 +{
267 + setgaps(
268 + selmon->gappoh + arg->i,
269 + selmon->gappov,
270 + selmon->gappih,
271 + selmon->gappiv
272 + );
273 +}
274 +
275 +void
276 +incrovgaps(const Arg *arg)
277 +{
278 + setgaps(
279 + selmon->gappoh,
280 + selmon->gappov + arg->i,
281 + selmon->gappih,
282 + selmon->gappiv
283 + );
284 +}
285 +
286 +void
287 +incrihgaps(const Arg *arg)
288 +{
289 + setgaps(
290 + selmon->gappoh,
291 + selmon->gappov,
292 + selmon->gappih + arg->i,
293 + selmon->gappiv
294 + );
295 +}
296 +
297 +void
298 +incrivgaps(const Arg *arg)
299 +{
300 + setgaps(
301 + selmon->gappoh,
302 + selmon->gappov,
303 + selmon->gappih,
304 + selmon->gappiv + arg->i
305 + );
306 +}
307 +
308 +void
309 +getgaps(Monitor *m, int *oh, int *ov, int *ih, int *iv, unsigned int *n…
310 +{
311 + unsigned int n, oe, ie;
312 + #if PERTAG_PATCH
313 + oe = ie = selmon->pertag->enablegaps[selmon->pertag->curtag];
314 + #else
315 + oe = ie = enablegaps;
316 + #endif // PERTAG_PATCH
317 + Client *c;
318 +
319 + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
320 + if (smartgaps && n == 1) {
321 + oe = 0; // outer gaps disabled when only one client
322 + }
323 +
324 + *oh = m->gappoh*oe; // outer horizontal gap
325 + *ov = m->gappov*oe; // outer vertical gap
326 + *ih = m->gappih*ie; // inner horizontal gap
327 + *iv = m->gappiv*ie; // inner vertical gap
328 + *nc = n; // number of clients
329 +}
330 +
331 +void
332 +getfacts(Monitor *m, int msize, int ssize, float *mf, float *sf, int *m…
333 +{
334 + unsigned int n;
335 + float mfacts = 0, sfacts = 0;
336 + int mtotal = 0, stotal = 0;
337 + Client *c;
338 +
339 + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
340 + if (n < m->nmaster)
341 + mfacts += c->cfact;
342 + else
343 + sfacts += c->cfact;
344 +
345 + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
346 + if (n < m->nmaster)
347 + mtotal += msize * (c->cfact / mfacts);
348 + else
349 + stotal += ssize * (c->cfact / sfacts);
350 +
351 + *mf = mfacts; // total factor of master area
352 + *sf = sfacts; // total factor of stack area
353 + *mr = msize - mtotal; // the remainder (rest) of pixels after a…
354 + *sr = ssize - stotal; // the remainder (rest) of pixels after a…
355 +}
356 +
357 +/***
358 + * Layouts
359 + */
360 +
361 +/*
362 + * Bottomstack layout + gaps
363 + * https://dwm.suckless.org/patches/bottomstack/
364 + */
365 +static void
366 +bstack(Monitor *m)
367 +{
368 + unsigned int i, n;
369 + int oh, ov, ih, iv;
370 + int mx = 0, my = 0, mh = 0, mw = 0;
371 + int sx = 0, sy = 0, sh = 0, sw = 0;
372 + float mfacts, sfacts;
373 + int mrest, srest;
374 + Client *c;
375 +
376 + getgaps(m, &oh, &ov, &ih, &iv, &n);
377 + if (n == 0)
378 + return;
379 +
380 + sx = mx = m->wx + ov;
381 + sy = my = m->wy + oh;
382 + sh = mh = m->wh - 2*oh;
383 + mw = m->ww - 2*ov - iv * (MIN(n, m->nmaster) - 1);
384 + sw = m->ww - 2*ov - iv * (n - m->nmaster - 1);
385 +
386 + if (m->nmaster && n > m->nmaster) {
387 + sh = (mh - ih) * (1 - m->mfact);
388 + mh = mh - ih - sh;
389 + sx = mx;
390 + sy = my + mh + ih;
391 + }
392 +
393 + getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
394 +
395 + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
396 + if (i < m->nmaster) {
397 + resize(c, mx, my, mw * (c->cfact / mfacts) + (i…
398 + mx += WIDTH(c) + iv;
399 + } else {
400 + resize(c, sx, sy, sw * (c->cfact / sfacts) + ((…
401 + sx += WIDTH(c) + iv;
402 + }
403 + }
404 +}
405 +
406 +static void
407 +bstackhoriz(Monitor *m)
408 +{
409 + unsigned int i, n;
410 + int oh, ov, ih, iv;
411 + int mx = 0, my = 0, mh = 0, mw = 0;
412 + int sx = 0, sy = 0, sh = 0, sw = 0;
413 + float mfacts, sfacts;
414 + int mrest, srest;
415 + Client *c;
416 +
417 + getgaps(m, &oh, &ov, &ih, &iv, &n);
418 + if (n == 0)
419 + return;
420 +
421 + sx = mx = m->wx + ov;
422 + sy = my = m->wy + oh;
423 + mh = m->wh - 2*oh;
424 + sh = m->wh - 2*oh - ih * (n - m->nmaster - 1);
425 + mw = m->ww - 2*ov - iv * (MIN(n, m->nmaster) - 1);
426 + sw = m->ww - 2*ov;
427 +
428 + if (m->nmaster && n > m->nmaster) {
429 + sh = (mh - ih) * (1 - m->mfact);
430 + mh = mh - ih - sh;
431 + sy = my + mh + ih;
432 + sh = m->wh - mh - 2*oh - ih * (n - m->nmaster);
433 + }
434 +
435 + getfacts(m, mw, sh, &mfacts, &sfacts, &mrest, &srest);
436 +
437 + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
438 + if (i < m->nmaster) {
439 + resize(c, mx, my, mw * (c->cfact / mfacts) + (i…
440 + mx += WIDTH(c) + iv;
441 + } else {
442 + resize(c, sx, sy, sw - (2*c->bw), sh * (c->cfac…
443 + sy += HEIGHT(c) + ih;
444 + }
445 + }
446 +}
447 +
448 +/*
449 + * Centred master layout + gaps
450 + * https://dwm.suckless.org/patches/centeredmaster/
451 + */
452 +void
453 +centeredmaster(Monitor *m)
454 +{
455 + unsigned int i, n;
456 + int oh, ov, ih, iv;
457 + int mx = 0, my = 0, mh = 0, mw = 0;
458 + int lx = 0, ly = 0, lw = 0, lh = 0;
459 + int rx = 0, ry = 0, rw = 0, rh = 0;
460 + float mfacts = 0, lfacts = 0, rfacts = 0;
461 + int mtotal = 0, ltotal = 0, rtotal = 0;
462 + int mrest = 0, lrest = 0, rrest = 0;
463 + Client *c;
464 +
465 + getgaps(m, &oh, &ov, &ih, &iv, &n);
466 + if (n == 0)
467 + return;
468 +
469 + /* initialize areas */
470 + mx = m->wx + ov;
471 + my = m->wy + oh;
472 + mh = m->wh - 2*oh - ih * ((!m->nmaster ? n : MIN(n, m->nmaster)…
473 + mw = m->ww - 2*ov;
474 + lh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - 1);
475 + rh = m->wh - 2*oh - ih * (((n - m->nmaster) / 2) - ((n - m->nma…
476 +
477 + if (m->nmaster && n > m->nmaster) {
478 + /* go mfact box in the center if more than nmaster clie…
479 + if (n - m->nmaster > 1) {
480 + /* ||<-S->|<---M--->|<-S->|| */
481 + mw = (m->ww - 2*ov - 2*iv) * m->mfact;
482 + lw = (m->ww - mw - 2*ov - 2*iv) / 2;
483 + rw = (m->ww - mw - 2*ov - 2*iv) - lw;
484 + mx += lw + iv;
485 + } else {
486 + /* ||<---M--->|<-S->|| */
487 + mw = (mw - iv) * m->mfact;
488 + lw = 0;
489 + rw = m->ww - mw - iv - 2*ov;
490 + }
491 + lx = m->wx + ov;
492 + ly = m->wy + oh;
493 + rx = mx + mw + iv;
494 + ry = m->wy + oh;
495 + }
496 +
497 + /* calculate facts */
498 + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
499 + if (!m->nmaster || n < m->nmaster)
500 + mfacts += c->cfact;
501 + else if ((n - m->nmaster) % 2)
502 + lfacts += c->cfact; // total factor of left han…
503 + else
504 + rfacts += c->cfact; // total factor of right ha…
505 + }
506 +
507 + for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
508 + if (!m->nmaster || n < m->nmaster)
509 + mtotal += mh * (c->cfact / mfacts);
510 + else if ((n - m->nmaster) % 2)
511 + ltotal += lh * (c->cfact / lfacts);
512 + else
513 + rtotal += rh * (c->cfact / rfacts);
514 +
515 + mrest = mh - mtotal;
516 + lrest = lh - ltotal;
517 + rrest = rh - rtotal;
518 +
519 + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
520 + if (!m->nmaster || i < m->nmaster) {
521 + /* nmaster clients are stacked vertically, in t…
522 + resize(c, mx, my, mw - (2*c->bw), mh * (c->cfac…
523 + my += HEIGHT(c) + ih;
524 + } else {
525 + /* stack clients are stacked vertically */
526 + if ((i - m->nmaster) % 2 ) {
527 + resize(c, lx, ly, lw - (2*c->bw), lh * …
528 + ly += HEIGHT(c) + ih;
529 + } else {
530 + resize(c, rx, ry, rw - (2*c->bw), rh * …
531 + ry += HEIGHT(c) + ih;
532 + }
533 + }
534 + }
535 +}
536 +
537 +void
538 +centeredfloatingmaster(Monitor *m)
539 +{
540 + unsigned int i, n;
541 + float mfacts, sfacts;
542 + float mivf = 1.0; // master inner vertical gap factor
543 + int oh, ov, ih, iv, mrest, srest;
544 + int mx = 0, my = 0, mh = 0, mw = 0;
545 + int sx = 0, sy = 0, sh = 0, sw = 0;
546 + Client *c;
547 +
548 + getgaps(m, &oh, &ov, &ih, &iv, &n);
549 + if (n == 0)
550 + return;
551 +
552 + sx = mx = m->wx + ov;
553 + sy = my = m->wy + oh;
554 + sh = mh = m->wh - 2*oh;
555 + mw = m->ww - 2*ov - iv*(n - 1);
556 + sw = m->ww - 2*ov - iv*(n - m->nmaster - 1);
557 +
558 + if (m->nmaster && n > m->nmaster) {
559 + mivf = 0.8;
560 + /* go mfact box in the center if more than nmaster clie…
561 + if (m->ww > m->wh) {
562 + mw = m->ww * m->mfact - iv*mivf*(MIN(n, m->nmas…
563 + mh = m->wh * 0.9;
564 + } else {
565 + mw = m->ww * 0.9 - iv*mivf*(MIN(n, m->nmaster) …
566 + mh = m->wh * m->mfact;
567 + }
568 + mx = m->wx + (m->ww - mw) / 2;
569 + my = m->wy + (m->wh - mh - 2*oh) / 2;
570 +
571 + sx = m->wx + ov;
572 + sy = m->wy + oh;
573 + sh = m->wh - 2*oh;
574 + }
575 +
576 + getfacts(m, mw, sw, &mfacts, &sfacts, &mrest, &srest);
577 +
578 + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
579 + if (i < m->nmaster) {
580 + /* nmaster clients are stacked horizontally, in…
581 + resize(c, mx, my, mw * (c->cfact / mfacts) + (i…
582 + mx += WIDTH(c) + iv*mivf;
583 + } else {
584 + /* stack clients are stacked horizontally */
585 + resize(c, sx, sy, sw * (c->cfact / sfacts) + ((…
586 + sx += WIDTH(c) + iv;
587 + }
588 +}
589 +
590 +/*
591 + * Deck layout + gaps
592 + * https://dwm.suckless.org/patches/deck/
593 + */
594 +void
595 +deck(Monitor *m)
596 +{
597 + unsigned int i, n;
598 + int oh, ov, ih, iv;
599 + int mx = 0, my = 0, mh = 0, mw = 0;
600 + int sx = 0, sy = 0, sh = 0, sw = 0;
601 + float mfacts, sfacts;
602 + int mrest, srest;
603 + Client *c;
604 +
605 + getgaps(m, &oh, &ov, &ih, &iv, &n);
606 + if (n == 0)
607 + return;
608 +
609 + sx = mx = m->wx + ov;
610 + sy = my = m->wy + oh;
611 + sh = mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1);
612 + sw = mw = m->ww - 2*ov;
613 +
614 + if (m->nmaster && n > m->nmaster) {
615 + sw = (mw - iv) * (1 - m->mfact);
616 + mw = mw - iv - sw;
617 + sx = mx + mw + iv;
618 + sh = m->wh - 2*oh;
619 + }
620 +
621 + getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest);
622 +
623 + if (n - m->nmaster > 0) /* override layout symbol */
624 + snprintf(m->ltsymbol, sizeof m->ltsymbol, "D %d", n - m…
625 +
626 + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
627 + if (i < m->nmaster) {
628 + resize(c, mx, my, mw - (2*c->bw), mh * (c->cfac…
629 + my += HEIGHT(c) + ih;
630 + } else {
631 + resize(c, sx, sy, sw - (2*c->bw), sh - (2*c->bw…
632 + }
633 +}
634 +
635 +/*
636 + * Fibonacci layout + gaps
637 + * https://dwm.suckless.org/patches/fibonacci/
638 + */
639 +void
640 +fibonacci(Monitor *m, int s)
641 +{
642 + unsigned int i, n;
643 + int nx, ny, nw, nh;
644 + int oh, ov, ih, iv;
645 + int nv, hrest = 0, wrest = 0, r = 1;
646 + Client *c;
647 +
648 + getgaps(m, &oh, &ov, &ih, &iv, &n);
649 + if (n == 0)
650 + return;
651 +
652 + nx = m->wx + ov;
653 + ny = m->wy + oh;
654 + nw = m->ww - 2*ov;
655 + nh = m->wh - 2*oh;
656 +
657 + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
658 + if (r) {
659 + if ((i % 2 && (nh - ih) / 2 <= (bh + 2*c->bw))
660 + || (!(i % 2) && (nw - iv) / 2 <= (bh + 2*c->…
661 + r = 0;
662 + }
663 + if (r && i < n - 1) {
664 + if (i % 2) {
665 + nv = (nh - ih) / 2;
666 + hrest = nh - 2*nv - ih;
667 + nh = nv;
668 + } else {
669 + nv = (nw - iv) / 2;
670 + wrest = nw - 2*nv - iv;
671 + nw = nv;
672 + }
673 +
674 + if ((i % 4) == 2 && !s)
675 + nx += nw + iv;
676 + else if ((i % 4) == 3 && !s)
677 + ny += nh + ih;
678 + }
679 +
680 + if ((i % 4) == 0) {
681 + if (s) {
682 + ny += nh + ih;
683 + nh += hrest;
684 + }
685 + else {
686 + nh -= hrest;
687 + ny -= nh + ih;
688 + }
689 + }
690 + else if ((i % 4) == 1) {
691 + nx += nw + iv;
692 + nw += wrest;
693 + }
694 + else if ((i % 4) == 2) {
695 + ny += nh + ih;
696 + nh += hrest;
697 + if (i < n - 1)
698 + nw += wrest;
699 + }
700 + else if ((i % 4) == 3) {
701 + if (s) {
702 + nx += nw + iv;
703 + nw -= wrest;
704 + } else {
705 + nw -= wrest;
706 + nx -= nw + iv;
707 + nh += hrest;
708 + }
709 + }
710 + if (i == 0) {
711 + if (n != 1) {
712 + nw = (m->ww - iv - 2*ov) - (m->…
713 + wrest = 0;
714 + }
715 + ny = m->wy + oh;
716 + }
717 + else if (i == 1)
718 + nw = m->ww - nw - iv - 2*ov;
719 + i++;
720 + }
721 +
722 + resize(c, nx, ny, nw - (2*c->bw), nh - (2*c->bw), False…
723 + }
724 +}
725 +
726 +void
727 +dwindle(Monitor *m)
728 +{
729 + fibonacci(m, 1);
730 +}
731 +
732 +void
733 +spiral(Monitor *m)
734 +{
735 + fibonacci(m, 0);
736 +}
737 +
738 +/*
739 + * Gappless grid layout + gaps (ironically)
740 + * https://dwm.suckless.org/patches/gaplessgrid/
741 + */
742 +void
743 +gaplessgrid(Monitor *m)
744 +{
745 + unsigned int i, n;
746 + int x, y, cols, rows, ch, cw, cn, rn, rrest, crest; // counters
747 + int oh, ov, ih, iv;
748 + Client *c;
749 +
750 + getgaps(m, &oh, &ov, &ih, &iv, &n);
751 + if (n == 0)
752 + return;
753 +
754 + /* grid dimensions */
755 + for (cols = 0; cols <= n/2; cols++)
756 + if (cols*cols >= n)
757 + break;
758 + if (n == 5) /* set layout against the general calculation: not …
759 + cols = 2;
760 + rows = n/cols;
761 + cn = rn = 0; // reset column no, row no, client count
762 +
763 + ch = (m->wh - 2*oh - ih * (rows - 1)) / rows;
764 + cw = (m->ww - 2*ov - iv * (cols - 1)) / cols;
765 + rrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
766 + crest = (m->ww - 2*ov - iv * (cols - 1)) - cw * cols;
767 + x = m->wx + ov;
768 + y = m->wy + oh;
769 +
770 + for (i = 0, c = nexttiled(m->clients); c; i++, c = nexttiled(c-…
771 + if (i/rows + 1 > cols - n%cols) {
772 + rows = n/cols + 1;
773 + ch = (m->wh - 2*oh - ih * (rows - 1)) / rows;
774 + rrest = (m->wh - 2*oh - ih * (rows - 1)) - ch *…
775 + }
776 + resize(c,
777 + x,
778 + y + rn*(ch + ih) + MIN(rn, rrest),
779 + cw + (cn < crest ? 1 : 0) - 2*c->bw,
780 + ch + (rn < rrest ? 1 : 0) - 2*c->bw,
781 + 0);
782 + rn++;
783 + if (rn >= rows) {
784 + rn = 0;
785 + x += cw + ih + (cn < crest ? 1 : 0);
786 + cn++;
787 + }
788 + }
789 +}
790 +
791 +/*
792 + * Gridmode layout + gaps
793 + * https://dwm.suckless.org/patches/gridmode/
794 + */
795 +void
796 +grid(Monitor *m)
797 +{
798 + unsigned int i, n;
799 + int cx, cy, cw, ch, cc, cr, chrest, cwrest, cols, rows;
800 + int oh, ov, ih, iv;
801 + Client *c;
802 +
803 + getgaps(m, &oh, &ov, &ih, &iv, &n);
804 +
805 + /* grid dimensions */
806 + for (rows = 0; rows <= n/2; rows++)
807 + if (rows*rows >= n)
808 + break;
809 + cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows;
810 +
811 + /* window geoms (cell height/width) */
812 + ch = (m->wh - 2*oh - ih * (rows - 1)) / (rows ? rows : 1);
813 + cw = (m->ww - 2*ov - iv * (cols - 1)) / (cols ? cols : 1);
814 + chrest = (m->wh - 2*oh - ih * (rows - 1)) - ch * rows;
815 + cwrest = (m->ww - 2*ov - iv * (cols - 1)) - cw * cols;
816 + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
817 + cc = i / rows;
818 + cr = i % rows;
819 + cx = m->wx + ov + cc * (cw + iv) + MIN(cc, cwrest);
820 + cy = m->wy + oh + cr * (ch + ih) + MIN(cr, chrest);
821 + resize(c, cx, cy, cw + (cc < cwrest ? 1 : 0) - 2*c->bw,…
822 + }
823 +}
824 +
825 +/*
826 + * Horizontal grid layout + gaps
827 + * https://dwm.suckless.org/patches/horizgrid/
828 + */
829 +void
830 +horizgrid(Monitor *m) {
831 + Client *c;
832 + unsigned int n, i;
833 + int oh, ov, ih, iv;
834 + int mx = 0, my = 0, mh = 0, mw = 0;
835 + int sx = 0, sy = 0, sh = 0, sw = 0;
836 + int ntop, nbottom = 1;
837 + float mfacts = 0, sfacts = 0;
838 + int mrest, srest, mtotal = 0, stotal = 0;
839 +
840 + /* Count windows */
841 + getgaps(m, &oh, &ov, &ih, &iv, &n);
842 + if (n == 0)
843 + return;
844 +
845 + if (n <= 2)
846 + ntop = n;
847 + else {
848 + ntop = n / 2;
849 + nbottom = n - ntop;
850 + }
851 + sx = mx = m->wx + ov;
852 + sy = my = m->wy + oh;
853 + sh = mh = m->wh - 2*oh;
854 + sw = mw = m->ww - 2*ov;
855 +
856 + if (n > ntop) {
857 + sh = (mh - ih) / 2;
858 + mh = mh - ih - sh;
859 + sy = my + mh + ih;
860 + mw = m->ww - 2*ov - iv * (ntop - 1);
861 + sw = m->ww - 2*ov - iv * (nbottom - 1);
862 + }
863 +
864 + /* calculate facts */
865 + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
866 + if (i < ntop)
867 + mfacts += c->cfact;
868 + else
869 + sfacts += c->cfact;
870 +
871 + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
872 + if (i < ntop)
873 + mtotal += mh * (c->cfact / mfacts);
874 + else
875 + stotal += sw * (c->cfact / sfacts);
876 +
877 + mrest = mh - mtotal;
878 + srest = sw - stotal;
879 +
880 + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
881 + if (i < ntop) {
882 + resize(c, mx, my, mw * (c->cfact / mfacts) + (i…
883 + mx += WIDTH(c) + iv;
884 + } else {
885 + resize(c, sx, sy, sw * (c->cfact / sfacts) + ((…
886 + sx += WIDTH(c) + iv;
887 + }
888 +}
889 +
890 +/*
891 + * nrowgrid layout + gaps
892 + * https://dwm.suckless.org/patches/nrowgrid/
893 + */
894 +void
895 +nrowgrid(Monitor *m)
896 +{
897 + unsigned int n;
898 + int ri = 0, ci = 0; /* counters */
899 + int oh, ov, ih, iv; /* vanitygap settin…
900 + unsigned int cx, cy, cw, ch; /* client geometry …
901 + unsigned int uw = 0, uh = 0, uc = 0; /* utilization trac…
902 + unsigned int cols, rows = m->nmaster + 1;
903 + Client *c;
904 +
905 + /* count clients */
906 + getgaps(m, &oh, &ov, &ih, &iv, &n);
907 +
908 + /* nothing to do here */
909 + if (n == 0)
910 + return;
911 +
912 + /* force 2 clients to always split vertically */
913 + if (FORCE_VSPLIT && n == 2)
914 + rows = 1;
915 +
916 + /* never allow empty rows */
917 + if (n < rows)
918 + rows = n;
919 +
920 + /* define first row */
921 + cols = n / rows;
922 + uc = cols;
923 + cy = m->wy + oh;
924 + ch = (m->wh - 2*oh - ih*(rows - 1)) / rows;
925 + uh = ch;
926 +
927 + for (c = nexttiled(m->clients); c; c = nexttiled(c->next), ci++…
928 + if (ci == cols) {
929 + uw = 0;
930 + ci = 0;
931 + ri++;
932 +
933 + /* next row */
934 + cols = (n - uc) / (rows - ri);
935 + uc += cols;
936 + cy = m->wy + oh + uh + ih;
937 + uh += ch + ih;
938 + }
939 +
940 + cx = m->wx + ov + uw;
941 + cw = (m->ww - 2*ov - uw) / (cols - ci);
942 + uw += cw + iv;
943 +
944 + resize(c, cx, cy, cw - (2*c->bw), ch - (2*c->bw), 0);
945 + }
946 +}
947 +
948 +/*
949 + * Default tile layout + gaps
950 + */
951 +static void
952 +tile(Monitor *m)
953 +{
954 + unsigned int i, n;
955 + int oh, ov, ih, iv;
956 + int mx = 0, my = 0, mh = 0, mw = 0;
957 + int sx = 0, sy = 0, sh = 0, sw = 0;
958 + float mfacts, sfacts;
959 + int mrest, srest;
960 + Client *c;
961 +
962 + getgaps(m, &oh, &ov, &ih, &iv, &n);
963 + if (n == 0)
964 + return;
965 +
966 + sx = mx = m->wx + ov;
967 + sy = my = m->wy + oh;
968 + mh = m->wh - 2*oh - ih * (MIN(n, m->nmaster) - 1);
969 + sh = m->wh - 2*oh - ih * (n - m->nmaster - 1);
970 + sw = mw = m->ww - 2*ov;
971 +
972 + if (m->nmaster && n > m->nmaster) {
973 + sw = (mw - iv) * (1 - m->mfact);
974 + mw = mw - iv - sw;
975 + sx = mx + mw + iv;
976 + }
977 +
978 + getfacts(m, mh, sh, &mfacts, &sfacts, &mrest, &srest);
979 +
980 + for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next…
981 + if (i < m->nmaster) {
982 + resize(c, mx, my, mw - (2*c->bw), mh * (c->cfac…
983 + my += HEIGHT(c) + ih;
984 + } else {
985 + resize(c, sx, sy, sw - (2*c->bw), sh * (c->cfac…
986 + sy += HEIGHT(c) + ih;
987 + }
988 +}
989 \ No newline at end of file
990 --
991 2.19.1
992
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.