From 96edcd2d020a3f088d70ca0f872602a25957f15c Mon Sep 17 00:00:00 2001 From: Ethan Marshall Date: Tue, 9 Aug 2022 14:55:04 +0100 Subject: Fix statusbar freezing Block signal handlers from running recursively (when a handler is already running) to avoid deadlock on Xorg connection. --- dwmblocks.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/dwmblocks.c b/dwmblocks.c index 0969ed7..b7f38a7 100644 --- a/dwmblocks.c +++ b/dwmblocks.c @@ -183,6 +183,14 @@ int getstatus(char *str, char *last) void setroot() { + /* block all signals until after root updated */ + sigset_t new, old; + sigfillset(&new); + if (sigprocmask(SIG_SETMASK, &new, &old) < 0) { + perror("sigset"); + exit(1); + } + if (!getstatus(statusstr[0], statusstr[1]))//Only set root if text has changed. return; Display *d = XOpenDisplay(NULL); @@ -192,7 +200,10 @@ void setroot() screen = DefaultScreen(dpy); root = RootWindow(dpy, screen); XStoreName(dpy, root, statusstr[0]); - XCloseDisplay(dpy); + XCloseDisplay(d); + + /* restore signals to default */ + sigprocmask(SIG_SETMASK, &old, NULL); } void pstdout() -- cgit v1.2.3 From 8f9974c5dcbdf8099bb05029699476c897f07ed8 Mon Sep 17 00:00:00 2001 From: Ethan Marshall Date: Tue, 9 Aug 2022 15:11:27 +0100 Subject: Do not block interrupt/terminate signals --- dwmblocks.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dwmblocks.c b/dwmblocks.c index b7f38a7..fb56d95 100644 --- a/dwmblocks.c +++ b/dwmblocks.c @@ -186,6 +186,9 @@ void setroot() /* block all signals until after root updated */ sigset_t new, old; sigfillset(&new); + sigdelset(&new, SIGINT); + sigdelset(&new, SIGTERM); + if (sigprocmask(SIG_SETMASK, &new, &old) < 0) { perror("sigset"); exit(1); -- cgit v1.2.3