ssuominen    14/05/31 19:19:58

  Added:                xfce4-session-4.11.0-upower-0.99.patch
  Log:
  Restrict 4.10 series and -r0 of 4.11.0 to old UPower and add -r1 for 
compability with UPower >= 0.99
  
  (Portage version: 2.2.10/cvs/Linux x86_64, signed Manifest commit with key 
4868F14D)

Revision  Changes    Path
1.1                  
xfce-base/xfce4-session/files/xfce4-session-4.11.0-upower-0.99.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/xfce-base/xfce4-session/files/xfce4-session-4.11.0-upower-0.99.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo-x86/xfce-base/xfce4-session/files/xfce4-session-4.11.0-upower-0.99.patch?rev=1.1&content-type=text/plain

Index: xfce4-session-4.11.0-upower-0.99.patch
===================================================================
Patch from http://bugzilla.xfce.org/show_bug.cgi?id=9952 with modification
to edit configure.ac (release tarball) instead of configure.ac.in (git)

>From ee2228c756e40a4289476f40a6d0045d17418bce Mon Sep 17 00:00:00 2001
From: Eric Koegel <eric.koe...@gmail.com>
Date: Thu, 29 May 2014 19:17:26 +0300
Subject: [PATCH] Add suspend/hibernate to shutdown-helper

Upower 0.99 dropped support for suspend/hibernate as an obsolete
feature in this commit:
http://cgit.freedesktop.org/upower/commit/?id=1ee642e705a63f5ad56a6b55e4bf5c4a64c959b8
Add that functionality into the shutdown-helper so these features
will work again.
---
 configure.ac.in               |  27 +++++++++
 xfce4-session/Makefile.am     |   4 +-
 xfce4-session/xfsm-shutdown.c | 126 ++++++++++++++++++++++++++++++++++++++++--
 xfce4-session/xfsm-upower.c   |   5 +-
 xfce4-session/xfsm-upower.h   |   4 ++
 xfsm-shutdown-helper/main.c   |  26 +++++++++
 6 files changed, 186 insertions(+), 6 deletions(-)

diff --git a/configure.ac b/configure.ac
index 910fd35..d4557a4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -95,6 +95,7 @@ XDT_CHECK_PACKAGE([LIBWNCK], [libwnck-1.0], [2.30])
 XDT_CHECK_PACKAGE([DBUS], [dbus-1], [1.1.0])
 XDT_CHECK_PACKAGE([DBUS_GLIB], [dbus-glib-1], [0.84])
 XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.9.0])
+XDT_CHECK_PACKAGE([UPOWER],[upower-glib], [0.9.8])
 
 dnl Check for polkit / systemd integration
 XDT_CHECK_OPTIONAL_PACKAGE([SYSTEMD], [polkit-gobject-1], [0.100],
@@ -157,6 +158,31 @@ if test "x$linux_ioprio_works" = "xyes"; then
             [Defined if linux/ioprio.h not only exists, but works properly])
 fi
 
+dnl Compile time default choice of backend
+AC_ARG_WITH([backend],
+           AS_HELP_STRING([--with-backend=<option>],
+                          [Default backend to use linux, freebsd, openbsd]))
+# default to a sane option
+AC_CANONICAL_HOST
+if test x$with_backend = x; then
+       AS_CASE([$host],
+               [*-linux*],   [with_backend=linux],
+               [*-*freebsd*], [with_backend=freebsd],
+               [*-openbsd*], [with_backend=openbsd])
+fi
+AC_DEFINE_UNQUOTED(BACKEND, "$with_backend", [backend])
+AC_SUBST(BACKEND, "$with_backend")
+
+if test x$with_backend = xlinux; then
+    AC_DEFINE(BACKEND_TYPE_LINUX, 1, [Linux suspend/hibernate backend])
+fi
+if test x$with_backend = xfreebsd; then
+    AC_DEFINE(BACKEND_TYPE_FREEBSD, 1, [FreeBSD suspend/hibernate backend])
+fi
+if test x$with_backend = xopenbsd; then
+    AC_DEFINE(BACKEND_TYPE_OPENBSD, 1, [OpenBSD suspend/hibernate backend])
+fi
+
 dnl check for location Xfce glade files were installed to
 XFCE_GLADE_CATALOG_PATH="`pkg-config --variable glade_catalogdir libxfce4ui-1`"
 XFCE_GLADE_PIXMAP_PATH="`pkg-config --variable glade_pixmapdir libxfce4ui-1`"
