dwm-fsignal-6.2.diff - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
Refs | |
--- | |
dwm-fsignal-6.2.diff (3145B) | |
--- | |
1 From e7f523c898983c84ba3102675662dc33cbb5573e Mon Sep 17 00:00:00 2001 | |
2 From: Nihal Jere <[email protected]> | |
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, togglet… | |
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… | |
70 + memcpy(str_signum, &fsignal[len_indicator], len… | |
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 handl… | |
82 + if (signum) | |
83 + for (i = 0; i < LENGTH(signals); i++) | |
84 + if (signum == signals[i].signum… | |
85 + signals[i].func(&(signa… | |
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 |