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.
This commit is contained in:
Timo Zuccarello 2024-04-19 21:22:41 +02:00
parent 57d0908e10
commit 1f13ba2b94

View file

@ -2,8 +2,7 @@ use std::{fs::File, io::Write, os::unix::prelude::AsRawFd};
use wayland_client::{ use wayland_client::{
protocol::{ protocol::{
wl_buffer, wl_compositor, wl_keyboard, wl_pointer, wl_registry, wl_seat, wl_shm, wl_buffer, wl_compositor, wl_keyboard, wl_region::WlRegion, wl_registry, wl_seat, wl_shm, wl_shm_pool, wl_surface
wl_shm_pool, wl_surface,
}, },
Connection, Dispatch, Proxy, QueueHandle, Connection, Dispatch, Proxy, QueueHandle,
}; };
@ -26,7 +25,6 @@ struct State {
layer_surface: Option<zwlr_layer_surface_v1::ZwlrLayerSurfaceV1>, layer_surface: Option<zwlr_layer_surface_v1::ZwlrLayerSurfaceV1>,
buffer: Option<wl_buffer::WlBuffer>, buffer: Option<wl_buffer::WlBuffer>,
wm_base: Option<xdg_wm_base::XdgWmBase>, wm_base: Option<xdg_wm_base::XdgWmBase>,
pointer: Option<wl_pointer::WlPointer>,
} }
fn main() { fn main() {
@ -47,7 +45,6 @@ fn main() {
layer_surface: None, layer_surface: None,
buffer: None, buffer: None,
wm_base: None, wm_base: None,
pointer: None,
}; };
event_queue.blocking_dispatch(&mut state).unwrap(); event_queue.blocking_dispatch(&mut state).unwrap();
@ -109,9 +106,6 @@ impl Dispatch<wl_registry::WlRegistry, ()> for State {
(), (),
); );
state.buffer = Some(buffer); state.buffer = Some(buffer);
} else if interface == wl_seat::WlSeat::interface().name {
let seat = registry.bind::<wl_seat::WlSeat, _, _>(name, version, qh, ());
state.pointer = Some(seat.get_pointer(qh, ()));
} else if interface == xdg_wm_base::XdgWmBase::interface().name { } else if interface == xdg_wm_base::XdgWmBase::interface().name {
let wm_base = registry.bind::<xdg_wm_base::XdgWmBase, _, _>(name, 1, qh, ()); let wm_base = registry.bind::<xdg_wm_base::XdgWmBase, _, _>(name, 1, qh, ());
state.wm_base = Some(wm_base); state.wm_base = Some(wm_base);
@ -120,31 +114,15 @@ impl Dispatch<wl_registry::WlRegistry, ()> for State {
} }
} }
impl Dispatch<wl_pointer::WlPointer, ()> for State { impl Dispatch<WlRegion, ()> for State {
fn event( fn event(
state: &mut Self, _: &mut Self,
_: &wl_pointer::WlPointer, _: &WlRegion,
event: wl_pointer::Event, _: <WlRegion as Proxy>::Event,
_: &(), _: &(),
_: &Connection, _: &Connection,
qh: &QueueHandle<Self>, _: &QueueHandle<Self>,
) { ) {
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 // A negative value means we will be centered on the screen
// independently of any other xdg_layer_shell // independently of any other xdg_layer_shell
layer.set_exclusive_zone(-1); 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(&region));
}
self.base_surface.as_ref().unwrap().commit(); self.base_surface.as_ref().unwrap().commit();
self.layer_surface = Some(layer); self.layer_surface = Some(layer);