@@ -207,5 +233,6 @@ echo " * Gnome Keyring support:          yes"
 else
 echo " * Gnome Keyring support:          no"
 fi
+echo " * Backend:                        ${with_backend}"
 
 echo
diff --git a/xfce4-session/Makefile.am b/xfce4-session/Makefile.am
index 5472b33..6b5968e 100644
--- a/xfce4-session/Makefile.am
+++ b/xfce4-session/Makefile.am
@@ -83,7 +83,8 @@ xfce4_session_CFLAGS =                                        
                \
        $(SYSTEMD_CFLAGS)                                               \
        $(XFCONF_CFLAGS)                                                \
        $(GMODULE_CFLAGS)                                               \
-       $(PLATFORM_CFLAGS)
+       $(PLATFORM_CFLAGS)                                              \
+       $(UPOWER_CFLAGS)
 
 xfce4_session_LDFLAGS =                                                        
\
        -no-undefined                                                   \
@@ -102,6 +103,7 @@ xfce4_session_LDADD =                                       
                \
        $(LIBWNCK_LIBS)                                                 \
        $(SYSTEMD_LIBS)                                                 \
        $(XFCONF_LIBS)                                                  \
+       $(UPOWER_LIBS)                                                  \
        -lm
 
 xfce4_session_DEPENDENCIES =                                           \
diff --git a/xfce4-session/xfsm-shutdown.c b/xfce4-session/xfsm-shutdown.c
index 4c483a7..cba08b8 100644
--- a/xfce4-session/xfsm-shutdown.c
+++ b/xfce4-session/xfsm-shutdown.c
@@ -57,6 +57,7 @@
 #include <dbus/dbus-glib-lowlevel.h>
 #include <libxfce4util/libxfce4util.h>
 #include <gtk/gtk.h>
+#include <upower.h>
 
 #include <libxfsm/xfsm-util.h>
 
@@ -76,6 +77,8 @@
 
 static void xfsm_shutdown_finalize  (GObject      *object);
 static void xfsm_shutdown_sudo_free (XfsmShutdown *shutdown);
+static gboolean xfsm_shutdown_fallback_can_hibernate (void);
+static gboolean xfsm_shutdown_fallback_can_suspend   (void);
 
 
 
@@ -403,14 +406,16 @@ xfsm_shutdown_sudo_try_action (XfsmShutdown      
*shutdown,
   g_return_val_if_fail (shutdown->helper_state == SUDO_AVAILABLE, FALSE);
   g_return_val_if_fail (shutdown->helper_outfile != NULL, FALSE);
   g_return_val_if_fail (shutdown->helper_infile != NULL, FALSE);
-  g_return_val_if_fail (type == XFSM_SHUTDOWN_SHUTDOWN
-                        || type == XFSM_SHUTDOWN_RESTART, FALSE);
 
   /* the command we send to sudo */
   if (type == XFSM_SHUTDOWN_SHUTDOWN)
     action = "POWEROFF";
   else if (type == XFSM_SHUTDOWN_RESTART)
     action = "REBOOT";
+  else if (type == XFSM_SHUTDOWN_SUSPEND)
+    action = "SUSPEND";
+  else if (type == XFSM_SHUTDOWN_HIBERNATE)
+    action = "HIBERNATE";
   else
     return FALSE;
 
@@ -692,7 +697,17 @@ xfsm_shutdown_try_suspend (XfsmShutdown  *shutdown,
 {
   g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE);
 
-  return xfsm_upower_try_suspend (shutdown->upower, error);
+#if UP_CHECK_VERSION(0, 99, 0)
+  if (shutdown->helper_state == SUDO_AVAILABLE)
+    {
+      xfsm_upower_lock_screen (shutdown->upower, "Suspend", error);
+      return xfsm_shutdown_sudo_try_action (shutdown, XFSM_SHUTDOWN_SUSPEND, 
error);
+    }
+  else
+    return FALSE;
+#else
+    return xfsm_upower_try_suspend (shutdown->upower, error);
+#endif
 }
 
 
@@ -703,7 +718,17 @@ xfsm_shutdown_try_hibernate (XfsmShutdown  *shutdown,
 {
   g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE);
 
-  return xfsm_upower_try_hibernate (shutdown->upower, error);
+#if UP_CHECK_VERSION(0, 99, 0)
+  if (shutdown->helper_state == SUDO_AVAILABLE)
+    {
+      xfsm_upower_lock_screen (shutdown->upower, "Hibernate", error);
+      return xfsm_shutdown_sudo_try_action (shutdown, XFSM_SHUTDOWN_HIBERNATE, 
error);
+    }
+  else
+    return FALSE;
+#else
+    return xfsm_upower_try_hibernate (shutdown->upower, error);
+#endif
 }
 
 
@@ -784,8 +809,13 @@ xfsm_shutdown_can_suspend (XfsmShutdown  *shutdown,
       return TRUE;
     }
 
+#if UP_CHECK_VERSION(0, 99, 0)
+  *can_suspend = xfsm_shutdown_fallback_can_suspend ();
+  return TRUE;
+#else
   return xfsm_upower_can_suspend (shutdown->upower, can_suspend, 
                                   auth_suspend, error);
+#endif
 }
 
 
