sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

commit 1e20c8bda53bd22d2540abfc39801f81d8f01b49
parent 3c8bab4f472138c58a5f44e22022b7ee5234cf1e
Author: Nihal Jere <nihal@nihaljere.xyz>
Date:   Sat, 21 Mar 2020 15:56:08 -0500

[dwm][patch] fsignal: window titles now update properly

Diffstat:
Ddwm.suckless.org/patches/fsignal/dwm-fsignal-6.1.diff | 97-------------------------------------------------------------------------------
Adwm.suckless.org/patches/fsignal/dwm-fsignal-6.2.diff | 114+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdwm.suckless.org/patches/fsignal/index.md | 3++-
3 files changed, 116 insertions(+), 98 deletions(-)

diff --git a/dwm.suckless.org/patches/fsignal/dwm-fsignal-6.1.diff b/dwm.suckless.org/patches/fsignal/dwm-fsignal-6.1.diff @@ -1,97 +0,0 @@ -diff -up dwm-6.1/config.def.h dwm-6.1_FSIGNAL/config.def.h ---- dwm-6.1/config.def.h 2015-11-08 23:11:48.000000000 +0100 -+++ dwm-6.1_FSIGNAL/config.def.h 2018-03-29 21:34:43.218114924 +0200 -@@ -111,3 +111,10 @@ static Button buttons[] = { - { 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} }, -+}; -Only in dwm-6.1_FSIGNAL/: config.h -diff -up dwm-6.1/dwm.c dwm-6.1_FSIGNAL/dwm.c ---- dwm-6.1/dwm.c 2015-11-08 23:11:48.000000000 +0100 -+++ dwm-6.1_FSIGNAL/dwm.c 2018-03-29 21:22:07.697560231 +0200 -@@ -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; -@@ -177,6 +183,7 @@ static void grabbuttons(Client *c, int f - 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); -@@ -1013,6 +1020,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) - { -@@ -1233,7 +1281,8 @@ propertynotify(XEvent *e) - XPropertyEvent *ev = &e->xproperty; - - if ((ev->window == root) && (ev->atom == XA_WM_NAME)) -- updatestatus(); -+ if (!fake_signal()) -+ updatestatus(); - else if (ev->state == PropertyDelete) - return; /* ignore */ - else if ((c = wintoclient(ev->window))) { diff --git a/dwm.suckless.org/patches/fsignal/dwm-fsignal-6.2.diff b/dwm.suckless.org/patches/fsignal/dwm-fsignal-6.2.diff @@ -0,0 +1,114 @@ +From e7f523c898983c84ba3102675662dc33cbb5573e Mon Sep 17 00:00:00 2001 +From: Nihal Jere <noocsharp@gmail.com> +Date: Sat, 21 Mar 2020 15:50:00 -0500 +Subject: [PATCH] fsignal + +--- + config.def.h | 7 +++++++ + dwm.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++-- + 2 files changed, 59 insertions(+), 2 deletions(-) + +diff --git a/config.def.h b/config.def.h +index 1c0b587..8d2e6e9 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -113,3 +113,10 @@ static Button buttons[] = { + { 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 4465af1..db2ee08 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -106,6 +106,12 @@ typedef struct { + const Arg arg; + } Key; + ++typedef struct { ++ unsigned int signum; ++ void (*func)(const Arg *); ++ const Arg arg; ++} Signal; ++ + typedef struct { + const char *symbol; + void (*arrange)(Monitor *); +@@ -176,6 +182,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); +@@ -998,6 +1005,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) + { +@@ -1215,8 +1263,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))) { +-- +2.25.1 + diff --git a/dwm.suckless.org/patches/fsignal/index.md b/dwm.suckless.org/patches/fsignal/index.md @@ -35,8 +35,9 @@ This can then be triggered through dmenu with this script: Download -------- -* [dwm-fsignal-6.1.diff](dwm-fsignal-6.1.diff) +* [dwm-fsignal-6.2.diff](dwm-fsignal-6.2.diff) Authors ------- * Chris Noxz - <chris@noxz.tech> +* Nihal Jere <nihal@nihaljere.xyz>