dwm-layoutmonitorrules-20211216-a786211d6cb7.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-layoutmonitorrules-20211216-a786211d6cb7.diff (2609B)
---
1 diff --git config.def.h config.def.h
2 index a2ac963..9af5393 100644
3 --- config.def.h
4 +++ config.def.h
5 @@ -37,6 +37,11 @@ static const int nmaster = 1; /* number of clients in master area */
6 static const int resizehints = 1; /* 1 means respect size hints in tiled resizals */
7 static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */
8
9 +static const LayoutMonitorRule lm_rules[] = {
10 + /* >=w, >=h, req'd layout, new nmaster, new mfact */
11 + { 3000, 0, 0, 2, 0.66 },
12 +};
13 +
14 static const Layout layouts[] = {
15 /* symbol arrange function */
16 { "[]=", tile }, /* first entry is default */
17 diff --git dwm.c dwm.c
18 index 5e4d494..d462775 100644
19 --- dwm.c
20 +++ dwm.c
21 @@ -111,6 +111,13 @@ typedef struct {
22 void (*arrange)(Monitor *);
23 } Layout;
24
25 +typedef struct {
26 + int mw, mh; /* >= matching */
27 + int layout; /* only apply if this is the current layout, <0 for no matching */
28 + int nmaster; /* the new nmaster to apply */
29 + float mfact; /* the new mfact to apply */
30 +} LayoutMonitorRule;
31 +
32 struct Monitor {
33 char ltsymbol[16];
34 float mfact;
35 @@ -142,6 +149,7 @@ typedef struct {
36 } Rule;
37
38 /* function declarations */
39 +static void applylmrules(void);
40 static void applyrules(Client *c);
41 static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact);
42 static void arrange(Monitor *m);
43 @@ -276,6 +284,31 @@ static Window root, wmcheckwin;
44 struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; };
45
46 /* function implementations */
47 +void
48 +applylmrules(void)
49 +{
50 + float new_mfact = mfact;
51 + int new_nmaster = nmaster;
52 + size_t i;
53 +
54 + for (i = 0; i < LENGTH(lm_rules); i++) {
55 + const LayoutMonitorRule *lmr = &lm_rules[i];
56 +
57 + if (selmon->mw >= lmr->mw &&
58 + selmon->mh >= lmr->mh &&
59 + selmon->sellt == lmr->layout)
60 + {
61 + new_mfact = lmr->mfact;
62 + new_nmaster = lmr->nmaster;
63 + break;
64 + }
65 + }
66 +
67 + selmon->mfact = new_mfact;
68 + selmon->nmaster = new_nmaster;
69 + arrange(selmon);
70 +}
71 +
72 void
73 applyrules(Client *c)
74 {
75 @@ -572,6 +605,7 @@ configurenotify(XEvent *e)
76 }
77 focus(NULL);
78 arrange(NULL);
79 + applylmrules();
80 }
81 }
82 }
83 @@ -1506,9 +1540,8 @@ setlayout(const Arg *arg)
84 if (arg && arg->v)
85 selmon->lt[selmon->sellt] = (Layout *)arg->v;
86 strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol);
87 - if (selmon->sel)
88 - arrange(selmon);
89 - else
90 + applylmrules();
91 + if (!selmon->sel)
92 drawbar(selmon);
93 }
94
95 @@ -1595,6 +1628,7 @@ setup(void)
96 XSelectInput(dpy, root, wa.event_mask);
97 grabkeys();
98 focus(NULL);
99 + applylmrules();
100 }
101
102