@@ -804,8 +834,13 @@ xfsm_shutdown_can_hibernate (XfsmShutdown  *shutdown,
       return TRUE;
     }
 
+#if UP_CHECK_VERSION(0, 99, 0)
+  *can_hibernate = xfsm_shutdown_fallback_can_hibernate ();
+  return TRUE;
+#else
   return xfsm_upower_can_hibernate (shutdown->upower, can_hibernate,
                                     auth_hibernate, error);
+#endif
 }
 
 
@@ -816,3 +851,86 @@ xfsm_shutdown_can_save_session (XfsmShutdown *shutdown)
   g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE);
   return shutdown->kiosk_can_save_session;
 }
+
+
+
+#ifdef BACKEND_TYPE_FREEBSD
+static gboolean
+freebsd_supports_sleep_state (const gchar *state)
+{
+  gboolean ret = FALSE;
+  gchar *sleep_states;
+
+  sleep_states = up_get_string_sysctl (NULL, "hw.acpi.supported_sleep_state");
+  if (sleep_states != NULL)
+    {
+      if (strstr (sleep_states, state) != NULL)
+          ret = TRUE;
+    }
+
+  g_free (sleep_states);
+
+  return ret;
+}
+#endif
+
+#ifdef BACKEND_TYPE_LINUX
+static gboolean
+linux_supports_sleep_state (const gchar *state)
+{
+  gboolean ret = FALSE;
+  gchar *command;
+  GError *error = NULL;
+  gint exit_status;
+
+  /* run script from pm-utils */
+  command = g_strdup_printf ("/usr/bin/pm-is-supported --%s", state);
+
+  ret = g_spawn_command_line_sync (command, NULL, NULL, &exit_status, &error);
+  if (!ret)
+    {
+      g_warning ("failed to run script: %s", error->message);
+      g_error_free (error);
+      goto out;
+    }
+  ret = (WIFEXITED(exit_status) && (WEXITSTATUS(exit_status) == EXIT_SUCCESS));
+
+out:
+  g_free (command);
+
+  return ret;
+}
+#endif
+
+
+static gboolean
+xfsm_shutdown_fallback_can_suspend (void)
+{
+#ifdef BACKEND_TYPE_FREEBSD
+  return freebsd_supports_sleep_state ("S3");
+#endif
+#ifdef BACKEND_TYPE_LINUX
+  return linux_supports_sleep_state ("suspend");
+#endif
+#ifdef BACKEND_TYPE_OPENBSD
+  return TRUE;
+#endif
+
+  return FALSE;
+}
+
+static gboolean
+xfsm_shutdown_fallback_can_hibernate (void)
+{
+#ifdef BACKEND_TYPE_FREEBSD
+  return freebsd_supports_sleep_state ("S4");
+#endif
+#ifdef BACKEND_TYPE_LINUX
+  return linux_supports_sleep_state ("hibernate");
+#endif
+#ifdef BACKEND_TYPE_OPENBSD
+  return FALSE;
+#endif
+
+  return FALSE;
+}
diff --git a/xfce4-session/xfsm-upower.c b/xfce4-session/xfsm-upower.c
index 57402ec..8112829 100644
--- a/xfce4-session/xfsm-upower.c
+++ b/xfce4-session/xfsm-upower.c
@@ -21,6 +21,7 @@
 
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
+#include <upower.h>
 
 #include <libxfsm/xfsm-util.h>
 #include <xfce4-session/xfsm-upower.h>
