From 1f13ba2b940539973f301164e06a0e11920923d7 Mon Sep 17 00:00:00 2001 From: Timo Zuccarello Date: Fri, 19 Apr 2024 21:22:41 +0200 Subject: [PATCH] Don't close the window on mouse over and allow clicking through window. This patch sets an empty input region allowing clicking through the window. It also removes the pointer event handler and no longer removes the window on mouse over. --- src/main.rs | 39 +++++++++++---------------------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5feff70..fa9fcc7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,8 +2,7 @@ use std::{fs::File, io::Write, os::unix::prelude::AsRawFd}; use wayland_client::{ protocol::{ - wl_buffer, wl_compositor, wl_keyboard, wl_pointer, wl_registry, wl_seat, wl_shm, - wl_shm_pool, wl_surface, + wl_buffer, wl_compositor, wl_keyboard, wl_region::WlRegion, wl_registry, wl_seat, wl_shm, wl_shm_pool, wl_surface }, Connection, Dispatch, Proxy, QueueHandle, }; @@ -26,7 +25,6 @@ struct State { layer_surface: Option, buffer: Option, wm_base: Option, - pointer: Option, } fn main() { @@ -47,7 +45,6 @@ fn main() { layer_surface: None, buffer: None, wm_base: None, - pointer: None, }; event_queue.blocking_dispatch(&mut state).unwrap(); @@ -109,9 +106,6 @@ impl Dispatch for State { (), ); state.buffer = Some(buffer); - } else if interface == wl_seat::WlSeat::interface().name { - let seat = registry.bind::(name, version, qh, ()); - state.pointer = Some(seat.get_pointer(qh, ())); } else if interface == xdg_wm_base::XdgWmBase::interface().name { let wm_base = registry.bind::(name, 1, qh, ()); state.wm_base = Some(wm_base); @@ -120,31 +114,15 @@ impl Dispatch for State { } } -impl Dispatch for State { +impl Dispatch for State { fn event( - state: &mut Self, - _: &wl_pointer::WlPointer, - event: wl_pointer::Event, + _: &mut Self, + _: &WlRegion, + _: ::Event, _: &(), _: &Connection, - qh: &QueueHandle, + _: &QueueHandle, ) { - eprintln!("WlPointer event {event:#?}"); - match event { - wl_pointer::Event::Enter { .. } => { - if let Some(surface) = &state.base_surface { - surface.destroy(); - } - state.base_surface = None; - } - wl_pointer::Event::Leave { .. } => { - let surface = state.compositor.as_ref().unwrap().create_surface(qh, ()); - state.base_surface = Some(surface); - - state.init_layer_surface(qh); - } - _ => {} - } } } @@ -197,6 +175,11 @@ impl State { // A negative value means we will be centered on the screen // independently of any other xdg_layer_shell layer.set_exclusive_zone(-1); + // Set empty input region to allow clicking through the window. + if let Some(compositor) = &self.compositor { + let region = compositor.create_region(qh, ()); + self.base_surface.as_ref().unwrap().set_input_region(Some(®ion)); + } self.base_surface.as_ref().unwrap().commit(); self.layer_surface = Some(layer);