diff -buwr xfce4-session-4.10.1.orig/configure.ac xfce4-session-4.10.1/configure.ac --- xfce4-session-4.10.1.orig/configure.ac 2013-05-06 00:33:55.000000000 +0900 +++ xfce4-session-4.10.1/configure.ac 2014-03-11 18:55:09.000000000 +0900 @@ -103,7 +103,7 @@ 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 @@ 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 -buwr xfce4-session-4.10.1.orig/xfce4-session/Makefile.am xfce4-session-4.10.1/xfce4-session/Makefile.am --- xfce4-session-4.10.1.orig/xfce4-session/Makefile.am 2013-05-06 00:33:55.000000000 +0900 +++ xfce4-session-4.10.1/xfce4-session/Makefile.am 2014-03-11 18:55:09.000000000 +0900 @@ -38,6 +38,8 @@ 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 @@ xfce4_session_SOURCES += \ xfsm-systemd.c \ xfsm-systemd.h -else -xfce4_session_SOURCES += \ - xfsm-consolekit.c \ - xfsm-consolekit.h endif xfce4_session_CFLAGS = \ diff -buwr xfce4-session-4.10.1.orig/xfce4-session/xfsm-shutdown.c xfce4-session-4.10.1/xfce4-session/xfsm-shutdown.c --- xfce4-session-4.10.1.orig/xfce4-session/xfsm-shutdown.c 2013-05-06 00:33:55.000000000 +0900 +++ xfce4-session-4.10.1/xfce4-session/xfsm-shutdown.c 2014-03-11 18:55:09.000000000 +0900 @@ -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 @@ #ifdef HAVE_SYSTEMD XfsmSystemd *systemd; -#else - XfsmConsolekit *consolekit; #endif + XfsmConsolekit *consolekit; XfsmUPower *upower; /* kiosk settings */ @@ -139,10 +137,14 @@ XfceKiosk *kiosk; #ifdef HAVE_SYSTEMD + shutdown->consolekit = NULL; + shutdown->systemd = NULL; + if (LOGIND_RUNNING()) shutdown->systemd = xfsm_systemd_get (); -#else - shutdown->consolekit = xfsm_consolekit_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 @@ XfsmShutdown *shutdown = XFSM_SHUTDOWN (object); #ifdef HAVE_SYSTEMD + if (shutdown->systemd != NULL) g_object_unref (G_OBJECT (shutdown->systemd)); -#else - g_object_unref (G_OBJECT (shutdown->consolekit)); #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 @@ return xfsm_shutdown_sudo_try_action (shutdown, XFSM_SHUTDOWN_RESTART, error); else #ifdef HAVE_SYSTEMD + if (shutdown->systemd != NULL) return xfsm_systemd_try_restart (shutdown->systemd, error); -#else - return xfsm_consolekit_try_restart (shutdown->consolekit, error); + else #endif + return xfsm_consolekit_try_restart (shutdown->consolekit, error); } @@ -678,10 +682,11 @@ return xfsm_shutdown_sudo_try_action (shutdown, XFSM_SHUTDOWN_SHUTDOWN, error); else #ifdef HAVE_SYSTEMD + if (shutdown->systemd != NULL) return xfsm_systemd_try_shutdown (shutdown->systemd, error); -#else - return xfsm_consolekit_try_shutdown (shutdown->consolekit, error); + else #endif + return xfsm_consolekit_try_shutdown (shutdown->consolekit, error); } @@ -692,6 +697,11 @@ { 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 @@ { 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 @@ } #ifdef HAVE_SYSTEMD + if (shutdown->systemd != NULL) + { if (xfsm_systemd_can_restart (shutdown->systemd, can_restart, error)) -#else - if (xfsm_consolekit_can_restart (shutdown->consolekit, 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 @@ } #ifdef HAVE_SYSTEMD + if (shutdown->systemd != NULL) + { if (xfsm_systemd_can_shutdown (shutdown->systemd, can_shutdown, error)) -#else - if (xfsm_consolekit_can_shutdown (shutdown->consolekit, 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 @@ 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 @@ 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 -buwr xfce4-session-4.10.1.orig/xfce4-session/xfsm-systemd.c xfce4-session-4.10.1/xfce4-session/xfsm-systemd.c --- xfce4-session-4.10.1.orig/xfce4-session/xfsm-systemd.c 2013-05-06 00:33:55.000000000 +0900 +++ xfce4-session-4.10.1/xfce4-session/xfsm-systemd.c 2014-03-11 18:55:09.000000000 +0900 @@ -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 @@ } + +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 @@ 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 @@ 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 -buwr xfce4-session-4.10.1.orig/xfce4-session/xfsm-systemd.h xfce4-session-4.10.1/xfce4-session/xfsm-systemd.h --- xfce4-session-4.10.1.orig/xfce4-session/xfsm-systemd.h 2013-05-06 00:33:55.000000000 +0900 +++ xfce4-session-4.10.1/xfce4-session/xfsm-systemd.h 2014-03-11 18:55:09.000000000 +0900 @@ -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_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 *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__ */