summaryrefslogtreecommitdiff
path: root/gnome-base/gnome-settings-daemon/files/gnome-settings-daemon-49.1-not-unidle-for-inactive-session.patch
blob: 3ccb16122f42ee08562aa4c3f59eeecebf7bae3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
From faba720a2f9b9896a318cad87ecd7bcd24d6f791 Mon Sep 17 00:00:00 2001
From: Roman Yepishev <ryepishev@google.com>
Date: Sat, 27 Dec 2025 16:27:15 -0500
Subject: [PATCH] plugins/power: do not unidle for inactive session

NVIDIA drivers change the virtual terminal before suspend and restore it
upon resume.

Upon resume, there is a period of time when systemd reports that our
session is not active (we are on a different virtual terminal). On
resume, `idle_set_mode` would ignore that state change (keeping it as
"sleep"), and if `WakeUpScreen` signal from screensaver arrives at that
time, we will store "sleep" as `previous_idle_mode`, and set up a
callback to restore to that state. That causes the machine to suspend
15 seconds after resume.

This change refactors the unidle calls, refactoring common checks into
a separate function.

Up until https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3481,
mutter was resetting the idle timer on AC events and gsd-power did not
have to do anything. Once mutter starts resetting the idle timer again,
we can remove the code handling AC events.

Closes #903
---
 plugins/power/gsd-power-manager.c | 39 ++++++++++++++++++++++++-------
 1 file changed, 31 insertions(+), 8 deletions(-)

diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
index 490b5536..e98cb844 100644
--- a/plugins/power/gsd-power-manager.c
+++ b/plugins/power/gsd-power-manager.c
@@ -2266,6 +2266,35 @@ set_temporary_unidle_on_ac (GsdPowerManager *manager,
         }
 }
 
+static gboolean
+should_set_temporary_unidle_on_ac (GsdPowerManager *manager)
+{
+        /* Do not unidle if lid is closed */
+        if (manager->lid_is_closed)
+                return FALSE;
+
+        /* Do not unidle if we are not in an active session */
+        if (! manager->session_is_active)
+                return FALSE;
+
+        /* Unidle is already running, so we will need to reset the timer */
+        if (manager->temporary_unidle_on_ac_id != 0)
+                return TRUE;
+
+        /* Do not unidle if our current state isn't dim or blank */
+        if (manager->current_idle_mode != GSD_POWER_IDLE_MODE_BLANK &&
+            manager->current_idle_mode != GSD_POWER_IDLE_MODE_DIM)
+                return FALSE;
+
+        return TRUE;
+}
+
+static void
+update_temporary_unidle_on_ac (GsdPowerManager *manager)
+{
+        set_temporary_unidle_on_ac(manager, should_set_temporary_unidle_on_ac (manager));
+}
+
 static void
 up_client_on_battery_cb (UpClient *client,
                          GParamSpec *pspec,
@@ -2290,13 +2319,7 @@ up_client_on_battery_cb (UpClient *client,
 
         idle_configure (manager);
 
-        if (manager->lid_is_closed)
-                return;
-
-        if (manager->current_idle_mode == GSD_POWER_IDLE_MODE_BLANK ||
-            manager->current_idle_mode == GSD_POWER_IDLE_MODE_DIM ||
-            manager->temporary_unidle_on_ac_id != 0)
-                set_temporary_unidle_on_ac (manager, TRUE);
+        update_temporary_unidle_on_ac (manager);
 }
 
 static void
@@ -2359,7 +2382,7 @@ handle_screensaver_active (GsdPowerManager *manager,
 static void
 handle_wake_up_screen (GsdPowerManager *manager)
 {
-        set_temporary_unidle_on_ac (manager, TRUE);
+        update_temporary_unidle_on_ac (manager);
 }
 
 static void
-- 
2.53.0