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