Index: xfce4-session-4.10.1/configure.ac =================================================================== --- xfce4-session-4.10.1.orig/configure.ac +++ xfce4-session-4.10.1/configure.ac @@ -103,7 +103,7 @@ XDT_CHECK_PACKAGE([XFCONF], [libxfconf-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]) @@ -207,10 +207,10 @@ echo " * Legacy session management: 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 Index: xfce4-session-4.10.1/xfce4-session/Makefile.am =================================================================== --- xfce4-session-4.10.1.orig/xfce4-session/Makefile.am +++ xfce4-session-4.10.1/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 = \ Index: xfce4-session-4.10.1/xfce4-session/xfsm-systemd.c =================================================================== --- xfce4-session-4.10.1.orig/xfce4-session/xfsm-systemd.c +++ xfce4-session-4.10.1/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 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_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; +} Index: xfce4-session-4.10.1/xfce4-session/xfsm-systemd.h =================================================================== --- xfce4-session-4.10.1.orig/xfce4-session/xfsm-systemd.h +++ xfce4-session-4.10.1/xfce4-session/xfsm-systemd.h @@ -42,6 +42,12 @@ gboolean xfsm_systemd_try_restart ( 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 +56,16 @@ gboolean xfsm_systemd_can_shutdown ( 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__ */ Index: xfce4-session-4.10.1/xfce4-session/xfsm-shutdown.c =================================================================== --- xfce4-session-4.10.1.orig/xfce4-session/xfsm-shutdown.c +++ xfce4-session-4.10.1/xfce4-session/xfsm-shutdown.c @@ -63,15 +63,15 @@ #include #include #include +#include #include #include #include #include #ifdef HAVE_SYSTEMD +#define LOGIND_RUNNING() (access ("/run/systemd/seats/", F_OK) >= 0) #include -#else -#include #endif static void xfsm_shutdown_finalize (GObject *object); @@ -98,9 +98,8 @@ struct _XfsmShutdown #ifdef HAVE_SYSTEMD XfsmSystemd *systemd; -#else - XfsmConsolekit *consolekit; #endif + XfsmConsolekit *consolekit; XfsmUPower *upower; /* kiosk settings */ @@ -139,10 +138,14 @@ xfsm_shutdown_init (XfsmShutdown *shutdo 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 +165,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 +661,11 @@ xfsm_shutdown_try_restart (XfsmShutdown 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 (LOGIND_RUNNING()) + return xfsm_systemd_try_restart (shutdown->systemd, error); + else #endif + return xfsm_consolekit_try_restart (shutdown->consolekit, error); } @@ -678,10 +683,11 @@ xfsm_shutdown_try_shutdown (XfsmShutdown 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 (LOGIND_RUNNING()) + return xfsm_systemd_try_shutdown (shutdown->systemd, error); + else #endif + return xfsm_consolekit_try_shutdown (shutdown->consolekit, error); } @@ -692,6 +698,11 @@ xfsm_shutdown_try_suspend (XfsmShutdown { g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE); +#ifdef HAVE_SYSTEMD + if (LOGIND_RUNNING()) + return xfsm_systemd_try_suspend (shutdown->systemd, error); + else +#endif return xfsm_upower_try_suspend (shutdown->upower, error); } @@ -703,6 +714,11 @@ xfsm_shutdown_try_hibernate (XfsmShutdow { g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE); +#ifdef HAVE_SYSTEMD + if (LOGIND_RUNNING()) + return xfsm_systemd_try_hibernate (shutdown->systemd, error); + else +#endif return xfsm_upower_try_hibernate (shutdown->upower, error); } @@ -722,10 +738,14 @@ xfsm_shutdown_can_restart (XfsmShutdown } #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 (LOGIND_RUNNING()) + { + 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 +773,14 @@ xfsm_shutdown_can_shutdown (XfsmShutdown } #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 (LOGIND_RUNNING()) + { + 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 +808,12 @@ xfsm_shutdown_can_suspend (XfsmShutdown return TRUE; } +#ifdef HAVE_SYSTEMD + if (LOGIND_RUNNING()) + 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 +834,12 @@ xfsm_shutdown_can_hibernate (XfsmShutdow return TRUE; } +#ifdef HAVE_SYSTEMD + if (LOGIND_RUNNING()) + 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); }