File xfce4-power-manager-systemd-suspend-hibernate-suport.patch of Package xfce4-power-manager
From 244d0f09561eace29cbef819c2deb55b13701e25 Mon Sep 17 00:00:00 2001
From: Mikhail Efremov <sem@altlinux.org>
Date: Mon, 8 Apr 2013 21:04:30 +0400
Subject: [PATCH] Add systemd-logind support for suspend/hibernate.
---
configure.ac.in | 20 +++++++++++++++++
src/xfpm-power-common.h | 8 +++++++
src/xfpm-power.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++-
3 files changed, 84 insertions(+), 1 deletion(-)
Index: xfce4-power-manager-1.2.0/configure.ac
===================================================================
--- xfce4-power-manager-1.2.0.orig/configure.ac
+++ xfce4-power-manager-1.2.0/configure.ac
@@ -150,6 +150,25 @@ fi
AC_MSG_RESULT([$ac_network_manager])
#=======================================================#
+# Suspend/hibernate support #
+#=======================================================#
+AC_ARG_WITH([sleep-manager], AS_HELP_STRING([--with-sleep-manager=systemd|upower],
+ [Build with specific suspend/hibernate support (default: systemd)]),
+ [], [with_sleep_manager=systemd])
+AC_MSG_CHECKING([for suspend/hibernate support])
+case "$with_sleep_manager" in
+ systemd)
+ ;;
+ upower)
+ AC_DEFINE(WITH_SLEEP_MANAGER_UPOWER, 1 , [Use upower for suspend/hibernate])
+ ;;
+ *)
+ AC_MSG_ERROR(--with-sleep-manager must be one of [upower, systemd])
+ ;;
+esac
+AC_MSG_RESULT([$with_sleep_manager])
+
+#=======================================================#
# Panel plugins ? #
#=======================================================#
AC_ARG_ENABLE([panel_plugins],
@@ -250,6 +269,7 @@ echo "xdg autostart: ${sysconfdir}/xdg/
echo "POLKIT: ${polkit}"
echo "DPMS: ${have_dpms}"
echo "Network manager: ${ac_network_manager}"
+echo "Suspend/hibernate: ${with_sleep_manager}"
echo "Build panel plugins: ${build_panel_plugins}"
echo "Debug: ${enable_debug}"
echo "Configuration finished, type make to compile"
Index: xfce4-power-manager-1.2.0/src/xfpm-power-common.h
===================================================================
--- xfce4-power-manager-1.2.0.orig/src/xfpm-power-common.h
+++ xfce4-power-manager-1.2.0/src/xfpm-power-common.h
@@ -33,9 +33,17 @@
#define UPOWER_PATH_WAKEUPS "/org/freedesktop/UPower/Wakeups"
#define UPOWER_IFACE_WAKEUPS "org.freedesktop.UPower.Wakeups"
+#ifdef WITH_SLEEP_MANAGER_UPOWER
#define POLKIT_AUTH_SUSPEND "org.freedesktop.upower.suspend"
#define POLKIT_AUTH_HIBERNATE "org.freedesktop.upower.hibernate"
+#else
+#define LOGIND_NAME "org.freedesktop.login1"
+#define LOGIND_PATH "/org/freedesktop/login1"
+#define LOGIND_IFACE "org.freedesktop.login1.Manager"
+#define POLKIT_AUTH_SUSPEND "org.freedesktop.login1.suspend"
+#define POLKIT_AUTH_HIBERNATE "org.freedesktop.login1.hibernate"
+#endif
GPtrArray *xfpm_power_enumerate_devices (DBusGProxy *proxy);
Index: xfce4-power-manager-1.2.0/src/xfpm-power.c
===================================================================
--- xfce4-power-manager-1.2.0.orig/src/xfpm-power.c
+++ xfce4-power-manager-1.2.0/src/xfpm-power.c
@@ -76,7 +76,10 @@ struct XfpmPowerPrivate
DBusGProxy *proxy;
DBusGProxy *proxy_prop;
-
+#ifndef WITH_SLEEP_MANAGER_UPOWER
+ DBusGProxy *proxy_logind;
+#endif
+
GHashTable *hash;
#ifdef HAVE_SYSTEMD
@@ -160,6 +163,7 @@ xfpm_power_check_polkit_auth (XfpmPower
}
#endif
+#ifdef WITH_SLEEP_MANAGER_UPOWER
static void
xfpm_power_check_pm (XfpmPower *power, GHashTable *props)
{
@@ -193,6 +197,33 @@ xfpm_power_check_pm (XfpmPower *power, G
power->priv->can_hibernate = ret;
}
}
+#else
+static gboolean
+xfpm_power_can_sleep_method (XfpmPower *power, const char *method)
+{
+ GError *error = NULL;
+ char *retstr = NULL;
+ gboolean ret = FALSE;
+
+ if (!dbus_g_proxy_call (power->priv->proxy_logind, method, &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &retstr,
+ G_TYPE_INVALID))
+ {
+ g_warning ("Unable to check %s method: %s", method, error->message);
+ g_error_free (error);
+
+ return FALSE;
+ }
+
+ if ((g_strcmp0 (retstr, "yes") == 0) ||
+ (g_strcmp0 (retstr, "challenge") == 0))
+ ret = TRUE;
+ g_free (retstr);
+
+ return ret;
+}
+#endif
static void
xfpm_power_check_power (XfpmPower *power, GHashTable *props)
@@ -283,7 +314,12 @@ xfpm_power_get_properties (XfpmPower *po
props = xfpm_power_get_interface_properties (power->priv->proxy_prop, UPOWER_IFACE);
+#ifdef WITH_SLEEP_MANAGER_UPOWER
xfpm_power_check_pm (power, props);
+#else
+ power->priv->can_suspend = xfpm_power_can_sleep_method (power, "CanSuspend");
+ power->priv->can_hibernate = xfpm_power_can_sleep_method (power, "CanHibernate");
+#endif
xfpm_power_check_lid (power, props);
xfpm_power_check_power (power, props);
@@ -354,9 +390,16 @@ xfpm_power_sleep (XfpmPower *power, cons
xfpm_lock_screen ();
}
+#ifdef WITH_SLEEP_MANAGER_UPOWER
dbus_g_proxy_call (power->priv->proxy, sleep_time, &error,
G_TYPE_INVALID,
G_TYPE_INVALID);
+#else
+ dbus_g_proxy_call (power->priv->proxy_logind, sleep_time, &error,
+ G_TYPE_BOOLEAN, TRUE,
+ G_TYPE_INVALID,
+ G_TYPE_INVALID);
+#endif
if ( error )
{
@@ -1394,12 +1437,20 @@ xfpm_power_init (XfpmPower *power)
UPOWER_NAME,
UPOWER_PATH,
DBUS_INTERFACE_PROPERTIES);
+
if (power->priv->proxy_prop == NULL)
{
g_critical ("Unable to create proxy for %s", UPOWER_NAME);
goto out;
}
+#ifndef WITH_SLEEP_MANAGER_UPOWER
+ power->priv->proxy_logind = dbus_g_proxy_new_for_name (power->priv->bus,
+ LOGIND_NAME,
+ LOGIND_PATH,
+ LOGIND_IFACE);
+#endif
+
xfpm_power_get_power_devices (power);
xfpm_power_get_properties (power);
#ifdef ENABLE_POLKIT
@@ -1506,6 +1557,11 @@ xfpm_power_finalize (GObject *object)
if ( power->priv->proxy_prop )
g_object_unref (power->priv->proxy_prop);
+#ifndef WITH_SLEEP_MANAGER_UPOWER
+ if ( power->priv->proxy_logind )
+ g_object_unref (power->priv->proxy_logind);
+#endif
+
g_hash_table_destroy (power->priv->hash);
#ifdef ENABLE_POLKIT