diff options
author | emersion <contact@emersion.fr> | 2018-11-24 23:26:57 +0100 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2018-11-24 23:26:57 +0100 |
commit | 9b88ee01439a95b922ac3be96a93f16094b06566 (patch) | |
tree | 85cc4f46cf1107f30b7444efb46bf97093a21988 | |
parent | 41ffb5b4d5cb22b670a34ff441a7e069b7a4d175 (diff) |
swayidle: fix dbus_event not to block
-rw-r--r-- | swayidle/main.c | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/swayidle/main.c b/swayidle/main.c index ab4b4596..89ccf671 100644 --- a/swayidle/main.c +++ b/swayidle/main.c @@ -43,6 +43,12 @@ struct swayidle_timeout_cmd { char *resume_cmd; }; +void sway_terminate(int exit_code) { + wl_display_disconnect(state.display); + wl_event_loop_destroy(state.event_loop); + exit(exit_code); +} + static void cmd_exec(char *param) { wlr_log(WLR_DEBUG, "Cmd exec %s", param); pid_t pid = fork(); @@ -138,10 +144,28 @@ static int prepare_for_sleep(sd_bus_message *msg, void *userdata, static int dbus_event(int fd, uint32_t mask, void *data) { sd_bus *bus = data; - while (sd_bus_process(bus, NULL) > 0) { - // Do nothing. + + if ((mask & WL_EVENT_HANGUP) || (mask & WL_EVENT_ERROR)) { + sway_terminate(0); + } + + int count = 0; + if (mask & WL_EVENT_READABLE) { + count = sd_bus_process(bus, NULL); + } + if (mask & WL_EVENT_WRITABLE) { + sd_bus_flush(bus); } - return 1; + if (mask == 0) { + sd_bus_flush(bus); + } + + if (count < 0) { + wlr_log_errno(WLR_ERROR, "sd_bus_process failed, exiting"); + sway_terminate(0); + } + + return count; } static void setup_sleep_listener(void) { @@ -167,8 +191,10 @@ static void setup_sleep_listener(void) { } acquire_sleep_lock(); - wl_event_loop_add_fd(state.event_loop, sd_bus_get_fd(bus), - WL_EVENT_READABLE, dbus_event, bus); + struct wl_event_source *source = wl_event_loop_add_fd(state.event_loop, + sd_bus_get_fd(bus), WL_EVENT_READABLE | WL_EVENT_WRITABLE, + dbus_event, bus); + wl_event_source_check(source); } #endif @@ -340,12 +366,6 @@ static int parse_args(int argc, char *argv[]) { return 0; } -void sway_terminate(int exit_code) { - wl_display_disconnect(state.display); - wl_event_loop_destroy(state.event_loop); - exit(exit_code); -} - static void register_zero_idle_timeout(void *item) { struct swayidle_timeout_cmd *cmd = item; register_timeout(cmd, 0); |