summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2017-03-28 16:11:33 +0200
committerChristophe Fergeau <cfergeau@redhat.com>2017-03-28 16:19:33 +0200
commit3a9e1c6b39d25a18d82b307f5b868631e80627f0 (patch)
treeaf8dc46f472fc8b7058c6ee48c10cf5473939457
parent7fa104f1d9c1bcb31024bab5325115342082012e (diff)
wayland lock pointer to windowwayland
-rw-r--r--src/spice-widget-priv.h2
-rw-r--r--src/spice-widget.c57
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