diff options
author | Drew DeVault <sir@cmpwn.com> | 2019-02-15 16:25:28 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-15 16:25:28 +0100 |
commit | cdbf8e8b2540768cc4c82176f6510d8e6ae8f037 (patch) | |
tree | e98b9ffe575791ab9fb48e52e5339c55bff2005a | |
parent | apply_output_config: dpms on before modeset (diff) | |
parent | tray: use correct parameter to set bus slot to floating (diff) | |
download | sway-cdbf8e8b2540768cc4c82176f6510d8e6ae8f037.tar.gz sway-cdbf8e8b2540768cc4c82176f6510d8e6ae8f037.tar.zst sway-cdbf8e8b2540768cc4c82176f6510d8e6ae8f037.zip |
Merge pull request #3692 from ianyfan/swaybar
Fix crash and memory leak on bar termination
-rw-r--r-- | include/swaybar/bar.h | 2 | ||||
-rw-r--r-- | swaybar/bar.c | 6 | ||||
-rw-r--r-- | swaybar/main.c | 14 | ||||
-rw-r--r-- | swaybar/tray/host.c | 6 |
4 files changed, 13 insertions, 15 deletions
diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h index 2d9ba0d9..2518d5aa 100644 --- a/include/swaybar/bar.h +++ b/include/swaybar/bar.h | |||
@@ -46,6 +46,8 @@ struct swaybar { | |||
46 | #if HAVE_TRAY | 46 | #if HAVE_TRAY |
47 | struct swaybar_tray *tray; | 47 | struct swaybar_tray *tray; |
48 | #endif | 48 | #endif |
49 | |||
50 | bool running; | ||
49 | }; | 51 | }; |
50 | 52 | ||
51 | struct swaybar_output { | 53 | struct swaybar_output { |
diff --git a/swaybar/bar.c b/swaybar/bar.c index a1f7bfdb..db1c1222 100644 --- a/swaybar/bar.c +++ b/swaybar/bar.c | |||
@@ -4,6 +4,7 @@ | |||
4 | #include <fcntl.h> | 4 | #include <fcntl.h> |
5 | #include <poll.h> | 5 | #include <poll.h> |
6 | #include <signal.h> | 6 | #include <signal.h> |
7 | #include <stdbool.h> | ||
7 | #include <stdlib.h> | 8 | #include <stdlib.h> |
8 | #include <string.h> | 9 | #include <string.h> |
9 | #include <sys/wait.h> | 10 | #include <sys/wait.h> |
@@ -403,8 +404,7 @@ bool bar_setup(struct swaybar *bar, const char *socket_path) { | |||
403 | static void display_in(int fd, short mask, void *data) { | 404 | static void display_in(int fd, short mask, void *data) { |
404 | struct swaybar *bar = data; | 405 | struct swaybar *bar = data; |
405 | if (wl_display_dispatch(bar->display) == -1) { | 406 | if (wl_display_dispatch(bar->display) == -1) { |
406 | bar_teardown(bar); | 407 | bar->running = false; |
407 | exit(0); | ||
408 | } | 408 | } |
409 | } | 409 | } |
410 | 410 | ||
@@ -439,7 +439,7 @@ void bar_run(struct swaybar *bar) { | |||
439 | loop_add_fd(bar->eventloop, bar->tray->fd, POLLIN, tray_in, bar->tray->bus); | 439 | loop_add_fd(bar->eventloop, bar->tray->fd, POLLIN, tray_in, bar->tray->bus); |
440 | } | 440 | } |
441 | #endif | 441 | #endif |
442 | while (1) { | 442 | while (bar->running) { |
443 | errno = 0; | 443 | errno = 0; |
444 | if (wl_display_flush(bar->display) == -1 && errno != EAGAIN) { | 444 | if (wl_display_flush(bar->display) == -1 && errno != EAGAIN) { |
445 | break; | 445 | break; |
diff --git a/swaybar/main.c b/swaybar/main.c index 4ef74629..108b16e9 100644 --- a/swaybar/main.c +++ b/swaybar/main.c | |||
@@ -11,13 +11,7 @@ | |||
11 | static struct swaybar swaybar; | 11 | static struct swaybar swaybar; |
12 | 12 | ||
13 | void sig_handler(int signal) { | 13 | void sig_handler(int signal) { |
14 | bar_teardown(&swaybar); | 14 | swaybar.running = false; |
15 | exit(0); | ||
16 | } | ||
17 | |||
18 | void sway_terminate(int code) { | ||
19 | bar_teardown(&swaybar); | ||
20 | exit(code); | ||
21 | } | 15 | } |
22 | 16 | ||
23 | int main(int argc, char **argv) { | 17 | int main(int argc, char **argv) { |
@@ -93,8 +87,6 @@ int main(int argc, char **argv) { | |||
93 | } | 87 | } |
94 | } | 88 | } |
95 | 89 | ||
96 | signal(SIGTERM, sig_handler); | ||
97 | |||
98 | if (!bar_setup(&swaybar, socket_path)) { | 90 | if (!bar_setup(&swaybar, socket_path)) { |
99 | free(socket_path); | 91 | free(socket_path); |
100 | return 1; | 92 | return 1; |
@@ -102,6 +94,10 @@ int main(int argc, char **argv) { | |||
102 | 94 | ||
103 | free(socket_path); | 95 | free(socket_path); |
104 | 96 | ||
97 | signal(SIGINT, sig_handler); | ||
98 | signal(SIGTERM, sig_handler); | ||
99 | |||
100 | swaybar.running = true; | ||
105 | bar_run(&swaybar); | 101 | bar_run(&swaybar); |
106 | bar_teardown(&swaybar); | 102 | bar_teardown(&swaybar); |
107 | return 0; | 103 | return 0; |
diff --git a/swaybar/tray/host.c b/swaybar/tray/host.c index 215e1e72..451b0896 100644 --- a/swaybar/tray/host.c +++ b/swaybar/tray/host.c | |||
@@ -189,9 +189,9 @@ bool init_host(struct swaybar_host *host, char *protocol, | |||
189 | goto error; | 189 | goto error; |
190 | } | 190 | } |
191 | 191 | ||
192 | sd_bus_slot_set_floating(reg_slot, 1); | 192 | sd_bus_slot_set_floating(reg_slot, 0); |
193 | sd_bus_slot_set_floating(unreg_slot, 1); | 193 | sd_bus_slot_set_floating(unreg_slot, 0); |
194 | sd_bus_slot_set_floating(watcher_slot, 1); | 194 | sd_bus_slot_set_floating(watcher_slot, 0); |
195 | 195 | ||
196 | sway_log(SWAY_DEBUG, "Registered %s", host->service); | 196 | sway_log(SWAY_DEBUG, "Registered %s", host->service); |
197 | return true; | 197 | return true; |