aboutsummaryrefslogtreecommitdiff
path: root/dwmblocks.c
diff options
context:
space:
mode:
Diffstat (limited to 'dwmblocks.c')
-rw-r--r--dwmblocks.c50
1 files changed, 43 insertions, 7 deletions
diff --git a/dwmblocks.c b/dwmblocks.c
index 88bdfb0..0cd0b54 100644
--- a/dwmblocks.c
+++ b/dwmblocks.c
@@ -14,6 +14,7 @@ typedef struct {
unsigned int signal;
} Block;
void sighandler(int num);
+void buttonhandler(int sig, siginfo_t *si, void *ucontext);
void replace(char *str, char old, char new);
void getcmds(int time);
#ifndef __OpenBSD__
@@ -27,13 +28,15 @@ void statusloop();
void termhandler(int signum);
-#include "blocks.h"
+#include "config.h"
static Display *dpy;
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;
@@ -48,16 +51,34 @@ void replace(char *str, char old, char new)
//opens process *cmd and stores output in *output
void getcmd(const Block *block, char *output)
{
+ if (block->signal)
+ {
+ output[0] = block->signal;
+ output++;
+ }
strcpy(output, block->icon);
- char *cmd = block->command;
- FILE *cmdf = popen(cmd,"r");
+ 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");
+ }
if (!cmdf)
return;
char c;
int i = strlen(block->icon);
fgets(output+i, CMDLENGTH-i, cmdf);
i = strlen(output);
- if (delim != '\0' && --i)
+ if (delim != '\0' && i)
output[i++] = delim;
output[i++] = '\0';
pclose(cmdf);
@@ -67,7 +88,7 @@ void getcmds(int time)
{
const Block* current;
for(int i = 0; i < LENGTH(blocks); i++)
- {
+ {
current = blocks + i;
if ((current->interval != 0 && time % current->interval == 0) || time == -1)
getcmd(current,statusbar[i]);
@@ -88,11 +109,18 @@ void getsigcmds(int signal)
void setupsignals()
{
+ struct sigaction sa;
for(int i = 0; i < LENGTH(blocks); i++)
- {
+ {
if (blocks[i].signal > 0)
+ {
signal(SIGRTMIN+blocks[i].signal, sighandler);
+ sigaddset(&sa.sa_mask, SIGRTMIN+blocks[i].signal);
+ }
}
+ sa.sa_sigaction = buttonhandler;
+ sa.sa_flags = SA_SIGINFO;
+ sigaction(SIGUSR1, &sa, NULL);
}
#endif
@@ -152,6 +180,14 @@ void sighandler(int signum)
getsigcmds(signum-SIGRTMIN);
writestatus();
}
+
+void buttonhandler(int sig, siginfo_t *si, void *ucontext)
+{
+ button = si->si_value.sival_int & 0xff;
+ getsigcmds(si->si_value.sival_int >> 8);
+ writestatus();
+}
+
#endif
void termhandler(int signum)
@@ -163,7 +199,7 @@ void termhandler(int signum)
int main(int argc, char** argv)
{
for(int i = 0; i < argc; i++)
- {
+ {
if (!strcmp("-d",argv[i]))
delim = argv[++i][0];
else if(!strcmp("-p",argv[i]))