[gnome-settings-daemon/benzea/drop-lid-inhibitor: 8/8] 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: 8/8] power: Drop lid switch inhibitor when session is inactive
- Date: Mon, 6 Apr 2020 16:07:43 +0000 (UTC)
commit 05ea8ef5a0b31ce55a28d62effe4305f0ac9b115
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 c7a16e8d..83331a97 100644
--- a/plugins/power/gsd-power-manager.c
+++ b/plugins/power/gsd-power-manager.c
@@ -217,6 +217,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);
@@ -1196,7 +1197,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
@@ -1205,7 +1206,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);
}
@@ -2178,6 +2179,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);
@@ -2329,11 +2331,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
@@ -2343,6 +2343,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)
{
@@ -2400,13 +2410,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);
@@ -2429,6 +2432,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]