From ee92e4fe13f7ece3a317e0f792fe594f25443891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 16 Apr 2019 18:07:31 +0200 Subject: [PATCH] idle-monitor: Postpone dispatching of idle timeout if not ready If we update the ready time while the source is already in the to-dispatch list, changing the ready time doesn't have any effect, and the source will still be dispatched. This could cause incorrect idle watch firing causing the power management plugin in gnome-settings-daemon to sometimes turn off monitors due to it believing the user had been idle for some time, while in fact, they just logged back in. Fix this by not actually dispatching the idle timeout if the ready time is in the future when actually dispatching. https://gitlab.gnome.org/GNOME/mutter/merge_requests/543 --- src/backends/meta-idle-monitor.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/backends/meta-idle-monitor.c b/src/backends/meta-idle-monitor.c index 6b8d36be9..e83d6c778 100644 --- a/src/backends/meta-idle-monitor.c +++ b/src/backends/meta-idle-monitor.c @@ -316,6 +316,13 @@ idle_monitor_dispatch_timeout (GSource *source, gpointer user_data) { MetaIdleMonitorWatch *watch = (MetaIdleMonitorWatch *) user_data; + int64_t now; + int64_t ready_time; + + now = g_source_get_time (source); + ready_time = g_source_get_ready_time (source); + if (ready_time > now) + return G_SOURCE_CONTINUE; _meta_idle_monitor_watch_fire (watch); g_source_set_ready_time (watch->timeout_source, -1);