dwm-dwmc-6.2.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-dwmc-6.2.diff (5837B) | |
--- | |
1 From d94cb6f1a553d19127f44dbdc96e8bb5041956c2 Mon Sep 17 00:00:00 2001 | |
2 From: Nihal Jere <[email protected]> | |
3 Date: Sat, 21 Mar 2020 15:16:49 -0500 | |
4 Subject: [PATCH] dwm-client | |
5 | |
6 --- | |
7 Makefile | 2 +- | |
8 config.def.h | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++ | |
9 dwm.c | 55 +++++++++++++++++++++++++++++++++++++++-- | |
10 dwmc | 40 ++++++++++++++++++++++++++++++ | |
11 4 files changed, 164 insertions(+), 3 deletions(-) | |
12 create mode 100755 dwmc | |
13 | |
14 diff --git a/Makefile b/Makefile | |
15 index 77bcbc0..f837f5c 100644 | |
16 --- a/Makefile | |
17 +++ b/Makefile | |
18 @@ -38,7 +38,7 @@ dist: clean | |
19 | |
20 install: all | |
21 mkdir -p ${DESTDIR}${PREFIX}/bin | |
22 - cp -f dwm ${DESTDIR}${PREFIX}/bin | |
23 + cp -f dwm dwmc ${DESTDIR}${PREFIX}/bin | |
24 chmod 755 ${DESTDIR}${PREFIX}/bin/dwm | |
25 mkdir -p ${DESTDIR}${MANPREFIX}/man1 | |
26 sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/m… | |
27 diff --git a/config.def.h b/config.def.h | |
28 index 1c0b587..efbae79 100644 | |
29 --- a/config.def.h | |
30 +++ b/config.def.h | |
31 @@ -113,3 +113,73 @@ static Button buttons[] = { | |
32 { ClkTagBar, MODKEY, Button3, togglet… | |
33 }; | |
34 | |
35 +void | |
36 +setlayoutex(const Arg *arg) | |
37 +{ | |
38 + setlayout(&((Arg) { .v = &layouts[arg->i] })); | |
39 +} | |
40 + | |
41 +void | |
42 +viewex(const Arg *arg) | |
43 +{ | |
44 + view(&((Arg) { .ui = 1 << arg->ui })); | |
45 +} | |
46 + | |
47 +void | |
48 +viewall(const Arg *arg) | |
49 +{ | |
50 + view(&((Arg){.ui = ~0})); | |
51 +} | |
52 + | |
53 +void | |
54 +toggleviewex(const Arg *arg) | |
55 +{ | |
56 + toggleview(&((Arg) { .ui = 1 << arg->ui })); | |
57 +} | |
58 + | |
59 +void | |
60 +tagex(const Arg *arg) | |
61 +{ | |
62 + tag(&((Arg) { .ui = 1 << arg->ui })); | |
63 +} | |
64 + | |
65 +void | |
66 +toggletagex(const Arg *arg) | |
67 +{ | |
68 + toggletag(&((Arg) { .ui = 1 << arg->ui })); | |
69 +} | |
70 + | |
71 +void | |
72 +tagall(const Arg *arg) | |
73 +{ | |
74 + tag(&((Arg){.ui = ~0})); | |
75 +} | |
76 + | |
77 +/* signal definitions */ | |
78 +/* signum must be greater than 0 */ | |
79 +/* trigger signals using `xsetroot -name "fsignal:<signame> [<type> <va… | |
80 +static Signal signals[] = { | |
81 + /* signum function */ | |
82 + { "focusstack", focusstack }, | |
83 + { "setmfact", setmfact }, | |
84 + { "togglebar", togglebar }, | |
85 + { "incnmaster", incnmaster }, | |
86 + { "togglefloating", togglefloating }, | |
87 + { "focusmon", focusmon }, | |
88 + { "tagmon", tagmon }, | |
89 + { "zoom", zoom }, | |
90 + { "view", view }, | |
91 + { "viewall", viewall }, | |
92 + { "viewex", viewex }, | |
93 + { "toggleview", view }, | |
94 + { "toggleviewex", toggleviewex }, | |
95 + { "tag", tag }, | |
96 + { "tagall", tagall }, | |
97 + { "tagex", tagex }, | |
98 + { "toggletag", tag }, | |
99 + { "toggletagex", toggletagex }, | |
100 + { "killclient", killclient }, | |
101 + { "quit", quit }, | |
102 + { "setlayout", setlayout }, | |
103 + { "setlayoutex", setlayoutex }, | |
104 +}; | |
105 diff --git a/dwm.c b/dwm.c | |
106 index 4465af1..aa53706 100644 | |
107 --- a/dwm.c | |
108 +++ b/dwm.c | |
109 @@ -106,6 +106,11 @@ typedef struct { | |
110 const Arg arg; | |
111 } Key; | |
112 | |
113 +typedef struct { | |
114 + const char * sig; | |
115 + void (*func)(const Arg *); | |
116 +} Signal; | |
117 + | |
118 typedef struct { | |
119 const char *symbol; | |
120 void (*arrange)(Monitor *); | |
121 @@ -148,6 +153,7 @@ static void arrange(Monitor *m); | |
122 static void arrangemon(Monitor *m); | |
123 static void attach(Client *c); | |
124 static void attachstack(Client *c); | |
125 +static int fake_signal(void); | |
126 static void buttonpress(XEvent *e); | |
127 static void checkotherwm(void); | |
128 static void cleanup(void); | |
129 @@ -998,6 +1004,49 @@ keypress(XEvent *e) | |
130 keys[i].func(&(keys[i].arg)); | |
131 } | |
132 | |
133 +int | |
134 +fake_signal(void) | |
135 +{ | |
136 + char fsignal[256]; | |
137 + char indicator[9] = "fsignal:"; | |
138 + char str_sig[50]; | |
139 + char param[16]; | |
140 + int i, len_str_sig, n, paramn; | |
141 + size_t len_fsignal, len_indicator = strlen(indicator); | |
142 + Arg arg; | |
143 + | |
144 + // Get root name property | |
145 + if (gettextprop(root, XA_WM_NAME, fsignal, sizeof(fsignal))) { | |
146 + len_fsignal = strlen(fsignal); | |
147 + | |
148 + // Check if this is indeed a fake signal | |
149 + if (len_indicator > len_fsignal ? 0 : strncmp(indicator… | |
150 + paramn = sscanf(fsignal+len_indicator, "%s%n%s%… | |
151 + | |
152 + if (paramn == 1) arg = (Arg) {0}; | |
153 + else if (paramn > 2) return 1; | |
154 + else if (strncmp(param, "i", n - len_str_sig) =… | |
155 + sscanf(fsignal + len_indicator + n, "%i… | |
156 + else if (strncmp(param, "ui", n - len_str_sig) … | |
157 + sscanf(fsignal + len_indicator + n, "%u… | |
158 + else if (strncmp(param, "f", n - len_str_sig) =… | |
159 + sscanf(fsignal + len_indicator + n, "%f… | |
160 + else return 1; | |
161 + | |
162 + // Check if a signal was found, and if so handl… | |
163 + for (i = 0; i < LENGTH(signals); i++) | |
164 + if (strncmp(str_sig, signals[i].sig, le… | |
165 + signals[i].func(&(arg)); | |
166 + | |
167 + // A fake signal was sent | |
168 + return 1; | |
169 + } | |
170 + } | |
171 + | |
172 + // No fake signal was sent, so proceed with update | |
173 + return 0; | |
174 +} | |
175 + | |
176 void | |
177 killclient(const Arg *arg) | |
178 { | |
179 @@ -1215,8 +1264,10 @@ propertynotify(XEvent *e) | |
180 Window trans; | |
181 XPropertyEvent *ev = &e->xproperty; | |
182 | |
183 - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) | |
184 - updatestatus(); | |
185 + if ((ev->window == root) && (ev->atom == XA_WM_NAME)) { | |
186 + if (!fake_signal()) | |
187 + updatestatus(); | |
188 + } | |
189 else if (ev->state == PropertyDelete) | |
190 return; /* ignore */ | |
191 else if ((c = wintoclient(ev->window))) { | |
192 diff --git a/dwmc b/dwmc | |
193 new file mode 100755 | |
194 index 0000000..5ff8dbc | |
195 --- /dev/null | |
196 +++ b/dwmc | |
197 @@ -0,0 +1,40 @@ | |
198 +#!/usr/bin/env sh | |
199 + | |
200 +signal() { | |
201 + xsetroot -name "fsignal:$*" | |
202 +} | |
203 + | |
204 +case $# in | |
205 +1) | |
206 + case $1 in | |
207 + setlayout | view | viewall | togglebar | togglefloating | zoom … | |
208 + signal $1 | |
209 + ;; | |
210 + *) | |
211 + echo "Unknown command or missing one argument." | |
212 + exit 1 | |
213 + ;; | |
214 + esac | |
215 + ;; | |
216 +2) | |
217 + case $1 in | |
218 + view) | |
219 + signal $1 ui $2 | |
220 + ;; | |
221 + viewex | toggleviewex | tagex | toggletagex | setlayoutex | foc… | |
222 + signal $1 i $2 | |
223 + ;; | |
224 + setmfact) | |
225 + signal $1 f $2 | |
226 + ;; | |
227 + *) | |
228 + echo "Unknown command or one too many arguments." | |
229 + exit 1 | |
230 + ;; | |
231 + esac | |
232 + ;; | |
233 +*) | |
234 + echo "Too many arguments." | |
235 + exit 1 | |
236 + ;; | |
237 +esac | |
238 -- | |
239 2.25.1 | |
240 |