-
Notifications
You must be signed in to change notification settings - Fork 30
/
dwm-pertag-monitorrules-6.2.diff
139 lines (131 loc) · 3.97 KB
/
dwm-pertag-monitorrules-6.2.diff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
From c2948f824cffb34ce96431d51eebcc62165e478c Mon Sep 17 00:00:00 2001
From: Bakkeby <bakkeby@gmail.com>
Date: Fri, 28 Jun 2024 18:13:46 +0200
Subject: [PATCH 2/2] Monitor rules patch on top of pertag
This patch allows the user to define layout, mfact, nmaster, showbar,
and topbar settings on a per monitor basis. An example use case could
be to have a layout with a horizontal split for a secondary vertical
monitor.
https://github.com/bakkeby/patches/wiki/monitorrules
---
config.def.h | 6 +++++
dwm.c | 67 +++++++++++++++++++++++++++++++++++++++++-----------
2 files changed, 59 insertions(+), 14 deletions(-)
diff --git a/config.def.h b/config.def.h
index 1c0b587..36bfa8c 100644
--- a/config.def.h
+++ b/config.def.h
@@ -43,6 +43,12 @@ static const Layout layouts[] = {
{ "[M]", monocle },
};
+static const MonitorRule monrules[] = {
+ /* monitor tag layout mfact nmaster showbar topbar */
+ { 1, -1, 2, -1, -1, -1, -1 }, // use a different layout for the second monitor
+ { -1, -1, 0, -1, -1, -1, -1 }, // default
+};
+
/* key definitions */
#define MODKEY Mod1Mask
#define TAGKEYS(KEY,TAG) \
diff --git a/dwm.c b/dwm.c
index 466177c..8597936 100644
--- a/dwm.c
+++ b/dwm.c
@@ -143,6 +143,16 @@ typedef struct {
int monitor;
} Rule;
+typedef struct {
+ int monitor;
+ int tag;
+ int layout;
+ float mfact;
+ int nmaster;
+ int showbar;
+ int topbar;
+} MonitorRule;
+
/* function declarations */
static void applyrules(Client *c);
static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact);
@@ -645,31 +655,46 @@ configurerequest(XEvent *e)
Monitor *
createmon(void)
{
- Monitor *m;
- int i;
-
+ Monitor *m, *mon;
+ int i, mi, j, layout;
+ const MonitorRule *mr;
m = ecalloc(1, sizeof(Monitor));
m->tagset[0] = m->tagset[1] = 1;
m->mfact = mfact;
m->nmaster = nmaster;
m->showbar = showbar;
m->topbar = topbar;
- m->lt[0] = &layouts[0];
- m->lt[1] = &layouts[1 % LENGTH(layouts)];
- strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
+
+ for (mi = 0, mon = mons; mon; mon = mon->next, mi++);
+ for (j = 0; j < LENGTH(monrules); j++) {
+ mr = &monrules[j];
+ if ((mr->monitor == -1 || mr->monitor == mi)
+ && (mr->tag <= 0 || (m->tagset[0] & (1 << (mr->tag - 1))))
+ ) {
+ layout = MAX(mr->layout, 0);
+ layout = MIN(layout, LENGTH(layouts) - 1);
+ m->lt[0] = &layouts[layout];
+ m->lt[1] = &layouts[1 % LENGTH(layouts)];
+ strncpy(m->ltsymbol, layouts[layout].symbol, sizeof m->ltsymbol);
+
+ if (mr->mfact > -1)
+ m->mfact = mr->mfact;
+ if (mr->nmaster > -1)
+ m->nmaster = mr->nmaster;
+ if (mr->showbar > -1)
+ m->showbar = mr->showbar;
+ if (mr->topbar > -1)
+ m->topbar = mr->topbar;
+ break;
+ }
+ }
+
if (!(m->pertag = (Pertag *)calloc(1, sizeof(Pertag))))
die("fatal: could not malloc() %u bytes\n", sizeof(Pertag));
m->pertag->curtag = m->pertag->prevtag = 1;
- for (i = 0; i <= LENGTH(tags); i++) {
- /* init nmaster */
- m->pertag->nmasters[i] = m->nmaster;
-
- /* init mfacts */
- m->pertag->mfacts[i] = m->mfact;
+ for (i = 0; i <= LENGTH(tags); i++) {
/* init layouts */
- m->pertag->ltidxs[i][0] = m->lt[0];
- m->pertag->ltidxs[i][1] = m->lt[1];
m->pertag->sellts[i] = m->sellt;
/* init showbar */
@@ -678,6 +703,20 @@ createmon(void)
#if ZOOMSWAP_PATCH
m->pertag->prevzooms[i] = NULL;
#endif // ZOOMSWAP_PATCH
+
+ for (j = 0; j < LENGTH(monrules); j++) {
+ mr = &monrules[j];
+ if ((mr->monitor == -1 || mr->monitor == mi) && (mr->tag == -1 || mr->tag == i)) {
+ layout = MAX(mr->layout, 0);
+ layout = MIN(layout, LENGTH(layouts) - 1);
+ m->pertag->ltidxs[i][0] = &layouts[layout];
+ m->pertag->ltidxs[i][1] = m->lt[0];
+ m->pertag->nmasters[i] = (mr->nmaster > -1 ? mr->nmaster : m->nmaster);
+ m->pertag->mfacts[i] = (mr->mfact > -1 ? mr->mfact : m->mfact);
+ m->pertag->showbars[i] = (mr->showbar > -1 ? mr->showbar : m->showbar);
+ break;
+ }
+ }
}
return m;
}
--
2.45.2