diff options
author | Christophe Fergeau <cfergeau@redhat.com> | 2017-03-28 16:11:33 +0200 |
---|---|---|
committer | Christophe Fergeau <cfergeau@redhat.com> | 2017-03-28 16:19:33 +0200 |
commit | 3a9e1c6b39d25a18d82b307f5b868631e80627f0 (patch) | |
tree | af8dc46f472fc8b7058c6ee48c10cf5473939457 | |
parent | 7fa104f1d9c1bcb31024bab5325115342082012e (diff) |
wayland lock pointer to windowwayland
-rw-r--r-- | src/spice-widget-priv.h | 2 | ||||
-rw-r--r-- | src/spice-widget.c | 57 |
2 files changed, 59 insertions, 0 deletions
diff --git a/src/spice-widget-priv.h b/src/spice-widget-priv.h index ddd2f98..4e8cd02 100644 --- a/src/spice-widget-priv.h +++ b/src/spice-widget-priv.h @@ -161,6 +161,8 @@ struct _SpiceDisplayPrivate { struct zwp_pointer_constraints_v1 *pointer_constraints; struct zwp_relative_pointer_manager_v1 *relative_pointer_manager; + struct zwp_locked_pointer_v1 *locked_pointer; + /* FIXME: belong to session? */ struct zwp_relative_pointer_v1 *relative_pointer; #endif diff --git a/src/spice-widget.c b/src/spice-widget.c index cf060d3..934aa83 100644 --- a/src/spice-widget.c +++ b/src/spice-widget.c @@ -1115,6 +1115,7 @@ error: #endif static int spice_display_wayland_lock_pointer(SpiceDisplay *display); +static void spice_display_wayland_constrain_pointer(SpiceDisplay *display); static gboolean do_pointer_grab(SpiceDisplay *display) { @@ -1164,6 +1165,7 @@ static gboolean do_pointer_grab(SpiceDisplay *display) GDK_CURRENT_TIME); #endif spice_display_wayland_lock_pointer(display); + spice_display_wayland_constrain_pointer(display); G_GNUC_END_IGNORE_DEPRECATIONS grab_successful = (status == GDK_GRAB_SUCCESS); if (!grab_successful) { @@ -1265,6 +1267,7 @@ static void mouse_wrap(SpiceDisplay *display, GdkEventMotion *motion) } static int spice_display_wayland_unlock_pointer(SpiceDisplay *display); +static void spice_display_wayland_unconstrain_pointer(SpiceDisplay *display); static void ungrab_pointer(G_GNUC_UNUSED SpiceDisplay *display) { @@ -1278,6 +1281,7 @@ static void ungrab_pointer(G_GNUC_UNUSED SpiceDisplay *display) gdk_pointer_ungrab(GDK_CURRENT_TIME); #endif spice_display_wayland_unlock_pointer(display); + spice_display_wayland_unconstrain_pointer(display); G_GNUC_END_IGNORE_DEPRECATIONS } @@ -3345,4 +3349,57 @@ static int spice_display_wayland_unlock_pointer(SpiceDisplay *display) return 0; } + +static void +locked_pointer_locked(void *data, + struct zwp_locked_pointer_v1 *locked_pointer) +{ +} + +static void +locked_pointer_unlocked(void *data, + struct zwp_locked_pointer_v1 *locked_pointer) +{ +} + +static const struct zwp_locked_pointer_v1_listener locked_pointer_listener = { + locked_pointer_locked, + locked_pointer_unlocked, +}; + +static void +spice_display_wayland_constrain_pointer(SpiceDisplay *display) +{ + struct zwp_locked_pointer_v1 *locked_pointer; + GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(display)); + struct wl_pointer *pointer; + + + if (display->priv->locked_pointer) + return; + + pointer = gdk_wayland_device_get_wl_pointer(spice_gdk_window_get_pointing_device(window)); + locked_pointer = + zwp_pointer_constraints_v1_lock_pointer(display->priv->pointer_constraints, + gdk_wayland_window_get_wl_surface(window), + pointer, + NULL, + ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_PERSISTENT); + zwp_locked_pointer_v1_add_listener(locked_pointer, + &locked_pointer_listener, + display); + + display->priv->locked_pointer = locked_pointer; +} + +/* FIXME: in SDL, this is done as part of spice_display_wayland_unlock_pointer */ +static void +spice_display_wayland_unconstrain_pointer(SpiceDisplay *display) +{ + if (display->priv->locked_pointer) { + zwp_locked_pointer_v1_destroy(display->priv->locked_pointer); + display->priv->locked_pointer = NULL; + } +} + #endif |