diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h index b60d322dc..c9596870a 100644 --- a/src/backends/meta-backend-private.h +++ b/src/backends/meta-backend-private.h @@ -80,6 +80,10 @@ struct _MetaBackendClass ClutterSeat * (* create_default_seat) (MetaBackend *backend, GError **error); + gboolean (* create_launcher) (MetaBackend *backend, + MetaLauncher **launcher_out, + GError **error); + MetaBackendCapabilities (* get_capabilities) (MetaBackend *backend); MetaCursorRenderer * (* get_cursor_renderer) (MetaBackend *backend, @@ -154,6 +158,9 @@ MetaIdleManager * meta_backend_get_idle_manager (MetaBackend *backend); META_EXPORT_TEST MetaColorManager * meta_backend_get_color_manager (MetaBackend *backend); +META_EXPORT_TEST +MetaLauncher * meta_backend_get_launcher (MetaBackend *backend); + MetaCursorRenderer * meta_backend_get_cursor_renderer_for_device (MetaBackend *backend, ClutterInputDevice *device); META_EXPORT_TEST diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c index 093b6279f..184736e64 100644 --- a/src/backends/meta-backend.c +++ b/src/backends/meta-backend.c @@ -62,6 +62,7 @@ #include "backends/meta-input-capture.h" #include "backends/meta-input-mapper-private.h" #include "backends/meta-input-settings-private.h" +#include "backends/meta-launcher.h" #include "backends/meta-logical-monitor.h" #include "backends/meta-monitor-manager-dummy.h" #include "backends/meta-remote-access-controller-private.h" @@ -144,6 +145,7 @@ struct _MetaBackendPrivate MetaIdleManager *idle_manager; MetaRenderer *renderer; MetaColorManager *color_manager; + MetaLauncher *launcher; #ifdef HAVE_EGL MetaEgl *egl; #endif @@ -256,6 +258,8 @@ meta_backend_finalize (GObject *object) g_cancellable_cancel (priv->cancellable); g_clear_object (&priv->cancellable); + g_clear_object (&priv->launcher); + if (priv->sleep_signal_id) { g_dbus_connection_signal_unsubscribe (priv->system_bus, priv->sleep_signal_id); @@ -923,6 +927,16 @@ meta_backend_class_init (MetaBackendClass *klass) G_TYPE_NONE, 0); } +static gboolean +meta_backend_create_launcher (MetaBackend *backend, + MetaLauncher **launcher_out, + GError **error) +{ + return META_BACKEND_GET_CLASS (backend)->create_launcher (backend, + launcher_out, + error); +} + static MetaMonitorManager * meta_backend_create_monitor_manager (MetaBackend *backend, GError **error) @@ -1217,6 +1231,7 @@ meta_backend_initable_init (GInitable *initable, MetaBackend *backend = META_BACKEND (initable); MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); MetaDebugControl *debug_control; + g_autoptr (GError) local_error = NULL; priv->in_init = TRUE; @@ -1229,6 +1244,9 @@ meta_backend_initable_init (GInitable *initable, system_bus_gotten_cb, backend); + if (!meta_backend_create_launcher (backend, &priv->launcher, error)) + return FALSE; + priv->settings = meta_settings_new (backend); priv->dnd = meta_dnd_new (backend); @@ -1429,6 +1447,17 @@ meta_backend_get_color_manager (MetaBackend *backend) return priv->color_manager; } +/** + * meta_backend_get_launcher: (skip) + */ +MetaLauncher * +meta_backend_get_launcher (MetaBackend *backend) +{ + MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); + + return priv->launcher; +} + /** * meta_backend_get_orientation_manager: * diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c index 5e69c85d9..2e4996afc 100644 --- a/src/backends/native/meta-backend-native.c +++ b/src/backends/native/meta-backend-native.c @@ -83,7 +83,6 @@ typedef struct _MetaBackendNativePrivate { MetaBackend parent; - MetaLauncher *launcher; MetaDevicePool *device_pool; MetaUdev *udev; MetaKms *kms; @@ -101,6 +100,10 @@ G_DEFINE_TYPE_WITH_PRIVATE (MetaBackendNative, meta_backend_native, META_TYPE_BACKEND) +static void meta_backend_native_resume (MetaBackendNative *native); + +static void meta_backend_native_pause (MetaBackendNative *native); + static void meta_backend_native_dispose (GObject *object) { @@ -114,7 +117,6 @@ meta_backend_native_dispose (GObject *object) g_clear_object (&priv->kms); g_clear_object (&priv->udev); g_clear_object (&priv->device_pool); - g_clear_object (&priv->launcher); } static ClutterBackend * @@ -339,12 +341,14 @@ meta_backend_native_get_seat_id (MetaBackendNative *backend_native) { MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (backend_native); + MetaLauncher *launcher = + meta_backend_get_launcher (META_BACKEND (backend_native)); switch (priv->mode) { case META_BACKEND_NATIVE_MODE_DEFAULT: case META_BACKEND_NATIVE_MODE_TEST_VKMS: - return meta_launcher_get_seat_id (priv->launcher); + return meta_launcher_get_seat_id (launcher); case META_BACKEND_NATIVE_MODE_HEADLESS: case META_BACKEND_NATIVE_MODE_TEST_HEADLESS: return "seat0"; @@ -745,19 +749,18 @@ on_session_active_changed (MetaLauncher *launcher, } static gboolean -meta_backend_native_init_basic (MetaBackend *backend, - GError **error) +meta_backend_native_create_launcher (MetaBackend *backend, + MetaLauncher **launcher_out, + GError **error) { MetaBackendNative *native = META_BACKEND_NATIVE (backend); MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native); - MetaKmsFlags kms_flags; + g_autoptr (MetaLauncher) launcher = NULL; const char *session_id = NULL; const char *seat_id = NULL; - priv->startup_render_devices = - g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, g_object_unref); + *launcher_out = NULL; switch (priv->mode) { @@ -772,31 +775,47 @@ meta_backend_native_init_basic (MetaBackend *backend, break; } - if (priv->mode != META_BACKEND_NATIVE_MODE_HEADLESS && - priv->mode != META_BACKEND_NATIVE_MODE_TEST_HEADLESS) + if (priv->mode == META_BACKEND_NATIVE_MODE_HEADLESS || + priv->mode == META_BACKEND_NATIVE_MODE_TEST_HEADLESS) + return TRUE; + + launcher = meta_launcher_new (backend, session_id, seat_id, error); + if (!launcher) + return FALSE; + + if (!meta_launcher_get_seat_id (launcher)) { - priv->launcher = meta_launcher_new (backend, - session_id, seat_id, - error); - if (!priv->launcher) - return FALSE; - - if (!meta_launcher_get_seat_id (priv->launcher)) - { - priv->mode = META_BACKEND_NATIVE_MODE_HEADLESS; - g_message ("No seat assigned, running headlessly"); - } - else if (!meta_launcher_is_session_controller (priv->launcher)) - { - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "Native backend mode needs to be session controller"); - return FALSE; - } - - g_signal_connect (priv->launcher, "notify::session-active", - G_CALLBACK (on_session_active_changed), - native); + priv->mode = META_BACKEND_NATIVE_MODE_HEADLESS; + g_message ("No seat assigned, running headlessly"); } + else if (!meta_launcher_is_session_controller (launcher)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "Native backend mode needs to be session controller"); + return FALSE; + } + + g_signal_connect (launcher, "notify::session-active", + G_CALLBACK (on_session_active_changed), + native); + + *launcher_out = g_steal_pointer (&launcher); + return TRUE; +} + + +static gboolean +meta_backend_native_init_basic (MetaBackend *backend, + GError **error) +{ + MetaBackendNative *native = META_BACKEND_NATIVE (backend); + MetaBackendNativePrivate *priv = + meta_backend_native_get_instance_private (native); + MetaKmsFlags kms_flags; + + priv->startup_render_devices = + g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_object_unref); priv->device_pool = meta_device_pool_new (native); priv->udev = meta_udev_new (native); @@ -857,6 +876,7 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass) backend_class->init_post = meta_backend_native_init_post; backend_class->get_capabilities = meta_backend_native_get_capabilities; + backend_class->create_launcher = meta_backend_native_create_launcher; backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager; backend_class->create_color_manager = meta_backend_native_create_color_manager; backend_class->get_cursor_renderer = meta_backend_native_get_cursor_renderer; @@ -893,10 +913,7 @@ meta_backend_native_init (MetaBackendNative *backend_native) MetaLauncher * meta_backend_native_get_launcher (MetaBackendNative *backend_native) { - MetaBackendNativePrivate *priv = - meta_backend_native_get_instance_private (backend_native); - - return priv->launcher; + return meta_backend_get_launcher (META_BACKEND (backend_native)); } MetaDevicePool * @@ -951,7 +968,7 @@ meta_backend_native_activate_vt (MetaBackendNative *backend_native, g_assert_not_reached (); } -void +static void meta_backend_native_pause (MetaBackendNative *backend_native) { MetaBackendNativePrivate *priv = @@ -976,7 +993,8 @@ meta_backend_native_pause (MetaBackendNative *backend_native) meta_monitor_manager_native_pause (monitor_manager_native); } -void meta_backend_native_resume (MetaBackendNative *native) +static void +meta_backend_native_resume (MetaBackendNative *native) { MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native); diff --git a/src/backends/native/meta-backend-native.h b/src/backends/native/meta-backend-native.h index 75f9d1b54..bfbd66097 100644 --- a/src/backends/native/meta-backend-native.h +++ b/src/backends/native/meta-backend-native.h @@ -41,10 +41,6 @@ gboolean meta_backend_native_activate_vt (MetaBackendNative *backend_native, int vt, GError **error); -void meta_backend_native_pause (MetaBackendNative *backend_native); - -void meta_backend_native_resume (MetaBackendNative *backend_native); - MetaLauncher * meta_backend_native_get_launcher (MetaBackendNative *native); META_EXPORT_TEST diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c index 02841c900..b81b4980f 100644 --- a/src/backends/x11/meta-backend-x11.c +++ b/src/backends/x11/meta-backend-x11.c @@ -43,6 +43,7 @@ #include "backends/meta-color-manager.h" #include "backends/meta-idle-monitor-private.h" #include "backends/meta-keymap-utils.h" +#include "backends/meta-launcher.h" #include "backends/meta-stage-private.h" #include "backends/x11/meta-barrier-x11.h" #include "backends/x11/meta-clutter-backend-x11.h" @@ -611,6 +612,31 @@ meta_backend_x11_init_post (MetaBackend *backend, return TRUE; } +static gboolean +meta_backend_x11_create_launcher (MetaBackend *backend, + MetaLauncher **launcher_out, + GError **error) +{ + g_autoptr (MetaLauncher) launcher = NULL; + g_autoptr (GError) local_error = NULL; + + *launcher_out = NULL; + + launcher = meta_launcher_new (backend, NULL, NULL, &local_error); + + if (!launcher) + { + meta_topic (META_DEBUG_BACKEND, + "Creating launcher for the X11 backend failed: %s", + local_error->message); + + return TRUE; + } + + *launcher_out = g_steal_pointer (&launcher); + return TRUE; +} + static ClutterBackend * meta_backend_x11_create_clutter_backend (MetaBackend *backend, ClutterContext *context) @@ -1052,9 +1078,12 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass) object_class->dispose = meta_backend_x11_dispose; object_class->finalize = meta_backend_x11_finalize; + backend_class->init_basic = meta_backend_x11_init_basic; backend_class->init_render = meta_backend_x11_init_render; backend_class->init_post = meta_backend_x11_init_post; + + backend_class->create_launcher = meta_backend_x11_create_launcher; backend_class->create_clutter_backend = meta_backend_x11_create_clutter_backend; backend_class->create_color_manager = meta_backend_x11_create_color_manager; backend_class->create_default_seat = meta_backend_x11_create_default_seat;