[mutter] seat/impl: Make it possible to run without libinput



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]