diff --git a/src/core/meta-context-main.c b/src/core/meta-context-main.c index 3645fbfd4..bc32adb61 100644 --- a/src/core/meta-context-main.c +++ b/src/core/meta-context-main.c @@ -32,6 +32,7 @@ #include "backends/meta-monitor.h" #include "backends/meta-monitor-manager-private.h" #include "backends/meta-virtual-monitor.h" +#include "core/meta-session-manager.h" #include "meta/meta-backend.h" #ifdef HAVE_X11 @@ -88,6 +89,8 @@ struct _MetaContextMain MetaContextMainOptions options; + MetaSessionManager *session_manager; + MetaCompositorType compositor_type; GList *persistent_virtual_monitors; @@ -524,12 +527,13 @@ meta_context_main_create_backend (MetaContext *context, g_assert_not_reached (); } -#ifdef HAVE_X11 static void meta_context_main_notify_ready (MetaContext *context) { MetaContextMain *context_main = META_CONTEXT_MAIN (context); + g_autoptr (GError) error = NULL; +#ifdef HAVE_X11 if (!context_main->options.sm.disable) { meta_session_init (context, @@ -538,8 +542,16 @@ meta_context_main_notify_ready (MetaContext *context) } g_clear_pointer (&context_main->options.sm.client_id, g_free); g_clear_pointer (&context_main->options.sm.save_file, g_free); +#endif + + context_main->session_manager = + meta_session_manager_new (meta_context_get_nick (context), &error); + + if (!context_main->session_manager) + g_critical ("Could not create session manager: %s", error->message); } +#ifdef HAVE_X11 static gboolean meta_context_main_is_x11_sync (MetaContext *context) { @@ -549,6 +561,14 @@ meta_context_main_is_x11_sync (MetaContext *context) } #endif +static MetaSessionManager * +meta_context_main_get_session_manager (MetaContext *context) +{ + MetaContextMain *context_main = META_CONTEXT_MAIN (context); + + return context_main->session_manager; +} + #ifdef HAVE_NATIVE_BACKEND static gboolean add_virtual_monitor_cb (const char *option_name, @@ -730,6 +750,10 @@ meta_context_main_finalize (GObject *object) g_list_free_full (context_main->persistent_virtual_monitors, g_object_unref); context_main->persistent_virtual_monitors = NULL; + + if (context_main->session_manager) + meta_session_manager_save_sync (context_main->session_manager, NULL); + g_clear_object (&context_main->session_manager); #endif G_OBJECT_CLASS (meta_context_main_parent_class)->finalize (object); @@ -761,10 +785,11 @@ meta_context_main_class_init (MetaContextMainClass *klass) context_class->is_replacing = meta_context_main_is_replacing; context_class->setup = meta_context_main_setup; context_class->create_backend = meta_context_main_create_backend; -#ifdef HAVE_X11 context_class->notify_ready = meta_context_main_notify_ready; +#ifdef HAVE_X11 context_class->is_x11_sync = meta_context_main_is_x11_sync; #endif + context_class->get_session_manager = meta_context_main_get_session_manager; } static void diff --git a/src/core/meta-context-private.h b/src/core/meta-context-private.h index 30735416e..2f46ab994 100644 --- a/src/core/meta-context-private.h +++ b/src/core/meta-context-private.h @@ -20,6 +20,7 @@ #include "core/meta-private-enums.h" #include "core/meta-service-channel.h" +#include "core/meta-session-manager.h" #include "core/util-private.h" #include "meta/meta-backend.h" #include "meta/meta-context.h" @@ -56,6 +57,8 @@ struct _MetaContextClass #ifdef HAVE_X11 gboolean (* is_x11_sync) (MetaContext *context); #endif + + MetaSessionManager * (* get_session_manager) (MetaContext *context); }; const char * meta_context_get_name (MetaContext *context); @@ -86,3 +89,5 @@ meta_context_get_profiler (MetaContext *context); void meta_context_set_trace_file (MetaContext *context, const char *trace_file); #endif + +MetaSessionManager * meta_context_get_session_manager (MetaContext *context); diff --git a/src/core/meta-context.c b/src/core/meta-context.c index e1a503e00..dd9bd4974 100644 --- a/src/core/meta-context.c +++ b/src/core/meta-context.c @@ -979,3 +979,9 @@ meta_context_get_debug_control (MetaContext *context) return priv->debug_control; } + +MetaSessionManager * +meta_context_get_session_manager (MetaContext *context) +{ + return META_CONTEXT_GET_CLASS (context)->get_session_manager (context); +}