diff options
Diffstat (limited to 'swayidle')
| -rw-r--r-- | swayidle/main.c | 77 | ||||
| -rw-r--r-- | swayidle/swayidle.1.scd | 2 | 
2 files changed, 56 insertions, 23 deletions
diff --git a/swayidle/main.c b/swayidle/main.c index 2b185949..dd7d9de3 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(); @@ -81,16 +87,16 @@ static int release_lock(void *data) {  }  static void acquire_sleep_lock(void) { -	sd_bus_message *msg; -	sd_bus_error error; +	sd_bus_message *msg = NULL; +	sd_bus_error error = SD_BUS_ERROR_NULL;  	int ret = sd_bus_call_method(bus, "org.freedesktop.login1",  			"/org/freedesktop/login1",  			"org.freedesktop.login1.Manager", "Inhibit",  			&error, &msg, "ssss", "sleep", "swayidle",  			"Setup Up Lock Screen", "delay");  	if (ret < 0) { -		wlr_log(WLR_ERROR, "Failed to send Inhibit signal: %s", -				strerror(-ret)); +		wlr_log(WLR_ERROR, "Failed to send Inhibit signal: %s", error.message); +		sd_bus_error_free(&error);  		return;  	} @@ -98,10 +104,11 @@ static void acquire_sleep_lock(void) {  	if (ret < 0) {  		wlr_log(WLR_ERROR, "Failed to parse D-Bus response for Inhibit: %s",  			strerror(-ret)); -		return; +	} else { +		wlr_log(WLR_INFO, "Got sleep lock: %d", lock_fd);  	} - -	wlr_log(WLR_INFO, "Got sleep lock: %d", lock_fd); +	sd_bus_error_free(&error); +	sd_bus_message_unref(msg);  }  static int prepare_for_sleep(sd_bus_message *msg, void *userdata, @@ -137,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);  	} -	return 1; +	if (mask & WL_EVENT_WRITABLE) { +		sd_bus_flush(bus); +	} +	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) { @@ -166,8 +191,9 @@ 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, dbus_event, bus); +	wl_event_source_check(source);  }  #endif @@ -339,12 +365,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); @@ -365,15 +385,28 @@ static int handle_signal(int sig, void *data) {  }  static int display_event(int fd, uint32_t mask, void *data) { -	if (mask & WL_EVENT_HANGUP) { +	if ((mask & WL_EVENT_HANGUP) || (mask & WL_EVENT_ERROR)) {  		sway_terminate(0);  	} -	if (wl_display_dispatch(state.display) < 0) { + +	int count = 0; +	if (mask & WL_EVENT_READABLE) { +		count = wl_display_dispatch(state.display); +	} +	if (mask & WL_EVENT_WRITABLE) { +		wl_display_flush(state.display); +	} +	if (mask == 0) { +		count = wl_display_dispatch_pending(state.display); +		wl_display_flush(state.display); +	} + +	if (count < 0) {  		wlr_log_errno(WLR_ERROR, "wl_display_dispatch failed, exiting");  		sway_terminate(0);  	} -	wl_display_flush(state.display); -	return 0; + +	return count;  }  static void register_idle_timeout(void *item) { diff --git a/swayidle/swayidle.1.scd b/swayidle/swayidle.1.scd index 3083163f..0e3b5c3c 100644 --- a/swayidle/swayidle.1.scd +++ b/swayidle/swayidle.1.scd @@ -49,7 +49,7 @@ swayidle \  ```  This will lock your screen after 300 seconds of inactivity, then turn off your -displays after another 600 seconds, and turn your screens back on when resumed. +displays after another 300 seconds, and turn your screens back on when resumed.  It will also lock your screen before your computer goes to sleep.  # AUTHORS  | 
