From 9fd55010d39a04cccf17ab59cdd2d81c4e2acd91 Mon Sep 17 00:00:00 2001 From: Solomon Laing Date: Mon, 24 Apr 2023 20:20:39 +0930 Subject: [PATCH] patched statuscmd/signal --- blocks.def.h | 16 +-- dwmblocks.c | 48 ++++++- .../dwmblocks-statuscmd-20210402-96cbb45.diff | 127 ++++++++++++++++++ 3 files changed, 176 insertions(+), 15 deletions(-) create mode 100644 patches/dwmblocks-statuscmd-20210402-96cbb45.diff diff --git a/blocks.def.h b/blocks.def.h index 7d422b5..92a2acc 100644 --- a/blocks.def.h +++ b/blocks.def.h @@ -2,15 +2,15 @@ // recompile using the make command. static const Block blocks[] = { /*Icon*/ /*Command*/ /*Update Interval*/ /*Update Signal*/ - {" ", "", 1000, 0}, - {"", "status-bat", 1, 0}, - {"", "status-vol", 1, 0}, - {" ", "free -h | awk '/^Mem/ { print $3\"/\"$2 }' | sed s/i//g", 30, 0}, - {"", "status-disk", 30, 0}, - {" ", "date '+%a %Y-%m-%d %H:%M'", 5, 0}, - {"", "status-net", 1, 0}, + {" ", "", 1000, 1}, + {"", "status-bat", 5, 2}, + {"", "status-vol", 0, 3}, + {" ", "free -h | awk '/^Mem/ { print $3\"/\"$2 }' | sed s/i//g", 30, 4}, + {"", "status-disk", 30, 5}, + {" ", "date '+%a %Y-%m-%d %H:%M'", 60, 6}, + {"", "status-net", 1, 7}, {"", "status-packages", 5, 8}, - {" ", "", 1000, 0}, + {" ", "", 1000, 30}, }; // sets delimeter between status commands. NULL character ('\0') means no diff --git a/dwmblocks.c b/dwmblocks.c index befd252..a811f76 100644 --- a/dwmblocks.c +++ b/dwmblocks.c @@ -3,6 +3,7 @@ #include #include #include +#include #ifndef NO_X #include #endif @@ -27,14 +28,14 @@ typedef struct { #ifndef __OpenBSD__ void dummysighandler(int num); #endif -void sighandler(int num); void getcmds(int time); void getsigcmds(unsigned int signal); void setupsignals(); -void sighandler(int signum); +void sighandler(int signum, siginfo_t *si, void *ucontext); int getstatus(char *str, char *last); void statusloop(); void termhandler(); +void chldhandler(); void pstdout(); #ifndef NO_X void setroot(); @@ -58,6 +59,8 @@ static int returnStatus = 0; //opens process *cmd and stores output in *output void getcmd(const Block *block, char *output) { + if (block->signal) + *output++ = block->signal; strcpy(output, block->icon); FILE *cmdf = popen(block->command, "r"); if (!cmdf) @@ -102,15 +105,18 @@ void getsigcmds(unsigned int signal) void setupsignals() { + struct sigaction sa = { .sa_sigaction = sighandler, .sa_flags = SA_SIGINFO }; #ifndef __OpenBSD__ /* initialize all real time signals with dummy handler */ - for (int i = SIGRTMIN; i <= SIGRTMAX; i++) + for (int i = SIGRTMIN; i <= SIGRTMAX; i++) { signal(i, dummysighandler); + sigaddset(&sa.sa_mask, i); + } #endif for (unsigned int i = 0; i < LENGTH(blocks); i++) { if (blocks[i].signal > 0) - signal(SIGMINUS+blocks[i].signal, sighandler); + sigaction(SIGMINUS+blocks[i].signal, &sa, NULL); } } @@ -178,10 +184,32 @@ void dummysighandler(int signum) } #endif -void sighandler(int signum) +void sighandler(int signum, siginfo_t *si, void *ucontext) { - getsigcmds(signum-SIGPLUS); - writestatus(); + if (si->si_value.sival_int) { + pid_t parent = getpid(); + if (fork() == 0) { +#ifndef NO_X + if (dpy) + close(ConnectionNumber(dpy)); +#endif + int i; + for (i = 0; i < LENGTH(blocks) && blocks[i].signal != signum-SIGRTMIN; i++); + + char shcmd[1024]; + sprintf(shcmd, "%s; kill -%d %d", blocks[i].command, SIGRTMIN+blocks[i].signal, parent); + char *cmd[] = { "/bin/sh", "-c", shcmd, NULL }; + char button[2] = { '0' + si->si_value.sival_int, '\0' }; + setenv("BUTTON", button, 1); + setsid(); + execvp(cmd[0], cmd); + perror(cmd[0]); + exit(EXIT_SUCCESS); + } + } else { + getsigcmds(signum-SIGPLUS); + writestatus(); + } } void termhandler() @@ -189,6 +217,11 @@ void termhandler() statusContinue = 0; } +void chldhandler() +{ + while (0 < waitpid(-1, NULL, WNOHANG)); +} + int main(int argc, char** argv) { for (int i = 0; i < argc; i++) {//Handle command line arguments @@ -205,6 +238,7 @@ int main(int argc, char** argv) delim[delimLen++] = '\0'; signal(SIGTERM, termhandler); signal(SIGINT, termhandler); + signal(SIGCHLD, chldhandler); statusloop(); #ifndef NO_X XCloseDisplay(dpy); diff --git a/patches/dwmblocks-statuscmd-20210402-96cbb45.diff b/patches/dwmblocks-statuscmd-20210402-96cbb45.diff new file mode 100644 index 0000000..bb2cbb6 --- /dev/null +++ b/patches/dwmblocks-statuscmd-20210402-96cbb45.diff @@ -0,0 +1,127 @@ +From 1669878c08607f481e3f879d6914fc4d3c9d7206 Mon Sep 17 00:00:00 2001 +From: Daniel Bylinka +Date: Fri, 2 Apr 2021 19:20:17 +0200 +Subject: [PATCH] [statuscmd] Format status text and handle button signals + +--- + dwmblocks.c | 48 +++++++++++++++++++++++++++++++++++++++++------- + 1 file changed, 41 insertions(+), 7 deletions(-) + +diff --git a/dwmblocks.c b/dwmblocks.c +index ded717c..78fdeb5 100644 +--- a/dwmblocks.c ++++ b/dwmblocks.c +@@ -3,6 +3,7 @@ + #include + #include + #include ++#include + #ifndef NO_X + #include + #endif +@@ -27,14 +28,14 @@ typedef struct { + #ifndef __OpenBSD__ + void dummysighandler(int num); + #endif +-void sighandler(int num); + void getcmds(int time); + void getsigcmds(unsigned int signal); + void setupsignals(); +-void sighandler(int signum); ++void sighandler(int signum, siginfo_t *si, void *ucontext); + int getstatus(char *str, char *last); + void statusloop(); + void termhandler(); ++void chldhandler(); + void pstdout(); + #ifndef NO_X + void setroot(); +@@ -58,6 +59,8 @@ static int returnStatus = 0; + //opens process *cmd and stores output in *output + void getcmd(const Block *block, char *output) + { ++ if (block->signal) ++ *output++ = block->signal; + strcpy(output, block->icon); + FILE *cmdf = popen(block->command, "r"); + if (!cmdf) +@@ -102,15 +105,18 @@ void getsigcmds(unsigned int signal) + + void setupsignals() + { ++ struct sigaction sa = { .sa_sigaction = sighandler, .sa_flags = SA_SIGINFO }; + #ifndef __OpenBSD__ + /* initialize all real time signals with dummy handler */ +- for (int i = SIGRTMIN; i <= SIGRTMAX; i++) ++ for (int i = SIGRTMIN; i <= SIGRTMAX; i++) { + signal(i, dummysighandler); ++ sigaddset(&sa.sa_mask, i); ++ } + #endif + + for (unsigned int i = 0; i < LENGTH(blocks); i++) { + if (blocks[i].signal > 0) +- signal(SIGMINUS+blocks[i].signal, sighandler); ++ sigaction(SIGMINUS+blocks[i].signal, &sa, NULL); + } + + } +@@ -178,10 +184,32 @@ void dummysighandler(int signum) + } + #endif + +-void sighandler(int signum) ++void sighandler(int signum, siginfo_t *si, void *ucontext) + { +- getsigcmds(signum-SIGPLUS); +- writestatus(); ++ if (si->si_value.sival_int) { ++ pid_t parent = getpid(); ++ if (fork() == 0) { ++#ifndef NO_X ++ if (dpy) ++ close(ConnectionNumber(dpy)); ++#endif ++ int i; ++ for (i = 0; i < LENGTH(blocks) && blocks[i].signal != signum-SIGRTMIN; i++); ++ ++ char shcmd[1024]; ++ sprintf(shcmd, "%s; kill -%d %d", blocks[i].command, SIGRTMIN+blocks[i].signal, parent); ++ char *cmd[] = { "/bin/sh", "-c", shcmd, NULL }; ++ char button[2] = { '0' + si->si_value.sival_int, '\0' }; ++ setenv("BUTTON", button, 1); ++ setsid(); ++ execvp(cmd[0], cmd); ++ perror(cmd[0]); ++ exit(EXIT_SUCCESS); ++ } ++ } else { ++ getsigcmds(signum-SIGPLUS); ++ writestatus(); ++ } + } + + void termhandler() +@@ -189,6 +217,11 @@ void termhandler() + statusContinue = 0; + } + ++void chldhandler() ++{ ++ while (0 < waitpid(-1, NULL, WNOHANG)); ++} ++ + int main(int argc, char** argv) + { + for (int i = 0; i < argc; i++) {//Handle command line arguments +@@ -205,6 +238,7 @@ int main(int argc, char** argv) + delim[delimLen++] = '\0'; + signal(SIGTERM, termhandler); + signal(SIGINT, termhandler); ++ signal(SIGCHLD, chldhandler); + statusloop(); + #ifndef NO_X + XCloseDisplay(dpy); +-- +2.31.0 +