Fix invisible cursor bug

Add upstream patches fixing issues with the cursor becoming invisible
in wayland environments

Resolves: rhbz#1528200
This commit is contained in:
Christophe Fergeau 2019-02-21 16:11:22 +01:00
parent 630bb691f9
commit 54d1204a92
4 changed files with 157 additions and 1 deletions

View File

@ -0,0 +1,67 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Wed, 6 Feb 2019 15:42:53 +0100
Subject: [PATCH] spice-widget: Release GdkSeat cursor on pointer ungrab
Using different GDK APIs to grab and ungrab the pointer device can lead
to the cursor not reappearing on ungrab because GDK keeps a reference of
the GdkSeat cursor.
Use the GdkSeat API to set a `NULL` cursor prior to ungrab the pointer
so that the cursor is recovered after the pointer is ungrabbed.
Thanks-to: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Fixes: https://gitlab.freedesktop.org/spice/spice-gtk/issues/83
See-also: https://gitlab.gnome.org/GNOME/gtk/issues/787
---
src/spice-widget.c | 27 ++++++++++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/src/spice-widget.c b/src/spice-widget.c
index 8adcc38..853cdcb 100644
--- a/src/spice-widget.c
+++ b/src/spice-widget.c
@@ -32,6 +32,9 @@
#include <va/va_x11.h>
#endif
#endif
+#ifdef GDK_WINDOWING_WAYLAND
+#include <gdk/gdkwayland.h>
+#endif
#ifdef G_OS_WIN32
#include <windows.h>
#include <dinput.h>
@@ -1151,9 +1154,31 @@ static void mouse_wrap(SpiceDisplay *display, GdkEventMotion *motion)
static void ungrab_pointer(G_GNUC_UNUSED SpiceDisplay *display)
{
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+ GdkSeat *seat = spice_display_get_default_seat(display);
+ GdkDevice *pointer = gdk_seat_get_pointer(seat);
+
+#ifdef GDK_WINDOWING_WAYLAND
+ /* On Wayland, mixing the GdkSeat and the GdkDevice APIs leave the
+ * cursor unchanged because the GDK Wayland backend keeps a reference
+ * of the cursor set previously using gdk_seat_grab() attached to the
+ * GdkSeat.
+ * To avoid that issue, we simply issue another gdk_seat_grab() with
+ * a NULL cursor so that the previous reference (the blank cursor)
+ * held by the GdkSeat is released.
+ */
+ if (GDK_IS_WAYLAND_DISPLAY(gdk_display_get_default()))
+ gdk_seat_grab(seat,
+ gtk_widget_get_window(GTK_WIDGET(display)),
+ GDK_SEAT_CAPABILITY_ALL_POINTING,
+ TRUE,
+ NULL,
+ NULL,
+ NULL,
+ NULL);
+#endif
+
/* we want to ungrab just the pointer - it is not possible using gdk_seat_ungrab().
See also https://bugzilla.gnome.org/show_bug.cgi?id=780133 */
- GdkDevice *pointer = gdk_seat_get_pointer(spice_display_get_default_seat(display));
gdk_device_ungrab(pointer, GDK_CURRENT_TIME);
G_GNUC_END_IGNORE_DEPRECATIONS
}

View File

