http://pkgs.fedoraproject.org/cgit/xfce4-session.git/commit/xfce4-session-4.10.1-systemd.patch?id=9e8af8b3ee7e8e91817d087e80de29b1af6d4943 diff --git a/configure.ac b/configure.ac index 46ff366..8feee0b 100644 --- a/configure.ac +++ b/configure.ac @@ -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 #include #include +#include #include #include #include @@ -70,8 +71,6 @@ #ifdef HAVE_SYSTEMD #include -#else -#include #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 #include +#include #include @@ -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__ */