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
openSUSE Build Service is sponsored by