@ -0,0 +1,49 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <ofourdan@redhat.com>
Date: Fri, 1 Feb 2019 14:35:39 +0100
Subject: [PATCH] spice-widget: Ungrab mouse on leave event on Wayland
The Spice Gtk widget relies on pointer grabs to receive all pointer
events even after the pointer has left the window.
While that works on X11, on Wayland there is no active pointer grab,
so once the pointer has left the SPICE widget on Wayland, the events
are routed to the window with the pointer focus instead of ours.
To avoid the problem, on Wayland, we simply ungrab the pointer once it
leaves the window.
Thanks-to: Peter Hutterer <peter.hutterer@who-t.net>
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
https://gitlab.freedesktop.org/spice/spice-gtk/issues/83
---
src/spice-widget.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/spice-widget.c b/src/spice-widget.c
index 853cdcb..80ea831 100644
--- a/src/spice-widget.c
+++ b/src/spice-widget.c
@@ -1805,8 +1805,21 @@ static gboolean leave_event(GtkWidget *widget, GdkEventCrossing *crossing G_GNUC
DISPLAY_DEBUG(display, "%s", __FUNCTION__);
- if (d->mouse_grab_active)
+ if (d->mouse_grab_active) {
+#ifdef GDK_WINDOWING_WAYLAND
+ /* On Wayland, there is no active pointer grab, so once the pointer
+ * has left the window, the events are routed to the window with
+ * pointer focus instead of ours, in which case we should just
+ * ungrab to avoid nasty side effects. */
+ if (GDK_IS_WAYLAND_DISPLAY(gdk_display_get_default())) {
+ GdkWindow *window = gtk_widget_get_window(widget);
+
+ if (window == crossing->window)
+ try_mouse_ungrab(display);
+ }
+#endif
return true;
+ }
d->mouse_have_pointer = false;
spice_gtk_session_set_mouse_has_pointer(d->gtk_session, false);

View File

@ -0,0 +1,32 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Rasmus Thomsen <rasmus.thomsen@protonmail.com>
Date: Sun, 20 Jan 2019 02:09:53 +0100
Subject: [PATCH] meson: ensure correct build order of VAPI
Without this commit spice-client-gtk-3.0.vapi may be built
before spice-client-glib-2.0.vapi if build_jobs > 1. This causes
the build to fail because the former depends on the latter
---
vapi/meson.build | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/vapi/meson.build b/vapi/meson.build
index 2c4caa0..c9fef3d 100644
--- a/vapi/meson.build
+++ b/vapi/meson.build
@@ -1,12 +1,13 @@
if spice_gtk_has_vala
- gnome.generate_vapi('spice-client-glib-2.0',
+ spice_glib_vapi = gnome.generate_vapi('spice-client-glib-2.0',
install : true,
packages : ['gio-2.0', 'gstreamer-1.0'],
sources : spice_client_glib_gir[0])
+
if spice_gtk_has_gtk
gnome.generate_vapi('spice-client-gtk-3.0',
install : true,
- packages : ['gtk+-3.0', 'gstreamer-1.0', 'spice-client-glib-2.0'],
+ packages : ['gtk+-3.0', 'gstreamer-1.0', spice_glib_vapi],
gir_dirs : join_paths(meson.build_root(), 'src'),
vapi_dirs : meson.current_build_dir(),
sources : spice_client_gtk_gir[0])

View File

@ -2,7 +2,7 @@
Name: spice-gtk Name: spice-gtk
Version: 0.36 Version: 0.36
Release: 3%{?dist} Release: 4%{?dist}
Summary: A GTK+ widget for SPICE clients Summary: A GTK+ widget for SPICE clients
License: LGPLv2+ License: LGPLv2+
@ -12,6 +12,9 @@ Source0: https://www.spice-space.org/download/gtk/%{name}-%{version}%{?_v
Patch0001: 0001-meson-improve-gtk-doc-build.patch Patch0001: 0001-meson-improve-gtk-doc-build.patch
Patch0002: 0002-meson-fix-ninja-dist-and-building-from-tarball.patch Patch0002: 0002-meson-fix-ninja-dist-and-building-from-tarball.patch
Patch0003: 0003-spice-widget-Release-GdkSeat-cursor-on-pointer-ungra.patch
Patch0004: 0004-spice-widget-Ungrab-mouse-on-leave-event-on-Wayland.patch
Patch0005: 0005-meson-ensure-correct-build-order-of-VAPI.patch
BuildRequires: git-core BuildRequires: git-core
BuildRequires: meson BuildRequires: meson
@ -183,6 +186,11 @@ spicy-screenshot is a tool to capture screen-shots of a SPICE desktop.
%{_bindir}/spicy-stats %{_bindir}/spicy-stats
%changelog %changelog
* Thu Feb 21 2019 Christophe Fergeau <cfergeau@redhat.com> - 0.36-4
- Add upstream patches fixing issues with the cursor becoming invisible
in wayland environments
Resolves: rhbz#1528200
* Mon Feb 04 2019 Kalev Lember <klember@redhat.com> - 0.36-3 * Mon Feb 04 2019 Kalev Lember <klember@redhat.com> - 0.36-3
- Update BRs for vala packaging changes - Update BRs for vala packaging changes