summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMario Limonciello <mario.limonciello@dell.com>2018-03-08 08:17:07 -0600
committerBenjamin Berg <bberg@redhat.com>2018-04-12 14:01:15 +0200
commita6e3ee40d90294c603e1108e19ef8fe8e6af61eb (patch)
treef7099a61eb225bdf86b8c6d4c8bde66a7d5270ee
parentb9ca35714ceb48652e8207c7b73b565ee7346219 (diff)
downloadgnome-settings-daemon-a6e3ee40d90294c603e1108e19ef8fe8e6af61eb.tar.gz
power: Add Suspend then Hibernate
Systemd recently merged supported for suspending then hibernate which is a new sleep type that will suspend the system followed by hibernate after a period of time. If the system supports it (new enough systemd and hibernation supported) choose this when the system is configured to suspend.
-rw-r--r--plugins/media-keys/gsd-media-keys-manager.c34
-rw-r--r--plugins/power/gsd-power-manager.c27
2 files changed, 58 insertions, 3 deletions
diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c
index 1b3ff38d..ee6ecbf3 100644
--- a/plugins/media-keys/gsd-media-keys-manager.c
+++ b/plugins/media-keys/gsd-media-keys-manager.c
@@ -1947,13 +1947,43 @@ power_action (GsdMediaKeysManager *manager,
}
static void
+suspend_action (GsdMediaKeysManager *manager,
+ gboolean allow_interaction)
+{
+ const gchar *action = "Suspend";
+ g_autoptr(GVariant) retval = NULL;
+ g_autoptr(GError) error = NULL;
+
+ retval = g_dbus_proxy_call_sync (manager->priv->logind_proxy,
+ "CanSuspendThenHibernate",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ if (retval == NULL) {
+ g_warning ("Failed to query CanSuspendThenHibernate: %s", error->message);
+ g_error_free (error);
+ } else {
+ const gchar *s2h = NULL;
+
+ g_variant_get (retval, "(s)", &s2h);
+ if (g_strcmp0 (s2h, "yes") == 0)
+ action = "SuspendThenHibernate";
+ }
+ g_debug ("Choosing suspend action: %s", action);
+
+ power_action (manager, action, allow_interaction);
+}
+
+static void
do_config_power_action (GsdMediaKeysManager *manager,
GsdPowerActionType action_type,
gboolean in_lock_screen)
{
switch (action_type) {
case GSD_POWER_ACTION_SUSPEND:
- power_action (manager, "Suspend", !in_lock_screen);
+ suspend_action (manager, !in_lock_screen);
break;
case GSD_POWER_ACTION_INTERACTIVE:
if (!in_lock_screen)
@@ -1991,7 +2021,7 @@ do_config_power_button_action (GsdMediaKeysManager *manager,
/* Always suspend tablets */
if (g_strcmp0 (manager->priv->chassis_type, "tablet") == 0) {
- power_action (manager, "Suspend", !in_lock_screen);
+ suspend_action (manager, !in_lock_screen);
return;
}
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
index 82d81e96..78ec8890 100644
--- a/plugins/power/gsd-power-manager.c
+++ b/plugins/power/gsd-power-manager.c
@@ -900,12 +900,35 @@ action_poweroff (GsdPowerManager *manager)
static void
action_suspend (GsdPowerManager *manager)
{
+ const gchar *action = "Suspend";
+ g_autoptr(GVariant) retval = NULL;
+ g_autoptr(GError) error = NULL;
+
if (manager->priv->logind_proxy == NULL) {
g_warning ("no systemd support");
return;
}
+
+ retval = g_dbus_proxy_call_sync (manager->priv->logind_proxy,
+ "CanSuspendThenHibernate",
+ NULL,
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ manager->priv->cancellable,
+ &error);
+ if (retval == NULL) {
+ g_warning ("Failed to query CanSuspendThenHibernate: %s", error->message);
+ } else {
+ const gchar *s2h = NULL;
+
+ g_variant_get (retval, "(s)", &s2h);
+ if (g_strcmp0 (s2h, "yes") == 0)
+ action = "SuspendThenHibernate";
+ }
+ g_debug ("Choosing suspend action: %s", action);
+
g_dbus_proxy_call (manager->priv->logind_proxy,
- "Suspend",
+ action,
g_variant_new ("(b)", FALSE),
G_DBUS_CALL_FLAGS_NONE,
G_MAXINT,
@@ -1061,6 +1084,7 @@ backlight_disable (GsdPowerManager *manager)
g_error_free (error);
}
+ g_debug("Is tablet: %d", manager->priv->is_tablet);
if (manager->priv->is_tablet)
action_suspend (manager);
else
@@ -1073,6 +1097,7 @@ static void
do_power_action_type (GsdPowerManager *manager,
GsdPowerActionType action_type)
{
+ g_debug("Running power action type %d", action_type);
switch (action_type) {
case GSD_POWER_ACTION_SUSPEND:
action_suspend (manager);