diff options
Diffstat (limited to 'patch')
| -rw-r--r-- | patch/dwmc.c | 29 | ||||
| -rw-r--r-- | patch/fsignal.c | 40 | ||||
| -rw-r--r-- | patch/fsignal.h | 7 | ||||
| -rw-r--r-- | patch/include.c | 2 | ||||
| -rw-r--r-- | patch/include.h | 2 |
5 files changed, 51 insertions, 29 deletions
diff --git a/patch/dwmc.c b/patch/dwmc.c index bd71d80..8b62cda 100644 --- a/patch/dwmc.c +++ b/patch/dwmc.c @@ -40,35 +40,6 @@ tagallex(const Arg *arg) tag(&((Arg){.ui = ~0})); } -/* signal definitions */ -/* signum must be greater than 0 */ -/* trigger signals using `xsetroot -name "fsignal:<signame> [<type> <value>]"` */ -static Signal signals[] = { - /* signum function */ - { "focusstack", focusstack }, - { "setmfact", setmfact }, - { "togglebar", togglebar }, - { "incnmaster", incnmaster }, - { "togglefloating", togglefloating }, - { "focusmon", focusmon }, - { "tagmon", tagmon }, - { "zoom", zoom }, - { "view", view }, - { "viewall", viewallex }, - { "viewex", viewex }, - { "toggleview", view }, - { "toggleviewex", toggleviewex }, - { "tag", tag }, - { "tagall", tagallex }, - { "tagex", tagex }, - { "toggletag", tag }, - { "toggletagex", toggletagex }, - { "killclient", killclient }, - { "quit", quit }, - { "setlayout", setlayout }, - { "setlayoutex", setlayoutex }, -}; - int fake_signal(void) { diff --git a/patch/fsignal.c b/patch/fsignal.c new file mode 100644 index 0000000..8ae237b --- /dev/null +++ b/patch/fsignal.c @@ -0,0 +1,40 @@ +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; +}
\ No newline at end of file diff --git a/patch/fsignal.h b/patch/fsignal.h new file mode 100644 index 0000000..bfb56af --- /dev/null +++ b/patch/fsignal.h @@ -0,0 +1,7 @@ +typedef struct { + unsigned int signum; + void (*func)(const Arg *); + const Arg arg; +} Signal; + +static int fake_signal(void);
\ No newline at end of file diff --git a/patch/include.c b/patch/include.c index 737bdc1..0b3c0d5 100644 --- a/patch/include.c +++ b/patch/include.c @@ -28,6 +28,8 @@ #endif #if DWMC_PATCH #include "dwmc.c" +#elif FSIGNAL_PATCH +#include "fsignal.c" #endif #if EWMHTAGS_PATCH #include "ewmhtags.c" diff --git a/patch/include.h b/patch/include.h index 8406e37..96f9a4b 100644 --- a/patch/include.h +++ b/patch/include.h @@ -28,6 +28,8 @@ #endif #if DWMC_PATCH #include "dwmc.h" +#elif FSIGNAL_PATCH +#include "fsignal.h" #endif #if EWMHTAGS_PATCH #include "ewmhtags.h" |
