[mutter] cursor-tracker/x11: Also update sprite when updating position



commit fc778e2bd3f0d2cf6a47496a726f52603b91787f
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Fri Jul 31 21:21:23 2020 +0200

    cursor-tracker/x11: Also update sprite when updating position
    
    Without doing this, we'd use the same sprite that was last set by
    mutter, most likely a leftptr cursor, and fail to update when e.g.
    moving the pointer above a text entry and the displayed cursor updated
    to a cursor position marker.
    
    https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1391

 src/backends/meta-cursor-tracker-private.h |  2 ++
 src/backends/meta-cursor-tracker.c         | 11 ++++++++++-
 src/backends/x11/meta-cursor-tracker-x11.c | 30 +++++++++++++++++++++++++-----
 3 files changed, 37 insertions(+), 6 deletions(-)
---
diff --git a/src/backends/meta-cursor-tracker-private.h b/src/backends/meta-cursor-tracker-private.h
index 60f8e899c0..1b60d95c99 100644
--- a/src/backends/meta-cursor-tracker-private.h
+++ b/src/backends/meta-cursor-tracker-private.h
@@ -51,6 +51,8 @@ void meta_cursor_tracker_untrack_position (MetaCursorTracker *tracker);
 
 MetaCursorSprite * meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker);
 
+MetaBackend * meta_cursor_tracker_get_backend (MetaCursorTracker *tracker);
+
 void meta_cursor_tracker_notify_cursor_changed (MetaCursorTracker *tracker);
 
 #endif
diff --git a/src/backends/meta-cursor-tracker.c b/src/backends/meta-cursor-tracker.c
index 5a9d5f226b..9ba0d2123c 100644
--- a/src/backends/meta-cursor-tracker.c
+++ b/src/backends/meta-cursor-tracker.c
@@ -543,7 +543,7 @@ meta_cursor_tracker_untrack_position (MetaCursorTracker *tracker)
   MetaCursorTrackerPrivate *priv =
     meta_cursor_tracker_get_instance_private (tracker);
 
-  g_return_if_fail (priv->track_position_count <= 0);
+  g_return_if_fail (priv->track_position_count > 0);
 
   priv->track_position_count--;
   if (priv->track_position_count == 0)
@@ -588,3 +588,12 @@ meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker)
 
   return priv->displayed_cursor;
 }
+
+MetaBackend *
+meta_cursor_tracker_get_backend (MetaCursorTracker *tracker)
+{
+  MetaCursorTrackerPrivate *priv =
+    meta_cursor_tracker_get_instance_private (tracker);
+
+  return priv->backend;
+}
diff --git a/src/backends/x11/meta-cursor-tracker-x11.c b/src/backends/x11/meta-cursor-tracker-x11.c
index 24e303fe31..91ac4b6afd 100644
--- a/src/backends/x11/meta-cursor-tracker-x11.c
+++ b/src/backends/x11/meta-cursor-tracker-x11.c
@@ -42,7 +42,7 @@ struct _MetaCursorTrackerX11
 G_DEFINE_TYPE (MetaCursorTrackerX11, meta_cursor_tracker_x11,
                META_TYPE_CURSOR_TRACKER)
 
-static void
+static gboolean
 ensure_xfixes_cursor (MetaCursorTrackerX11 *tracker_x11);
 
 gboolean
@@ -75,27 +75,47 @@ update_position (MetaCursorTrackerX11 *tracker_x11)
   meta_cursor_tracker_update_position (tracker, x, y);
 }
 
-static void
+static gboolean
 ensure_xfixes_cursor (MetaCursorTrackerX11 *tracker_x11)
 {
   MetaDisplay *display = meta_get_display ();
   g_autoptr (GError) error = NULL;
 
   if (tracker_x11->xfixes_cursor)
-    return;
+    return FALSE;
 
   tracker_x11->xfixes_cursor = meta_cursor_sprite_xfixes_new (display, &error);
   if (!tracker_x11->xfixes_cursor)
     g_warning ("Failed to create XFIXES cursor: %s", error->message);
+
+  return TRUE;
 }
 
 static gboolean
-update_position_timeout (gpointer user_data)
+update_cursor_timeout (gpointer user_data)
 {
   MetaCursorTrackerX11 *tracker_x11 = user_data;
+  MetaCursorTracker *tracker = META_CURSOR_TRACKER (tracker_x11);
+  MetaBackend *backend = meta_cursor_tracker_get_backend (tracker);
+  MetaCursorRenderer *cursor_renderer =
+    meta_backend_get_cursor_renderer (backend);
+  gboolean cursor_changed;
+  MetaCursorSprite *cursor_sprite;
 
   update_position (tracker_x11);
 
+  cursor_changed = ensure_xfixes_cursor (tracker_x11);
+
+  if (tracker_x11->xfixes_cursor)
+    cursor_sprite = META_CURSOR_SPRITE (tracker_x11->xfixes_cursor);
+  else
+    cursor_sprite = NULL;
+
+  meta_cursor_renderer_update_stage_overlay (cursor_renderer, cursor_sprite);
+
+  if (cursor_changed)
+    meta_cursor_tracker_notify_cursor_changed (tracker);
+
   return G_SOURCE_CONTINUE;
 }
 
@@ -114,7 +134,7 @@ meta_cursor_tracker_x11_set_force_track_position (MetaCursorTracker *tracker,
     {
       tracker_x11->update_position_timeout_id =
         g_timeout_add (UPDATE_POSITION_TIMEOUT_MS,
-                       update_position_timeout,
+                       update_cursor_timeout,
                        tracker_x11);
       update_position (tracker_x11);
     }


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