dwm-dwmc-6.2.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-dwmc-6.2.diff (5837B)
---
1 From d94cb6f1a553d19127f44dbdc96e8bb5041956c2 Mon Sep 17 00:00:00 2001
2 From: Nihal Jere <noocsharp@gmail.com>
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}/man1/dwm.1
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, toggletag, {0} },
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> <value>]"` */
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, fsignal, len_indicator) == 0) {
150 + paramn = sscanf(fsignal+len_indicator, "%s%n%s%n", str_sig, &len_str_sig, param, &n);
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) == 0)
155 + sscanf(fsignal + len_indicator + n, "%i", &(arg.i));
156 + else if (strncmp(param, "ui", n - len_str_sig) == 0)
157 + sscanf(fsignal + len_indicator + n, "%u", &(arg.ui));
158 + else if (strncmp(param, "f", n - len_str_sig) == 0)
159 + sscanf(fsignal + len_indicator + n, "%f", &(arg.f));
160 + else return 1;
161 +
162 + // Check if a signal was found, and if so handle it
163 + for (i = 0; i < LENGTH(signals); i++)
164 + if (strncmp(str_sig, signals[i].sig, len_str_sig) == 0 && signals[i].func)
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 | killclient | quit)
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 | focusstack | incnmaster | focusmon | tagmon)
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