[mutter] backends: Dissociate visibility from current cursor sprite
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] backends: Dissociate visibility from current cursor sprite
- Date: Fri, 17 Nov 2017 16:26:42 +0000 (UTC)
commit b1a0bf89162c0f2ecb444d1801766ea15d7c9312
Author: Carlos Garnacho <carlosg gnome org>
Date: Thu Nov 16 19:23:09 2017 +0100
backends: Dissociate visibility from current cursor sprite
Just like X11/XFixes behaves, the current cursor is not affected
by its visibility, so it can be queried while invisible (possibly
to be replaced).
For this, keep an extra effective_cursor pointer that will be
either equal to displayed_cursor (maybe a bit of a misnomer now)
or NULL if the cursor is invisible. The MetaCursorRenderer
management is tied to the former, and the ::cursor-changed signal
emission to the latter.
https://bugzilla.gnome.org/show_bug.cgi?id=754806
src/backends/meta-cursor-tracker-private.h | 1 +
src/backends/meta-cursor-tracker.c | 61 ++++++++++++++++++----------
2 files changed, 40 insertions(+), 22 deletions(-)
---
diff --git a/src/backends/meta-cursor-tracker-private.h b/src/backends/meta-cursor-tracker-private.h
index 3c19b43..2ec9468 100644
--- a/src/backends/meta-cursor-tracker-private.h
+++ b/src/backends/meta-cursor-tracker-private.h
@@ -32,6 +32,7 @@ struct _MetaCursorTracker {
gboolean is_showing;
+ MetaCursorSprite *effective_cursor; /* May be NULL when hidden */
MetaCursorSprite *displayed_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 59e242b..3cdab83 100644
--- a/src/backends/meta-cursor-tracker.c
+++ b/src/backends/meta-cursor-tracker.c
@@ -53,47 +53,57 @@ enum {
static guint signals[LAST_SIGNAL];
-static MetaCursorSprite *
-get_displayed_cursor (MetaCursorTracker *tracker)
+static gboolean
+update_displayed_cursor (MetaCursorTracker *tracker)
{
MetaDisplay *display = meta_get_display ();
+ MetaCursorSprite *cursor = NULL;
- if (!tracker->is_showing)
- return NULL;
-
- if (meta_display_windows_are_interactable (display))
+ if (display && meta_display_windows_are_interactable (display))
{
if (tracker->has_window_cursor)
- return tracker->window_cursor;
+ cursor = tracker->window_cursor;
}
- return tracker->root_cursor;
+ if (!cursor)
+ cursor = tracker->root_cursor;
+
+ if (tracker->displayed_cursor == cursor)
+ return FALSE;
+
+ g_set_object (&tracker->displayed_cursor, cursor);
+ return TRUE;
+}
+
+static gboolean
+update_effective_cursor (MetaCursorTracker *tracker)
+{
+ MetaCursorSprite *cursor = NULL;
+
+ if (tracker->is_showing)
+ cursor = tracker->displayed_cursor;
+
+ return g_set_object (&tracker->effective_cursor, cursor);
}
static void
-update_displayed_cursor (MetaCursorTracker *tracker)
+change_cursor_renderer (MetaCursorTracker *tracker)
{
MetaBackend *backend = meta_get_backend ();
MetaCursorRenderer *cursor_renderer =
meta_backend_get_cursor_renderer (backend);
- meta_cursor_renderer_set_cursor (cursor_renderer, tracker->displayed_cursor);
+ meta_cursor_renderer_set_cursor (cursor_renderer, tracker->effective_cursor);
}
static void
sync_cursor (MetaCursorTracker *tracker)
{
- MetaCursorSprite *displayed_cursor = get_displayed_cursor (tracker);
-
- if (tracker->displayed_cursor == displayed_cursor)
- return;
-
- g_clear_object (&tracker->displayed_cursor);
- if (displayed_cursor)
- tracker->displayed_cursor = g_object_ref (displayed_cursor);
+ if (update_displayed_cursor (tracker))
+ g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
- update_displayed_cursor (tracker);
- g_signal_emit (tracker, signals[CURSOR_CHANGED], 0);
+ if (update_effective_cursor (tracker))
+ change_cursor_renderer (tracker);
}
static void
@@ -107,6 +117,8 @@ meta_cursor_tracker_finalize (GObject *object)
{
MetaCursorTracker *self = META_CURSOR_TRACKER (object);
+ if (self->effective_cursor)
+ g_object_unref (self->effective_cursor);
if (self->displayed_cursor)
g_object_unref (self->displayed_cursor);
if (self->root_cursor)
@@ -282,9 +294,14 @@ meta_cursor_tracker_get_sprite (MetaCursorTracker *tracker)
}
if (cursor_sprite)
- return meta_cursor_sprite_get_cogl_texture (cursor_sprite);
+ {
+ meta_cursor_sprite_realize_texture (cursor_sprite);
+ return meta_cursor_sprite_get_cogl_texture (cursor_sprite);
+ }
else
- return NULL;
+ {
+ return NULL;
+ }
}
/**
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]