dwm-fsignal-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-fsignal-6.2.diff (3145B)
---
1 From e7f523c898983c84ba3102675662dc33cbb5573e Mon Sep 17 00:00:00 2001
2 From: Nihal Jere <noocsharp@gmail.com>
3 Date: Sat, 21 Mar 2020 15:50:00 -0500
4 Subject: [PATCH] fsignal
5
6 ---
7 config.def.h | 7 +++++++
8 dwm.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++--
9 2 files changed, 59 insertions(+), 2 deletions(-)
10
11 diff --git a/config.def.h b/config.def.h
12 index 1c0b587..8d2e6e9 100644
13 --- a/config.def.h
14 +++ b/config.def.h
15 @@ -113,3 +113,10 @@ static Button buttons[] = {
16 { ClkTagBar, MODKEY, Button3, toggletag, {0} },
17 };
18
19 +/* signal definitions */
20 +/* signum must be greater than 0 */
21 +/* trigger signals using `xsetroot -name "fsignal:<signum>"` */
22 +static Signal signals[] = {
23 + /* signum function argument */
24 + { 1, setlayout, {.v = 0} },
25 +};
26 diff --git a/dwm.c b/dwm.c
27 index 4465af1..db2ee08 100644
28 --- a/dwm.c
29 +++ b/dwm.c
30 @@ -106,6 +106,12 @@ typedef struct {
31 const Arg arg;
32 } Key;
33
34 +typedef struct {
35 + unsigned int signum;
36 + void (*func)(const Arg *);
37 + const Arg arg;
38 +} Signal;
39 +
40 typedef struct {
41 const char *symbol;
42 void (*arrange)(Monitor *);
43 @@ -176,6 +182,7 @@ static void grabbuttons(Client *c, int focused);
44 static void grabkeys(void);
45 static void incnmaster(const Arg *arg);
46 static void keypress(XEvent *e);
47 +static int fake_signal(void);
48 static void killclient(const Arg *arg);
49 static void manage(Window w, XWindowAttributes *wa);
50 static void mappingnotify(XEvent *e);
51 @@ -998,6 +1005,47 @@ keypress(XEvent *e)
52 keys[i].func(&(keys[i].arg));
53 }
54
55 +int
56 +fake_signal(void)
57 +{
58 + char fsignal[256];
59 + char indicator[9] = "fsignal:";
60 + char str_signum[16];
61 + int i, v, signum;
62 + size_t len_fsignal, len_indicator = strlen(indicator);
63 +
64 + // Get root name property
65 + if (gettextprop(root, XA_WM_NAME, fsignal, sizeof(fsignal))) {
66 + len_fsignal = strlen(fsignal);
67 +
68 + // Check if this is indeed a fake signal
69 + if (len_indicator > len_fsignal ? 0 : strncmp(indicator, fsignal, len_indicator) == 0) {
70 + memcpy(str_signum, &fsignal[len_indicator], len_fsignal - len_indicator);
71 + str_signum[len_fsignal - len_indicator] = '\0';
72 +
73 + // Convert string value into managable integer
74 + for (i = signum = 0; i < strlen(str_signum); i++) {
75 + v = str_signum[i] - '0';
76 + if (v >= 0 && v <= 9) {
77 + signum = signum * 10 + v;
78 + }
79 + }
80 +
81 + // Check if a signal was found, and if so handle it
82 + if (signum)
83 + for (i = 0; i < LENGTH(signals); i++)
84 + if (signum == signals[i].signum && signals[i].func)
85 + signals[i].func(&(signals[i].arg));
86 +
87 + // A fake signal was sent
88 + return 1;
89 + }
90 + }
91 +
92 + // No fake signal was sent, so proceed with update
93 + return 0;
94 +}
95 +
96 void
97 killclient(const Arg *arg)
98 {
99 @@ -1215,8 +1263,10 @@ propertynotify(XEvent *e)
100 Window trans;
101 XPropertyEvent *ev = &e->xproperty;
102
103 - if ((ev->window == root) && (ev->atom == XA_WM_NAME))
104 - updatestatus();
105 + if ((ev->window == root) && (ev->atom == XA_WM_NAME)) {
106 + if (!fake_signal())
107 + updatestatus();
108 + }
109 else if (ev->state == PropertyDelete)
110 return; /* ignore */
111 else if ((c = wintoclient(ev->window))) {
112 --
113 2.25.1
114