[gnome-settings-daemon/benzea/drop-lid-inhibitor: 92/92] power: Drop lid switch inhibitor when session is inactive
- From: Benjamin Berg <bberg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon/benzea/drop-lid-inhibitor: 92/92] power: Drop lid switch inhibitor when session is inactive
- Date: Thu, 20 Aug 2020 12:33:28 +0000 (UTC)
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]