Upgraded the dwmblocks patch for statuscmd which changes the signalling
mechanism from SIGUSR1 to SIGRTMIN which is likely to cause issues for those that already have a working setup. A compatibility option has been added which changes this back to SIGUSR1. Note that configuration was also changed. This was ref. reported issue #114.
This commit is contained in:
@ -1,31 +1,50 @@
|
||||
static int dwmblockssig;
|
||||
pid_t dwmblockspid = 0;
|
||||
static int statussig;
|
||||
pid_t statuspid = -1;
|
||||
|
||||
int
|
||||
getdwmblockspid()
|
||||
pid_t
|
||||
getstatusbarpid()
|
||||
{
|
||||
char buf[16];
|
||||
FILE *fp = popen("pidof -s dwmblocks", "r");
|
||||
if (fgets(buf, sizeof(buf), fp));
|
||||
pid_t pid = strtoul(buf, NULL, 10);
|
||||
char buf[32], *str = buf, *c;
|
||||
FILE *fp;
|
||||
|
||||
if (statuspid > 0) {
|
||||
snprintf(buf, sizeof(buf), "/proc/%u/cmdline", statuspid);
|
||||
if ((fp = fopen(buf, "r"))) {
|
||||
fgets(buf, sizeof(buf), fp);
|
||||
while ((c = strchr(str, '/')))
|
||||
str = c + 1;
|
||||
fclose(fp);
|
||||
if (!strcmp(str, STATUSBAR))
|
||||
return statuspid;
|
||||
}
|
||||
}
|
||||
if (!(fp = popen("pidof -s "STATUSBAR, "r")))
|
||||
return -1;
|
||||
fgets(buf, sizeof(buf), fp);
|
||||
pclose(fp);
|
||||
dwmblockspid = pid;
|
||||
return pid != 0 ? 0 : -1;
|
||||
return strtol(buf, NULL, 10);
|
||||
}
|
||||
|
||||
void
|
||||
sigdwmblocks(const Arg *arg)
|
||||
sigstatusbar(const Arg *arg)
|
||||
{
|
||||
union sigval sv;
|
||||
sv.sival_int = (dwmblockssig << 8) | arg->i;
|
||||
if (!dwmblockspid)
|
||||
if (getdwmblockspid() == -1)
|
||||
return;
|
||||
|
||||
if (sigqueue(dwmblockspid, SIGUSR1, sv) == -1) {
|
||||
if (!statussig)
|
||||
return;
|
||||
if ((statuspid = getstatusbarpid()) <= 0)
|
||||
return;
|
||||
|
||||
#if BAR_DWMBLOCKS_SIGUSR1_PATCH
|
||||
sv.sival_int = (statussig << 8) | arg->i;
|
||||
if (sigqueue(statuspid, SIGUSR1, sv) == -1) {
|
||||
if (errno == ESRCH) {
|
||||
if (!getdwmblockspid())
|
||||
sigqueue(dwmblockspid, SIGUSR1, sv);
|
||||
if (!getstatusbarpid())
|
||||
sigqueue(statuspid, SIGUSR1, sv);
|
||||
}
|
||||
}
|
||||
#else
|
||||
sv.sival_int = arg->i;
|
||||
sigqueue(statuspid, SIGRTMIN+statussig, sv);
|
||||
#endif // BAR_DWMBLOCKS_SIGUSR1_PATCH
|
||||
}
|
@ -1,2 +1,2 @@
|
||||
static int getdwmblockspid();
|
||||
static void sigdwmblocks(const Arg *arg);
|
||||
static int getstatusbarpid();
|
||||
static void sigstatusbar(const Arg *arg);
|
@ -25,7 +25,7 @@ click_statuscmd_text(Arg *arg, int rel_x, char *text)
|
||||
int x = 0;
|
||||
char ch;
|
||||
#if BAR_DWMBLOCKS_PATCH
|
||||
dwmblockssig = -1;
|
||||
statussig = -1;
|
||||
#else
|
||||
statuscmdn = 0;
|
||||
#endif // BAR_DWMBLOCKS_PATCH
|
||||
@ -42,9 +42,9 @@ click_statuscmd_text(Arg *arg, int rel_x, char *text)
|
||||
text += i+1;
|
||||
i = -1;
|
||||
#if BAR_DWMBLOCKS_PATCH
|
||||
if (x >= rel_x && dwmblockssig != -1)
|
||||
if (x >= rel_x && statussig != -1)
|
||||
break;
|
||||
dwmblockssig = ch;
|
||||
statussig = ch;
|
||||
#else
|
||||
if (x >= rel_x)
|
||||
break;
|
||||
@ -54,8 +54,8 @@ click_statuscmd_text(Arg *arg, int rel_x, char *text)
|
||||
}
|
||||
}
|
||||
#if BAR_DWMBLOCKS_PATCH
|
||||
if (dwmblockssig == -1)
|
||||
dwmblockssig = 0;
|
||||
if (statussig == -1)
|
||||
statussig = 0;
|
||||
#endif // BAR_DWMBLOCKS_PATCH
|
||||
return ClkStatusText;
|
||||
}
|
||||
|
Reference in New Issue
Block a user