From a57d17e9226b2d15375a69315cfa59ad05edff2f Mon Sep 17 00:00:00 2001 From: nkreipke Date: Sun, 16 Nov 2014 21:30:52 +0100 Subject: [PATCH] Added support for logind hybrid sleep when closing lid --- common/xfpm-enum-glib.h | 5 ++++- settings/xfpm-settings-main.c | 4 +++- settings/xfpm-settings.c | 23 +++++++++++++++++---- settings/xfpm-settings.h | 1 + src/xfpm-manager.c | 6 ++++++ src/xfpm-power.c | 47 ++++++++++++++++++++++++++++++++++--------- src/xfpm-power.h | 2 ++ src/xfpm-systemd.c | 14 +++++++++++++ src/xfpm-xfconf.c | 4 ++-- 9 files changed, 88 insertions(+), 18 deletions(-) diff --git a/common/xfpm-enum-glib.h b/common/xfpm-enum-glib.h index c7cfe3f..938583a 100644 --- a/common/xfpm-enum-glib.h +++ b/common/xfpm-enum-glib.h @@ -45,7 +45,8 @@ typedef enum XFPM_DO_SUSPEND, XFPM_DO_HIBERNATE, XFPM_ASK, - XFPM_DO_SHUTDOWN + XFPM_DO_SHUTDOWN, + XFPM_DO_HYBRID_SLEEP } XfpmShutdownRequest; @@ -56,6 +57,8 @@ typedef enum LID_TRIGGER_HIBERNATE, LID_TRIGGER_LOCK_SCREEN, + LID_TRIGGER_HYBRID_SLEEP = XFPM_DO_HYBRID_SLEEP + } XfpmLidTriggerAction; typedef enum diff --git a/settings/xfpm-settings-main.c b/settings/xfpm-settings-main.c index c27208a..8377d23 100644 --- a/settings/xfpm-settings-main.c +++ b/settings/xfpm-settings-main.c @@ -60,6 +60,7 @@ int main (int argc, char **argv) gboolean auth_hibernate; gboolean can_suspend; gboolean can_hibernate; + gboolean can_hybrid_sleep; gboolean can_shutdown; gboolean has_lcd_brightness; gboolean has_sleep_button; @@ -179,6 +180,7 @@ int main (int argc, char **argv) has_lid = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "has-lid")); can_suspend = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "can-suspend")); can_hibernate = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "can-hibernate")); + can_hybrid_sleep = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "can-hybrid-sleep")); auth_suspend = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "auth-suspend")); auth_hibernate = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "auth-hibernate")); has_lcd_brightness = xfpm_string_to_bool (g_hash_table_lookup (config_hash, "has-brightness")); @@ -190,7 +192,7 @@ int main (int argc, char **argv) g_hash_table_destroy (config_hash); dialog = xfpm_settings_dialog_new (channel, auth_suspend, auth_hibernate, - can_suspend, can_hibernate, can_shutdown, has_battery, has_lcd_brightness, + can_suspend, can_hibernate, can_hybrid_sleep, can_shutdown, has_battery, has_lcd_brightness, has_lid, has_sleep_button, has_hibernate_button, has_power_button, socket_id, device_id); diff --git a/settings/xfpm-settings.c b/settings/xfpm-settings.c index a0e116d..653b992 100644 --- a/settings/xfpm-settings.c +++ b/settings/xfpm-settings.c @@ -801,7 +801,7 @@ lock_screen_toggled_cb (GtkWidget *w, XfconfChannel *channel) static void xfpm_settings_on_battery (XfconfChannel *channel, gboolean auth_suspend, gboolean auth_hibernate, gboolean can_suspend, - gboolean can_hibernate, gboolean can_shutdown, + gboolean can_hibernate, gboolean can_hybrid_sleep, gboolean can_shutdown, gboolean has_lcd_brightness, gboolean has_lid) { gboolean valid, handle_dpms; @@ -975,6 +975,12 @@ xfpm_settings_on_battery (XfconfChannel *channel, gboolean auth_suspend, gtk_list_store_append(list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Hibernate"), 1, LID_TRIGGER_HIBERNATE, -1); } + + if ( can_hybrid_sleep && auth_suspend && auth_hibernate ) + { + gtk_list_store_append(list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hybrid Sleep"), 1, LID_TRIGGER_HYBRID_SLEEP, -1); + } gtk_list_store_append(list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Lock screen"), 1, LID_TRIGGER_LOCK_SCREEN, -1); @@ -1027,7 +1033,7 @@ xfpm_settings_on_battery (XfconfChannel *channel, gboolean auth_suspend, static void xfpm_settings_on_ac (XfconfChannel *channel, gboolean auth_suspend, gboolean auth_hibernate, gboolean can_suspend, - gboolean can_hibernate, gboolean has_lcd_brightness, + gboolean can_hibernate, gboolean can_hybrid_sleep, gboolean has_lcd_brightness, gboolean has_lid) { gboolean valid, handle_dpms; @@ -1152,6 +1158,12 @@ xfpm_settings_on_ac (XfconfChannel *channel, gboolean auth_suspend, gtk_list_store_append(list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Hibernate"), 1, LID_TRIGGER_HIBERNATE, -1); } + + if ( can_hybrid_sleep && auth_suspend && auth_hibernate ) + { + gtk_list_store_append(list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hybrid Sleep"), 1, LID_TRIGGER_HYBRID_SLEEP, -1); + } gtk_list_store_append(list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Lock screen"), 1, LID_TRIGGER_LOCK_SCREEN, -1); @@ -2026,7 +2038,7 @@ delete_event_cb (GtkWidget *plug, GdkEvent *ev, XfconfChannel *channel) GtkWidget * xfpm_settings_dialog_new (XfconfChannel *channel, gboolean auth_suspend, gboolean auth_hibernate, gboolean can_suspend, - gboolean can_hibernate, gboolean can_shutdown, + gboolean can_hibernate, gboolean can_hybrid_sleep, gboolean can_shutdown, gboolean has_battery, gboolean has_lcd_brightness, gboolean has_lid, gboolean has_sleep_button, gboolean has_hibernate_button, gboolean has_power_button, @@ -2044,12 +2056,13 @@ xfpm_settings_dialog_new (XfconfChannel *channel, gboolean auth_suspend, GError *error = NULL; guint val; - XFPM_DEBUG ("auth_hibernate=%s auth_suspend=%s can_shutdown=%s can_suspend=%s can_hibernate=%s " \ + XFPM_DEBUG ("auth_hibernate=%s auth_suspend=%s can_shutdown=%s can_suspend=%s can_hibernate=%s can_hybrid_sleep=%s " \ "has_battery=%s has_lcd_brightness=%s has_lid=%s has_sleep_button=%s " \ "has_hibernate_button=%s has_power_button=%s", xfpm_bool_to_string (has_battery), xfpm_bool_to_string (auth_hibernate), xfpm_bool_to_string (can_shutdown), xfpm_bool_to_string (auth_suspend), xfpm_bool_to_string (can_suspend), xfpm_bool_to_string (can_hibernate), + xfpm_bool_to_string (can_hybrid_sleep), xfpm_bool_to_string (has_lcd_brightness), xfpm_bool_to_string (has_lid), xfpm_bool_to_string (has_sleep_button), xfpm_bool_to_string (has_hibernate_button), xfpm_bool_to_string (has_power_button)); @@ -2142,6 +2155,7 @@ xfpm_settings_dialog_new (XfconfChannel *channel, gboolean auth_suspend, auth_hibernate, can_suspend, can_hibernate, + can_hybrid_sleep, has_lcd_brightness, has_lid); @@ -2151,6 +2165,7 @@ xfpm_settings_dialog_new (XfconfChannel *channel, gboolean auth_suspend, auth_hibernate, can_suspend, can_hibernate, + can_hybrid_sleep, can_shutdown, has_lcd_brightness, has_lid); diff --git a/settings/xfpm-settings.h b/settings/xfpm-settings.h index b5a6cb4..91abf30 100644 --- a/settings/xfpm-settings.h +++ b/settings/xfpm-settings.h @@ -27,6 +27,7 @@ GtkWidget *xfpm_settings_dialog_new (XfconfChannel *channel, gboolean auth_hibernate, gboolean can_suspend, gboolean can_hibernate, + gboolean can_hybrid_sleep, gboolean can_shutdown, gboolean has_battery, gboolean has_lcd_brightness, diff --git a/src/xfpm-manager.c b/src/xfpm-manager.c index 9549b66..fc64df1 100644 --- a/src/xfpm-manager.c +++ b/src/xfpm-manager.c @@ -255,6 +255,9 @@ xfpm_manager_sleep_request (XfpmManager *manager, XfpmShutdownRequest req, gbool case XFPM_DO_HIBERNATE: xfpm_power_hibernate (manager->priv->power, force); break; + case XFPM_DO_HYBRID_SLEEP: + xfpm_power_hybrid_sleep (manager->priv->power, force); + break; case XFPM_DO_SHUTDOWN: xfpm_manager_shutdown (manager); break; @@ -777,6 +780,7 @@ GHashTable *xfpm_manager_get_config (XfpmManager *manager) gboolean auth_suspend = FALSE; gboolean can_suspend = FALSE; gboolean can_hibernate = FALSE; + gboolean can_hybrid_sleep = FALSE; gboolean has_sleep_button = FALSE; gboolean has_hibernate_button = FALSE; gboolean has_power_button = FALSE; @@ -805,6 +809,7 @@ GHashTable *xfpm_manager_get_config (XfpmManager *manager) "auth-hibernate", &auth_hibernate, "can-suspend", &can_suspend, "can-hibernate", &can_hibernate, + "can-hybrid-sleep", &can_hybrid_sleep, "has-lid", &has_lid, NULL); @@ -827,6 +832,7 @@ GHashTable *xfpm_manager_get_config (XfpmManager *manager) g_hash_table_insert (hash, g_strdup ("auth-hibernate"), g_strdup (xfpm_bool_to_string (auth_hibernate))); g_hash_table_insert (hash, g_strdup ("can-suspend"), g_strdup (xfpm_bool_to_string (can_suspend))); g_hash_table_insert (hash, g_strdup ("can-hibernate"), g_strdup (xfpm_bool_to_string (can_hibernate))); + g_hash_table_insert (hash, g_strdup ("can-hybrid-sleep"), g_strdup (xfpm_bool_to_string (can_hybrid_sleep))); g_hash_table_insert (hash, g_strdup ("can-shutdown"), g_strdup (xfpm_bool_to_string (can_shutdown))); g_hash_table_insert (hash, g_strdup ("has-battery"), g_strdup (xfpm_bool_to_string (has_battery))); diff --git a/src/xfpm-power.c b/src/xfpm-power.c index ac5850b..f8e5feb 100644 --- a/src/xfpm-power.c +++ b/src/xfpm-power.c @@ -128,6 +128,7 @@ struct XfpmPowerPrivate gchar *daemon_version; gboolean can_suspend; gboolean can_hibernate; + gboolean can_hybrid_sleep; /** * Warning dialog to use when notification daemon @@ -145,6 +146,7 @@ enum PROP_AUTH_HIBERNATE, PROP_CAN_SUSPEND, PROP_CAN_HIBERNATE, + PROP_CAN_HYBRID_SLEEP, PROP_HAS_LID, PROP_PRESENTATION_MODE, PROP_ON_AC_BLANK, @@ -266,11 +268,15 @@ xfpm_power_get_properties (XfpmPower *power) g_object_get (G_OBJECT (power->priv->systemd), "can-hibernate", &power->priv->can_hibernate, NULL); + g_object_get (G_OBJECT (power->priv->systemd), + "can-hybrid-sleep", &power->priv->can_hybrid_sleep, + NULL); } else { power->priv->can_suspend = xfpm_suspend_can_suspend (); power->priv->can_hibernate = xfpm_suspend_can_hibernate (); + power->priv->can_hybrid_sleep = FALSE; } #endif g_object_get (power->priv->upower, @@ -387,7 +393,7 @@ xfpm_power_sleep (XfpmPower *power, const gchar *sleep_time, gboolean force) if ( LOGIND_RUNNING () ) { - xfpm_systemd_sleep (power->priv->systemd, sleep_time, &error); + xfpm_systemd_sleep (power->priv->systemd, sleep_time, &error); } else { @@ -396,20 +402,25 @@ xfpm_power_sleep (XfpmPower *power, const gchar *sleep_time, gboolean force) { up_client_hibernate_sync(power->priv->upower, NULL, &error); } - else + else if (!g_strcmp0 (sleep_time, "Suspend")) { up_client_suspend_sync(power->priv->upower, NULL, &error); } #else if (!g_strcmp0 (sleep_time, "Hibernate")) - { - xfpm_suspend_try_action (XFPM_HIBERNATE); - } - else - { - xfpm_suspend_try_action (XFPM_SUSPEND); - } + { + xfpm_suspend_try_action (XFPM_HIBERNATE); + } + else if (!g_strcmp0 (sleep_time, "Suspend")) + { + xfpm_suspend_try_action (XFPM_SUSPEND); + } #endif + else + { + // Method is not implemented + g_set_error (&error, 0, 0, "This action is not supported by this system."); + } } if ( error ) @@ -1047,6 +1058,13 @@ xfpm_power_class_init (XfpmPowerClass *klass) G_PARAM_READABLE)); g_object_class_install_property (object_class, + PROP_CAN_HYBRID_SLEEP, + g_param_spec_boolean ("can-hybrid-sleep", + NULL, NULL, + FALSE, + G_PARAM_READABLE)); + + g_object_class_install_property (object_class, PROP_CAN_SUSPEND, g_param_spec_boolean ("can-suspend", NULL, NULL, @@ -1106,6 +1124,7 @@ xfpm_power_init (XfpmPower *power) power->priv->daemon_version = NULL; power->priv->can_suspend = FALSE; power->priv->can_hibernate = FALSE; + power->priv->can_hybrid_sleep = FALSE; power->priv->auth_hibernate = TRUE; power->priv->auth_suspend = TRUE; power->priv->dialog = NULL; @@ -1177,7 +1196,7 @@ static void xfpm_power_get_property (GObject *object, { XfpmPower *power; power = XFPM_POWER (object); - + switch (prop_id) { case PROP_ON_BATTERY: @@ -1195,6 +1214,9 @@ static void xfpm_power_get_property (GObject *object, case PROP_CAN_HIBERNATE: g_value_set_boolean (value, power->priv->can_hibernate); break; + case PROP_CAN_HYBRID_SLEEP: + g_value_set_boolean (value, power->priv->can_hybrid_sleep); + break; case PROP_HAS_LID: g_value_set_boolean (value, power->priv->lid_is_present); break; @@ -1321,6 +1343,11 @@ void xfpm_power_hibernate (XfpmPower *power, gboolean force) xfpm_power_sleep (power, "Hibernate", force); } +void xfpm_power_hybrid_sleep (XfpmPower *power, gboolean force) +{ + xfpm_power_sleep (power, "HybridSleep", force); +} + gboolean xfpm_power_has_battery (XfpmPower *power) { GtkStatusIcon *battery = NULL; diff --git a/src/xfpm-power.h b/src/xfpm-power.h index b3a1860..74ead30 100644 --- a/src/xfpm-power.h +++ b/src/xfpm-power.h @@ -73,6 +73,8 @@ void xfpm_power_suspend (XfpmPower *power, void xfpm_power_hibernate (XfpmPower *power, gboolean force); +void xfpm_power_hybrid_sleep (XfpmPower *power, gboolean force); + gboolean xfpm_power_has_battery (XfpmPower *power); gboolean xfpm_power_is_in_presentation_mode (XfpmPower *power); diff --git a/src/xfpm-systemd.c b/src/xfpm-systemd.c index 0c1cda6..deebe79 100644 --- a/src/xfpm-systemd.c +++ b/src/xfpm-systemd.c @@ -52,6 +52,7 @@ struct XfpmSystemdPrivate gboolean can_restart; gboolean can_suspend; gboolean can_hibernate; + gboolean can_hybrid_sleep; #ifdef ENABLE_POLKIT XfpmPolkit *polkit; #endif @@ -64,6 +65,7 @@ enum PROP_CAN_SHUTDOWN, PROP_CAN_SUSPEND, PROP_CAN_HIBERNATE, + PROP_CAN_HYBRID_SLEEP }; G_DEFINE_TYPE (XfpmSystemd, xfpm_systemd, G_TYPE_OBJECT) @@ -114,6 +116,12 @@ xfpm_systemd_class_init (XfpmSystemdClass *klass) NULL, NULL, FALSE, G_PARAM_READABLE)); + g_object_class_install_property (object_class, + PROP_CAN_HYBRID_SLEEP, + g_param_spec_boolean ("can-hybrid-sleep", + NULL, NULL, + FALSE, + G_PARAM_READABLE)); g_type_class_add_private (klass, sizeof (XfpmSystemdPrivate)); } @@ -156,6 +164,9 @@ xfpm_systemd_init (XfpmSystemd *systemd) xfpm_systemd_can_method (systemd, &systemd->priv->can_hibernate, SYSTEMD_HIBERNATE_TEST); + + systemd->priv->can_hybrid_sleep = + systemd->priv->can_suspend && systemd->priv->can_hibernate; } static void xfpm_systemd_get_property (GObject *object, @@ -180,6 +191,9 @@ static void xfpm_systemd_get_property (GObject *object, case PROP_CAN_HIBERNATE: g_value_set_boolean (value, systemd->priv->can_hibernate); break; + case PROP_CAN_HYBRID_SLEEP: + g_value_set_boolean (value, systemd->priv->can_hybrid_sleep); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; diff --git a/src/xfpm-xfconf.c b/src/xfpm-xfconf.c index 721d977..9770ff8 100644 --- a/src/xfpm-xfconf.c +++ b/src/xfpm-xfconf.c @@ -356,7 +356,7 @@ xfpm_xfconf_class_init (XfpmXfconfClass *klass) g_param_spec_uint (LID_SWITCH_ON_AC_CFG, NULL, NULL, LID_TRIGGER_NOTHING, - LID_TRIGGER_LOCK_SCREEN, + LID_TRIGGER_HYBRID_SLEEP, LID_TRIGGER_LOCK_SCREEN, G_PARAM_READWRITE)); @@ -392,7 +392,7 @@ xfpm_xfconf_class_init (XfpmXfconfClass *klass) g_param_spec_uint (LID_SWITCH_ON_BATTERY_CFG, NULL, NULL, LID_TRIGGER_NOTHING, - LID_TRIGGER_LOCK_SCREEN, + LID_TRIGGER_HYBRID_SLEEP, LID_TRIGGER_LOCK_SCREEN, G_PARAM_READWRITE)); -- 2.1.3