summaryrefslogtreecommitdiff
path: root/mate-session/gsm-manager.c
diff options
context:
space:
mode:
authorStefano Karapetsas <[email protected]>2013-03-05 20:39:33 +0100
committerStefano Karapetsas <[email protected]>2013-03-05 20:39:33 +0100
commit31fdf9eb550e0f2e69fa1ba96a1d7d78b8d2e060 (patch)
tree832bb7dcfcbdbba34eaf2b66cbbb659a7c692c93 /mate-session/gsm-manager.c
parent29e5cd2f28f6ddc253d393064c0b24130af0ee35 (diff)
downloadmate-session-manager-31fdf9eb550e0f2e69fa1ba96a1d7d78b8d2e060.tar.bz2
mate-session-manager-31fdf9eb550e0f2e69fa1ba96a1d7d78b8d2e060.tar.xz
Add initial systemd support
Diffstat (limited to 'mate-session/gsm-manager.c')
-rw-r--r--mate-session/gsm-manager.c264
1 files changed, 241 insertions, 23 deletions
diff --git a/mate-session/gsm-manager.c b/mate-session/gsm-manager.c
index ad4ed89..b817fb2 100644
--- a/mate-session/gsm-manager.c
+++ b/mate-session/gsm-manager.c
@@ -60,6 +60,10 @@
#include "gsm-logout-dialog.h"
#include "gsm-inhibit-dialog.h"
#include "gsm-consolekit.h"
+#ifdef HAVE_SYSTEMD
+#include "gsm-systemd.h"
+#include <systemd/sd-daemon.h>
+#endif
#include "gsm-session-save.h"
#define GSM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSM_TYPE_MANAGER, GsmManagerPrivate))
@@ -391,9 +395,9 @@ phase_num_to_name (guint phase)
static void start_phase (GsmManager *manager);
static void
-quit_request_completed (GsmConsolekit *consolekit,
- GError *error,
- gpointer user_data)
+quit_request_completed_consolekit (GsmConsolekit *consolekit,
+ GError *error,
+ gpointer user_data)
{
MdmLogoutAction fallback_action = GPOINTER_TO_INT (user_data);
@@ -406,10 +410,31 @@ quit_request_completed (GsmConsolekit *consolekit,
gtk_main_quit ();
}
+#ifdef HAVE_SYSTEMD
+static void
+quit_request_completed_systemd (GsmSystemd *systemd,
+ GError *error,
+ gpointer user_data)
+{
+ MdmLogoutAction fallback_action = GPOINTER_TO_INT (user_data);
+
+ if (error != NULL) {
+ mdm_set_logout_action (fallback_action);
+ }
+
+ g_object_unref (systemd);
+
+ gtk_main_quit ();
+}
+#endif
+
static void
gsm_manager_quit (GsmManager *manager)
{
GsmConsolekit *consolekit;
+#ifdef HAVE_SYSTEMD
+ GsmSystemd *systemd;
+#endif
/* See the comment in request_reboot() for some more details about how
* this works. */
@@ -422,12 +447,26 @@ gsm_manager_quit (GsmManager *manager)
case GSM_MANAGER_LOGOUT_REBOOT_INTERACT:
mdm_set_logout_action (MDM_LOGOUT_ACTION_NONE);
+ #ifdef HAVE_SYSTEMD
+ if (sd_booted () > 0) {
+ systemd = gsm_get_systemd ();
+ g_signal_connect (systemd,
+ "request-completed",
+ G_CALLBACK (quit_request_completed_systemd),
+ GINT_TO_POINTER (MDM_LOGOUT_ACTION_REBOOT));
+ gsm_systemd_attempt_restart (systemd);
+ }
+ else {
+ #endif
consolekit = gsm_get_consolekit ();
g_signal_connect (consolekit,
"request-completed",
- G_CALLBACK (quit_request_completed),
+ G_CALLBACK (quit_request_completed_consolekit),
GINT_TO_POINTER (MDM_LOGOUT_ACTION_REBOOT));
gsm_consolekit_attempt_restart (consolekit);
+ #ifdef HAVE_SYSTEMD
+ }
+ #endif
break;
case GSM_MANAGER_LOGOUT_REBOOT_MDM:
mdm_set_logout_action (MDM_LOGOUT_ACTION_REBOOT);
@@ -437,12 +476,26 @@ gsm_manager_quit (GsmManager *manager)
case GSM_MANAGER_LOGOUT_SHUTDOWN_INTERACT:
mdm_set_logout_action (MDM_LOGOUT_ACTION_NONE);
+ #ifdef HAVE_SYSTEMD
+ if (sd_booted () > 0) {
+ systemd = gsm_get_systemd ();
+ g_signal_connect (systemd,
+ "request-completed",
+ G_CALLBACK (quit_request_completed_systemd),
+ GINT_TO_POINTER (MDM_LOGOUT_ACTION_SHUTDOWN));
+ gsm_systemd_attempt_stop (systemd);
+ }
+ else {
+ #endif
consolekit = gsm_get_consolekit ();
g_signal_connect (consolekit,
"request-completed",
- G_CALLBACK (quit_request_completed),
+ G_CALLBACK (quit_request_completed_consolekit),
GINT_TO_POINTER (MDM_LOGOUT_ACTION_SHUTDOWN));
gsm_consolekit_attempt_stop (consolekit);
+ #ifdef HAVE_SYSTEMD
+ }
+ #endif
break;
case GSM_MANAGER_LOGOUT_SHUTDOWN_MDM:
mdm_set_logout_action (MDM_LOGOUT_ACTION_SHUTDOWN);
@@ -1822,16 +1875,33 @@ auto_save_is_enabled (GsmManager *manager)
static void
maybe_save_session (GsmManager *manager)
{
- GsmConsolekit *consolekit;
+ GsmConsolekit *consolekit = NULL;
+#ifdef HAVE_SYSTEMD
+ GsmSystemd *systemd = NULL;
+#endif
char *session_type;
GError *error;
+#ifdef HAVE_SYSTEMD
+ if (sd_booted () > 0) {
+ systemd = gsm_get_systemd ();
+ session_type = gsm_systemd_get_current_session_type (systemd);
+
+ if (g_strcmp0 (session_type, GSM_SYSTEMD_SESSION_TYPE_LOGIN_WINDOW) == 0) {
+ goto out;
+ }
+ }
+ else {
+#endif
consolekit = gsm_get_consolekit ();
session_type = gsm_consolekit_get_current_session_type (consolekit);
if (g_strcmp0 (session_type, GSM_CONSOLEKIT_SESSION_TYPE_LOGIN_WINDOW) == 0) {
goto out;
}
+#ifdef HAVE_SYSTEMD
+ }
+#endif
/* We only allow session saving when session is running or when
* logging out */
@@ -1849,7 +1919,12 @@ maybe_save_session (GsmManager *manager)
}
out:
- g_object_unref (consolekit);
+ if (consolekit != NULL)
+ g_object_unref (consolekit);
+#ifdef HAVE_SYSTEMD
+ if (systemd != NULL)
+ g_object_unref (systemd);
+#endif
g_free (session_type);
}
@@ -2335,11 +2410,24 @@ on_presence_status_changed (GsmPresence *presence,
guint status,
GsmManager *manager)
{
+#ifdef HAVE_SYSTEMD
+ if (sd_booted () > 0) {
+ GsmSystemd *systemd;
+
+ systemd = gsm_get_systemd ();
+ gsm_systemd_set_session_idle (systemd,
+ (status == GSM_PRESENCE_STATUS_IDLE));
+ }
+ else {
+#endif
GsmConsolekit *consolekit;
consolekit = gsm_get_consolekit ();
gsm_consolekit_set_session_idle (consolekit,
(status == GSM_PRESENCE_STATUS_IDLE));
+#ifdef HAVE_SYSTEMD
+ }
+#endif
}
static void
@@ -2520,17 +2608,17 @@ gsm_manager_is_suspend_inhibited (GsmManager *manager)
}
static void
-request_reboot_privileges_completed (GsmConsolekit *consolekit,
- gboolean success,
- gboolean ask_later,
- GError *error,
- GsmManager *manager)
+request_reboot_privileges_completed_consolekit (GsmConsolekit *consolekit,
+ gboolean success,
+ gboolean ask_later,
+ GError *error,
+ GsmManager *manager)
{
/* make sure we disconnect the signal handler so that it's not called
* again next time the event is fired -- this can happen if the reboot
* is cancelled. */
g_signal_handlers_disconnect_by_func (consolekit,
- request_reboot_privileges_completed,
+ request_reboot_privileges_completed_consolekit,
manager);
g_object_unref (consolekit);
@@ -2546,10 +2634,42 @@ request_reboot_privileges_completed (GsmConsolekit *consolekit,
}
}
+#ifdef HAVE_SYSTEMD
+static void
+request_reboot_privileges_completed_systemd (GsmSystemd *systemd,
+ gboolean success,
+ gboolean ask_later,
+ GError *error,
+ GsmManager *manager)
+{
+ /* make sure we disconnect the signal handler so that it's not called
+ * again next time the event is fired -- this can happen if the reboot
+ * is cancelled. */
+ g_signal_handlers_disconnect_by_func (systemd,
+ request_reboot_privileges_completed_systemd,
+ manager);
+
+ g_object_unref (systemd);
+
+ if (success) {
+ if (ask_later) {
+ manager->priv->logout_type = GSM_MANAGER_LOGOUT_REBOOT_INTERACT;
+ } else {
+ manager->priv->logout_type = GSM_MANAGER_LOGOUT_REBOOT;
+ }
+
+ end_phase (manager);
+ }
+}
+#endif
+
static void
request_reboot (GsmManager *manager)
{
GsmConsolekit *consolekit;
+#ifdef HAVE_SYSTEMD
+ GsmSystemd *systemd;
+#endif
gboolean success;
g_debug ("GsmManager: requesting reboot");
@@ -2557,6 +2677,7 @@ request_reboot (GsmManager *manager)
/* We request the privileges before doing anything. There are a few
* different cases here:
*
+ * - no systemd: we fallback on ConsoleKit
* - no ConsoleKit: we fallback on MDM
* - no password required: everything is fine
* - password asked once: we ask for it now. If the user enters it
@@ -2575,36 +2696,60 @@ request_reboot (GsmManager *manager)
* just work fine.
*/
+#ifdef HAVE_SYSTEMD
+ if (sd_booted () > 0) {
+ systemd = gsm_get_systemd ();
+ g_signal_connect (systemd,
+ "privileges-completed",
+ G_CALLBACK (request_reboot_privileges_completed_systemd),
+ manager);
+ success = gsm_systemd_get_restart_privileges (systemd);
+
+ if (!success) {
+ g_signal_handlers_disconnect_by_func (systemd,
+ request_reboot_privileges_completed_systemd,
+ manager);
+ g_object_unref (systemd);
+
+ manager->priv->logout_type = GSM_MANAGER_LOGOUT_REBOOT_MDM;
+ end_phase (manager);
+ }
+ }
+ else {
+#endif
consolekit = gsm_get_consolekit ();
g_signal_connect (consolekit,
"privileges-completed",
- G_CALLBACK (request_reboot_privileges_completed),
+ G_CALLBACK (request_reboot_privileges_completed_consolekit),
manager);
success = gsm_consolekit_get_restart_privileges (consolekit);
if (!success) {
g_signal_handlers_disconnect_by_func (consolekit,
- request_reboot_privileges_completed,
+ request_reboot_privileges_completed_consolekit,
manager);
g_object_unref (consolekit);
manager->priv->logout_type = GSM_MANAGER_LOGOUT_REBOOT_MDM;
end_phase (manager);
}
+#ifdef HAVE_SYSTEMD
+ }
+#endif
}
static void
-request_shutdown_privileges_completed (GsmConsolekit *consolekit,
- gboolean success,
- gboolean ask_later,
- GError *error,
- GsmManager *manager)
+request_shutdown_privileges_completed_consolekit (GsmConsolekit *consolekit,
+ gboolean success,
+ gboolean ask_later,
+ GError *error,
+ GsmManager *manager)
{
/* make sure we disconnect the signal handler so that it's not called
* again next time the event is fired -- this can happen if the reboot
* is cancelled. */
g_signal_handlers_disconnect_by_func (consolekit,
- request_shutdown_privileges_completed,
+ request_shutdown_privileges_completed_consolekit,
manager);
g_object_unref (consolekit);
@@ -2620,10 +2765,42 @@ request_shutdown_privileges_completed (GsmConsolekit *consolekit,
}
}
+#ifdef HAVE_SYSTEMD
+static void
+request_shutdown_privileges_completed_systemd (GsmSystemd *systemd,
+ gboolean success,
+ gboolean ask_later,
+ GError *error,
+ GsmManager *manager)
+{
+ /* make sure we disconnect the signal handler so that it's not called
+ * again next time the event is fired -- this can happen if the reboot
+ * is cancelled. */
+ g_signal_handlers_disconnect_by_func (systemd,
+ request_shutdown_privileges_completed_systemd,
+ manager);
+
+ g_object_unref (systemd);
+
+ if (success) {
+ if (ask_later) {
+ manager->priv->logout_type = GSM_MANAGER_LOGOUT_SHUTDOWN_INTERACT;
+ } else {
+ manager->priv->logout_type = GSM_MANAGER_LOGOUT_SHUTDOWN;
+ }
+
+ end_phase (manager);
+ }
+}
+#endif
+
static void
request_shutdown (GsmManager *manager)
{
GsmConsolekit *consolekit;
+#ifdef HAVE_SYSTEMD
+ GsmSystemd *systemd;
+#endif
gboolean success;
g_debug ("GsmManager: requesting shutdown");
@@ -2631,22 +2808,46 @@ request_shutdown (GsmManager *manager)
/* See the comment in request_reboot() for some more details about how
* this works. */
+#ifdef HAVE_SYSTEMD
+ if (sd_booted () > 0) {
+ systemd = gsm_get_systemd ();
+ g_signal_connect (systemd,
+ "privileges-completed",
+ G_CALLBACK (request_shutdown_privileges_completed_systemd),
+ manager);
+ success = gsm_systemd_get_stop_privileges (systemd);
+
+ if (!success) {
+ g_signal_handlers_disconnect_by_func (systemd,
+ request_shutdown_privileges_completed_systemd,
+ manager);
+ g_object_unref (systemd);
+
+ manager->priv->logout_type = GSM_MANAGER_LOGOUT_SHUTDOWN_MDM;
+ end_phase (manager);
+ }
+ }
+ else {
+#endif
consolekit = gsm_get_consolekit ();
g_signal_connect (consolekit,
"privileges-completed",
- G_CALLBACK (request_shutdown_privileges_completed),
+ G_CALLBACK (request_shutdown_privileges_completed_consolekit),
manager);
success = gsm_consolekit_get_stop_privileges (consolekit);
if (!success) {
g_signal_handlers_disconnect_by_func (consolekit,
- request_shutdown_privileges_completed,
+ request_shutdown_privileges_completed_consolekit,
manager);
g_object_unref (consolekit);
manager->priv->logout_type = GSM_MANAGER_LOGOUT_SHUTDOWN_MDM;
end_phase (manager);
}
+#ifdef HAVE_SYSTEMD
+ }
+#endif
}
static void
@@ -2938,6 +3139,9 @@ gsm_manager_can_shutdown (GsmManager *manager,
GError **error)
{
GsmConsolekit *consolekit;
+#ifdef HAVE_SYSTEMD
+ GsmSystemd *systemd;
+#endif
gboolean can_suspend;
gboolean can_hibernate;
@@ -2950,12 +3154,26 @@ gsm_manager_can_shutdown (GsmManager *manager,
g_return_val_if_fail (GSM_IS_MANAGER (manager), FALSE);
+#ifdef HAVE_SYSTEMD
+ if (sd_booted () > 0) {
+ systemd = gsm_get_systemd ();
+ *shutdown_available = gsm_systemd_can_stop (systemd)
+ || gsm_systemd_can_restart (systemd)
+ || can_suspend
+ || can_hibernate;
+ g_object_unref (systemd);
+ }
+ else {
+#endif
consolekit = gsm_get_consolekit ();
*shutdown_available = gsm_consolekit_can_stop (consolekit)
|| gsm_consolekit_can_restart (consolekit)
|| can_suspend
|| can_hibernate;
g_object_unref (consolekit);
+#ifdef HAVE_SYSTEMD
+ }
+#endif
return TRUE;
}