[Xfce4-commits] [xfce/xfce4-session] 01/10: Add logind runtime detection to support suspend/hibernate (Bug 9952)
noreply at xfce.org
noreply at xfce.org
Thu Aug 28 17:53:02 CEST 2014
This is an automated email from the git hooks/post-receive script.
eric pushed a commit to branch master
in repository xfce/xfce4-session.
commit 0bc5eb603a3ab4af930fac70e03cfe7aa63a399e
Author: Guido Berhoerster <gber at opensuse.org>
Date: Sun Aug 10 15:43:33 2014 +0300
Add logind runtime detection to support suspend/hibernate (Bug 9952)
Signed-off-by: Eric Koegel <eric.koegel at gmail.com>
---
configure.ac.in | 8 ++--
xfce4-session/Makefile.am | 6 +--
xfce4-session/xfsm-shutdown.c | 79 +++++++++++++++++++++++++++-----------
xfce4-session/xfsm-systemd.c | 85 +++++++++++++++++++++++++++++++++++++++++
xfce4-session/xfsm-systemd.h | 18 +++++++++
5 files changed, 166 insertions(+), 30 deletions(-)
diff --git a/configure.ac.in b/configure.ac.in
index 910fd35..d5b093d 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -98,7 +98,7 @@ XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.9.0])
dnl Check for polkit / systemd integration
XDT_CHECK_OPTIONAL_PACKAGE([SYSTEMD], [polkit-gobject-1], [0.100],
- [systemd], [Systemd support (through polit)])
+ [systemd], [Systemd support (through polkit)])
dnl Check for debugging support
XDT_FEATURE_DEBUG([xfsm_debug_default])
@@ -202,10 +202,10 @@ echo " * Legacy session management: yes"
else
echo " * Legacy session management: no"
fi
-if test x"$GNOME_KEYRING_FOUND" = x"yes"; then
-echo " * Gnome Keyring support: yes"
+if test x"$SYSTEMD_FOUND" = x"yes"; then
+echo " * Systemd support (through polkit): yes"
else
-echo " * Gnome Keyring support: no"
+echo " * Systemd support (through polkit): no"
fi
echo
diff --git a/xfce4-session/Makefile.am b/xfce4-session/Makefile.am
index 5472b33..ea706fd 100644
--- a/xfce4-session/Makefile.am
+++ b/xfce4-session/Makefile.am
@@ -38,6 +38,8 @@ xfce4_session_SOURCES = \
xfsm-compat-gnome.h \
xfsm-compat-kde.c \
xfsm-compat-kde.h \
+ xfsm-consolekit.c \
+ xfsm-consolekit.h \
xfsm-dns.c \
xfsm-dns.h \
xfsm-error.c \
@@ -67,10 +69,6 @@ if HAVE_SYSTEMD
xfce4_session_SOURCES += \
xfsm-systemd.c \
xfsm-systemd.h
-else
-xfce4_session_SOURCES += \
- xfsm-consolekit.c \
- xfsm-consolekit.h
endif
xfce4_session_CFLAGS = \
diff --git a/xfce4-session/xfsm-shutdown.c b/xfce4-session/xfsm-shutdown.c
index 4c483a7..329c4f6 100644
--- a/xfce4-session/xfsm-shutdown.c
+++ b/xfce4-session/xfsm-shutdown.c
@@ -63,6 +63,7 @@
#include <xfce4-session/xfsm-shutdown.h>
#include <xfce4-session/xfsm-compat-gnome.h>
#include <xfce4-session/xfsm-compat-kde.h>
+#include <xfce4-session/xfsm-consolekit.h>
#include <xfce4-session/xfsm-fadeout.h>
#include <xfce4-session/xfsm-global.h>
#include <xfce4-session/xfsm-legacy.h>
@@ -70,8 +71,6 @@
#ifdef HAVE_SYSTEMD
#include <xfce4-session/xfsm-systemd.h>
-#else
-#include <xfce4-session/xfsm-consolekit.h>
#endif
static void xfsm_shutdown_finalize (GObject *object);
@@ -98,9 +97,8 @@ struct _XfsmShutdown
#ifdef HAVE_SYSTEMD
XfsmSystemd *systemd;
-#else
- XfsmConsolekit *consolekit;
#endif
+ XfsmConsolekit *consolekit;
XfsmUPower *upower;
/* kiosk settings */
@@ -139,10 +137,14 @@ xfsm_shutdown_init (XfsmShutdown *shutdown)
XfceKiosk *kiosk;
#ifdef HAVE_SYSTEMD
- shutdown->systemd = xfsm_systemd_get ();
-#else
- shutdown->consolekit = xfsm_consolekit_get ();
+ shutdown->consolekit = NULL;
+ shutdown->systemd = NULL;
+ if (LOGIND_RUNNING())
+ shutdown->systemd = xfsm_systemd_get ();
+ else
#endif
+ shutdown->consolekit = xfsm_consolekit_get ();
+
shutdown->upower = xfsm_upower_get ();
shutdown->helper_state = SUDO_NOT_INITIAZED;
shutdown->helper_require_password = FALSE;
@@ -162,10 +164,11 @@ xfsm_shutdown_finalize (GObject *object)
XfsmShutdown *shutdown = XFSM_SHUTDOWN (object);
#ifdef HAVE_SYSTEMD
- g_object_unref (G_OBJECT (shutdown->systemd));
-#else
- g_object_unref (G_OBJECT (shutdown->consolekit));
+ if (shutdown->systemd != NULL)
+ g_object_unref (G_OBJECT (shutdown->systemd));
#endif
+ if (shutdown->consolekit != NULL)
+ g_object_unref (G_OBJECT (shutdown->consolekit));
g_object_unref (G_OBJECT (shutdown->upower));
/* close down helper */
@@ -657,10 +660,11 @@ xfsm_shutdown_try_restart (XfsmShutdown *shutdown,
return xfsm_shutdown_sudo_try_action (shutdown, XFSM_SHUTDOWN_RESTART, error);
else
#ifdef HAVE_SYSTEMD
- return xfsm_systemd_try_restart (shutdown->systemd, error);
-#else
- return xfsm_consolekit_try_restart (shutdown->consolekit, error);
+ if (shutdown->systemd != NULL)
+ return xfsm_systemd_try_restart (shutdown->systemd, error);
+ else
#endif
+ return xfsm_consolekit_try_restart (shutdown->consolekit, error);
}
@@ -678,10 +682,11 @@ xfsm_shutdown_try_shutdown (XfsmShutdown *shutdown,
return xfsm_shutdown_sudo_try_action (shutdown, XFSM_SHUTDOWN_SHUTDOWN, error);
else
#ifdef HAVE_SYSTEMD
- return xfsm_systemd_try_shutdown (shutdown->systemd, error);
-#else
- return xfsm_consolekit_try_shutdown (shutdown->consolekit, error);
+ if (shutdown->systemd != NULL)
+ return xfsm_systemd_try_shutdown (shutdown->systemd, error);
+ else
#endif
+ return xfsm_consolekit_try_shutdown (shutdown->consolekit, error);
}
@@ -692,6 +697,11 @@ xfsm_shutdown_try_suspend (XfsmShutdown *shutdown,
{
g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE);
+#ifdef HAVE_SYSTEMD
+ if (shutdown->systemd != NULL)
+ return xfsm_systemd_try_suspend (shutdown->systemd, error);
+ else
+#endif
return xfsm_upower_try_suspend (shutdown->upower, error);
}
@@ -703,6 +713,11 @@ xfsm_shutdown_try_hibernate (XfsmShutdown *shutdown,
{
g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE);
+#ifdef HAVE_SYSTEMD
+ if (shutdown->systemd != NULL)
+ return xfsm_systemd_try_hibernate (shutdown->systemd, error);
+ else
+#endif
return xfsm_upower_try_hibernate (shutdown->upower, error);
}
@@ -722,10 +737,14 @@ xfsm_shutdown_can_restart (XfsmShutdown *shutdown,
}
#ifdef HAVE_SYSTEMD
- if (xfsm_systemd_can_restart (shutdown->systemd, can_restart, error))
-#else
- if (xfsm_consolekit_can_restart (shutdown->consolekit, can_restart, error))
+ if (shutdown->systemd != NULL)
+ {
+ if (xfsm_systemd_can_restart (shutdown->systemd, can_restart, error))
+ return TRUE;
+ }
+ else
#endif
+ if (xfsm_consolekit_can_restart (shutdown->consolekit, can_restart, error))
return TRUE;
if (xfsm_shutdown_sudo_init (shutdown, error))
@@ -753,10 +772,14 @@ xfsm_shutdown_can_shutdown (XfsmShutdown *shutdown,
}
#ifdef HAVE_SYSTEMD
- if (xfsm_systemd_can_shutdown (shutdown->systemd, can_shutdown, error))
-#else
- if (xfsm_consolekit_can_shutdown (shutdown->consolekit, can_shutdown, error))
+ if (shutdown->systemd != NULL)
+ {
+ if (xfsm_systemd_can_shutdown (shutdown->systemd, can_shutdown, error))
+ return TRUE;
+ }
+ else
#endif
+ if (xfsm_consolekit_can_shutdown (shutdown->consolekit, can_shutdown, error))
return TRUE;
if (xfsm_shutdown_sudo_init (shutdown, error))
@@ -784,6 +807,12 @@ xfsm_shutdown_can_suspend (XfsmShutdown *shutdown,
return TRUE;
}
+#ifdef HAVE_SYSTEMD
+ if (shutdown->systemd != NULL)
+ return xfsm_systemd_can_suspend (shutdown->systemd, can_suspend,
+ auth_suspend, error);
+ else
+#endif
return xfsm_upower_can_suspend (shutdown->upower, can_suspend,
auth_suspend, error);
}
@@ -804,6 +833,12 @@ xfsm_shutdown_can_hibernate (XfsmShutdown *shutdown,
return TRUE;
}
+#ifdef HAVE_SYSTEMD
+ if (shutdown->systemd != NULL)
+ return xfsm_systemd_can_hibernate (shutdown->systemd, can_hibernate,
+ auth_hibernate, error);
+ else
+#endif
return xfsm_upower_can_hibernate (shutdown->upower, can_hibernate,
auth_hibernate, error);
}
diff --git a/xfce4-session/xfsm-systemd.c b/xfce4-session/xfsm-systemd.c
index 7bdd39d..f18fbf7 100644
--- a/xfce4-session/xfsm-systemd.c
+++ b/xfce4-session/xfsm-systemd.c
@@ -24,6 +24,7 @@
#include <dbus/dbus-glib.h>
#include <dbus/dbus-glib-lowlevel.h>
+#include <libxfsm/xfsm-util.h>
#include <xfce4-session/xfsm-systemd.h>
@@ -33,8 +34,12 @@
#define SYSTEMD_DBUS_INTERFACE "org.freedesktop.login1.Manager"
#define SYSTEMD_REBOOT_ACTION "Reboot"
#define SYSTEMD_POWEROFF_ACTION "PowerOff"
+#define SYSTEMD_SUSPEND_ACTION "Suspend"
+#define SYSTEMD_HIBERNATE_ACTION "Hibernate"
#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"
@@ -93,6 +98,22 @@ xfsm_systemd_finalize (GObject *object)
}
+
+static gboolean
+xfsm_systemd_lock_screen (GError **error)
+{
+ XfconfChannel *channel;
+ gboolean ret = TRUE;
+
+ channel = xfsm_open_config ();
+ if (xfconf_channel_get_bool (channel, "/shutdown/LockScreen", FALSE))
+ ret = g_spawn_command_line_async ("xflock4", error);
+
+ return ret;
+}
+
+
+
static gboolean
xfsm_systemd_can_method (XfsmSystemd *systemd,
gboolean *can_method,
@@ -205,6 +226,34 @@ xfsm_systemd_try_shutdown (XfsmSystemd *systemd,
gboolean
+xfsm_systemd_try_suspend (XfsmSystemd *systemd,
+ GError **error)
+{
+ if (!xfsm_systemd_lock_screen (error))
+ return FALSE;
+
+ return xfsm_systemd_try_method (systemd,
+ SYSTEMD_SUSPEND_ACTION,
+ error);
+}
+
+
+
+gboolean
+xfsm_systemd_try_hibernate (XfsmSystemd *systemd,
+ GError **error)
+{
+ if (!xfsm_systemd_lock_screen (error))
+ return FALSE;
+
+ return xfsm_systemd_try_method (systemd,
+ SYSTEMD_HIBERNATE_ACTION,
+ error);
+}
+
+
+
+gboolean
xfsm_systemd_can_restart (XfsmSystemd *systemd,
gboolean *can_restart,
GError **error)
@@ -227,3 +276,39 @@ xfsm_systemd_can_shutdown (XfsmSystemd *systemd,
SYSTEMD_POWEROFF_TEST,
error);
}
+
+
+
+gboolean
+xfsm_systemd_can_suspend (XfsmSystemd *systemd,
+ gboolean *can_suspend,
+ gboolean *auth_suspend,
+ GError **error)
+{
+ gboolean ret = FALSE;
+
+ ret = xfsm_systemd_can_method (systemd,
+ can_suspend,
+ SYSTEMD_SUSPEND_TEST,
+ error);
+ *auth_suspend = *can_suspend;
+ return ret;
+}
+
+
+
+gboolean
+xfsm_systemd_can_hibernate (XfsmSystemd *systemd,
+ gboolean *can_hibernate,
+ gboolean *auth_hibernate,
+ GError **error)
+{
+ gboolean ret = FALSE;
+
+ ret = xfsm_systemd_can_method (systemd,
+ can_hibernate,
+ SYSTEMD_HIBERNATE_TEST,
+ error);
+ *auth_hibernate = *can_hibernate;
+ return ret;
+}
diff --git a/xfce4-session/xfsm-systemd.h b/xfce4-session/xfsm-systemd.h
index 8223622..c5e74b5 100644
--- a/xfce4-session/xfsm-systemd.h
+++ b/xfce4-session/xfsm-systemd.h
@@ -22,6 +22,8 @@
#ifndef __XFSM_SYSTEMD_H__
#define __XFSM_SYSTEMD_H__
+#define LOGIND_RUNNING() (access ("/run/systemd/seats/", F_OK) >= 0)
+
typedef struct _XfsmSystemdClass XfsmSystemdClass;
typedef struct _XfsmSystemd XfsmSystemd;
@@ -42,6 +44,12 @@ gboolean xfsm_systemd_try_restart (XfsmSystemd *systemd,
gboolean xfsm_systemd_try_shutdown (XfsmSystemd *systemd,
GError **error);
+gboolean xfsm_systemd_try_suspend (XfsmSystemd *systemd,
+ GError **error);
+
+gboolean xfsm_systemd_try_hibernate (XfsmSystemd *systemd,
+ GError **error);
+
gboolean xfsm_systemd_can_restart (XfsmSystemd *systemd,
gboolean *can_restart,
GError **error);
@@ -50,6 +58,16 @@ gboolean xfsm_systemd_can_shutdown (XfsmSystemd *systemd,
gboolean *can_shutdown,
GError **error);
+gboolean xfsm_systemd_can_suspend (XfsmSystemd *systemd,
+ gboolean *can_suspend,
+ gboolean *auth_suspend,
+ GError **error);
+
+gboolean xfsm_systemd_can_hibernate (XfsmSystemd *systemd,
+ gboolean *can_hibernate,
+ gboolean *auth_hibernate,
+ GError **error);
+
G_END_DECLS
#endif /* __XFSM_SYSTEMD_H__ */
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list