idle: allow zero timeout

Prior to this commit, setting up a zero timeout resulted in a timer that never
expires, which isn't particularly useful.

This commit allows setting up timers that expire immediately, which is useful
to immediately enter idle state.
This commit is contained in:
emersion 2018-10-28 09:22:12 +01:00
parent 266b3df678
commit 3cb4ff3ff1
No known key found for this signature in database
GPG key ID: 0FDE7BE0E88F5E48

View file

@ -27,6 +27,9 @@ static void idle_timeout_destroy(struct wlr_idle_timeout *timer) {
static int idle_notify(void *data) { static int idle_notify(void *data) {
struct wlr_idle_timeout *timer = data; struct wlr_idle_timeout *timer = data;
if (timer->idle_state) {
return 0;
}
timer->idle_state = true; timer->idle_state = true;
org_kde_kwin_idle_timeout_send_idle(timer->resource); org_kde_kwin_idle_timeout_send_idle(timer->resource);
return 1; return 1;
@ -36,13 +39,18 @@ static void handle_activity(struct wlr_idle_timeout *timer) {
if (!timer->enabled) { if (!timer->enabled) {
return; return;
} }
// rearm the timer
wl_event_source_timer_update(timer->idle_source, timer->timeout);
// in case the previous state was sleeping send a resume event and switch state // in case the previous state was sleeping send a resume event and switch state
if (timer->idle_state) { if (timer->idle_state) {
timer->idle_state = false; timer->idle_state = false;
org_kde_kwin_idle_timeout_send_resumed(timer->resource); org_kde_kwin_idle_timeout_send_resumed(timer->resource);
} }
// rearm the timer
wl_event_source_timer_update(timer->idle_source, timer->timeout);
if (timer->timeout == 0) {
idle_notify(timer);
}
} }
static void handle_timer_resource_destroy(struct wl_resource *timer_resource) { static void handle_timer_resource_destroy(struct wl_resource *timer_resource) {
@ -142,6 +150,9 @@ static void create_idle_timer(struct wl_client *client,
if (timer->enabled) { if (timer->enabled) {
// arm the timer // arm the timer
wl_event_source_timer_update(timer->idle_source, timer->timeout); wl_event_source_timer_update(timer->idle_source, timer->timeout);
if (timer->timeout == 0) {
idle_notify(timer);
}
} }
} }