Refresh all blocks on receiving SIGUSR1

This commit is contained in:
Utkarsh Verma 2022-02-16 14:11:07 +05:30
parent 4f4976500a
commit 1676c07b8f
No known key found for this signature in database
GPG Key ID: 817656CF818EFCCC
2 changed files with 15 additions and 4 deletions

View File

@ -113,6 +113,8 @@ My volume block *never* updates on its own, instead I have this command run alon
Note that all blocks must have different signal numbers. Note that all blocks must have different signal numbers.
Apart from this, you can also refresh all the blocks by sending `SIGUSR1` to `dwmblocks-async` using either `pkill -SIGUSR1 dwmblocks` or `kill -10 $(pidof dwmblocks)`.
### Clickable blocks ### Clickable blocks
Like `i3blocks`, this build allows you to build in additional actions into your scripts in response to click events. You can check out [my statusbar scripts](https://github.com/UtkarshVerma/dotfiles/tree/main/.local/bin/statusbar) as references for using the `$BLOCK_BUTTON` variable. Like `i3blocks`, this build allows you to build in additional actions into your scripts in response to click events. You can check out [my statusbar scripts](https://github.com/UtkarshVerma/dotfiles/tree/main/.local/bin/statusbar) as references for using the `$BLOCK_BUTTON` variable.

17
main.c
View File

@ -38,7 +38,7 @@ typedef const struct {
static Display* dpy; static Display* dpy;
static int screen; static int screen;
static Window root; static Window root;
static unsigned short int statusContinue = 1; static unsigned short statusContinue = 1;
static char outputs[LEN(blocks)][CMDLENGTH + 1 + CLICKABLE_BLOCKS]; static char outputs[LEN(blocks)][CMDLENGTH + 1 + CLICKABLE_BLOCKS];
static char statusBar[2][LEN(blocks) * (LEN(outputs[0]) - 1) + (LEN(blocks) - 1 + LEADING_DELIMITER) * (LEN(DELIMITER) - 1) + 1]; static char statusBar[2][LEN(blocks) * (LEN(outputs[0]) - 1) + (LEN(blocks) - 1 + LEADING_DELIMITER) * (LEN(DELIMITER) - 1) + 1];
static struct epoll_event event, events[LEN(blocks) + 2]; static struct epoll_event event, events[LEN(blocks) + 2];
@ -167,9 +167,16 @@ void setRoot() {
void signalHandler() { void signalHandler() {
struct signalfd_siginfo info; struct signalfd_siginfo info;
read(signalFD, &info, sizeof(info)); read(signalFD, &info, sizeof(info));
unsigned int signal = info.ssi_signo;
// Update all blocks on receiving SIGUSR1
if (signal == SIGUSR1) {
execBlocks(0);
return;
}
for (int j = 0; j < LEN(blocks); j++) { for (int j = 0; j < LEN(blocks); j++) {
if (blocks[j].signal == info.ssi_signo - SIGRTMIN) { if (blocks[j].signal == signal - SIGRTMIN) {
char button[] = {'0' + info.ssi_int & 0xff, 0}; char button[] = {'0' + info.ssi_int & 0xff, 0};
execBlock(j, button); execBlock(j, button);
break; break;
@ -182,9 +189,10 @@ void termHandler() {
} }
void setupSignals() { void setupSignals() {
// Ignore all realtime signals // Ignore SIGUSR1 and all realtime signals
sigset_t ignoredSignals; sigset_t ignoredSignals;
sigemptyset(&ignoredSignals); sigemptyset(&ignoredSignals);
sigaddset(&ignoredSignals, SIGUSR1);
for (int i = SIGRTMIN; i <= SIGRTMAX; i++) for (int i = SIGRTMIN; i <= SIGRTMAX; i++)
sigaddset(&ignoredSignals, i); sigaddset(&ignoredSignals, i);
sigprocmask(SIG_BLOCK, &ignoredSignals, NULL); sigprocmask(SIG_BLOCK, &ignoredSignals, NULL);
@ -203,6 +211,7 @@ void setupSignals() {
// Handle block update signals // Handle block update signals
sigset_t handledSignals; sigset_t handledSignals;
sigemptyset(&handledSignals); sigemptyset(&handledSignals);
sigaddset(&handledSignals, SIGUSR1);
for (int i = 0; i < LEN(blocks); i++) for (int i = 0; i < LEN(blocks); i++)
if (blocks[i].signal > 0) if (blocks[i].signal > 0)
sigaddset(&handledSignals, SIGRTMIN + blocks[i].signal); sigaddset(&handledSignals, SIGRTMIN + blocks[i].signal);
@ -215,7 +224,7 @@ void statusLoop() {
while (statusContinue) { while (statusContinue) {
int eventCount = epoll_wait(epollFD, events, LEN(events), -1); int eventCount = epoll_wait(epollFD, events, LEN(events), -1);
for (int i = 0; i < eventCount; i++) { for (int i = 0; i < eventCount; i++) {
unsigned short int id = events[i].data.u32; unsigned short id = events[i].data.u32;
if (id == LEN(blocks)) { if (id == LEN(blocks)) {
unsigned int j = 0; unsigned int j = 0;