-
Notifications
You must be signed in to change notification settings - Fork 31
/
Copy pathdwm-pertag-monitorrules-6.5.diff
139 lines (131 loc) · 3.97 KB
/
dwm-pertag-monitorrules-6.5.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 cf213f02dea133954e7c98ecce0a2a564a177d8d Mon Sep 17 00:00:00 2001
From: Bakkeby <[email protected]>
Date: Mon, 1 Jul 2024 23:15:17 +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 9efa774..d90bec8 100644
--- a/config.def.h
+++ b/config.def.h
@@ -44,6 +44,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 ab1edb6..9b593b2 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);
@@ -648,31 +658,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 */
@@ -681,6 +706,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