[mutter] cursor-tracker/x11: Also update sprite when updating position
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] cursor-tracker/x11: Also update sprite when updating position
- Date: Thu, 6 Aug 2020 16:26:40 +0000 (UTC)
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]