From b076b5592579b397b7d4888eb8062e646b9a4dec Mon Sep 17 00:00:00 2001 From: Mikhail Efremov Date: Wed, 10 Apr 2013 17:10:09 +0400 Subject: [PATCH] Add systemd-logind support for suspend/hibernate. --- xfce4-session/Makefile.am | 8 +++---- xfce4-session/xfsm-shutdown.c | 42 +++++++++++++++++++++++++++------- xfce4-session/xfsm-systemd.c | 52 +++++++++++++++++++++++++++++++++++++++++++ xfce4-session/xfsm-systemd.h | 14 ++++++++++++ 4 files changed, 104 insertions(+), 12 deletions(-) diff --git a/xfce4-session/Makefile.am b/xfce4-session/Makefile.am index 5472b33..5e2973b 100644 --- a/xfce4-session/Makefile.am +++ b/xfce4-session/Makefile.am @@ -59,9 +59,7 @@ xfce4_session_SOURCES = \ xfsm-splash-screen.c \ xfsm-splash-screen.h \ xfsm-startup.c \ - xfsm-startup.h \ - xfsm-upower.c \ - xfsm-upower.h + xfsm-startup.h if HAVE_SYSTEMD xfce4_session_SOURCES += \ @@ -70,7 +68,9 @@ xfce4_session_SOURCES += \ else xfce4_session_SOURCES += \ xfsm-consolekit.c \ - xfsm-consolekit.h + xfsm-consolekit.h \ + xfsm-upower.c \ + xfsm-upower.h endif xfce4_session_CFLAGS = \ diff --git a/xfce4-session/xfsm-shutdown.c b/xfce4-session/xfsm-shutdown.c index 4c483a7..8a2ba8d 100644 --- a/xfce4-session/xfsm-shutdown.c +++ b/xfce4-session/xfsm-shutdown.c @@ -66,12 +66,12 @@ #include #include #include -#include #ifdef HAVE_SYSTEMD #include #else #include +#include #endif static void xfsm_shutdown_finalize (GObject *object); @@ -100,8 +100,8 @@ struct _XfsmShutdown XfsmSystemd *systemd; #else XfsmConsolekit *consolekit; -#endif XfsmUPower *upower; +#endif /* kiosk settings */ gboolean kiosk_can_shutdown; @@ -142,8 +142,8 @@ xfsm_shutdown_init (XfsmShutdown *shutdown) shutdown->systemd = xfsm_systemd_get (); #else shutdown->consolekit = xfsm_consolekit_get (); -#endif shutdown->upower = xfsm_upower_get (); +#endif shutdown->helper_state = SUDO_NOT_INITIAZED; shutdown->helper_require_password = FALSE; @@ -165,8 +165,8 @@ xfsm_shutdown_finalize (GObject *object) g_object_unref (G_OBJECT (shutdown->systemd)); #else g_object_unref (G_OBJECT (shutdown->consolekit)); -#endif g_object_unref (G_OBJECT (shutdown->upower)); +#endif /* close down helper */ xfsm_shutdown_sudo_free (shutdown); @@ -692,7 +692,11 @@ xfsm_shutdown_try_suspend (XfsmShutdown *shutdown, { g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE); +#ifdef HAVE_SYSTEMD + return xfsm_systemd_try_suspend (shutdown->systemd, error); +#else return xfsm_upower_try_suspend (shutdown->upower, error); +#endif } @@ -703,7 +707,11 @@ xfsm_shutdown_try_hibernate (XfsmShutdown *shutdown, { g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE); +#ifdef HAVE_SYSTEMD + return xfsm_systemd_try_hibernate (shutdown->systemd, error); +#else return xfsm_upower_try_hibernate (shutdown->upower, error); +#endif } @@ -776,6 +784,8 @@ xfsm_shutdown_can_suspend (XfsmShutdown *shutdown, gboolean *auth_suspend, GError **error) { + gboolean ret; + g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE); if (!xfsm_shutdown_kiosk_can_shutdown (shutdown, NULL)) @@ -784,8 +794,15 @@ xfsm_shutdown_can_suspend (XfsmShutdown *shutdown, return TRUE; } - return xfsm_upower_can_suspend (shutdown->upower, can_suspend, - auth_suspend, error); +#ifdef HAVE_SYSTEMD + ret = xfsm_systemd_can_suspend (shutdown->systemd, can_suspend, error); + *auth_suspend = *can_suspend; +#else + ret = xfsm_upower_can_suspend (shutdown->upower, can_suspend, + auth_suspend, error); +#endif + + return ret; } @@ -796,6 +813,8 @@ xfsm_shutdown_can_hibernate (XfsmShutdown *shutdown, gboolean *auth_hibernate, GError **error) { + gboolean ret; + g_return_val_if_fail (XFSM_IS_SHUTDOWN (shutdown), FALSE); if (!xfsm_shutdown_kiosk_can_shutdown (shutdown, NULL)) @@ -804,8 +823,15 @@ xfsm_shutdown_can_hibernate (XfsmShutdown *shutdown, return TRUE; } - return xfsm_upower_can_hibernate (shutdown->upower, can_hibernate, - auth_hibernate, error); +#ifdef HAVE_SYSTEMD + ret = xfsm_systemd_can_hibernate (shutdown->systemd, can_hibernate, error); + *auth_hibernate = *can_hibernate; +#else + ret = xfsm_upower_can_hibernate (shutdown->upower, can_hibernate, + auth_hibernate, error); +#endif + + return ret; } diff --git a/xfce4-session/xfsm-systemd.c b/xfce4-session/xfsm-systemd.c index 7bdd39d..cfe7bf4 100644 --- a/xfce4-session/xfsm-systemd.c +++ b/xfce4-session/xfsm-systemd.c @@ -33,8 +33,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" @@ -205,6 +209,28 @@ xfsm_systemd_try_shutdown (XfsmSystemd *systemd, gboolean +xfsm_systemd_try_suspend (XfsmSystemd *systemd, + GError **error) +{ + return xfsm_systemd_try_method (systemd, + SYSTEMD_SUSPEND_ACTION, + error); +} + + + +gboolean +xfsm_systemd_try_hibernate (XfsmSystemd *systemd, + GError **error) +{ + return xfsm_systemd_try_method (systemd, + SYSTEMD_HIBERNATE_ACTION, + error); +} + + + +gboolean xfsm_systemd_can_restart (XfsmSystemd *systemd, gboolean *can_restart, GError **error) @@ -227,3 +253,29 @@ xfsm_systemd_can_shutdown (XfsmSystemd *systemd, SYSTEMD_POWEROFF_TEST, error); } + + + +gboolean +xfsm_systemd_can_suspend (XfsmSystemd *systemd, + gboolean *can_suspend, + GError **error) +{ + return xfsm_systemd_can_method (systemd, + can_suspend, + SYSTEMD_SUSPEND_TEST, + error); +} + + + +gboolean +xfsm_systemd_can_hibernate (XfsmSystemd *systemd, + gboolean *can_hibernate, + GError **error) +{ + return xfsm_systemd_can_method (systemd, + can_hibernate, + SYSTEMD_HIBERNATE_TEST, + error); +} diff --git a/xfce4-session/xfsm-systemd.h b/xfce4-session/xfsm-systemd.h index 8223622..6cf803f 100644 --- a/xfce4-session/xfsm-systemd.h +++ b/xfce4-session/xfsm-systemd.h @@ -42,6 +42,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 +56,14 @@ gboolean xfsm_systemd_can_shutdown (XfsmSystemd *systemd, gboolean *can_shutdown, GError **error); +gboolean xfsm_systemd_can_suspend (XfsmSystemd *systemd, + gboolean *can_suspend, + GError **error); + +gboolean xfsm_systemd_can_hibernate (XfsmSystemd *systemd, + gboolean *can_hibernate, + GError **error); + G_END_DECLS #endif /* __XFSM_SYSTEMD_H__ */ -- 1.8.1.5