dwm-autoswitch-20240921-c282f865.diff - sites - public wiki contents of suckles… | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-autoswitch-20240921-c282f865.diff (5015B) | |
--- | |
1 From c282f86559f3c7858e34888c1fa0204c22ede89c Mon Sep 17 00:00:00 2001 | |
2 From: elbachir-one <[email protected]> | |
3 Date: Sat, 21 Sep 2024 22:59:53 +0100 | |
4 Subject: [PATCH] Allowing manual switch of monocle mode. | |
5 | |
6 --- | |
7 config.def.h | 7 ++--- | |
8 dwm.c | 72 +++++++++++++++++++++++++++++++++++++++------------- | |
9 2 files changed, 59 insertions(+), 20 deletions(-) | |
10 | |
11 diff --git a/config.def.h b/config.def.h | |
12 index 9efa774..32fafc9 100644 | |
13 --- a/config.def.h | |
14 +++ b/config.def.h | |
15 @@ -5,6 +5,7 @@ static const unsigned int borderpx = 1; /* borde… | |
16 static const unsigned int snap = 32; /* snap pixel */ | |
17 static const int showbar = 1; /* 0 means no bar */ | |
18 static const int topbar = 1; /* 0 means bottom bar */ | |
19 +static const int monoclemode = 4; /* automatically switch… | |
20 static const char *fonts[] = { "monospace:size=10" }; | |
21 static const char dmenufont[] = "monospace:size=10"; | |
22 static const char col_gray1[] = "#222222"; | |
23 @@ -40,8 +41,8 @@ static const int lockfullscreen = 1; /* 1 will force f… | |
24 static const Layout layouts[] = { | |
25 /* symbol arrange function */ | |
26 { "[]=", tile }, /* first entry is default */ | |
27 - { "><>", NULL }, /* no layout function means floating b… | |
28 { "[M]", monocle }, | |
29 + { "><>", NULL }, /* no layout function means floating b… | |
30 }; | |
31 | |
32 /* key definitions */ | |
33 @@ -75,8 +76,8 @@ static const Key keys[] = { | |
34 { MODKEY, XK_Tab, view, {0} … | |
35 { MODKEY|ShiftMask, XK_c, killclient, {0} … | |
36 { MODKEY, XK_t, setlayout, {.v … | |
37 - { MODKEY, XK_f, setlayout, {.v … | |
38 - { MODKEY, XK_m, setlayout, {.v … | |
39 + { MODKEY, XK_m, setlayout, {.v … | |
40 + { MODKEY, XK_f, setlayout, {.v … | |
41 { MODKEY, XK_space, setlayout, {0} … | |
42 { MODKEY|ShiftMask, XK_space, togglefloating, {0} … | |
43 { MODKEY, XK_0, view, {.ui… | |
44 diff --git a/dwm.c b/dwm.c | |
45 index 67c6b2b..9561896 100644 | |
46 --- a/dwm.c | |
47 +++ b/dwm.c | |
48 @@ -130,6 +130,7 @@ struct Monitor { | |
49 Monitor *next; | |
50 Window barwin; | |
51 const Layout *lt[2]; | |
52 + int manualswitch; | |
53 }; | |
54 | |
55 typedef struct { | |
56 @@ -227,6 +228,7 @@ static void updatetitle(Client *c); | |
57 static void updatewindowtype(Client *c); | |
58 static void updatewmhints(Client *c); | |
59 static void view(const Arg *arg); | |
60 +static int visibleclientcount(Monitor *m); | |
61 static Client *wintoclient(Window w); | |
62 static Monitor *wintomon(Window w); | |
63 static int xerror(Display *dpy, XErrorEvent *ee); | |
64 @@ -382,15 +384,31 @@ applysizehints(Client *c, int *x, int *y, int *w, … | |
65 void | |
66 arrange(Monitor *m) | |
67 { | |
68 - if (m) | |
69 - showhide(m->stack); | |
70 - else for (m = mons; m; m = m->next) | |
71 + if (!m) | |
72 + for (m = mons; m; m = m->next) | |
73 + showhide(m->stack); | |
74 + else | |
75 showhide(m->stack); | |
76 - if (m) { | |
77 - arrangemon(m); | |
78 - restack(m); | |
79 - } else for (m = mons; m; m = m->next) | |
80 - arrangemon(m); | |
81 + | |
82 + for (Monitor *mon = (m ? m : mons); mon; mon = (m ? NULL : mon-… | |
83 + unsigned int n = visibleclientcount(mon); | |
84 + | |
85 + if (!mon->manualswitch) { | |
86 + if (n >= monoclemode && mon->lt[mon->sellt]->ar… | |
87 + setlayout(&(Arg) {.v = &layouts[1]}); | |
88 + } else if (n < monoclemode && mon->lt[mon->sell… | |
89 + setlayout(&(Arg) {.v = &layouts[0]}); | |
90 + } | |
91 + } | |
92 + | |
93 + if (mon->manualswitch && (n < monoclemode || n >= monoc… | |
94 + mon->manualswitch = 0; | |
95 + } | |
96 + | |
97 + arrangemon(mon); | |
98 + if (!m) | |
99 + restack(mon); | |
100 + } | |
101 } | |
102 | |
103 void | |
104 @@ -1510,15 +1528,22 @@ setfullscreen(Client *c, int fullscreen) | |
105 void | |
106 setlayout(const Arg *arg) | |
107 { | |
108 - if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) | |
109 - selmon->sellt ^= 1; | |
110 - if (arg && arg->v) | |
111 - selmon->lt[selmon->sellt] = (Layout *)arg->v; | |
112 - strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, si… | |
113 - if (selmon->sel) | |
114 - arrange(selmon); | |
115 - else | |
116 - drawbar(selmon); | |
117 + if (!arg || !arg->v) | |
118 + return; | |
119 + | |
120 + Layout *newlayout = (Layout *)arg->v; | |
121 + if (newlayout != selmon->lt[selmon->sellt]) { | |
122 + selmon->lt[selmon->sellt] = newlayout; | |
123 + strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->sy… | |
124 + selmon->ltsymbol[sizeof(selmon->ltsymbol) - 1] = '\0'; | |
125 + | |
126 + selmon->manualswitch = 1; | |
127 + | |
128 + if (selmon->sel) | |
129 + arrange(selmon); | |
130 + else | |
131 + drawbar(selmon); | |
132 + } | |
133 } | |
134 | |
135 /* arg > 1.0 will set mfact absolutely */ | |
136 @@ -2062,6 +2087,19 @@ view(const Arg *arg) | |
137 arrange(selmon); | |
138 } | |
139 | |
140 +int | |
141 +visibleclientcount(Monitor *m) | |
142 +{ | |
143 + unsigned int count = 0; | |
144 + Client *c; | |
145 + for (c = m->clients; c; c = c->next) { | |
146 + if (ISVISIBLE(c)) { | |
147 + count++; | |
148 + } | |
149 + } | |
150 + return count; | |
151 +} | |
152 + | |
153 Client * | |
154 wintoclient(Window w) | |
155 { | |
156 -- | |
157 2.46.0 | |
158 |