diff options
author | Rui Matos <tiagomatos@gmail.com> | 2014-04-07 18:40:41 +0200 |
---|---|---|
committer | Rui Matos <tiagomatos@gmail.com> | 2014-04-07 19:23:35 +0200 |
commit | b9d798c2134f208035edfa8c13fc833486c8b444 (patch) | |
tree | ff9ebab65151cae92d53708a8b23eddf59b8fb1a | |
parent | 5abf41ab5a2156b8c4075ffd8de0db9d405f8a15 (diff) | |
download | mutter-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.h | 6 | ||||
-rw-r--r-- | src/backends/meta-cursor-tracker.c | 44 |
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 |