summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backends/meta-cursor-tracker-private.h6
-rw-r--r--src/backends/meta-cursor-tracker.c44
2 files changed, 35 insertions, 15 deletions
diff --git a/src/backends/meta-cursor-tracker-private.h b/src/backends/meta-cursor-tracker-private.h
index c2a25e9bf..9564bce6c 100644
--- a/src/backends/meta-cursor-tracker-private.h
+++ b/src/backends/meta-cursor-tracker-private.h
@@ -46,6 +46,12 @@ struct _MetaCursorTracker {
*/
MetaCursorReference *displayed_cursor;
+ /* This is the cursor that would be displayed if we hadn't been
+ * asked to hide it. i.e. it's the same as displayed_cursor unless
+ * is_showing is false.
+ */
+ MetaCursorReference *current_cursor;
+
MetaCursorReference *grab_cursor;
/* Wayland clients can set a NULL buffer as their cursor
diff --git a/src/backends/meta-cursor-tracker.c b/src/backends/meta-cursor-tracker.c
index c0d5072b5..a26280b19 100644
--- a/src/backends/meta-cursor-tracker.c
+++ b/src/backends/meta-cursor-tracker.c
@@ -157,8 +157,8 @@ meta_cursor_tracker_get_sprite (MetaCursorTracker *tracker)
META_CURSOR_TRACKER_GET_CLASS (tracker)->ensure_cursor (tracker);
- if (tracker->displayed_cursor)
- return meta_cursor_reference_get_cogl_texture (tracker->displayed_cursor, NULL, NULL);
+ if (tracker->current_cursor)
+ return meta_cursor_reference_get_cogl_texture (tracker->current_cursor, NULL, NULL);
else
return NULL;
}
@@ -179,8 +179,8 @@ meta_cursor_tracker_get_hot (MetaCursorTracker *tracker,
META_CURSOR_TRACKER_GET_CLASS (tracker)->ensure_cursor (tracker);
- if (tracker->displayed_cursor)
- meta_cursor_reference_get_cogl_texture (tracker->displayed_cursor, x, y);
+ if (tracker->current_cursor)
+ meta_cursor_reference_get_cogl_texture (tracker->current_cursor, x, y);
else
{
if (x)
@@ -239,11 +239,8 @@ meta_cursor_tracker_set_root_cursor (MetaCursorTracker *tracker,
}
static MetaCursorReference *
-get_displayed_cursor (MetaCursorTracker *tracker)
+get_current_cursor (MetaCursorTracker *tracker)
{
- if (!tracker->is_showing)
- return NULL;
-
if (tracker->grab_cursor)
return tracker->grab_cursor;
@@ -253,21 +250,38 @@ get_displayed_cursor (MetaCursorTracker *tracker)
return tracker->root_cursor;
}
+static MetaCursorReference *
+get_displayed_cursor (MetaCursorTracker *tracker)
+{
+ if (!tracker->is_showing)
+ return NULL;
+
+ return get_current_cursor (tracker);
+}
+
void
_meta_cursor_tracker_sync_cursor (MetaCursorTracker *tracker)
{
+ MetaCursorReference *current_cursor = get_current_cursor (tracker);
MetaCursorReference *displayed_cursor = get_displayed_cursor (tracker);
- if (tracker->displayed_cursor == displayed_cursor)
- return;
+ if (tracker->displayed_cursor != displayed_cursor)
+ {
+ g_clear_pointer (&tracker->displayed_cursor, meta_cursor_reference_unref);
+ if (displayed_cursor)
+ tracker->displayed_cursor = meta_cursor_reference_ref (displayed_cursor);
- g_clear_pointer (&tracker->displayed_cursor, meta_cursor_reference_unref);
- if (displayed_cursor)
- tracker->displayed_cursor = meta_cursor_reference_ref (displayed_cursor);
+ META_CURSOR_TRACKER_GET_CLASS (tracker)->sync_cursor (tracker);
+ }
- META_CURSOR_TRACKER_GET_CLASS (tracker)->sync_cursor (tracker);
+ if (tracker->current_cursor != current_cursor)
+ {
+ g_clear_pointer (&tracker->current_cursor, meta_cursor_reference_unref);
+ if (current_cursor)
+ tracker->current_cursor = meta_cursor_reference_ref (current_cursor);
- g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
+ g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
+ }
}
void