[mutter] seat/impl: Make it possible to run without libinput
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] seat/impl: Make it possible to run without libinput
- Date: Fri, 12 Mar 2021 15:43:44 +0000 (UTC)
commit 0786f44b0be5719bbddb8776f246ed79337d4c8a
Author: Jonas Ã…dahl <jadahl gmail com>
Date: Tue Jan 19 11:47:59 2021 +0100
seat/impl: Make it possible to run without libinput
Add a flag to MetaSeatNative and MetaSeatImpl that tells it not to
attempt to create a libinput context. This is intended to be used when
mutter is to run headless, as in without any input devices other than
virtual ones.
Currently not hooked up.
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1698>
src/backends/native/meta-backend-native-types.h | 6 ++
src/backends/native/meta-seat-impl.c | 93 ++++++++++++++++++-------
src/backends/native/meta-seat-impl.h | 6 +-
src/backends/native/meta-seat-native.c | 20 +++++-
src/backends/native/meta-seat-native.h | 1 +
src/meson.build | 20 ++++--
6 files changed, 113 insertions(+), 33 deletions(-)
---
diff --git a/src/backends/native/meta-backend-native-types.h b/src/backends/native/meta-backend-native-types.h
index 0668a84e4f..3efbca9ca4 100644
--- a/src/backends/native/meta-backend-native-types.h
+++ b/src/backends/native/meta-backend-native-types.h
@@ -28,4 +28,10 @@ typedef struct _MetaKeymapNative MetaKeymapNative;
typedef struct _MetaRendererNative MetaRendererNative;
typedef struct _MetaGpuKms MetaGpuKms;
+typedef enum _MetaSeatNativeFlag
+{
+ META_SEAT_NATIVE_FLAG_NONE = 0,
+ META_SEAT_NATIVE_FLAG_NO_LIBINPUT = 1 << 0,
+} MetaSeatNativeFlag;
+
#endif /* META_BACKEND_NATIVE_TYPES_H */
diff --git a/src/backends/native/meta-seat-impl.c b/src/backends/native/meta-seat-impl.c
index 71da8f8fac..a67698ce15 100644
--- a/src/backends/native/meta-seat-impl.c
+++ b/src/backends/native/meta-seat-impl.c
@@ -40,6 +40,8 @@
#include "clutter/clutter-mutter.h"
#include "core/bell.h"
+#include "meta-private-enum-types.h"
+
/*
* Clutter makes the assumption that two core devices have ID's 2 and 3 (core
* pointer and core keyboard).
@@ -96,6 +98,7 @@ enum
PROP_0,
PROP_SEAT,
PROP_SEAT_ID,
+ PROP_FLAGS,
N_PROPS,
};
@@ -259,9 +262,12 @@ keyboard_repeat (gpointer data)
/* There might be events queued in libinput that could cancel the
repeat timer. */
- dispatch_libinput (seat_impl);
- if (!seat_impl->repeat_source)
- return G_SOURCE_REMOVE;
+ if (seat_impl->libinput)
+ {
+ dispatch_libinput (seat_impl);
+ if (!seat_impl->repeat_source)
+ return G_SOURCE_REMOVE;
+ }
g_return_val_if_fail (seat_impl->repeat_device != NULL, G_SOURCE_REMOVE);
@@ -2654,50 +2660,71 @@ meta_seat_impl_set_keyboard_numlock_in_impl (MetaSeatImpl *seat_impl,
seat_impl->xkb);
}
-static gpointer
-input_thread (MetaSeatImpl *seat_impl)
+static gboolean
+init_libinput (MetaSeatImpl *seat_impl,
+ GError **error)
{
MetaEventSource *source;
struct udev *udev;
- struct xkb_keymap *xkb_keymap;
-
- g_main_context_push_thread_default (seat_impl->input_context);
+ struct libinput *libinput;
udev = udev_new ();
if (G_UNLIKELY (udev == NULL))
{
g_warning ("Failed to create udev object");
seat_impl->input_thread_initialized = TRUE;
- return NULL;
+ return FALSE;
}
- seat_impl->libinput = libinput_udev_create_context (&libinput_interface,
- seat_impl, udev);
- if (seat_impl->libinput == NULL)
+ libinput = libinput_udev_create_context (&libinput_interface,
+ seat_impl, udev);
+ udev_unref (udev);
+
+ if (libinput == NULL)
{
- g_critical ("Failed to create the libinput object.");
- seat_impl->input_thread_initialized = TRUE;
- return NULL;
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Failed to create the libinput object.");
+ return FALSE;
}
- if (libinput_udev_assign_seat (seat_impl->libinput, seat_impl->seat_id) == -1)
+ if (libinput_udev_assign_seat (libinput, seat_impl->seat_id) == -1)
{
- g_critical ("Failed to assign a seat to the libinput object.");
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Failed to assign a seat to the libinput object.");
libinput_unref (seat_impl->libinput);
- seat_impl->libinput = NULL;
- seat_impl->input_thread_initialized = TRUE;
- return NULL;
+ return FALSE;
}
- udev_unref (udev);
+ seat_impl->libinput = libinput;
+ source = meta_event_source_new (seat_impl);
+ seat_impl->event_source = source;
+
+ return TRUE;
+}
+
+static gpointer
+input_thread (MetaSeatImpl *seat_impl)
+{
+ struct xkb_keymap *xkb_keymap;
+
+ g_main_context_push_thread_default (seat_impl->input_context);
+
+ if (!(seat_impl->flags & META_SEAT_NATIVE_FLAG_NO_LIBINPUT))
+ {
+ g_autoptr (GError) error = NULL;
+
+ if (!init_libinput (seat_impl, &error))
+ {
+ g_critical ("Failed to initialize seat: %s", error->message);
+ seat_impl->input_thread_initialized = TRUE;
+ return NULL;
+ }
+ }
seat_impl->input_settings = meta_input_settings_native_new_in_impl (seat_impl);
g_signal_connect_object (seat_impl->input_settings, "kbd-a11y-changed",
G_CALLBACK (kbd_a11y_changed_cb), seat_impl, 0);
- source = meta_event_source_new (seat_impl);
- seat_impl->event_source = source;
-
seat_impl->keymap = g_object_new (META_TYPE_KEYMAP_NATIVE, NULL);
xkb_keymap = meta_keymap_native_get_keyboard_map_in_impl (seat_impl->keymap);
@@ -2804,6 +2831,9 @@ meta_seat_impl_set_property (GObject *object,
case PROP_SEAT_ID:
seat_impl->seat_id = g_value_dup_string (value);
break;
+ case PROP_FLAGS:
+ seat_impl->flags = g_value_get_flags (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -3050,6 +3080,15 @@ meta_seat_impl_class_init (MetaSeatImplClass *klass)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY);
+ props[PROP_FLAGS] =
+ g_param_spec_flags ("flags",
+ "Flags",
+ "Flags",
+ META_TYPE_SEAT_NATIVE_FLAG,
+ META_SEAT_NATIVE_FLAG_NONE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY);
+
signals[KBD_A11Y_FLAGS_CHANGED] =
g_signal_new ("kbd-a11y-flags-changed",
G_TYPE_FROM_CLASS (object_class),
@@ -3462,13 +3501,15 @@ meta_seat_impl_set_viewports (MetaSeatImpl *seat_impl,
}
MetaSeatImpl *
-meta_seat_impl_new (MetaSeatNative *seat_native,
- const char *seat_id)
+meta_seat_impl_new (MetaSeatNative *seat_native,
+ const char *seat_id,
+ MetaSeatNativeFlag flags)
{
return g_initable_new (META_TYPE_SEAT_IMPL,
NULL, NULL,
"seat", seat_native,
"seat-id", seat_id,
+ "flags", flags,
NULL);
}
diff --git a/src/backends/native/meta-seat-impl.h b/src/backends/native/meta-seat-impl.h
index d49d1660f5..eed122f6c5 100644
--- a/src/backends/native/meta-seat-impl.h
+++ b/src/backends/native/meta-seat-impl.h
@@ -67,6 +67,7 @@ struct _MetaSeatImpl
MetaSeatNative *seat_native;
char *seat_id;
+ MetaSeatNativeFlag flags;
MetaEventSource *event_source;
struct libinput *libinput;
GRWLock state_lock;
@@ -126,8 +127,9 @@ struct _MetaSeatImpl
G_DECLARE_FINAL_TYPE (MetaSeatImpl, meta_seat_impl,
META, SEAT_IMPL, GObject)
-MetaSeatImpl * meta_seat_impl_new (MetaSeatNative *seat_native,
- const char *seat_id);
+MetaSeatImpl * meta_seat_impl_new (MetaSeatNative *seat_native,
+ const char *seat_id,
+ MetaSeatNativeFlag flags);
void meta_seat_impl_destroy (MetaSeatImpl *seat_impl);
diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c
index c0bfe22233..133bf58fe1 100644
--- a/src/backends/native/meta-seat-native.c
+++ b/src/backends/native/meta-seat-native.c
@@ -37,10 +37,13 @@
#include "clutter/clutter-mutter.h"
#include "core/bell.h"
+#include "meta-private-enum-types.h"
+
enum
{
PROP_0,
PROP_SEAT_ID,
+ PROP_FLAGS,
N_PROPS,
/* This property is overridden */
@@ -153,7 +156,7 @@ meta_seat_native_constructed (GObject *object)
{
MetaSeatNative *seat = META_SEAT_NATIVE (object);
- seat->impl = meta_seat_impl_new (seat, seat->seat_id);
+ seat->impl = meta_seat_impl_new (seat, seat->seat_id, seat->flags);
g_signal_connect (seat->impl, "kbd-a11y-flags-changed",
G_CALLBACK (proxy_kbd_a11y_flags_changed), seat);
g_signal_connect (seat->impl, "kbd-a11y-mods-state-changed",
@@ -187,6 +190,9 @@ meta_seat_native_set_property (GObject *object,
case PROP_SEAT_ID:
seat_native->seat_id = g_value_dup_string (value);
break;
+ case PROP_FLAGS:
+ seat_native->flags = g_value_get_flags (value);
+ break;
case PROP_TOUCH_MODE:
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -209,6 +215,9 @@ meta_seat_native_get_property (GObject *object,
case PROP_TOUCH_MODE:
g_value_set_boolean (value, seat_native->touch_mode);
break;
+ case PROP_FLAGS:
+ g_value_set_flags (value, seat_native->flags);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -393,6 +402,15 @@ meta_seat_native_class_init (MetaSeatNativeClass *klass)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY);
+ props[PROP_FLAGS] =
+ g_param_spec_flags ("flags",
+ "Flags",
+ "Flags",
+ META_TYPE_SEAT_NATIVE_FLAG,
+ META_SEAT_NATIVE_FLAG_NONE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY);
+
g_object_class_install_properties (object_class, N_PROPS, props);
g_object_class_override_property (object_class, PROP_TOUCH_MODE,
diff --git a/src/backends/native/meta-seat-native.h b/src/backends/native/meta-seat-native.h
index 7f94828d0e..dca2679863 100644
--- a/src/backends/native/meta-seat-native.h
+++ b/src/backends/native/meta-seat-native.h
@@ -44,6 +44,7 @@ struct _MetaSeatNative
MetaSeatImpl *impl;
char *seat_id;
+ MetaSeatNativeFlag flags;
GList *devices;
struct xkb_keymap *xkb_keymap;
diff --git a/src/meson.build b/src/meson.build
index dc968ad2ef..196abf71f4 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -744,13 +744,25 @@ if have_wayland_eglstream
]
endif
-mutter_built_sources = []
+mutter_private_enum_sources = []
if have_remote_desktop
+ mutter_private_enum_sources += [
+ 'backends/meta-screen-cast.h',
+ ]
+endif
+
+if have_native_backend
+ mutter_private_enum_sources += [
+ 'backends/native/meta-backend-native-types.h',
+ ]
+endif
+
+mutter_built_sources = []
+
+if mutter_private_enum_sources.length() > 0
mutter_private_enum_types = gnome.mkenums('meta-private-enum-types',
- sources: [
- 'backends/meta-screen-cast.h',
- ],
+ sources: mutter_private_enum_sources,
c_template: 'meta-private-enum-types.c.in',
h_template: 'meta-private-enum-types.h.in',
)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]