summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2021-07-28 16:40:24 +0200
committerBenjamin Berg <bberg@redhat.com>2021-08-10 17:30:53 +0200
commitdccf11b9bb4df8cc01d57e3cb80ccd9a1106babb (patch)
tree75672b7180397c49c7e9df14e67e13aef9840cda /plugins
parent7fdf9eefeb3ce7149ab31838877f468b76495e9a (diff)
downloadgnome-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.c46
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