| dwmblocks-statuscmd-20210402-96cbb45.diff - sites - public wiki contents of suc… | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| dwmblocks-statuscmd-20210402-96cbb45.diff (3331B) | |
| --- | |
| 1 From 1669878c08607f481e3f879d6914fc4d3c9d7206 Mon Sep 17 00:00:00 2001 | |
| 2 From: Daniel Bylinka <[email protected]> | |
| 3 Date: Fri, 2 Apr 2021 19:20:17 +0200 | |
| 4 Subject: [PATCH] [statuscmd] Format status text and handle button signals | |
| 5 | |
| 6 --- | |
| 7 dwmblocks.c | 48 +++++++++++++++++++++++++++++++++++++++++------- | |
| 8 1 file changed, 41 insertions(+), 7 deletions(-) | |
| 9 | |
| 10 diff --git a/dwmblocks.c b/dwmblocks.c | |
| 11 index ded717c..78fdeb5 100644 | |
| 12 --- a/dwmblocks.c | |
| 13 +++ b/dwmblocks.c | |
| 14 @@ -3,6 +3,7 @@ | |
| 15 #include<string.h> | |
| 16 #include<unistd.h> | |
| 17 #include<signal.h> | |
| 18 +#include<sys/wait.h> | |
| 19 #ifndef NO_X | |
| 20 #include<X11/Xlib.h> | |
| 21 #endif | |
| 22 @@ -27,14 +28,14 @@ typedef struct { | |
| 23 #ifndef __OpenBSD__ | |
| 24 void dummysighandler(int num); | |
| 25 #endif | |
| 26 -void sighandler(int num); | |
| 27 void getcmds(int time); | |
| 28 void getsigcmds(unsigned int signal); | |
| 29 void setupsignals(); | |
| 30 -void sighandler(int signum); | |
| 31 +void sighandler(int signum, siginfo_t *si, void *ucontext); | |
| 32 int getstatus(char *str, char *last); | |
| 33 void statusloop(); | |
| 34 void termhandler(); | |
| 35 +void chldhandler(); | |
| 36 void pstdout(); | |
| 37 #ifndef NO_X | |
| 38 void setroot(); | |
| 39 @@ -58,6 +59,8 @@ static int returnStatus = 0; | |
| 40 //opens process *cmd and stores output in *output | |
| 41 void getcmd(const Block *block, char *output) | |
| 42 { | |
| 43 + if (block->signal) | |
| 44 + *output++ = block->signal; | |
| 45 strcpy(output, block->icon); | |
| 46 FILE *cmdf = popen(block->command, "r"); | |
| 47 if (!cmdf) | |
| 48 @@ -102,15 +105,18 @@ void getsigcmds(unsigned int signal) | |
| 49 | |
| 50 void setupsignals() | |
| 51 { | |
| 52 + struct sigaction sa = { .sa_sigaction = sighandler, .sa_flags =… | |
| 53 #ifndef __OpenBSD__ | |
| 54 /* initialize all real time signals with dummy handler */ | |
| 55 - for (int i = SIGRTMIN; i <= SIGRTMAX; i++) | |
| 56 + for (int i = SIGRTMIN; i <= SIGRTMAX; i++) { | |
| 57 signal(i, dummysighandler); | |
| 58 + sigaddset(&sa.sa_mask, i); | |
| 59 + } | |
| 60 #endif | |
| 61 | |
| 62 for (unsigned int i = 0; i < LENGTH(blocks); i++) { | |
| 63 if (blocks[i].signal > 0) | |
| 64 - signal(SIGMINUS+blocks[i].signal, sighandler); | |
| 65 + sigaction(SIGMINUS+blocks[i].signal, &sa, NULL); | |
| 66 } | |
| 67 | |
| 68 } | |
| 69 @@ -178,10 +184,32 @@ void dummysighandler(int signum) | |
| 70 } | |
| 71 #endif | |
| 72 | |
| 73 -void sighandler(int signum) | |
| 74 +void sighandler(int signum, siginfo_t *si, void *ucontext) | |
| 75 { | |
| 76 - getsigcmds(signum-SIGPLUS); | |
| 77 - writestatus(); | |
| 78 + if (si->si_value.sival_int) { | |
| 79 + pid_t parent = getpid(); | |
| 80 + if (fork() == 0) { | |
| 81 +#ifndef NO_X | |
| 82 + if (dpy) | |
| 83 + close(ConnectionNumber(dpy)); | |
| 84 +#endif | |
| 85 + int i; | |
| 86 + for (i = 0; i < LENGTH(blocks) && blocks[i].sig… | |
| 87 + | |
| 88 + char shcmd[1024]; | |
| 89 + sprintf(shcmd, "%s; kill -%d %d", blocks[i].com… | |
| 90 + char *cmd[] = { "/bin/sh", "-c", shcmd, NULL }; | |
| 91 + char button[2] = { '0' + si->si_value.sival_int… | |
| 92 + setenv("BUTTON", button, 1); | |
| 93 + setsid(); | |
| 94 + execvp(cmd[0], cmd); | |
| 95 + perror(cmd[0]); | |
| 96 + exit(EXIT_SUCCESS); | |
| 97 + } | |
| 98 + } else { | |
| 99 + getsigcmds(signum-SIGPLUS); | |
| 100 + writestatus(); | |
| 101 + } | |
| 102 } | |
| 103 | |
| 104 void termhandler() | |
| 105 @@ -189,6 +217,11 @@ void termhandler() | |
| 106 statusContinue = 0; | |
| 107 } | |
| 108 | |
| 109 +void chldhandler() | |
| 110 +{ | |
| 111 + while (0 < waitpid(-1, NULL, WNOHANG)); | |
| 112 +} | |
| 113 + | |
| 114 int main(int argc, char** argv) | |
| 115 { | |
| 116 for (int i = 0; i < argc; i++) {//Handle command line arguments | |
| 117 @@ -205,6 +238,7 @@ int main(int argc, char** argv) | |
| 118 delim[delimLen++] = '\0'; | |
| 119 signal(SIGTERM, termhandler); | |
| 120 signal(SIGINT, termhandler); | |
| 121 + signal(SIGCHLD, chldhandler); | |
| 122 statusloop(); | |
| 123 #ifndef NO_X | |
| 124 XCloseDisplay(dpy); | |
| 125 -- | |
| 126 2.31.0 | |
| 127 |