summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Burakov <mburakov@mailbox.org>2023-04-07 15:30:40 +0200
committerMikhail Burakov <mburakov@mailbox.org>2023-04-07 15:30:40 +0200
commita1235cfd3581b3c5cb134d63532c9f72ad8b278a (patch)
treec055842736d6854c482c944da33daa88c2a2002a
parentd25bb30da26eefbe92cd1e59f7ee4b936c1afcec (diff)
Lock pointer to receiver window
-rw-r--r--.gitignore1
-rw-r--r--makefile1
-rw-r--r--window.c25
3 files changed, 24 insertions, 3 deletions
diff --git a/.gitignore b/.gitignore
index d239d70..6e8e8e3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
compile_commands.json
compile_flags.txt
linux-dmabuf-unstable-v1.h
+pointer-constraints-unstable-v1.h
receiver
relative-pointer-unstable-v1.h
xdg-shell.h
diff --git a/makefile b/makefile
index 3ab97d7..367c04f 100644
--- a/makefile
+++ b/makefile
@@ -16,6 +16,7 @@ protocols_dir:=\
protocols:=\
linux-dmabuf-unstable-v1 \
+ pointer-constraints-unstable-v1 \
relative-pointer-unstable-v1 \
xdg-shell
diff --git a/window.c b/window.c
index eb56dc4..5c36c0b 100644
--- a/window.c
+++ b/window.c
@@ -26,6 +26,7 @@
#include "frame.h"
#include "linux-dmabuf-unstable-v1.h"
+#include "pointer-constraints-unstable-v1.h"
#include "relative-pointer-unstable-v1.h"
#include "toolbox/utils.h"
#include "xdg-shell.h"
@@ -43,9 +44,11 @@ struct Window {
struct wl_keyboard* wl_keyboard;
struct xdg_wm_base* xdg_wm_base;
struct zwp_linux_dmabuf_v1* zwp_linux_dmabuf_v1;
+ struct zwp_pointer_constraints_v1* zwp_pointer_constraints_v1;
struct zwp_relative_pointer_manager_v1* zwp_relative_pointer_manager_v1;
struct zwp_relative_pointer_v1* zwp_relative_pointer_v1;
+ struct zwp_locked_pointer_v1* zwp_locked_pointer_v1;
struct xdg_surface* xdg_surface;
struct xdg_toplevel* xdg_toplevel;
struct wl_buffer** wl_buffers;
@@ -94,6 +97,12 @@ static void OnWlRegistryGlobal(void* data, struct wl_registry* wl_registry,
if (!window->zwp_linux_dmabuf_v1)
LOG("Failed to bind zwp_linux_dmabuf_v1 (%s)", strerror(errno));
+ } else if (!strcmp(interface, zwp_pointer_constraints_v1_interface.name)) {
+ window->zwp_pointer_constraints_v1 = wl_registry_bind(
+ wl_registry, name, &zwp_pointer_constraints_v1_interface, version);
+ if (!window->zwp_pointer_constraints_v1)
+ LOG("Failed to bind zwp_pointer_constraints_v1 (%s)", strerror(errno));
+
} else if (!strcmp(interface,
zwp_relative_pointer_manager_v1_interface.name)) {
window->zwp_relative_pointer_manager_v1 = wl_registry_bind(
@@ -116,11 +125,10 @@ static void OnWlPointerEnter(void* data, struct wl_pointer* wl_pointer,
uint32_t serial, struct wl_surface* surface,
wl_fixed_t surface_x, wl_fixed_t surface_y) {
(void)data;
- (void)wl_pointer;
- (void)serial;
(void)surface;
(void)surface_x;
(void)surface_y;
+ wl_pointer_set_cursor(wl_pointer, serial, NULL, 0, 0);
}
static void OnWlPointerLeave(void* data, struct wl_pointer* wl_pointer,
@@ -402,12 +410,20 @@ struct Window* WindowCreate(const struct WindowEventHandlers* event_handlers,
goto rollback_globals;
}
+ window->zwp_locked_pointer_v1 = zwp_pointer_constraints_v1_lock_pointer(
+ window->zwp_pointer_constraints_v1, window->wl_surface,
+ window->wl_pointer, NULL, ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_PERSISTENT);
+ if (!window->zwp_locked_pointer_v1) {
+ LOG("Failed to lock wl_pointer (%s)", strerror(errno));
+ goto rollback_globals;
+ }
+
window->zwp_relative_pointer_v1 =
zwp_relative_pointer_manager_v1_get_relative_pointer(
window->zwp_relative_pointer_manager_v1, window->wl_pointer);
if (!window->zwp_relative_pointer_v1) {
LOG("Failed to get zwp_relative_pointer_v1 (%s)", strerror(errno));
- goto rollback_globals;
+ goto rollback_zwp_locked_pointer_v1;
}
static const struct zwp_relative_pointer_v1_listener
zwp_relative_pointer_v1_listener = {
@@ -457,6 +473,7 @@ struct Window* WindowCreate(const struct WindowEventHandlers* event_handlers,
LOG("Failed to roundtrip wl_display (%s)", strerror(errno));
goto rollback_xdg_toplevel;
}
+ zwp_locked_pointer_v1_set_region(window->zwp_locked_pointer_v1, NULL);
wl_registry_destroy(wl_registry);
return window;
@@ -466,6 +483,8 @@ rollback_xdg_surface:
xdg_surface_destroy(window->xdg_surface);
rollback_zwp_relative_pointer_v1:
zwp_relative_pointer_v1_destroy(window->zwp_relative_pointer_v1);
+rollback_zwp_locked_pointer_v1:
+ zwp_locked_pointer_v1_destroy(window->zwp_locked_pointer_v1);
rollback_globals:
if (window->zwp_relative_pointer_manager_v1) {
zwp_relative_pointer_manager_v1_destroy(