From 7c6915b0ec08c40011355a16939344db41742903 Mon Sep 17 00:00:00 2001 From: Shawn Wallace Date: Sat, 18 May 2024 02:19:26 -0400 Subject: [PATCH] Add wl_region and wl_surface.set_input_region support Needed for latest Xwayland. --- src/clientside.rs | 3 ++- src/server/dispatch.rs | 43 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/clientside.rs b/src/clientside.rs index 912043c..fe2295c 100644 --- a/src/clientside.rs +++ b/src/clientside.rs @@ -6,7 +6,7 @@ use wayland_client::protocol::{ wl_buffer::WlBuffer, wl_callback::WlCallback, wl_compositor::WlCompositor, wl_keyboard::WlKeyboard, wl_output::WlOutput, wl_pointer::WlPointer, wl_registry::WlRegistry, wl_seat::WlSeat, wl_shm::WlShm, wl_shm_pool::WlShmPool, wl_surface::WlSurface, - wl_touch::WlTouch, + wl_touch::WlTouch, wl_region::WlRegion }; use wayland_client::{delegate_noop, Connection, Dispatch, EventQueue, Proxy, QueueHandle}; use wayland_protocols::wp::relative_pointer::zv1::client::{ @@ -92,6 +92,7 @@ impl ClientState { pub type Event = ::Event; delegate_noop!(Globals: WlCompositor); +delegate_noop!(Globals: WlRegion); delegate_noop!(Globals: ignore WlShm); delegate_noop!(Globals: ignore ZwpLinuxDmabufV1); delegate_noop!(Globals: ZwpRelativePointerManagerV1); diff --git a/src/server/dispatch.rs b/src/server/dispatch.rs index 56b367e..921497e 100644 --- a/src/server/dispatch.rs +++ b/src/server/dispatch.rs @@ -25,9 +25,18 @@ use wayland_protocols::{ }; use wayland_server::{ protocol::{ - wl_buffer::WlBuffer, wl_callback::WlCallback, wl_compositor::WlCompositor, - wl_keyboard::WlKeyboard, wl_output::WlOutput, wl_pointer::WlPointer, wl_seat::WlSeat, - wl_shm::WlShm, wl_shm_pool::WlShmPool, wl_surface::WlSurface, wl_touch::WlTouch, + wl_buffer::WlBuffer, + wl_callback::WlCallback, + wl_compositor::WlCompositor, + wl_keyboard::WlKeyboard, + wl_output::WlOutput, + wl_pointer::WlPointer, + wl_region::{self, WlRegion}, + wl_seat::WlSeat, + wl_shm::WlShm, + wl_shm_pool::WlShmPool, + wl_surface::WlSurface, + wl_touch::WlTouch, }, Dispatch, DisplayHandle, GlobalDispatch, Resource, }; @@ -114,11 +123,35 @@ impl Dispatch for ServerState { Request::::SetBufferScale { scale } => { surface.client.set_buffer_scale(scale); } + Request::::SetInputRegion { region } => { + let region = region.as_ref().map(|r| r.data().unwrap()); + surface.client.set_input_region(region); + } other => warn!("unhandled surface request: {other:?}"), } } } +impl Dispatch for ServerState { + fn request( + _: &mut Self, + _: &wayland_server::Client, + _: &WlRegion, + request: ::Request, + client: &client::wl_region::WlRegion, + _: &DisplayHandle, + _: &mut wayland_server::DataInit<'_, Self>, + ) { + simple_event_shunt! { + client, request: wl_region::Request => [ + Add { x, y, width, height }, + Subtract { x, y, width, height }, + Destroy + ] + } + } +} + impl Dispatch> for ServerState @@ -168,6 +201,10 @@ impl } } } + Request::::CreateRegion { id } => { + let c_region = client.create_region(&state.qh, ()); + data_init.init(id, c_region); + } other => { warn!("unhandled wlcompositor request: {other:?}"); }