summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2021-04-22 15:56:50 +0200
committerBenjamin Berg <bberg@redhat.com>2022-03-09 20:38:10 +0100
commit71d6f43b409c52f662be6e7f241ca9978c83f906 (patch)
tree3bec47a6ff59518244527bdcf7fa040e4a4d7bb8
parent168f4c029421bd5a2621a27844417df2b244f3f5 (diff)
downloadgnome-settings-daemon-wip/hadess/lid-is-closed-removal.tar.gz
power: Use logind to get lid statuswip/hadess/lid-is-closed-removal
Rather than upower, where the lid status functions have been obsolete for some time. Co-Authored-By: Benjamin Berg <bberg@redhat.com>
-rw-r--r--plugins/power/gsd-power-manager.c51
1 files changed, 32 insertions, 19 deletions
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
index 757986e3..2aef0fed 100644
--- a/plugins/power/gsd-power-manager.c
+++ b/plugins/power/gsd-power-manager.c
@@ -154,7 +154,6 @@ struct _GsdPowerManager
gboolean screensaver_active;
/* State */
- gboolean lid_is_present;
gboolean lid_is_closed;
gboolean session_is_active;
UpClient *up_client;
@@ -1559,19 +1558,36 @@ do_lid_closed_action (GsdPowerManager *manager)
}
}
+static gboolean
+is_lid_closed (GsdPowerManager *manager)
+{
+ GVariant *variant;
+ gboolean is_lid_closed = FALSE;
+
+ variant = g_dbus_proxy_get_cached_property (manager->logind_proxy,
+ "LidClosed");
+ if (variant) {
+ is_lid_closed = g_variant_get_boolean (variant);
+ g_variant_unref (variant);
+ }
+
+ return is_lid_closed;
+}
+
static void
-lid_state_changed_cb (UpClient *client, GParamSpec *pspec, GsdPowerManager *manager)
+logind_proxy_changed_cb (GDBusProxy *proxy,
+ GVariant *changed_properties,
+ GStrv invalidated_properties,
+ gpointer user_data)
{
+ GsdPowerManager *manager = user_data;
gboolean tmp;
- if (!manager->lid_is_present)
+ tmp = is_lid_closed (manager);
+ if (tmp == manager->lid_is_closed)
return;
- /* same lid state */
- tmp = up_client_get_lid_is_closed (manager->up_client);
- if (manager->lid_is_closed == tmp)
- return;
- manager->lid_is_closed = tmp;
+ manager->lid_is_closed = tmp;
g_debug ("up changed: lid is now %s", tmp ? "closed" : "open");
if (manager->lid_is_closed)
@@ -2847,11 +2863,9 @@ on_rr_screen_acquired (GObject *object,
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);
- }
+ 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 ();
@@ -2869,8 +2883,6 @@ on_rr_screen_acquired (GObject *object,
G_CALLBACK (engine_device_added_cb), manager);
g_signal_connect (manager->up_client, "device-removed",
G_CALLBACK (engine_device_removed_cb), manager);
- g_signal_connect_after (manager->up_client, "notify::lid-is-closed",
- G_CALLBACK (lid_state_changed_cb), manager);
g_signal_connect (manager->up_client, "notify::on-battery",
G_CALLBACK (up_client_on_battery_cb), manager);
@@ -3051,11 +3063,7 @@ gsd_power_manager_start (GsdPowerManager *manager,
g_debug ("Starting power manager");
gnome_settings_profile_start (NULL);
- /* Check whether we have a lid first */
manager->up_client = up_client_new ();
- manager->lid_is_present = up_client_get_lid_is_present (manager->up_client);
- if (manager->lid_is_present)
- manager->lid_is_closed = up_client_get_lid_is_closed (manager->up_client);
/* Set up the logind proxy */
manager->logind_proxy =
@@ -3072,6 +3080,11 @@ gsd_power_manager_start (GsdPowerManager *manager,
return FALSE;
}
+ /* Check whether the lid is closed */
+ manager->lid_is_closed = is_lid_closed (manager);
+ g_signal_connect (manager->logind_proxy, "g-properties-changed",
+ G_CALLBACK (logind_proxy_changed_cb), manager);
+
/* coldplug the list of screens */
gnome_rr_screen_new_async (gdk_screen_get_default (),
on_rr_screen_acquired, manager);