--- 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 @@
+
+
+
+