aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--swaybar/main.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/swaybar/main.c b/swaybar/main.c
index 88cd1dbe..4323d370 100644
--- a/swaybar/main.c
+++ b/swaybar/main.c
@@ -5,6 +5,7 @@
#include <stdbool.h>
#include <unistd.h>
#include <sys/select.h>
+#include <sys/wait.h>
#include <errno.h>
#include <json-c/json.h>
#include <sys/un.h>
@@ -87,7 +88,7 @@ struct colors colors = {
},
};
-void sway_terminate(void) {
+void swaybar_teardown() {
window_teardown(window);
if (registry) {
registry_teardown(registry);
@@ -99,16 +100,31 @@ void sway_terminate(void) {
if (pid) {
// terminate status_command process
- kill(pid, SIGTERM);
+ int ret = kill(pid, SIGTERM);
+ if (ret != 0) {
+ sway_log(L_ERROR, "Unable to terminate status_command [pid: %d]", pid);
+ } else {
+ int status;
+ waitpid(pid, &status, 0);
+ }
}
if (pipefd[0]) {
close(pipefd[0]);
}
+}
+
+void sway_terminate(void) {
+ swaybar_teardown();
exit(EXIT_FAILURE);
}
+void sig_handler(int signal) {
+ swaybar_teardown();
+ exit(0);
+}
+
void cairo_set_source_u32(cairo_t *cairo, uint32_t color) {
cairo_set_source_rgba(cairo,
((color & 0xFF000000) >> 24) / 256.0,
@@ -525,14 +541,12 @@ int main(int argc, char **argv) {
line[0] = '\0';
}
+ signal(SIGTERM, sig_handler);
+
poll_for_update();
- window_teardown(window);
- registry_teardown(registry);
- fclose(command);
- // terminate status_command process
- kill(pid, SIGTERM);
- close(pipefd[0]);
+ // gracefully shutdown swaybar and status_command
+ swaybar_teardown();
return 0;
}