[gnome-settings-daemon/benzea/drop-lid-inhibitor: 92/92] power: Drop lid switch inhibitor when session is inactive




commit 91960b9b18200e202c897d5b79af108f3edeed68
Author: Benjamin Berg <bberg redhat com>
Date:   Tue Mar 17 09:42:43 2020 +0100

    power: Drop lid switch inhibitor when session is inactive
    
    We should never hold on to inhibitors when our session becomes inactive.
    Implement the appropriate logic for the lid switch, going through the
    same delay logic as for normal monitor events.
    
    Fixes: #504

 plugins/power/gsd-power-manager.c | 36 +++++++++++++++++++++++-------------
 1 file changed, 23 insertions(+), 13 deletions(-)
---
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
index b114d32e..0e65bd2a 100644
--- a/plugins/power/gsd-power-manager.c
+++ b/plugins/power/gsd-power-manager.c
@@ -222,6 +222,7 @@ static void      engine_device_warning_changed_cb (UpDevice *device, GParamSpec
 static void      do_power_action_type (GsdPowerManager *manager, GsdPowerActionType action_type);
 static void      uninhibit_lid_switch (GsdPowerManager *manager);
 static void      stop_inhibit_lid_switch_timer (GsdPowerManager *manager);
+static void      sync_lid_inhibitor (GsdPowerManager *manager);
 static void      main_battery_or_ups_low_changed (GsdPowerManager *manager, gboolean is_low);
 static gboolean  idle_is_session_inhibited (GsdPowerManager *manager, guint mask, gboolean *is_inhibited);
 static void      idle_triggered_idle_cb (GnomeIdleMonitor *monitor, guint watch_id, gpointer user_data);
@@ -1268,7 +1269,7 @@ upower_kbd_toggle (GsdPowerManager *manager,
 static gboolean
 suspend_on_lid_close (GsdPowerManager *manager)
 {
-        return !external_monitor_is_connected (manager->rr_screen);
+        return !external_monitor_is_connected (manager->rr_screen) || !manager->session_is_active;
 }
 
 static gboolean
@@ -1277,7 +1278,7 @@ inhibit_lid_switch_timer_cb (GsdPowerManager *manager)
         stop_inhibit_lid_switch_timer (manager);
 
         if (suspend_on_lid_close (manager)) {
-                g_debug ("no external monitors for a while; uninhibiting lid close");
+                g_debug ("no external monitors or session inactive for a while; uninhibiting lid close");
                 uninhibit_lid_switch (manager);
         }
 
@@ -2264,6 +2265,7 @@ engine_session_properties_changed_cb (GDBusProxy      *session,
                 }
                 g_variant_unref (v);
 
+                sync_lid_inhibitor (manager);
         }
 
         v = g_variant_lookup_value (changed, "InhibitedActions", G_VARIANT_TYPE_UINT32);
@@ -2415,11 +2417,9 @@ uninhibit_suspend (GsdPowerManager *manager)
 }
 
 static void
-on_randr_event (GnomeRRScreen *screen, gpointer user_data)
+sync_lid_inhibitor (GsdPowerManager *manager)
 {
-        GsdPowerManager *manager = GSD_POWER_MANAGER (user_data);
-
-        g_debug ("Screen configuration changed");
+        g_debug ("Syncing lid inhibitor and grabbing it temporarily");
 
         /* Uninhibiting is done in inhibit_lid_switch_timer_cb,
          * since we want to give users a few seconds when unplugging
@@ -2429,6 +2429,16 @@ on_randr_event (GnomeRRScreen *screen, gpointer user_data)
         restart_inhibit_lid_switch_timer (manager);
 }
 
+static void
+on_randr_event (GnomeRRScreen *screen, gpointer user_data)
+{
+        GsdPowerManager *manager = GSD_POWER_MANAGER (user_data);
+
+        g_debug ("Screen configuration changed");
+
+        sync_lid_inhibitor (manager);
+}
+
 static void
 handle_suspend_actions (GsdPowerManager *manager)
 {
@@ -2486,13 +2496,6 @@ on_rr_screen_acquired (GObject      *object,
                 return;
         }
 
-        /* set up the screens */
-        if (manager->lid_is_present) {
-                g_signal_connect (manager->rr_screen, "changed", G_CALLBACK (on_randr_event), manager);
-                watch_external_monitor (manager->rr_screen);
-                on_randr_event (manager->rr_screen, manager);
-        }
-
         /* Resolve screen backlight */
         manager->backlight = gsd_backlight_new (manager->rr_screen, NULL);
 
@@ -2515,6 +2518,13 @@ on_rr_screen_acquired (GObject      *object,
                                  manager, 0);
         manager->session_is_active = is_session_active (manager);
 
+        /* set up the screens */
+        if (manager->lid_is_present) {
+                g_signal_connect (manager->rr_screen, "changed", G_CALLBACK (on_randr_event), manager);
+                watch_external_monitor (manager->rr_screen);
+                on_randr_event (manager->rr_screen, manager);
+        }
+
         manager->screensaver_proxy = gnome_settings_bus_get_screen_saver_proxy ();
 
         g_signal_connect (manager->screensaver_proxy, "g-signal",


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]