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