diff --git a/src/backends/native/meta-backend-native-types.h b/src/backends/native/meta-backend-native-types.h index 0668a84e4..3efbca9ca 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 71da8f8fa..a67698ce1 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; - } - - seat_impl->libinput = libinput_udev_create_context (&libinput_interface, - seat_impl, udev); - if (seat_impl->libinput == NULL) - { - g_critical ("Failed to create the libinput object."); - seat_impl->input_thread_initialized = TRUE; - return NULL; - } - - if (libinput_udev_assign_seat (seat_impl->libinput, seat_impl->seat_id) == -1) - { - g_critical ("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; } + libinput = libinput_udev_create_context (&libinput_interface, + seat_impl, udev); udev_unref (udev); + if (libinput == 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 (libinput, seat_impl->seat_id) == -1) + { + 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); + return FALSE; + } + + 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 d49d1660f..eed122f6c 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 c0bfe2223..133bf58fe 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 7f94828d0..dca267986 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 dc968ad2e..196abf71f 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', )