backend: Create MetaLauncher in backend and not in backend native

It also adds a vfunc so the MetaBackend subclasses can add more
constraints on what the launcher must support.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4130>
This commit is contained in:
Sebastian Wick 2024-11-12 17:05:48 +01:00
parent 7b944a52fc
commit 30c6104620
5 changed files with 121 additions and 42 deletions

View File

@ -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

View File

@ -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:
*

View File

@ -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);

View File

@ -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

View File

@ -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;