diff options
| author | Mikhail Burakov <mburakov@mailbox.org> | 2023-04-07 15:30:40 +0200 | 
|---|---|---|
| committer | Mikhail Burakov <mburakov@mailbox.org> | 2023-04-07 15:30:40 +0200 | 
| commit | a1235cfd3581b3c5cb134d63532c9f72ad8b278a (patch) | |
| tree | c055842736d6854c482c944da33daa88c2a2002a | |
| parent | d25bb30da26eefbe92cd1e59f7ee4b936c1afcec (diff) | |
Lock pointer to receiver window
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | makefile | 1 | ||||
| -rw-r--r-- | window.c | 25 | 
3 files changed, 24 insertions, 3 deletions
| @@ -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 @@ -16,6 +16,7 @@ protocols_dir:=\  protocols:=\  	linux-dmabuf-unstable-v1 \ +	pointer-constraints-unstable-v1 \  	relative-pointer-unstable-v1 \  	xdg-shell @@ -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( | 
