[Spice-devel] [spice-gtk v2] mouse: Fix pointer grabbing in server mode
Frediano Ziglio
fziglio at redhat.com
Tue Aug 9 14:33:05 UTC 2016
>
> Trying to click on spice-gtk window while in server mode should result
> in a pointer grab. This is currently failing, with the cursor wrapping
> to the top left corner of the window instead without being grabbed.
>
> This is caused by our use of gtk_event_box_set_above_child(),
> when clicking on the SpiceWidget, the grab is implicitly taken by
> the window which is above the event box (which is an internal
> GtkEventBox input-only GdkWindow). Then when we call gdk_pointer_grab()
> on the GtkEventBox::window, we get a grab-broken event indicating the
> grab was transferred from the internal input-only window to
> GtkEventBox::window (see gtk+ bug
> https://bugzilla.gnome.org/show_bug.cgi?id=769635#c2 for a detailed
> explanation).
>
> This commit ignores grab-broken events when the GdkWindow who got the
> grab corresponds to the one we called gdk_pointer_grab() on.
> An alternative would be to call gdk_pointer_grab() on the GdkWindow
> which received the button-press-event, but the call chain between
> button_event() and the eventual gdk_pointer_grab() call, so it would be
> not so elegant to pass the correct GdkWindow all the way.
> ---
> Changes since v1:
>
> Rework commit log/code comment following garnacho's input in the gtk+ bug. No
> code change.
>
>
> src/spice-widget.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/src/spice-widget.c b/src/spice-widget.c
> index 7c1c756..de10736 100644
> --- a/src/spice-widget.c
> +++ b/src/spice-widget.c
> @@ -462,8 +462,19 @@ static GdkCursor* get_blank_cursor(void)
> static gboolean grab_broken(SpiceDisplay *self, GdkEventGrabBroken *event,
> gpointer user_data G_GNUC_UNUSED)
> {
> + GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(self));
> SPICE_DEBUG("%s (implicit: %d, keyboard: %d)", __FUNCTION__,
> event->implicit, event->keyboard);
> + SPICE_DEBUG("%s (SpiceDisplay::GdkWindow %p, event->grab_window: %p)",
> + __FUNCTION__, window, event->grab_window);
> + if (window == event->grab_window) {
> + /* ignore grab-broken event moving the grab to GtkEventBox::window
> + * (from GtkEventBox::event_window) as we initially called
> + * gdk_pointer_grab() on GtkEventBox::window, see
> + * https://bugzilla.gnome.org/show_bug.cgi?id=769635
> + */
> + return false;
s/false/FALSE/ ??
Not a big deal.
> + }
>
> if (event->keyboard) {
> try_keyboard_ungrab(self);
Acked-by: Frediano Ziglio <fziglio at redhat.com>
(I think Victor one is still valid too).
Frediano
More information about the Spice-devel
mailing list