summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.h8
-rw-r--r--dwm.c54
2 files changed, 60 insertions, 2 deletions
diff --git a/config.h b/config.h
index 7d96918..e94c31c 100644
--- a/config.h
+++ b/config.h
@@ -164,3 +164,11 @@ static const Button buttons[] = {
{ ClkTagBar, MODKEY, Button1, tag, {0} },
{ ClkTagBar, MODKEY, Button3, toggletag, {0} },
};
+
+/* signal definitions */
+/* signum must be greater than 0 */
+/* trigger signals using `xsetroot -name "fsignal:<signum>"` */
+static Signal signals[] = {
+ /* signum function argument */
+ { 1, setlayout, {.v = 0} },
+};
diff --git a/dwm.c b/dwm.c
index 3d1ac6b..091650c 100644
--- a/dwm.c
+++ b/dwm.c
@@ -107,6 +107,12 @@ typedef struct {
} Key;
typedef struct {
+ unsigned int signum;
+ void (*func)(const Arg *);
+ const Arg arg;
+} Signal;
+
+typedef struct {
const char *symbol;
void (*arrange)(Monitor *);
} Layout;
@@ -179,6 +185,7 @@ static void grabbuttons(Client *c, int focused);
static void grabkeys(void);
static void incnmaster(const Arg *arg);
static void keypress(XEvent *e);
+static int fake_signal(void);
static void killclient(const Arg *arg);
static void manage(Window w, XWindowAttributes *wa);
static void mappingnotify(XEvent *e);
@@ -1077,6 +1084,47 @@ keypress(XEvent *e)
keys[i].func(&(keys[i].arg));
}
+int
+fake_signal(void)
+{
+ char fsignal[256];
+ char indicator[9] = "fsignal:";
+ char str_signum[16];
+ int i, v, signum;
+ size_t len_fsignal, len_indicator = strlen(indicator);
+
+ // Get root name property
+ if (gettextprop(root, XA_WM_NAME, fsignal, sizeof(fsignal))) {
+ len_fsignal = strlen(fsignal);
+
+ // Check if this is indeed a fake signal
+ if (len_indicator > len_fsignal ? 0 : strncmp(indicator, fsignal, len_indicator) == 0) {
+ memcpy(str_signum, &fsignal[len_indicator], len_fsignal - len_indicator);
+ str_signum[len_fsignal - len_indicator] = '\0';
+
+ // Convert string value into managable integer
+ for (i = signum = 0; i < strlen(str_signum); i++) {
+ v = str_signum[i] - '0';
+ if (v >= 0 && v <= 9) {
+ signum = signum * 10 + v;
+ }
+ }
+
+ // Check if a signal was found, and if so handle it
+ if (signum)
+ for (i = 0; i < LENGTH(signals); i++)
+ if (signum == signals[i].signum && signals[i].func)
+ signals[i].func(&(signals[i].arg));
+
+ // A fake signal was sent
+ return 1;
+ }
+ }
+
+ // No fake signal was sent, so proceed with update
+ return 0;
+}
+
void
killclient(const Arg *arg)
{
@@ -1280,8 +1328,10 @@ propertynotify(XEvent *e)
Window trans;
XPropertyEvent *ev = &e->xproperty;
- if ((ev->window == root) && (ev->atom == XA_WM_NAME))
- updatestatus();
+ if ((ev->window == root) && (ev->atom == XA_WM_NAME)) {
+ if (!fake_signal())
+ updatestatus();
+ }
else if (ev->state == PropertyDelete)
return; /* ignore */
else if ((c = wintoclient(ev->window))) {