summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ã…dahl <jadahl@gmail.com>2021-03-12 08:31:50 +0100
committerMarge Bot <marge-bot@gnome.org>2021-03-13 18:56:21 +0000
commit6ecd911dd0fe370c93486f41798f8f36a70e2187 (patch)
treed1c5170d93948d00787a3791928c8cf26dd08358
parent16b63451a36bedf941c1325e67c0f4a3287fe8e6 (diff)
downloadmutter-6ecd911dd0fe370c93486f41798f8f36a70e2187.tar.gz
backend: Take over seat ownership from the clutter backend
Having the clutter backend owning and managing creates complication for implementing graceful shutdown, so move it to the real backend. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1775>
-rw-r--r--clutter/clutter/clutter-backend-private.h2
-rw-r--r--clutter/clutter/clutter-backend.c18
-rw-r--r--clutter/clutter/clutter-main.c3
-rw-r--r--src/backends/meta-backend-private.h5
-rw-r--r--src/backends/meta-backend.c22
-rw-r--r--src/backends/native/meta-backend-native.c24
-rw-r--r--src/backends/native/meta-clutter-backend-native.c46
-rw-r--r--src/backends/x11/meta-backend-x11.c37
-rw-r--r--src/backends/x11/meta-clutter-backend-x11.c44
9 files changed, 96 insertions, 105 deletions
diff --git a/clutter/clutter/clutter-backend-private.h b/clutter/clutter/clutter-backend-private.h
index 76fab8ad4..2f67c77ba 100644
--- a/clutter/clutter/clutter-backend-private.h
+++ b/clutter/clutter/clutter-backend-private.h
@@ -73,7 +73,6 @@ struct _ClutterBackendClass
ClutterStageWindow * (* create_stage) (ClutterBackend *backend,
ClutterStage *wrapper,
GError **error);
- void (* init_events) (ClutterBackend *backend);
void (* init_features) (ClutterBackend *backend);
void (* add_options) (ClutterBackend *backend,
GOptionGroup *group);
@@ -116,7 +115,6 @@ gboolean _clutter_backend_pre_parse (Clutter
gboolean _clutter_backend_post_parse (ClutterBackend *backend,
GError **error);
-void _clutter_backend_init_events (ClutterBackend *backend);
CLUTTER_EXPORT
gboolean _clutter_backend_translate_event (ClutterBackend *backend,
gpointer native,
diff --git a/clutter/clutter/clutter-backend.c b/clutter/clutter/clutter-backend.c
index fb918d9bc..f49d93cac 100644
--- a/clutter/clutter/clutter-backend.c
+++ b/clutter/clutter/clutter-backend.c
@@ -446,12 +446,6 @@ _clutter_create_backend (void)
}
static void
-clutter_backend_real_init_events (ClutterBackend *backend)
-{
- g_error ("Unknown input backend");
-}
-
-static void
clutter_backend_class_init (ClutterBackendClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
@@ -513,7 +507,6 @@ clutter_backend_class_init (ClutterBackendClass *klass)
klass->resolution_changed = clutter_backend_real_resolution_changed;
klass->font_changed = clutter_backend_real_font_changed;
- klass->init_events = clutter_backend_real_init_events;
klass->create_context = clutter_backend_real_create_context;
klass->get_features = clutter_backend_real_get_features;
}
@@ -652,17 +645,6 @@ _clutter_backend_get_features (ClutterBackend *backend)
return 0;
}
-void
-_clutter_backend_init_events (ClutterBackend *backend)
-{
- ClutterBackendClass *klass;
-
- g_assert (CLUTTER_IS_BACKEND (backend));
-
- klass = CLUTTER_BACKEND_GET_CLASS (backend);
- klass->init_events (backend);
-}
-
gfloat
_clutter_backend_get_units_per_em (ClutterBackend *backend,
PangoFontDescription *font_desc)
diff --git a/clutter/clutter/clutter-main.c b/clutter/clutter/clutter-main.c
index dd2198cca..2efe8e973 100644
--- a/clutter/clutter/clutter-main.c
+++ b/clutter/clutter/clutter-main.c
@@ -608,9 +608,6 @@ clutter_init_real (GError **error)
clutter_text_direction = clutter_get_text_direction ();
- /* Initiate event collection */
- _clutter_backend_init_events (ctx->backend);
-
clutter_is_initialized = TRUE;
ctx->is_initialized = TRUE;
diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h
index 0c328ffcc..b930462b2 100644
--- a/src/backends/meta-backend-private.h
+++ b/src/backends/meta-backend-private.h
@@ -71,6 +71,9 @@ struct _MetaBackendClass
GError **error);
MetaInputSettings * (* get_input_settings) (MetaBackend *backend);
+ ClutterSeat * (* create_default_seat) (MetaBackend *backend,
+ GError **error);
+
gboolean (* grab_device) (MetaBackend *backend,
int device_id,
uint32_t timestamp);
@@ -122,6 +125,8 @@ void meta_backend_init_wayland (MetaBackend *backend);
ClutterBackend * meta_backend_get_clutter_backend (MetaBackend *backend);
+ClutterSeat * meta_backend_get_default_seat (MetaBackend *bakcend);
+
MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend,
ClutterInputDevice *device);
void meta_backend_foreach_device_monitor (MetaBackend *backend,
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index 4eb0a8e7d..609f690ac 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -149,6 +149,7 @@ struct _MetaBackendPrivate
#endif
ClutterBackend *clutter_backend;
+ ClutterSeat *default_seat;
ClutterActor *stage;
GList *gpus;
@@ -244,6 +245,7 @@ meta_backend_dispose (GObject *object)
g_clear_object (&priv->profiler);
#endif
+ g_clear_object (&priv->default_seat);
g_clear_object (&priv->clutter_backend);
G_OBJECT_CLASS (meta_backend_parent_class)->dispose (object);
@@ -1047,10 +1049,18 @@ meta_get_clutter_backend (void)
return meta_backend_get_clutter_backend (backend);
}
+static ClutterSeat *
+meta_backend_create_default_seat (MetaBackend *backend,
+ GError **error)
+{
+ return META_BACKEND_GET_CLASS (backend)->create_default_seat (backend, error);
+}
+
static gboolean
init_clutter (MetaBackend *backend,
GError **error)
{
+ MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
MetaBackendSource *backend_source;
GSource *source;
@@ -1063,6 +1073,10 @@ init_clutter (MetaBackend *backend,
return FALSE;
}
+ priv->default_seat = meta_backend_create_default_seat (backend, error);
+ if (!priv->default_seat)
+ return FALSE;
+
source = g_source_new (&clutter_source_funcs, sizeof (MetaBackendSource));
backend_source = (MetaBackendSource *) source;
backend_source->backend = backend;
@@ -1393,6 +1407,14 @@ meta_backend_get_stage (MetaBackend *backend)
return priv->stage;
}
+ClutterSeat *
+meta_backend_get_default_seat (MetaBackend *backend)
+{
+ MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
+
+ return priv->default_seat;
+}
+
static gboolean
update_last_device (MetaBackend *backend)
{
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index 5231d432c..dbbedceae 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -126,6 +126,29 @@ meta_backend_native_create_clutter_backend (MetaBackend *backend)
return g_object_new (META_TYPE_CLUTTER_BACKEND_NATIVE, NULL);
}
+static ClutterSeat *
+meta_backend_native_create_default_seat (MetaBackend *backend,
+ GError **error)
+{
+ MetaBackendNative *backend_native = META_BACKEND_NATIVE (backend);
+ ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
+ const char *seat_id;
+ MetaSeatNativeFlag flags;
+
+ seat_id = meta_backend_native_get_seat_id (backend_native);
+
+ if (meta_backend_native_is_headless (backend_native))
+ flags = META_SEAT_NATIVE_FLAG_NO_LIBINPUT;
+ else
+ flags = META_SEAT_NATIVE_FLAG_NONE;
+
+ return CLUTTER_SEAT (g_object_new (META_TYPE_SEAT_NATIVE,
+ "backend", clutter_backend,
+ "seat-id", seat_id,
+ "flags", flags,
+ NULL));
+}
+
#ifdef HAVE_REMOTE_DESKTOP
static void
maybe_disable_screen_cast_dma_bufs (MetaBackendNative *native)
@@ -597,6 +620,7 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
object_class->dispose = meta_backend_native_dispose;
backend_class->create_clutter_backend = meta_backend_native_create_clutter_backend;
+ backend_class->create_default_seat = meta_backend_native_create_default_seat;
backend_class->post_init = meta_backend_native_post_init;
diff --git a/src/backends/native/meta-clutter-backend-native.c b/src/backends/native/meta-clutter-backend-native.c
index 2d6a6b1dd..a28ecea99 100644
--- a/src/backends/native/meta-clutter-backend-native.c
+++ b/src/backends/native/meta-clutter-backend-native.c
@@ -54,8 +54,6 @@
struct _MetaClutterBackendNative
{
ClutterBackend parent;
-
- MetaSeatNative *main_seat;
};
G_DEFINE_TYPE (MetaClutterBackendNative, meta_clutter_backend_native,
@@ -82,37 +80,12 @@ meta_clutter_backend_native_create_stage (ClutterBackend *clutter_backend,
NULL);
}
-static void
-meta_clutter_backend_native_init_events (ClutterBackend *clutter_backend)
-{
- MetaClutterBackendNative *clutter_backend_native =
- META_CLUTTER_BACKEND_NATIVE (clutter_backend);
- MetaBackend *backend = meta_get_backend ();
- MetaBackendNative *backend_native = META_BACKEND_NATIVE (backend);
- const char *seat_id;
- MetaSeatNativeFlag flags;
-
- seat_id = meta_backend_native_get_seat_id (backend_native);
-
- if (meta_backend_native_is_headless (backend_native))
- flags = META_SEAT_NATIVE_FLAG_NO_LIBINPUT;
- else
- flags = META_SEAT_NATIVE_FLAG_NONE;
-
- clutter_backend_native->main_seat = g_object_new (META_TYPE_SEAT_NATIVE,
- "backend", clutter_backend,
- "seat-id", seat_id,
- "flags", flags,
- NULL);
-}
-
static ClutterSeat *
meta_clutter_backend_native_get_default_seat (ClutterBackend *clutter_backend)
{
- MetaClutterBackendNative *clutter_backend_native =
- META_CLUTTER_BACKEND_NATIVE (clutter_backend);
+ MetaBackend *backend = meta_get_backend ();
- return CLUTTER_SEAT (clutter_backend_native->main_seat);
+ return meta_backend_get_default_seat (backend);
}
static gboolean
@@ -122,17 +95,6 @@ meta_clutter_backend_native_is_display_server (ClutterBackend *clutter_backend)
}
static void
-meta_clutter_backend_native_finalize (GObject *object)
-{
- MetaClutterBackendNative *clutter_backend_native =
- META_CLUTTER_BACKEND_NATIVE (object);
-
- g_clear_object (&clutter_backend_native->main_seat);
-
- G_OBJECT_CLASS (meta_clutter_backend_native_parent_class)->finalize (object);
-}
-
-static void
meta_clutter_backend_native_init (MetaClutterBackendNative *clutter_backend_nativen)
{
}
@@ -140,14 +102,10 @@ meta_clutter_backend_native_init (MetaClutterBackendNative *clutter_backend_nati
static void
meta_clutter_backend_native_class_init (MetaClutterBackendNativeClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
ClutterBackendClass *clutter_backend_class = CLUTTER_BACKEND_CLASS (klass);
- object_class->finalize = meta_clutter_backend_native_finalize;
-
clutter_backend_class->get_renderer = meta_clutter_backend_native_get_renderer;
clutter_backend_class->create_stage = meta_clutter_backend_native_create_stage;
- clutter_backend_class->init_events = meta_clutter_backend_native_init_events;
clutter_backend_class->get_default_seat = meta_clutter_backend_native_get_default_seat;
clutter_backend_class->is_display_server = meta_clutter_backend_native_is_display_server;
}
diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c
index ae1a91628..1f5f95dde 100644
--- a/src/backends/x11/meta-backend-x11.c
+++ b/src/backends/x11/meta-backend-x11.c
@@ -624,6 +624,42 @@ meta_backend_x11_create_clutter_backend (MetaBackend *backend)
return g_object_new (META_TYPE_CLUTTER_BACKEND_X11, NULL);
}
+static ClutterSeat *
+meta_backend_x11_create_default_seat (MetaBackend *backend,
+ GError **error)
+{
+ MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
+ MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
+ int event_base, first_event, first_error;
+ int major, minor;
+ MetaSeatX11 *seat_x11;
+
+ if (!XQueryExtension (priv->xdisplay,
+ "XInputExtension",
+ &event_base,
+ &first_event,
+ &first_error))
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Failed to query XInputExtension");
+ return NULL;
+ }
+
+ major = 2;
+ minor = 3;
+ if (XIQueryVersion (priv->xdisplay, &major, &minor) == BadRequest)
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Incompatible XInputExtension version");
+ return NULL;
+ }
+
+ seat_x11 = meta_seat_x11_new (event_base,
+ META_VIRTUAL_CORE_POINTER_ID,
+ META_VIRTUAL_CORE_KEYBOARD_ID);
+ return CLUTTER_SEAT (seat_x11);
+}
+
static gboolean
meta_backend_x11_grab_device (MetaBackend *backend,
int device_id,
@@ -894,6 +930,7 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
object_class->dispose = meta_backend_x11_dispose;
object_class->finalize = meta_backend_x11_finalize;
backend_class->create_clutter_backend = meta_backend_x11_create_clutter_backend;
+ backend_class->create_default_seat = meta_backend_x11_create_default_seat;
backend_class->post_init = meta_backend_x11_post_init;
backend_class->grab_device = meta_backend_x11_grab_device;
backend_class->ungrab_device = meta_backend_x11_ungrab_device;
diff --git a/src/backends/x11/meta-clutter-backend-x11.c b/src/backends/x11/meta-clutter-backend-x11.c
index ed6b035fc..b34ae9c0f 100644
--- a/src/backends/x11/meta-clutter-backend-x11.c
+++ b/src/backends/x11/meta-clutter-backend-x11.c
@@ -41,7 +41,6 @@
struct _MetaClutterBackendX11
{
ClutterBackendX11 parent;
- MetaSeatX11 *core_seat;
};
G_DEFINE_TYPE (MetaClutterBackendX11, meta_clutter_backend_x11,
@@ -82,10 +81,10 @@ meta_clutter_backend_x11_translate_event (ClutterBackend *clutter_backend,
gpointer native,
ClutterEvent *event)
{
- MetaClutterBackendX11 *clutter_backend_x11 =
- META_CLUTTER_BACKEND_X11 (clutter_backend);
+ MetaBackend *backend = meta_get_backend ();
MetaStageX11 *stage_x11;
ClutterBackendClass *clutter_backend_class;
+ ClutterSeat *seat;
clutter_backend_class =
CLUTTER_BACKEND_CLASS (meta_clutter_backend_x11_parent_class);
@@ -97,49 +96,19 @@ meta_clutter_backend_x11_translate_event (ClutterBackend *clutter_backend,
if (meta_stage_x11_translate_event (stage_x11, native, event))
return TRUE;
- if (meta_seat_x11_translate_event (clutter_backend_x11->core_seat,
- native, event))
+ seat = meta_backend_get_default_seat (backend);
+ if (meta_seat_x11_translate_event (META_SEAT_X11 (seat), native, event))
return TRUE;
return FALSE;
}
-static void
-meta_clutter_backend_x11_init_events (ClutterBackend *backend)
-{
- MetaClutterBackendX11 *backend_x11 = META_CLUTTER_BACKEND_X11 (backend);
- int event_base, first_event, first_error;
-
- if (XQueryExtension (clutter_x11_get_default_display (),
- "XInputExtension",
- &event_base,
- &first_event,
- &first_error))
- {
- int major = 2;
- int minor = 3;
-
- if (XIQueryVersion (clutter_x11_get_default_display (),
- &major, &minor) != BadRequest)
- {
- backend_x11->core_seat =
- meta_seat_x11_new (event_base,
- META_VIRTUAL_CORE_POINTER_ID,
- META_VIRTUAL_CORE_KEYBOARD_ID);
- }
- }
-
- if (!backend_x11->core_seat)
- g_error ("No XInput 2.3 support");
-}
-
static ClutterSeat *
meta_clutter_backend_x11_get_default_seat (ClutterBackend *clutter_backend)
{
- MetaClutterBackendX11 *clutter_backend_x11 =
- META_CLUTTER_BACKEND_X11 (clutter_backend);
+ MetaBackend *backend = meta_get_backend ();
- return CLUTTER_SEAT (clutter_backend_x11->core_seat);
+ return meta_backend_get_default_seat (backend);
}
static gboolean
@@ -161,7 +130,6 @@ meta_clutter_backend_x11_class_init (MetaClutterBackendX11Class *klass)
clutter_backend_class->get_renderer = meta_clutter_backend_x11_get_renderer;
clutter_backend_class->create_stage = meta_clutter_backend_x11_create_stage;
clutter_backend_class->translate_event = meta_clutter_backend_x11_translate_event;
- clutter_backend_class->init_events = meta_clutter_backend_x11_init_events;
clutter_backend_class->get_default_seat = meta_clutter_backend_x11_get_default_seat;
clutter_backend_class->is_display_server = meta_clutter_backend_x11_is_display_server;
}