mirror of
https://github.com/NickHu/sway
synced 2024-12-27 21:58:11 +01:00
swaybar: Correct handling of SIGTERM.
Swaybar did not correctly handle the SIGTERM sent from sway when exiting, ultimately leaving the child status_command behind. This should correctly handle the SIGTERM signal and terminate the status_command. Fix #386
This commit is contained in:
parent
fc71c6303c
commit
5c8a3afff9
1 changed files with 22 additions and 8 deletions
|
@ -5,6 +5,7 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/select.h>
|
#include <sys/select.h>
|
||||||
|
#include <sys/wait.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <json-c/json.h>
|
#include <json-c/json.h>
|
||||||
#include <sys/un.h>
|
#include <sys/un.h>
|
||||||
|
@ -87,7 +88,7 @@ struct colors colors = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
void sway_terminate(void) {
|
void swaybar_teardown() {
|
||||||
window_teardown(window);
|
window_teardown(window);
|
||||||
if (registry) {
|
if (registry) {
|
||||||
registry_teardown(registry);
|
registry_teardown(registry);
|
||||||
|
@ -99,16 +100,31 @@ void sway_terminate(void) {
|
||||||
|
|
||||||
if (pid) {
|
if (pid) {
|
||||||
// terminate status_command process
|
// 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]) {
|
if (pipefd[0]) {
|
||||||
close(pipefd[0]);
|
close(pipefd[0]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void sway_terminate(void) {
|
||||||
|
swaybar_teardown();
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sig_handler(int signal) {
|
||||||
|
swaybar_teardown();
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
void cairo_set_source_u32(cairo_t *cairo, uint32_t color) {
|
void cairo_set_source_u32(cairo_t *cairo, uint32_t color) {
|
||||||
cairo_set_source_rgba(cairo,
|
cairo_set_source_rgba(cairo,
|
||||||
((color & 0xFF000000) >> 24) / 256.0,
|
((color & 0xFF000000) >> 24) / 256.0,
|
||||||
|
@ -525,14 +541,12 @@ int main(int argc, char **argv) {
|
||||||
line[0] = '\0';
|
line[0] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
signal(SIGTERM, sig_handler);
|
||||||
|
|
||||||
poll_for_update();
|
poll_for_update();
|
||||||
|
|
||||||
window_teardown(window);
|
// gracefully shutdown swaybar and status_command
|
||||||
registry_teardown(registry);
|
swaybar_teardown();
|
||||||
fclose(command);
|
|
||||||
// terminate status_command process
|
|
||||||
kill(pid, SIGTERM);
|
|
||||||
close(pipefd[0]);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue