[mutter/wip/carlosg/input-thread: 140/185] backends: Manage tablet cursors in backend




commit 7785f838502f6fcb5439989d7356b8cc3d38b068
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat Jul 11 13:47:51 2020 +0200

    backends: Manage tablet cursors in backend
    
    Instead of letting the wayland bits maintain an always-software
    cursor renderer, let the cursor renderer be managed by the backend,
    and only hook to it (as we do for pointer cursor) in the wayland
    bits.
    
    ATM, make the cursor renderer still always-software, although
    ideally we should allow moving the HW cursor management between
    renderers.
    
    https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403

 src/backends/native/meta-seat-native.c | 40 +++++++++++++++++++++++++++++++---
 src/backends/native/meta-seat-native.h |  1 +
 src/wayland/meta-wayland-tablet-tool.c |  9 +++++++-
 3 files changed, 46 insertions(+), 4 deletions(-)
---
diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c
index 943a675b87..dcc3d1ad5d 100644
--- a/src/backends/native/meta-seat-native.c
+++ b/src/backends/native/meta-seat-native.c
@@ -1856,6 +1856,31 @@ process_tablet_axis (MetaSeatNative        *seat,
     }
 }
 
+static void
+update_tablet_cursor_state (MetaSeatNative     *seat,
+                            ClutterInputDevice *device,
+                            gboolean            in)
+{
+  if (in)
+    {
+      MetaCursorRenderer *renderer;
+
+      if (!seat->tablet_cursors)
+        {
+          seat->tablet_cursors = g_hash_table_new_full (NULL, NULL, NULL,
+                                                        g_object_unref);
+        }
+
+      renderer = meta_cursor_renderer_new (meta_get_backend ());
+      g_hash_table_insert (seat->tablet_cursors, device, renderer);
+    }
+  else
+    {
+      if (seat->tablet_cursors)
+        g_hash_table_remove (seat->tablet_cursors, device);
+    }
+}
+
 static gboolean
 process_device_event (MetaSeatNative        *seat,
                       struct libinput_event *event)
@@ -2263,18 +2288,22 @@ process_device_event (MetaSeatNative        *seat,
           libinput_event_get_tablet_tool_event (event);
         struct libinput_tablet_tool *libinput_tool = NULL;
         enum libinput_tablet_tool_proximity_state state;
+        gboolean in;
 
         state = libinput_event_tablet_tool_get_proximity_state (tablet_event);
         time = libinput_event_tablet_tool_get_time_usec (tablet_event);
         device = libinput_device_get_user_data (libinput_device);
+        in = state == LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_IN;
 
         libinput_tool = libinput_event_tablet_tool_get_tool (tablet_event);
 
-        if (state == LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_IN)
+        if (in)
           input_device_update_tool (device, libinput_tool);
-        notify_proximity (device, time, state == LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_IN);
-        if (state == LIBINPUT_TABLET_TOOL_PROXIMITY_STATE_OUT)
+        notify_proximity (device, time, in);
+        if (!in)
           input_device_update_tool (device, NULL);
+
+        update_tablet_cursor_state (seat, device, in);
         break;
       }
     case LIBINPUT_EVENT_TABLET_TOOL_BUTTON:
@@ -2638,6 +2667,7 @@ meta_seat_native_finalize (GObject *object)
 
   g_hash_table_destroy (seat->reserved_virtual_slots);
 
+  g_clear_pointer (&seat->tablet_cursors, g_hash_table_unref);
   g_object_unref (seat->cursor_renderer);
   g_object_unref (seat->udev_client);
 
@@ -3355,5 +3385,9 @@ meta_seat_native_get_cursor_renderer (MetaSeatNative     *seat,
       return seat->cursor_renderer;
     }
 
+  if (seat->tablet_cursors &&
+      clutter_input_device_get_device_type (device) == CLUTTER_TABLET_DEVICE)
+    return g_hash_table_lookup (seat->tablet_cursors, device);
+
   return NULL;
 }
diff --git a/src/backends/native/meta-seat-native.h b/src/backends/native/meta-seat-native.h
index 458905fdaa..3d05973580 100644
--- a/src/backends/native/meta-seat-native.h
+++ b/src/backends/native/meta-seat-native.h
@@ -87,6 +87,7 @@ struct _MetaSeatNative
 
   MetaKeymapNative *keymap;
   MetaCursorRenderer *cursor_renderer;
+  GHashTable *tablet_cursors;
 
   GUdevClient *udev_client;
   guint tablet_mode_switch_state : 1;
diff --git a/src/wayland/meta-wayland-tablet-tool.c b/src/wayland/meta-wayland-tablet-tool.c
index c913d0a55d..589e92ddd4 100644
--- a/src/wayland/meta-wayland-tablet-tool.c
+++ b/src/wayland/meta-wayland-tablet-tool.c
@@ -913,7 +913,14 @@ meta_wayland_tablet_tool_update (MetaWaylandTabletTool *tool,
       break;
     case CLUTTER_PROXIMITY_IN:
       if (!tool->cursor_renderer)
-        tool->cursor_renderer = meta_cursor_renderer_new (meta_get_backend ());
+        {
+          MetaCursorRenderer *renderer;
+
+          renderer =
+            meta_backend_get_cursor_renderer_for_device (meta_get_backend (),
+                                                         clutter_event_get_source_device (event));
+          g_set_object (&tool->cursor_renderer, renderer);
+        }
       tool->current_tablet =
         meta_wayland_tablet_seat_lookup_tablet (tool->seat,
                                                 clutter_event_get_source_device (event));


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]