aboutsummaryrefslogtreecommitdiff
path: root/patches
diff options
context:
space:
mode:
authorLuke Smith <luke@lukesmith.xyz>2020-05-04 15:27:46 -0400
committerLuke Smith <luke@lukesmith.xyz>2020-05-04 15:27:46 -0400
commitff41f8e71ec6fafdcc8fa25367d5ad01dbdd8519 (patch)
tree6bb67ff1636d7a4f37caf13507c87154648efef2 /patches
parenta0ebcc3f5448204a9414691fea0f496404f81560 (diff)
downloaddwmblocks-ff41f8e71ec6fafdcc8fa25367d5ad01dbdd8519.tar.gz
dwmblocks-ff41f8e71ec6fafdcc8fa25367d5ad01dbdd8519.tar.bz2
dwmblocks-ff41f8e71ec6fafdcc8fa25367d5ad01dbdd8519.zip
statuscmd programs forked
Diffstat (limited to 'patches')
-rw-r--r--patches/dwmblocks-statuscmd-fork.diff77
1 files changed, 77 insertions, 0 deletions
diff --git a/patches/dwmblocks-statuscmd-fork.diff b/patches/dwmblocks-statuscmd-fork.diff
new file mode 100644
index 0000000..1ae7d7a
--- /dev/null
+++ b/patches/dwmblocks-statuscmd-fork.diff
@@ -0,0 +1,77 @@
+diff --git a/dwmblocks.c b/dwmblocks.c
+index 7d7a564..e2c5dd0 100644
+--- a/dwmblocks.c
++++ b/dwmblocks.c
+@@ -34,8 +34,6 @@ static int screen;
+ static Window root;
+ static char statusbar[LENGTH(blocks)][CMDLENGTH] = {0};
+ static char statusstr[2][256];
+-static char exportstring[CMDLENGTH + 22] = "export BLOCK_BUTTON=-;";
+-static int button = 0;
+ static int statusContinue = 1;
+ static void (*writestatus) () = setroot;
+
+@@ -55,21 +53,8 @@ void getcmd(const Block *block, char *output)
+ output[0] = block->signal;
+ output++;
+ }
+- char* cmd;
+- FILE *cmdf;
+- if (button)
+- {
+- cmd = strcat(exportstring, block->command);
+- cmd[20] = '0' + button;
+- button = 0;
+- cmdf = popen(cmd,"r");
+- cmd[22] = '\0';
+- }
+- else
+- {
+- cmd = block->command;
+- cmdf = popen(cmd,"r");
+- }
++ char *cmd = block->command;
++ FILE *cmdf = popen(cmd,"r");
+ if (!cmdf)
+ return;
+ fgets(output, CMDLENGTH, cmdf);
+@@ -117,6 +102,7 @@ void setupsignals()
+ sa.sa_sigaction = buttonhandler;
+ sa.sa_flags = SA_SIGINFO;
+ sigaction(SIGUSR1, &sa, NULL);
++ signal(SIGCHLD, SIG_IGN);
+
+ }
+ #endif
+@@ -179,9 +165,29 @@ void sighandler(int signum)
+
+ void buttonhandler(int sig, siginfo_t *si, void *ucontext)
+ {
+- button = si->si_value.sival_int & 0xff;
+- getsigcmds(si->si_value.sival_int >> 8);
++ int button = si->si_value.sival_int & 0xff;
++ sig = si->si_value.sival_int >> 8;
++ getsigcmds(sig);
+ writestatus();
++ if (fork() == 0)
++ {
++ static char exportstring[CMDLENGTH + 22] = "export BLOCK_BUTTON=-;";
++ const Block *current;
++ int i;
++ for (i = 0; i < LENGTH(blocks); i++)
++ {
++ current = blocks + i;
++ if (current->signal == sig)
++ break;
++ }
++ char *cmd = strcat(exportstring, blocks[i].command);
++ cmd[20] = '0' + button;
++ char *command[] = { "/bin/sh", "-c", cmd, NULL };
++ setsid();
++ execvp(command[0], command);
++ exit(EXIT_SUCCESS);
++ cmd[22] = '\0';
++ }
+ }
+
+ #endif