*** 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,48 **** --- 43,49 ---- { XFPM_DO_NOTHING, XFPM_DO_SUSPEND, + XFPM_DO_HYBRID_SLEEP, XFPM_DO_HIBERNATE, XFPM_ASK, XFPM_DO_SHUTDOWN *************** *** 53,58 **** --- 54,60 ---- { 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,137 **** --- 130,139 ---- 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,249 **** --- 244,253 ---- 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,262 **** 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, has_lid, has_sleep_button, has_hibernate_button, has_power_button, has_battery_button, priv->socket_id, priv->device_id, GTK_APPLICATION (app)); --- 259,266 ---- DBG("socket_id %i", (int)priv->socket_id); DBG("device id %s", priv->device_id); ! 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 22:20:46.175538378 +0200 *************** *** 882,888 **** static void xfpm_settings_on_battery (XfconfChannel *channel, gboolean auth_suspend, ! gboolean auth_hibernate, gboolean can_suspend, gboolean can_hibernate, gboolean can_shutdown, gboolean has_lcd_brightness, gboolean has_lid) { --- 882,889 ---- static void xfpm_settings_on_battery (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_lcd_brightness, gboolean has_lid) { *************** *** 919,924 **** --- 920,939 ---- 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,995 **** --- 1005,1016 ---- 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,1058 **** gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, LID_TRIGGER_SUSPEND, -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); --- 1073,1085 ---- 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); gtk_list_store_set (list_store, &iter, 0, _("Hibernate"), 1, LID_TRIGGER_HIBERNATE, -1); *************** *** 1121,1127 **** 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 has_lid) { --- 1148,1155 ---- static void xfpm_settings_on_ac (XfconfChannel *channel, gboolean auth_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,1163 **** --- 1186,1205 ---- 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,1247 **** --- 1284,1295 ---- 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,1319 **** static void xfpm_settings_general (XfconfChannel *channel, gboolean auth_suspend, ! gboolean auth_hibernate, gboolean can_suspend, gboolean can_hibernate, gboolean can_shutdown, gboolean has_sleep_button, gboolean has_hibernate_button, gboolean has_power_button, gboolean has_battery_button) --- 1361,1368 ---- static void xfpm_settings_general (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_sleep_button, gboolean has_hibernate_button, gboolean has_power_button, gboolean has_battery_button) *************** *** 1358,1369 **** 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) { gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, XFPM_DO_SUSPEND, -1); } if ( can_hibernate && auth_hibernate ) { gtk_list_store_append (list_store, &iter); --- 1407,1424 ---- 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 ) { 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,1426 **** 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) { gtk_list_store_append (list_store, &iter); gtk_list_store_set (list_store, &iter, 0, _("Suspend"), 1, XFPM_DO_SUSPEND, -1); } if ( can_hibernate && auth_hibernate ) { gtk_list_store_append (list_store, &iter); --- 1470,1487 ---- 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 ) { 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,1478 **** --- 1534,1545 ---- 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,1529 **** --- 1591,1602 ---- 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,1564 **** static void xfpm_settings_advanced (XfconfChannel *channel, gboolean auth_suspend, ! gboolean auth_hibernate, gboolean can_suspend, gboolean can_hibernate, gboolean has_battery) { guint val; --- 1631,1638 ---- static void xfpm_settings_advanced (XfconfChannel *channel, gboolean auth_suspend, ! gboolean auth_hybrid_sleep, gboolean auth_hibernate, ! gboolean can_suspend, gboolean can_hybrid_sleep, gboolean can_hibernate, gboolean has_battery) { guint val; *************** *** 1709,1716 **** } static void xfpm_settings_light_locker (XfconfChannel *channel, ! gboolean auth_suspend, gboolean auth_hibernate, ! gboolean can_suspend, gboolean can_hibernate) { GSettingsSchemaSource *schema_source; GSettingsSchema *schema; --- 1783,1791 ---- } static void xfpm_settings_light_locker (XfconfChannel *channel, ! 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; *************** *** 2248,2258 **** GPtrArray *array = NULL; guint i; ! #if UP_CHECK_VERSION(0, 99, 8) array = up_client_get_devices2 (upower); ! #else ! array = up_client_get_devices (upower); ! #endif if ( array ) { --- 2323,2333 ---- GPtrArray *array = NULL; guint i; ! #if UP_CHECK_VERSION(0, 99, 8) array = up_client_get_devices2 (upower); ! #else ! array = up_client_get_devices (upower); ! #endif if ( array ) { *************** *** 2330,2336 **** GtkWidget * xfpm_settings_dialog_new (XfconfChannel *channel, gboolean auth_suspend, ! gboolean auth_hibernate, gboolean can_suspend, gboolean can_hibernate, gboolean can_shutdown, gboolean has_battery, gboolean has_lcd_brightness, gboolean has_lid, gboolean has_sleep_button, --- 2405,2412 ---- 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, gboolean has_lcd_brightness, gboolean has_lid, gboolean has_sleep_button, *************** *** 2354,2368 **** guint val; GtkCssProvider *css_provider; ! XFPM_DEBUG ("auth_hibernate=%s auth_suspend=%s can_shutdown=%s can_suspend=%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)); xml = xfpm_builder_new_from_string (xfpm_settings_ui, &error); --- 2430,2445 ---- guint val; GtkCssProvider *css_provider; ! 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 (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,2479 **** --- 2549,2558 ---- 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,2488 **** --- 2560,2569 ---- 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,2521 **** 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_advanced (channel, auth_suspend, auth_hibernate, can_suspend, can_hibernate, has_battery); /* Light Locker Integration */ ! xfpm_settings_light_locker (channel, auth_suspend, auth_hibernate, can_suspend, can_hibernate); /* END Light Locker Integration */ if ( !has_lcd_brightness ) --- 2590,2605 ---- gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (xml ,"lid-plugged-in-header"))); } ! 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_hybrid_sleep, auth_hibernate, can_suspend, can_hybrid_sleep, ! can_hibernate, has_battery); /* Light Locker Integration */ ! 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,33 **** --- 26,35 ---- 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,76 **** --- 71,77 ---- #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,146 **** gint euid; const gchar *pkexec_uid_str; gboolean suspend = 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 }, { NULL } }; --- 137,149 ---- 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 }, ! { "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,157 **** g_option_context_free (context); /* no input */ ! if (!suspend && !hibernate) { puts ("No valid option was specified"); return EXIT_CODE_ARGUMENTS_INVALID; } --- 154,160 ---- g_option_context_free (context); /* no input */ ! if (!suspend && !hybridsleep && !hibernate) { puts ("No valid option was specified"); return EXIT_CODE_ARGUMENTS_INVALID; } *************** *** 181,186 **** --- 184,198 ---- 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,196 **** return EXIT_CODE_FAILED; } } - /* how did we get here? */ return EXIT_CODE_FAILED; } --- 202,207 ---- *** 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,120 **** --- 115,121 ---- XfpmPolkit *polkit; #endif gboolean auth_suspend; + gboolean auth_hybrid_sleep; gboolean auth_hibernate; /* Properties */ *************** *** 124,129 **** --- 125,131 ---- gboolean on_battery; gchar *daemon_version; gboolean can_suspend; + gboolean can_hybrid_sleep; gboolean can_hibernate; /** *************** *** 139,146 **** --- 141,150 ---- 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,181 **** check_for_consolekit2 (XfpmPower *power) { XfpmConsoleKit *console; ! gboolean can_suspend, can_hibernate; g_return_val_if_fail (XFPM_IS_POWER (power), FALSE); --- 179,185 ---- check_for_consolekit2 (XfpmPower *power) { XfpmConsoleKit *console; ! gboolean can_suspend; gboolean can_hybrid_sleep; gboolean can_hibernate; g_return_val_if_fail (XFPM_IS_POWER (power), FALSE); *************** *** 188,198 **** "can-suspend", &can_suspend, NULL); g_object_get (G_OBJECT (console), "can-hibernate", &can_hibernate, NULL); ! /* ConsoleKit2 supports suspend and hibernate */ ! if (can_suspend || can_hibernate) { return TRUE; } --- 192,205 ---- "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, hybrid sleep or hibernate */ ! if (can_suspend || can_hybrid_sleep || can_hibernate) { return TRUE; } *************** *** 204,215 **** static void xfpm_power_check_polkit_auth (XfpmPower *power) { ! const char *suspend = NULL, *hibernate = NULL; if (LOGIND_RUNNING()) { XFPM_DEBUG ("using logind suspend backend"); ! suspend = POLKIT_AUTH_SUSPEND_LOGIND; ! hibernate = POLKIT_AUTH_HIBERNATE_LOGIND; } else { --- 211,223 ---- static void xfpm_power_check_polkit_auth (XfpmPower *power) { ! const char *suspend = NULL, *hybrid_sleep = NULL, *hibernate = NULL; if (LOGIND_RUNNING()) { XFPM_DEBUG ("using logind suspend backend"); ! suspend = POLKIT_AUTH_SUSPEND_LOGIND; ! hybrid_sleep = POLKIT_AUTH_HIBERNATE_LOGIND; ! hibernate = POLKIT_AUTH_HIBERNATE_LOGIND; } else { *************** *** 219,238 **** if (check_for_consolekit2 (power)) { XFPM_DEBUG ("using consolekit2 suspend backend"); ! suspend = POLKIT_AUTH_SUSPEND_CONSOLEKIT2; ! hibernate = POLKIT_AUTH_HIBERNATE_CONSOLEKIT2; } else { XFPM_DEBUG ("using xfpm internal suspend backend"); ! suspend = POLKIT_AUTH_SUSPEND_XFPM; ! hibernate = POLKIT_AUTH_HIBERNATE_XFPM; } } } power->priv->auth_suspend = xfpm_polkit_check_auth (power->priv->polkit, suspend); power->priv->auth_hibernate = xfpm_polkit_check_auth (power->priv->polkit, hibernate); } --- 227,252 ---- if (check_for_consolekit2 (power)) { XFPM_DEBUG ("using consolekit2 suspend backend"); ! 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; ! 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,287 **** --- 296,302 ---- * * DaemonVersion 's' * CanSuspend' 'b' + * CanHybridSleep' 'b' * CanHibernate' 'b' * OnBattery' 'b' * OnLowBattery' 'b' *************** *** 300,305 **** --- 315,323 ---- 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,324 **** g_object_get (G_OBJECT (power->priv->console), "can-suspend", &power->priv->can_suspend, 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 (); } } --- 329,346 ---- 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_hybrid_sleep = xfpm_suspend_can_hybrid_sleep (); ! power->priv->can_hibernate = xfpm_suspend_can_hibernate (); } } *************** *** 922,932 **** 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 ( array ) { --- 944,954 ---- 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 ( array ) { *************** *** 1143,1148 **** --- 1165,1184 ---- 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,1269 **** --- 1300,1308 ---- 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,1278 **** --- 1312,1320 ---- 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,1405 **** --- 1442,1452 ---- 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,75 **** GType xfpm_power_get_type (void) G_GNUC_CONST; ! XfpmPower *xfpm_power_get (void); void xfpm_power_suspend (XfpmPower *power, gboolean force); void xfpm_power_hibernate (XfpmPower *power, gboolean force); --- 65,78 ---- GType xfpm_power_get_type (void) G_GNUC_CONST; ! 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,36 **** { XFPM_ASK_0 = 0, XFPM_SUSPEND, XFPM_HIBERNATE, } XfpmActionType; ! gboolean xfpm_suspend_can_suspend (void); ! gboolean xfpm_suspend_can_hibernate (void); gboolean xfpm_suspend_try_action (XfpmActionType type); --- 26,38 ---- { XFPM_ASK_0 = 0, XFPM_SUSPEND, + XFPM_HYBRID_SLEEP, XFPM_HIBERNATE, } XfpmActionType; ! 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,154 **** --- 149,173 ---- } 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,183 **** --- 197,204 ---- 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,53 **** --- 48,54 ---- gboolean can_shutdown; gboolean can_restart; gboolean can_suspend; + gboolean can_hybrid_sleep; gboolean can_hibernate; #ifdef ENABLE_POLKIT XfpmPolkit *polkit; *************** *** 60,65 **** --- 61,67 ---- PROP_CAN_RESTART, PROP_CAN_SHUTDOWN, PROP_CAN_SUSPEND, + PROP_CAN_HYBRID_SLEEP, PROP_CAN_HIBERNATE, }; *************** *** 73,80 **** --- 75,88 ---- #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,117 **** 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 gboolean xfpm_systemd_can_method (XfpmSystemd *systemd, --- 114,131 ---- 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));} static gboolean xfpm_systemd_can_method (XfpmSystemd *systemd, *************** *** 149,154 **** --- 163,171 ---- &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,183 **** switch (prop_id) { case PROP_CAN_SHUTDOWN: ! g_value_set_boolean (value, systemd->priv->can_shutdown); ! break; case PROP_CAN_RESTART: ! g_value_set_boolean (value, systemd->priv->can_restart); ! break; case PROP_CAN_SUSPEND: ! g_value_set_boolean (value, systemd->priv->can_suspend); ! 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; } } --- 181,203 ---- switch (prop_id) { case PROP_CAN_SHUTDOWN: ! g_value_set_boolean (value, systemd->priv->can_shutdown); ! break; case PROP_CAN_RESTART: ! g_value_set_boolean (value, systemd->priv->can_restart); ! break; case PROP_CAN_SUSPEND: ! 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; } } *** 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,344 **** --- 339,347 ---- 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,957 **** --- 953,962 ---- 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,985 **** --- 983,992 ---- 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,1010 **** --- 1010,1019 ---- 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,56 **** --- 51,57 ---- gboolean can_shutdown; gboolean can_restart; gboolean can_suspend; + gboolean can_hybrid_sleep; gboolean can_hibernate; }; *************** *** 60,65 **** --- 61,67 ---- PROP_CAN_RESTART, PROP_CAN_SHUTDOWN, PROP_CAN_SUSPEND, + PROP_CAN_HYBRID_SLEEP, PROP_CAN_HIBERNATE }; *************** *** 194,206 **** 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 --- 196,214 ---- 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_object_class_install_property (object_class, + PROP_CAN_HIBERNATE, + g_param_spec_boolean ("can-hibernate", + NULL, NULL, + FALSE, + G_PARAM_READABLE)); } static void *************** *** 262,267 **** --- 270,278 ---- 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,89 **** --- 82,91 ---- { 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,103 **** --- 98,107 ---- 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,142 **** --- 137,150 ---- "%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,13 **** --- 8,16 ---- + + + *************** *** 27,32 **** --- 30,39 ---- + + + +