summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRui Matos <tiagomatos@gmail.com>2014-04-07 18:40:41 +0200
committerRui Matos <tiagomatos@gmail.com>2014-04-07 19:23:35 +0200
commitb9d798c2134f208035edfa8c13fc833486c8b444 (patch)
treeff9ebab65151cae92d53708a8b23eddf59b8fb1a
parent5abf41ab5a2156b8c4075ffd8de0db9d405f8a15 (diff)
downloadmutter-wip/split-cursor-tracker.tar.gz
cursor-tracker: Properly handle invisible cursorswip/split-cursor-tracker
We might be asked to not display the cursor ourselves but we should still emit cursor-changed signals and hand out the correct sprite and hot point information when asked so that consumers can still draw an updated cursor themselves. This fixes the cursor not showing up in gnome-shell's zoom 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