@@ -283,7 +284,7 @@ xfsm_upower_try_method (XfsmUPower   *upower,
 
 
 
-static gboolean
+gboolean
 xfsm_upower_lock_screen (XfsmUPower   *upower,
                          const gchar  *sleep_kind,
                          GError      **error)
@@ -299,6 +300,7 @@ xfsm_upower_lock_screen (XfsmUPower   *upower,
     {
       if (xfsm_upower_proxy_ensure (upower, error))
         {
+#if !UP_CHECK_VERSION(0, 99, 0)
           /* tell upower we're going to sleep, this saves some
            * time while we sleep 1 second if xflock4 is spawned */
           ret = dbus_g_proxy_call (upower->upower_proxy,
@@ -312,6 +314,7 @@ xfsm_upower_lock_screen (XfsmUPower   *upower,
               g_warning ("Couldn't sent that we were about to sleep: %s", 
err->message);
               g_error_free (err);
             }
+#endif
         }
       else
         {
diff --git a/xfce4-session/xfsm-upower.h b/xfce4-session/xfsm-upower.h
index a492f7d..4e6a53b 100644
--- a/xfce4-session/xfsm-upower.h
+++ b/xfce4-session/xfsm-upower.h
@@ -51,4 +51,8 @@ gboolean        xfsm_upower_can_hibernate    (XfsmUPower      
*upower,
                                               gboolean        *auth_hibernate,
                                               GError         **error);
 
+gboolean        xfsm_upower_lock_screen      (XfsmUPower      *upower,
+                                              const gchar     *sleep_kind,
+                                              GError         **error);
+
 #endif /* !__XFSM_UPOWER_HELPER_H__ */
diff --git a/xfsm-shutdown-helper/main.c b/xfsm-shutdown-helper/main.c
index 667f288..60c621b 100644
--- a/xfsm-shutdown-helper/main.c
+++ b/xfsm-shutdown-helper/main.c
@@ -57,6 +57,12 @@
 #ifdef REBOOT_CMD
 #undef REBOOT_CMD
 #endif
+#ifdef UP_BACKEND_SUSPEND_COMMAND
+#undef UP_BACKEND_SUSPEND_COMMAND
+#endif
+#ifdef UP_BACKEND_HIBERNATE_COMMAND
+#undef UP_BACKEND_HIBERNATE_COMMAND
+#endif
 
 #if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || 
defined(__OpenBSD__)
 #define POWEROFF_CMD  "/sbin/shutdown -p now"
@@ -68,6 +74,18 @@
 #define POWEROFF_CMD  "/sbin/shutdown -h now"
 #define REBOOT_CMD    "/sbin/shutdown -r now"
 #endif
+#ifdef BACKEND_TYPE_FREEBSD
+#define UP_BACKEND_SUSPEND_COMMAND "/usr/sbin/zzz"
+#define UP_BACKEND_HIBERNATE_COMMAND "/usr/sbin/acpiconf -s 4"
+#endif
+#if BACKEND_TYPE_LINUX
+#define UP_BACKEND_SUSPEND_COMMAND "/usr/sbin/pm-suspend"
+#define UP_BACKEND_HIBERNATE_COMMAND "/usr/sbin/pm-hibernate"
+#endif
+#ifdef BACKEND_TYPE_OPENBSD
+#define UP_BACKEND_SUSPEND_COMMAND     "/usr/sbin/zzz"
+#define UP_BACKEND_HIBERNATE_COMMAND "/dev/null"
+#endif
 
 
 static gboolean
@@ -143,6 +161,14 @@ main (int argc, char **argv)
     {
       succeed = run (REBOOT_CMD);
     }
+  else if (strncasecmp (action, "SUSPEND", 7) == 0)
+    {
+      succeed = run (UP_BACKEND_SUSPEND_COMMAND);
+    }
+  else if (strncasecmp (action, "HIBERNATE", 9) == 0)
+    {
+      succeed = run (UP_BACKEND_HIBERNATE_COMMAND);
+    }
 
   if (succeed)
     {
-- 
1.9.3





Reply via email to