summaryrefslogtreecommitdiff
path: root/plugins/power/gsd-power-manager.c
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 /plugins/power/gsd-power-manager.c
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.
Diffstat (limited to 'plugins/power/gsd-power-manager.c')
-rw-r--r--plugins/power/gsd-power-manager.c27
1 files changed, 26 insertions, 1 deletions
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);