diff options
author | Bastien Nocera <hadess@hadess.net> | 2021-04-22 15:56:50 +0200 |
---|---|---|
committer | Benjamin Berg <bberg@redhat.com> | 2022-03-09 20:38:10 +0100 |
commit | 71d6f43b409c52f662be6e7f241ca9978c83f906 (patch) | |
tree | 3bec47a6ff59518244527bdcf7fa040e4a4d7bb8 | |
parent | 168f4c029421bd5a2621a27844417df2b244f3f5 (diff) | |
download | gnome-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.c | 51 |
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); |