You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
449 lines
13 KiB
449 lines
13 KiB
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 38afe446cdc889266f1e553952397cc4a876ecf8 Mon Sep 17 00:00:00 2001
|
|
From: Eric Koegel <eric.koegel@gmail.com>
|
|
Date: Mon, 7 Jul 2014 11:30:06 +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. Additionally Upower is an optional build dependency
|
|
and the minimum required is 0.9.7 to support FreeBSD 9 and 10.
|
|
---
|
|
configure.ac.in | 30 ++++++++
|
|
xfce4-session/Makefile.am | 4 +-
|
|
xfce4-session/xfsm-shutdown.c | 167 +++++++++++++++++++++++++++++++++++++++++-
|
|
xfce4-session/xfsm-upower.c | 8 +-
|
|
xfce4-session/xfsm-upower.h | 4 +
|
|
xfsm-shutdown-helper/main.c | 26 +++++++
|
|
6 files changed, 234 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/configure.ac b/configure.ac
|
|
index 910fd35..b9c9a90 100644
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -96,6 +96,10 @@ 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])
|
|
|
|
+dnl Check for Upower
|
|
+XDT_CHECK_OPTIONAL_PACKAGE([UPOWER],[upower-glib], [0.9.7],
|
|
+ [upower],[Upower support])
|
|
+
|
|
dnl Check for polkit / systemd integration
|
|
XDT_CHECK_OPTIONAL_PACKAGE([SYSTEMD], [polkit-gobject-1], [0.100],
|
|
[systemd], [Systemd support (through polit)])
|
|
@@ -157,6 +161,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 +236,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..24b548e 100644
|
|
--- a/xfce4-session/xfsm-shutdown.c
|
|
+++ b/xfce4-session/xfsm-shutdown.c
|
|
@@ -57,6 +57,9 @@
|
|
#include <dbus/dbus-glib-lowlevel.h>
|
|
#include <libxfce4util/libxfce4util.h>
|
|
#include <gtk/gtk.h>
|
|
+#ifdef HAVE_UPOWER
|
|
+#include <upower.h>
|
|
+#endif
|
|
|
|
#include <libxfsm/xfsm-util.h>
|
|
|
|
@@ -76,6 +79,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 +408,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 +699,19 @@ xfsm_shutdown_try_suspend (XfsmShutdown *shutdown,
|
|
{
|
|
g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE);
|
|
|
|
+#ifdef HAVE_UPOWER
|
|
+#if !UP_CHECK_VERSION(0, 99, 0)
|
|
return xfsm_upower_try_suspend (shutdown->upower, error);
|
|
+#endif /* UP_CHECK_VERSION */
|
|
+#endif /* HAVE_UPOWER */
|
|
+
|
|
+ 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;
|
|
}
|
|
|
|
|
|
@@ -703,7 +722,19 @@ xfsm_shutdown_try_hibernate (XfsmShutdown *shutdown,
|
|
{
|
|
g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE);
|
|
|
|
+#ifdef HAVE_UPOWER
|
|
+#if !UP_CHECK_VERSION(0, 99, 0)
|
|
return xfsm_upower_try_hibernate (shutdown->upower, error);
|
|
+#endif /* UP_CHECK_VERSION */
|
|
+#endif /* HAVE_UPOWER */
|
|
+
|
|
+ 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;
|
|
}
|
|
|
|
|
|
@@ -784,8 +815,15 @@ xfsm_shutdown_can_suspend (XfsmShutdown *shutdown,
|
|
return TRUE;
|
|
}
|
|
|
|
+#ifdef HAVE_UPOWER
|
|
+#if !UP_CHECK_VERSION(0, 99, 0)
|
|
return xfsm_upower_can_suspend (shutdown->upower, can_suspend,
|
|
auth_suspend, error);
|
|
+#endif /* UP_CHECK_VERSION */
|
|
+#endif /* HAVE_UPOWER */
|
|
+
|
|
+ *can_suspend = xfsm_shutdown_fallback_can_suspend ();
|
|
+ return TRUE;
|
|
}
|
|
|
|
|
|
@@ -804,8 +842,15 @@ xfsm_shutdown_can_hibernate (XfsmShutdown *shutdown,
|
|
return TRUE;
|
|
}
|
|
|
|
+#ifdef HAVE_UPOWER
|
|
+#if !UP_CHECK_VERSION(0, 99, 0)
|
|
return xfsm_upower_can_hibernate (shutdown->upower, can_hibernate,
|
|
auth_hibernate, error);
|
|
+#endif /* UP_CHECK_VERSION */
|
|
+#endif /* HAVE_UPOWER */
|
|
+
|
|
+ *can_hibernate = xfsm_shutdown_fallback_can_hibernate ();
|
|
+ return TRUE;
|
|
}
|
|
|
|
|
|
@@ -816,3 +861,121 @@ 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 gchar *
|
|
+get_string_sysctl (GError **err, const gchar *format, ...)
|
|
+{
|
|
+ va_list args;
|
|
+ gchar *name;
|
|
+ size_t value_len;
|
|
+ gchar *str = NULL;
|
|
+
|
|
+ g_return_val_if_fail(format != NULL, FALSE);
|
|
+
|
|
+ va_start (args, format);
|
|
+ name = g_strdup_vprintf (format, args);
|
|
+ va_end (args);
|
|
+
|
|
+ if (sysctlbyname (name, NULL, &value_len, NULL, 0) == 0) {
|
|
+ str = g_new (char, value_len + 1);
|
|
+ if (sysctlbyname (name, str, &value_len, NULL, 0) == 0)
|
|
+ str[value_len] = 0;
|
|
+ else {
|
|
+ g_free (str);
|
|
+ str = NULL;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ if (!str)
|
|
+ g_set_error (err, 0, 0, "%s", g_strerror(errno));
|
|
+
|
|
+ g_free(name);
|
|
+ return str;
|
|
+}
|
|
+
|
|
+
|
|
+
|
|
+static gboolean
|
|
+freebsd_supports_sleep_state (const gchar *state)
|
|
+{
|
|
+ gboolean ret = FALSE;
|
|
+ gchar *sleep_states;
|
|
+
|
|
+ sleep_states = 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 /* BACKEND_TYPE_FREEBSD */
|
|
+
|
|
+
|
|
+
|
|
+#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 /* BACKEND_TYPE_LINUX */
|
|
+
|
|
+
|
|
+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..2960943 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,14 +284,13 @@ xfsm_upower_try_method (XfsmUPower *upower,
|
|
|
|
|
|
|
|
-static gboolean
|
|
+gboolean
|
|
xfsm_upower_lock_screen (XfsmUPower *upower,
|
|
const gchar *sleep_kind,
|
|
GError **error)
|
|
{
|
|
XfconfChannel *channel;
|
|
gboolean ret = TRUE;
|
|
- GError *err = NULL;
|
|
|
|
g_return_val_if_fail (sleep_kind != NULL, FALSE);
|
|
|
|
@@ -299,6 +299,9 @@ xfsm_upower_lock_screen (XfsmUPower *upower,
|
|
{
|
|
if (xfsm_upower_proxy_ensure (upower, error))
|
|
{
|
|
+#if !UP_CHECK_VERSION(0, 99, 0)
|
|
+ GError *err = NULL;
|
|
+
|
|
/* 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 +315,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)
|
|
{
|
|
--
|
|
2.0.0
|
|
|