diff options
author | Bastien Nocera <hadess@hadess.net> | 2021-07-28 16:40:24 +0200 |
---|---|---|
committer | Benjamin Berg <bberg@redhat.com> | 2021-08-10 17:30:53 +0200 |
commit | dccf11b9bb4df8cc01d57e3cb80ccd9a1106babb (patch) | |
tree | 75672b7180397c49c7e9df14e67e13aef9840cda /plugins | |
parent | 7fdf9eefeb3ce7149ab31838877f468b76495e9a (diff) | |
download | gnome-settings-daemon-dccf11b9bb4df8cc01d57e3cb80ccd9a1106babb.tar.gz |
power: Dim screen faster if power saver mode is on
As done on other platforms, aggressively dim the screen after a
short period when the user has selected to enter power saver mode.
The same aggressive screen dim will be used if the battery is low and
power-profiles-daemon is not available. If it is available, then it
fixes a screen dim happening when the battery was low which might
have been unwanted.
See https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/232
Prior art:
https://support.apple.com/en-us/HT205234
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/power/gsd-power-manager.c | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c index 1f125a6f..cfef9718 100644 --- a/plugins/power/gsd-power-manager.c +++ b/plugins/power/gsd-power-manager.c @@ -192,6 +192,7 @@ struct _GsdPowerManager /* Power Profiles */ GDBusProxy *power_profiles_proxy; guint32 power_saver_cookie; + gboolean power_saver_enabled; /* Sound */ guint32 critical_alert_timeout_id; @@ -1780,6 +1781,20 @@ clear_idle_watch (GnomeIdleMonitor *monitor, *id = 0; } +static gboolean +is_power_save_active (GsdPowerManager *manager) +{ + /* + * If we have power-profiles-daemon, then we follow its setting, + * otherwise we go into power-save mode when the battery is low. + */ + if (manager->power_profiles_proxy && + g_dbus_proxy_get_name_owner (manager->power_profiles_proxy)) + return manager->power_saver_enabled; + else + return manager->battery_is_low; +} + static void idle_configure (GsdPowerManager *manager) { @@ -1903,8 +1918,8 @@ idle_configure (GsdPowerManager *manager) /* Don't dim when the screen lock is active */ } else if (!on_battery) { /* Don't dim when charging */ - } else if (manager->battery_is_low) { - /* Aggressively blank when battery is low */ + } else if (is_power_save_active (manager)) { + /* Try to save power by dimming agressively */ timeout_dim = SCREENSAVER_TIMEOUT_BLANK; } else { if (g_settings_get_boolean (manager->settings, "idle-dim")) { @@ -2166,6 +2181,27 @@ power_profiles_proxy_signal_cb (GDBusProxy *proxy, } static void +update_active_power_profile (GsdPowerManager *manager) +{ + g_autoptr(GVariant) v = NULL; + const char *active_profile; + gboolean power_saver_enabled; + + v = g_dbus_proxy_get_cached_property (manager->power_profiles_proxy, "ActiveProfile"); + if (v) { + active_profile = g_variant_get_string (v, NULL); + power_saver_enabled = g_strcmp0 (active_profile, "power-saver") == 0; + if (power_saver_enabled != manager->power_saver_enabled) { + manager->power_saver_enabled = power_saver_enabled; + idle_configure (manager); + } + } else { + /* p-p-d might have disappeared from the bus */ + idle_configure (manager); + } +} + +static void power_profiles_proxy_ready_cb (GObject *source_object, GAsyncResult *res, gpointer user_data) @@ -2179,9 +2215,15 @@ power_profiles_proxy_ready_cb (GObject *source_object, return; } + g_signal_connect_swapped (manager->power_profiles_proxy, + "g-properties-changed", + G_CALLBACK (update_active_power_profile), + manager); g_signal_connect (manager->power_profiles_proxy, "g-signal", G_CALLBACK (power_profiles_proxy_signal_cb), manager); + + update_active_power_profile (manager); } static void |