Introduction
Introduction Statistics Contact Development Disclaimer Help
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
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.