--- a/common/xfpm-enum-glib.h 2019-04-19 20:56:07.011083198 +0200 +++ b/common/xfpm-enum-glib.h 2019-04-19 21:54:39.778802114 +0200 @@ -43,6 +43,7 @@ { XFPM_DO_NOTHING, XFPM_DO_SUSPEND, + XFPM_DO_HYBRID_SLEEP, XFPM_DO_HIBERNATE, XFPM_ASK, XFPM_DO_SHUTDOWN @@ -53,6 +54,7 @@ { LID_TRIGGER_NOTHING, LID_TRIGGER_SUSPEND, + LID_TRIGGER_HYBRID_SLEEP, LID_TRIGGER_HIBERNATE, LID_TRIGGER_LOCK_SCREEN, --- a/settings/xfpm-settings-app.c 2019-04-19 20:56:07.022083391 +0200 +++ b/settings/xfpm-settings-app.c 2019-04-19 21:55:41.480861187 +0200 @@ -130,8 +130,10 @@ gboolean has_battery; gboolean auth_suspend; + gboolean auth_hybrid_sleep; gboolean auth_hibernate; gboolean can_suspend; + gboolean can_hybrid_sleep; gboolean can_hibernate; gboolean can_shutdown; gboolean has_lcd_brightness; @@ -242,8 +244,10 @@ has_battery = xfpm_string_to_bool (g_hash_table_lookup (hash, "has-battery")); has_lid = xfpm_string_to_bool (g_hash_table_lookup (hash, "has-lid")); can_suspend = xfpm_string_to_bool (g_hash_table_lookup (hash, "can-suspend")); + can_hybrid_sleep = xfpm_string_to_bool (g_hash_table_lookup (hash, "can-hybrid-sleep")); can_hibernate = xfpm_string_to_bool (g_hash_table_lookup (hash, "can-hibernate")); auth_suspend = xfpm_string_to_bool (g_hash_table_lookup (hash, "auth-suspend")); + auth_hybrid_sleep = xfpm_string_to_bool (g_hash_table_lookup (hash, "auth-hybrid-sleep")); auth_hibernate = xfpm_string_to_bool (g_hash_table_lookup (hash, "auth-hibernate")); has_lcd_brightness = xfpm_string_to_bool (g_hash_table_lookup (hash, "has-brightness")); has_sleep_button = xfpm_string_to_bool (g_hash_table_lookup (hash, "sleep-button")); @@ -255,8 +259,8 @@ DBG("socket_id %i", (int)priv->socket_id); DBG("device id %s", priv->device_id); - dialog = xfpm_settings_dialog_new (channel, auth_suspend, auth_hibernate, - can_suspend, can_hibernate, can_shutdown, has_battery, has_lcd_brightness, + dialog = xfpm_settings_dialog_new (channel, auth_suspend, auth_hybrid_sleep, auth_hibernate, + can_suspend, can_hybrid_sleep, can_hibernate, can_shutdown, has_battery, has_lcd_brightness, has_lid, has_sleep_button, has_hibernate_button, has_power_button, has_battery_button, priv->socket_id, priv->device_id, GTK_APPLICATION (app)); --- a/settings/xfpm-settings.c 2019-04-19 20:56:07.022083391 +0200 +++ b/settings/xfpm-settings.c 2019-04-19 23:46:27.075003050 +0200 @@ -882,7 +882,8 @@ static void xfpm_settings_on_battery (XfconfChannel *channel, gboolean auth_suspend, - gboolean auth_hibernate, gboolean can_suspend, + gboolean auth_hybrid_sleep, gboolean auth_hibernate, + gboolean can_suspend, gboolean can_hybrid_sleep, gboolean can_hibernate, gboolean can_shutdown, gboolean has_lcd_brightness, gboolean has_lid) { @@ -919,6 +920,20 @@ gtk_widget_set_tooltip_text (inact_action, _("Suspend operation not supported")); } + if ( can_hybrid_sleep ) + { + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hybrid Sleep"), 1, XFPM_DO_HYBRID_SLEEP, -1); + } + else if ( !auth_hybrid_sleep ) + { + gtk_widget_set_tooltip_text (inact_action, _("Hybrid Sleep not permitted")); + } + else + { + gtk_widget_set_tooltip_text (inact_action, _("Hybrid Sleep not supported")); + } + if ( can_hibernate ) { gtk_list_store_append (list_store, &iter); @@ -990,6 +1005,12 @@ gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, XFPM_DO_SUSPEND, -1); } + if ( can_hybrid_sleep && auth_hybrid_sleep ) + { + gtk_list_store_append(list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hybrid Sleep"), 1, XFPM_DO_HYBRID_SLEEP, -1); + } + if ( can_hibernate && auth_hibernate ) { gtk_list_store_append(list_store, &iter); @@ -1052,7 +1073,13 @@ gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, LID_TRIGGER_SUSPEND, -1); } - if ( can_hibernate && auth_hibernate) + if ( can_hybrid_sleep && auth_hybrid_sleep ) + { + gtk_list_store_append(list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hybrid Sleep"), 1, LID_TRIGGER_HYBRID_SLEEP, -1); + } + + if ( can_hibernate && auth_hibernate ) { gtk_list_store_append(list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Hibernate"), 1, LID_TRIGGER_HIBERNATE, -1); @@ -1121,7 +1148,8 @@ static void xfpm_settings_on_ac (XfconfChannel *channel, gboolean auth_suspend, - gboolean auth_hibernate, gboolean can_suspend, + gboolean auth_hybrid_sleep, gboolean auth_hibernate, + gboolean can_suspend, gboolean can_hybrid_sleep, gboolean can_hibernate, gboolean has_lcd_brightness, gboolean has_lid) { @@ -1158,6 +1186,20 @@ gtk_widget_set_tooltip_text (inact_action, _("Suspend operation not supported")); } + if ( can_hybrid_sleep ) + { + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hybrid Sleep"), 1, XFPM_DO_HYBRID_SLEEP, -1); + } + else if ( !auth_hybrid_sleep ) + { + gtk_widget_set_tooltip_text (inact_action, _("Hybrid Sleep not permitted")); + } + else + { + gtk_widget_set_tooltip_text (inact_action, _("Hybrid Sleep not supported")); + } + if ( can_hibernate ) { gtk_list_store_append (list_store, &iter); @@ -1242,6 +1284,12 @@ gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, LID_TRIGGER_SUSPEND, -1); } + if ( can_hybrid_sleep && auth_hybrid_sleep ) + { + gtk_list_store_append(list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hybrid Sleep"), 1, LID_TRIGGER_HYBRID_SLEEP, -1); + } + if ( can_hibernate && auth_hibernate ) { gtk_list_store_append(list_store, &iter); @@ -1313,7 +1361,8 @@ static void xfpm_settings_general (XfconfChannel *channel, gboolean auth_suspend, - gboolean auth_hibernate, gboolean can_suspend, + gboolean auth_hybrid_sleep, gboolean auth_hibernate, + gboolean can_suspend, gboolean can_hybrid_sleep, gboolean can_hibernate, gboolean can_shutdown, gboolean has_sleep_button, gboolean has_hibernate_button, gboolean has_power_button, gboolean has_battery_button) @@ -1358,12 +1407,18 @@ gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Do nothing"), 1, XFPM_DO_NOTHING, -1); - if ( can_suspend && auth_suspend) + if ( can_suspend && auth_suspend ) { gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, XFPM_DO_SUSPEND, -1); } + if ( can_hybrid_sleep && auth_hybrid_sleep ) + { + gtk_list_store_append(list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hybrid Sleep"), 1, XFPM_DO_HYBRID_SLEEP, -1); + } + if ( can_hibernate && auth_hibernate ) { gtk_list_store_append (list_store, &iter); @@ -1415,12 +1470,18 @@ gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Do nothing"), 1, XFPM_DO_NOTHING, -1); - if ( can_suspend && auth_suspend) + if ( can_suspend && auth_suspend ) { gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, XFPM_DO_SUSPEND, -1); } + if ( can_hybrid_sleep && auth_hybrid_sleep ) + { + gtk_list_store_append(list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hybrid Sleep"), 1, XFPM_DO_HYBRID_SLEEP, -1); + } + if ( can_hibernate && auth_hibernate ) { gtk_list_store_append (list_store, &iter); @@ -1473,6 +1534,12 @@ gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, XFPM_DO_SUSPEND, -1); } + if ( can_hybrid_sleep && auth_hybrid_sleep ) + { + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hybrid Sleep"), 1, XFPM_DO_HYBRID_SLEEP, -1); + } + if ( can_hibernate && auth_hibernate) { gtk_list_store_append (list_store, &iter); @@ -1524,6 +1591,12 @@ gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, XFPM_DO_SUSPEND, -1); } + if ( can_hybrid_sleep && auth_hybrid_sleep ) + { + gtk_list_store_append (list_store, &iter); + gtk_list_store_set (list_store, &iter, 0, _("Hybrid Sleep"), 1, XFPM_DO_HYBRID_SLEEP, -1); + } + if ( can_hibernate && auth_hibernate) { gtk_list_store_append (list_store, &iter); @@ -1558,7 +1631,8 @@ static void xfpm_settings_advanced (XfconfChannel *channel, gboolean auth_suspend, - gboolean auth_hibernate, gboolean can_suspend, + gboolean auth_hybrid_sleep, gboolean auth_hibernate, + gboolean can_suspend, gboolean can_hybrid_sleep, gboolean can_hibernate, gboolean has_battery) { guint val; @@ -1709,8 +1783,9 @@ } static void xfpm_settings_light_locker (XfconfChannel *channel, - gboolean auth_suspend, gboolean auth_hibernate, - gboolean can_suspend, gboolean can_hibernate) + gboolean auth_suspend, gboolean auth_hybrid_sleep, + gboolean auth_hibernate, gboolean can_suspend, + gboolean can_hybrid_sleep, gboolean can_hibernate) { GSettingsSchemaSource *schema_source; GSettingsSchema *schema; @@ -2330,7 +2405,8 @@ GtkWidget * xfpm_settings_dialog_new (XfconfChannel *channel, gboolean auth_suspend, - gboolean auth_hibernate, gboolean can_suspend, + gboolean auth_hybrid_sleep, gboolean auth_hibernate, + gboolean can_suspend, gboolean can_hybrid_sleep, gboolean can_hibernate, gboolean can_shutdown, gboolean has_battery, gboolean has_lcd_brightness, gboolean has_lid, gboolean has_sleep_button, @@ -2354,15 +2430,16 @@ guint val; GtkCssProvider *css_provider; - 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 auth_hybrid_sleep=%s can_shutdown=%s can_suspend=%s can_hybrid_sleep=%s can_hibernate=%s " \ "has_battery=%s has_lcd_brightness=%s has_lid=%s has_sleep_button=%s " \ "has_hibernate_button=%s has_power_button=%s has_battery_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 (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), xfpm_bool_to_string (has_battery_button)); + xfpm_bool_to_string (has_battery), xfpm_bool_to_string (auth_hibernate), + xfpm_bool_to_string (auth_hybrid_sleep), xfpm_bool_to_string (can_hybrid_sleep), + 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 (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), xfpm_bool_to_string (has_battery_button)); xml = xfpm_builder_new_from_string (xfpm_settings_ui, &error); @@ -2472,8 +2549,10 @@ xfpm_settings_on_ac (channel, auth_suspend, + auth_hybrid_sleep, auth_hibernate, can_suspend, + can_hybrid_sleep, can_hibernate, has_lcd_brightness, has_lid); @@ -2481,8 +2560,10 @@ if ( has_battery ) xfpm_settings_on_battery (channel, auth_suspend, + auth_hybrid_sleep, auth_hibernate, can_suspend, + can_hybrid_sleep, can_hibernate, can_shutdown, has_lcd_brightness, @@ -2509,13 +2590,16 @@ gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (xml ,"lid-plugged-in-header"))); } - xfpm_settings_general (channel, auth_suspend, auth_hibernate, can_suspend, can_hibernate, can_shutdown, - has_sleep_button, has_hibernate_button, has_power_button, has_battery_button); + xfpm_settings_general (channel, auth_suspend, auth_hybrid_sleep, auth_hibernate, can_suspend, can_hybrid_sleep, + can_hibernate, can_shutdown, has_sleep_button, has_hibernate_button, + has_power_button, has_battery_button); - xfpm_settings_advanced (channel, auth_suspend, auth_hibernate, can_suspend, can_hibernate, has_battery); + xfpm_settings_advanced (channel, auth_suspend, auth_hybrid_sleep, auth_hibernate, can_suspend, can_hybrid_sleep, + can_hibernate, has_battery); /* Light Locker Integration */ - xfpm_settings_light_locker (channel, auth_suspend, auth_hibernate, can_suspend, can_hibernate); + xfpm_settings_light_locker (channel, auth_suspend, auth_hybrid_sleep, auth_hibernate, can_suspend, + can_hybrid_sleep, can_hibernate); /* END Light Locker Integration */ if ( !has_lcd_brightness ) --- a/settings/xfpm-settings.h 2019-04-19 20:56:07.023083408 +0200 +++ b/settings/xfpm-settings.h 2019-04-19 21:24:46.250327496 +0200 @@ -26,8 +26,10 @@ GtkWidget *xfpm_settings_dialog_new (XfconfChannel *channel, gboolean auth_suspend, + gboolean auth_hybrid_sleep, gboolean auth_hibernate, gboolean can_suspend, + gboolean can_hybrid_sleep, gboolean can_hibernate, gboolean can_shutdown, gboolean has_battery, --- a/src/xfpm-pm-helper.c 2019-04-19 20:56:07.025083443 +0200 +++ b/src/xfpm-pm-helper.c 2019-04-19 21:24:46.250327496 +0200 @@ -71,6 +71,7 @@ #endif #ifdef BACKEND_TYPE_LINUX #define UP_BACKEND_SUSPEND_COMMAND "/usr/sbin/pm-suspend" +#define UP_BACKEND_HYBRID_SLEEP_COMMAND "/usr/sbin/pm-suspend-hybrid" #define UP_BACKEND_HIBERNATE_COMMAND "/usr/sbin/pm-hibernate" #endif #ifdef BACKEND_TYPE_OPENBSD @@ -136,11 +137,13 @@ gint euid; const gchar *pkexec_uid_str; gboolean suspend = FALSE; + gboolean hybridsleep = FALSE; gboolean hibernate = FALSE; const GOptionEntry options[] = { - { "suspend", '\0', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &suspend, "Suspend the system", NULL }, - { "hibernate", '\0', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &hibernate, "Hibernate the system", NULL }, + { "suspend", '\0', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &suspend, "Suspend the system", NULL }, + { "hybridsleep", '\0', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &hybridsleep, "Hybrid Suspend/sleep the system", NULL }, + { "hibernate", '\0', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &hibernate, "Hibernate the system", NULL }, { NULL } }; @@ -151,7 +154,7 @@ g_option_context_free (context); /* no input */ - if (!suspend && !hibernate) { + if (!suspend && !hybridsleep && !hibernate) { puts ("No valid option was specified"); return EXIT_CODE_ARGUMENTS_INVALID; } @@ -181,6 +184,15 @@ return EXIT_CODE_FAILED; } } + else if (hybridsleep) + { + if(run (UP_BACKEND_HYBRID_SLEEP_COMMAND)) + { + return EXIT_CODE_SUCCESS; + } else { + return EXIT_CODE_FAILED; + } + } else if (hibernate) { if(run (UP_BACKEND_HIBERNATE_COMMAND)) @@ -190,7 +202,6 @@ return EXIT_CODE_FAILED; } } - /* how did we get here? */ return EXIT_CODE_FAILED; } --- a/src/xfpm-power.c 2019-04-19 20:56:07.023083408 +0200 +++ b/src/xfpm-power.c 2019-04-19 22:09:17.186860748 +0200 @@ -115,6 +115,7 @@ XfpmPolkit *polkit; #endif gboolean auth_suspend; + gboolean auth_hybrid_sleep; gboolean auth_hibernate; /* Properties */ @@ -124,6 +125,7 @@ gboolean on_battery; gchar *daemon_version; gboolean can_suspend; + gboolean can_hybrid_sleep; gboolean can_hibernate; /** @@ -139,8 +141,10 @@ PROP_ON_LOW_BATTERY, PROP_ON_BATTERY, PROP_AUTH_SUSPEND, + PROP_AUTH_HYBRID_SLEEP, PROP_AUTH_HIBERNATE, PROP_CAN_SUSPEND, + PROP_CAN_HYBRID_SLEEP, PROP_CAN_HIBERNATE, PROP_HAS_LID, PROP_PRESENTATION_MODE, @@ -175,7 +179,7 @@ check_for_consolekit2 (XfpmPower *power) { XfpmConsoleKit *console; - gboolean can_suspend, can_hibernate; + gboolean can_suspend; gboolean can_hybrid_sleep; gboolean can_hibernate; g_return_val_if_fail (XFPM_IS_POWER (power), FALSE); @@ -188,11 +192,14 @@ "can-suspend", &can_suspend, NULL); g_object_get (G_OBJECT (console), + "can-hybrid-sleep", &can_hybrid_sleep, + NULL); + g_object_get (G_OBJECT (console), "can-hibernate", &can_hibernate, NULL); - /* ConsoleKit2 supports suspend and hibernate */ - if (can_suspend || can_hibernate) + /* ConsoleKit2 supports suspend, hybrid sleep or hibernate */ + if (can_suspend || can_hybrid_sleep || can_hibernate) { return TRUE; } @@ -204,12 +211,13 @@ static void xfpm_power_check_polkit_auth (XfpmPower *power) { - const char *suspend = NULL, *hibernate = NULL; + const char *suspend = NULL, *hybrid_sleep = NULL, *hibernate = NULL; if (LOGIND_RUNNING()) { XFPM_DEBUG ("using logind suspend backend"); - suspend = POLKIT_AUTH_SUSPEND_LOGIND; - hibernate = POLKIT_AUTH_HIBERNATE_LOGIND; + suspend = POLKIT_AUTH_SUSPEND_LOGIND; + hybrid_sleep = POLKIT_AUTH_HIBERNATE_LOGIND; + hibernate = POLKIT_AUTH_HIBERNATE_LOGIND; } else { @@ -219,20 +227,26 @@ if (check_for_consolekit2 (power)) { XFPM_DEBUG ("using consolekit2 suspend backend"); - suspend = POLKIT_AUTH_SUSPEND_CONSOLEKIT2; - hibernate = POLKIT_AUTH_HIBERNATE_CONSOLEKIT2; + suspend = POLKIT_AUTH_SUSPEND_CONSOLEKIT2; + hybrid_sleep = POLKIT_AUTH_HIBERNATE_CONSOLEKIT2; + hibernate = POLKIT_AUTH_HIBERNATE_CONSOLEKIT2; } else { XFPM_DEBUG ("using xfpm internal suspend backend"); - suspend = POLKIT_AUTH_SUSPEND_XFPM; - hibernate = POLKIT_AUTH_HIBERNATE_XFPM; + suspend = POLKIT_AUTH_SUSPEND_XFPM; + hybrid_sleep = POLKIT_AUTH_HIBERNATE_XFPM; + hibernate = POLKIT_AUTH_HIBERNATE_XFPM; } } } power->priv->auth_suspend = xfpm_polkit_check_auth (power->priv->polkit, suspend); + /* polkit doesn't seem to support hybrid-suspend auth check */ + power->priv->auth_hybrid_sleep = xfpm_polkit_check_auth (power->priv->polkit, + hibernate); + power->priv->auth_hibernate = xfpm_polkit_check_auth (power->priv->polkit, hibernate); } @@ -282,6 +296,7 @@ * * DaemonVersion 's' * CanSuspend' 'b' + * CanHybridSleep' 'b' * CanHibernate' 'b' * OnBattery' 'b' * OnLowBattery' 'b' @@ -300,6 +315,9 @@ g_object_get (G_OBJECT (power->priv->systemd), "can-suspend", &power->priv->can_suspend, NULL); + g_object_get (G_OBJECT (power->priv->systemd), + "can-hybrid-sleep", &power->priv->can_hybrid_sleep, + NULL); g_object_get (G_OBJECT (power->priv->systemd), "can-hibernate", &power->priv->can_hibernate, NULL); @@ -311,14 +329,18 @@ g_object_get (G_OBJECT (power->priv->console), "can-suspend", &power->priv->can_suspend, NULL); + g_object_get (G_OBJECT (power->priv->console), + "can-hybrid-sleep", &power->priv->can_hybrid_sleep, + NULL); g_object_get (G_OBJECT (power->priv->console), "can-hibernate", &power->priv->can_hibernate, NULL); } else { - power->priv->can_suspend = xfpm_suspend_can_suspend (); - power->priv->can_hibernate = xfpm_suspend_can_hibernate (); + power->priv->can_suspend = xfpm_suspend_can_suspend (); + power->priv->can_hybrid_sleep = xfpm_suspend_can_hybrid_sleep (); + power->priv->can_hibernate = xfpm_suspend_can_hibernate (); } } @@ -922,11 +944,11 @@ GPtrArray *array = NULL; guint i; -#if UP_CHECK_VERSION(0, 99, 8) - array = up_client_get_devices2 (power->priv->upower); -#else - array = up_client_get_devices (power->priv->upower); -#endif + #if UP_CHECK_VERSION(0, 99, 8) + array = up_client_get_devices2 (power->priv->upower); + #else + array = up_client_get_devices (power->priv->upower); + #endif if ( array ) { @@ -1143,6 +1165,20 @@ 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_AUTH_HYBRID_SLEEP, + g_param_spec_boolean ("auth-hybrid-sleep", + NULL, NULL, + FALSE, + G_PARAM_READABLE)); + + g_object_class_install_property (object_class, PROP_PRESENTATION_MODE, g_param_spec_boolean (PRESENTATION_MODE, NULL, NULL, @@ -1264,6 +1300,9 @@ case PROP_AUTH_HIBERNATE: g_value_set_boolean (value, power->priv->auth_hibernate); break; + case PROP_AUTH_HYBRID_SLEEP: + g_value_set_boolean (value, power->priv->auth_hybrid_sleep); + break; case PROP_AUTH_SUSPEND: g_value_set_boolean (value, power->priv->auth_suspend); break; @@ -1273,6 +1312,9 @@ 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; @@ -1400,6 +1442,11 @@ 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; --- a/src/xfpm-power.h 2019-04-19 20:56:07.025083443 +0200 +++ b/src/xfpm-power.h 2019-04-19 21:58:48.707074778 +0200 @@ -65,11 +65,14 @@ GType xfpm_power_get_type (void) G_GNUC_CONST; -XfpmPower *xfpm_power_get (void); +XfpmPower *xfpm_power_get (void); void xfpm_power_suspend (XfpmPower *power, gboolean force); +void xfpm_power_hybrid_sleep (XfpmPower *power, + gboolean force); + void xfpm_power_hibernate (XfpmPower *power, gboolean force); --- a/src/xfpm-suspend.h 2019-04-19 20:56:07.025083443 +0200 +++ b/src/xfpm-suspend.h 2019-04-19 22:04:59.933446511 +0200 @@ -26,11 +26,13 @@ { XFPM_ASK_0 = 0, XFPM_SUSPEND, + XFPM_HYBRID_SLEEP, XFPM_HIBERNATE, } XfpmActionType; -gboolean xfpm_suspend_can_suspend (void); -gboolean xfpm_suspend_can_hibernate (void); +gboolean xfpm_suspend_can_suspend (void); +gboolean xfpm_suspend_can_hybrid_sleep (void); +gboolean xfpm_suspend_can_hibernate (void); gboolean xfpm_suspend_try_action (XfpmActionType type); --- a/src/xfpm-suspend.c 2019-04-19 20:56:07.025083443 +0200 +++ b/src/xfpm-suspend.c 2019-04-19 22:07:05.968609775 +0200 @@ -149,6 +149,25 @@ } gboolean +xfpm_suspend_can_hybrid_sleep (void) +{ + XFPM_DEBUG("entering"); +#ifdef BACKEND_TYPE_FREEBSD + return freebsd_supports_sleep_state ("S3"); +#endif +/* pm-utils pm-is-supported uses suspend-hybrid not hybridsleep */ +#ifdef BACKEND_TYPE_LINUX + return linux_supports_sleep_state ("suspend-hybrid"); +#endif +#ifdef BACKEND_TYPE_OPENBSD + return TRUE; +#endif + + return FALSE; +} + + +gboolean xfpm_suspend_can_hibernate (void) { XFPM_DEBUG("entering"); @@ -178,6 +197,8 @@ if (type == XFPM_SUSPEND) action = "suspend"; + else if (type == XFPM_HYBRID_SLEEP) + action = "hybridsleep"; else if (type == XFPM_HIBERNATE) action = "hibernate"; else --- a/src/xfpm-systemd.c 2019-04-19 20:56:07.025083443 +0200 +++ b/src/xfpm-systemd.c 2019-04-19 21:48:43.148705920 +0200 @@ -48,6 +48,7 @@ gboolean can_shutdown; gboolean can_restart; gboolean can_suspend; + gboolean can_hybrid_sleep; gboolean can_hibernate; #ifdef ENABLE_POLKIT XfpmPolkit *polkit; @@ -60,6 +61,7 @@ PROP_CAN_RESTART, PROP_CAN_SHUTDOWN, PROP_CAN_SUSPEND, + PROP_CAN_HYBRID_SLEEP, PROP_CAN_HIBERNATE, }; @@ -73,8 +75,14 @@ #define SYSTEMD_REBOOT_TEST "org.freedesktop.login1.reboot" #define SYSTEMD_POWEROFF_TEST "org.freedesktop.login1.power-off" #define SYSTEMD_SUSPEND_TEST "org.freedesktop.login1.suspend" + #define SYSTEMD_HIBERNATE_TEST "org.freedesktop.login1.hibernate" +#define SYSTEMD_HYBRID_SLEEP_TEST "org.freedesktop.login1.reboot" +/* +#define SYSTEMD_HIBERNATE_TEST "CanHibernate" +#define SYSTEMD_HYBRID_SLEEP_TEST "CanHybridSleep" +*/ static void xfpm_systemd_class_init (XfpmSystemdClass *klass) { @@ -106,12 +114,18 @@ 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_HIBERNATE, g_param_spec_boolean ("can-hibernate", NULL, NULL, FALSE, - G_PARAM_READABLE)); -} + G_PARAM_READABLE));} static gboolean xfpm_systemd_can_method (XfpmSystemd *systemd, @@ -149,6 +163,9 @@ &systemd->priv->can_suspend, SYSTEMD_SUSPEND_TEST); xfpm_systemd_can_method (systemd, + &systemd->priv->can_hybrid_sleep, + SYSTEMD_HYBRID_SLEEP_TEST); + xfpm_systemd_can_method (systemd, &systemd->priv->can_hibernate, SYSTEMD_HIBERNATE_TEST); } @@ -164,20 +181,23 @@ switch (prop_id) { case PROP_CAN_SHUTDOWN: - g_value_set_boolean (value, systemd->priv->can_shutdown); - break; + g_value_set_boolean (value, systemd->priv->can_shutdown); + break; case PROP_CAN_RESTART: - g_value_set_boolean (value, systemd->priv->can_restart); - break; + g_value_set_boolean (value, systemd->priv->can_restart); + break; case PROP_CAN_SUSPEND: - g_value_set_boolean (value, systemd->priv->can_suspend); - break; + g_value_set_boolean (value, systemd->priv->can_suspend); + break; + case PROP_CAN_HYBRID_SLEEP: + g_value_set_boolean (value, systemd->priv->can_hybrid_sleep); + break; case PROP_CAN_HIBERNATE: g_value_set_boolean (value, systemd->priv->can_hibernate); break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; } } --- a/src/xfpm-manager.c 2019-04-19 20:56:07.024083426 +0200 +++ b/src/xfpm-manager.c 2019-04-19 22:17:53.718615419 +0200 @@ -339,6 +339,9 @@ 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; @@ -950,8 +953,10 @@ guint16 mapped_buttons; gboolean auth_hibernate = FALSE; gboolean auth_suspend = FALSE; + gboolean auth_hybrid_sleep = 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; @@ -978,8 +983,10 @@ g_object_get (G_OBJECT (manager->priv->power), "auth-suspend", &auth_suspend, + "auth-hybrid-sleep", &auth_hybrid_sleep, "auth-hibernate", &auth_hibernate, "can-suspend", &can_suspend, + "can-hybrid-sleep", &can_hybrid_sleep, "can-hibernate", &can_hibernate, "has-lid", &has_lid, NULL); @@ -1003,8 +1010,10 @@ g_hash_table_insert (hash, g_strdup ("hibernate-button"), g_strdup (xfpm_bool_to_string (has_hibernate_button))); g_hash_table_insert (hash, g_strdup ("battery-button"), g_strdup (xfpm_bool_to_string (has_battery_button))); g_hash_table_insert (hash, g_strdup ("auth-suspend"), g_strdup (xfpm_bool_to_string (auth_suspend))); + g_hash_table_insert (hash, g_strdup ("auth-hybrid-sleep"), g_strdup (xfpm_bool_to_string (auth_hybrid_sleep))); 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-hybrid-sleep"), g_strdup (xfpm_bool_to_string (can_hybrid_sleep))); 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-shutdown"), g_strdup (xfpm_bool_to_string (can_shutdown))); --- a/src/xfpm-console-kit.c 2019-04-19 20:56:07.024083426 +0200 +++ b/src/xfpm-console-kit.c 2019-04-19 21:56:35.235783839 +0200 @@ -51,6 +51,7 @@ gboolean can_shutdown; gboolean can_restart; gboolean can_suspend; + gboolean can_hybrid_sleep; gboolean can_hibernate; }; @@ -60,6 +61,7 @@ PROP_CAN_RESTART, PROP_CAN_SHUTDOWN, PROP_CAN_SUSPEND, + PROP_CAN_HYBRID_SLEEP, PROP_CAN_HIBERNATE }; @@ -194,13 +196,19 @@ NULL, NULL, FALSE, G_PARAM_READABLE)); - g_object_class_install_property (object_class, - PROP_CAN_HIBERNATE, - g_param_spec_boolean ("can-hibernate", + 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_HIBERNATE, + g_param_spec_boolean ("can-hibernate", + NULL, NULL, + FALSE, + G_PARAM_READABLE)); } static void @@ -262,6 +270,9 @@ case PROP_CAN_SUSPEND: g_value_set_boolean (value, console->priv->can_suspend); break; + case PROP_CAN_HYBRID_SLEEP: + g_value_set_boolean (value, console->priv->can_hybrid_sleep); + break; case PROP_CAN_HIBERNATE: g_value_set_boolean (value, console->priv->can_hibernate); break; --- a/src/xfpm-main.c 2019-04-19 20:56:07.024083426 +0200 +++ b/src/xfpm-main.c 2019-04-19 22:07:31.289044375 +0200 @@ -82,8 +82,10 @@ { gboolean has_battery; gboolean auth_suspend; + gboolean auth_hybrid_sleep; gboolean auth_hibernate; gboolean can_suspend; + gboolean can_hybrid_sleep; gboolean can_hibernate; gboolean can_shutdown; gboolean has_lcd_brightness; @@ -96,8 +98,10 @@ has_battery = xfpm_string_to_bool (g_hash_table_lookup (hash, "has-battery")); has_lid = xfpm_string_to_bool (g_hash_table_lookup (hash, "has-lid")); can_suspend = xfpm_string_to_bool (g_hash_table_lookup (hash, "can-suspend")); + can_hybrid_sleep = xfpm_string_to_bool (g_hash_table_lookup (hash, "can-hybrid-sleep")); can_hibernate = xfpm_string_to_bool (g_hash_table_lookup (hash, "can-hibernate")); auth_suspend = xfpm_string_to_bool (g_hash_table_lookup (hash, "auth-suspend")); + auth_hybrid_sleep = xfpm_string_to_bool (g_hash_table_lookup (hash, "auth-hybrid-sleep")); auth_hibernate = xfpm_string_to_bool (g_hash_table_lookup (hash, "auth-hibernate")); has_lcd_brightness = xfpm_string_to_bool (g_hash_table_lookup (hash, "has-brightness")); has_sleep_button = xfpm_string_to_bool (g_hash_table_lookup (hash, "sleep-button")); @@ -133,10 +137,14 @@ "%s: %s\n", _("Can suspend"), xfpm_bool_to_local_string (can_suspend), + _("Can hybrid_sleep"), + xfpm_bool_to_local_string (can_hybrid_sleep), _("Can hibernate"), xfpm_bool_to_local_string (can_hibernate), _("Authorized to suspend"), xfpm_bool_to_local_string (auth_suspend), + _("Authorized to hybrid_sleep"), + xfpm_bool_to_local_string (auth_hybrid_sleep), _("Authorized to hibernate"), xfpm_bool_to_local_string (auth_hibernate), _("Authorized to shutdown"), --- a/src/org.freedesktop.PowerManagement.xml 2019-04-19 20:56:07.023083408 +0200 +++ b/src/org.freedesktop.PowerManagement.xml 2019-04-19 21:31:05.289722766 +0200 @@ -8,6 +8,9 @@ + + + @@ -27,6 +30,10 @@ + + + +