dwmblocks-statuscmd-20210402-96cbb45.diff - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       dwmblocks-statuscmd-20210402-96cbb45.diff (3331B)
       ---
            1 From 1669878c08607f481e3f879d6914fc4d3c9d7206 Mon Sep 17 00:00:00 2001
            2 From: Daniel Bylinka <daniel.bylinka@gmail.com>
            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 = SA_SIGINFO };
           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].signal != signum-SIGRTMIN; i++);
           87 +
           88 +                        char shcmd[1024];
           89 +                        sprintf(shcmd, "%s; kill -%d %d", blocks[i].command, SIGRTMIN+blocks[i].signal, parent);
           90 +                        char *cmd[] = { "/bin/sh", "-c", shcmd, NULL };
           91 +                        char button[2] = { '0' + si->si_value.sival_int, '\0' };
           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