From c2446f028ff718a03da57afaf7f5ab23b82979d1 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Sun, 4 Jan 2026 11:18:29 +0900 Subject: [PATCH] decor mouse hover & leave --- wlx-overlay-s/src/overlays/wayvr.rs | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/wlx-overlay-s/src/overlays/wayvr.rs b/wlx-overlay-s/src/overlays/wayvr.rs index bf3a483..768d9a6 100644 --- a/wlx-overlay-s/src/overlays/wayvr.rs +++ b/wlx-overlay-s/src/overlays/wayvr.rs @@ -1,3 +1,4 @@ +use anyhow::Context; use glam::{Affine2, Affine3A, Quat, Vec2, Vec3, vec2, vec3}; use smithay::{ desktop::PopupManager, @@ -87,6 +88,7 @@ pub struct WvrWindowBackend { inner_extent: [u32; 3], mouse_transform: Affine2, uv_range: RangeInclusive, + panel_hovered: bool, } impl WvrWindowBackend { @@ -143,6 +145,7 @@ impl WvrWindowBackend { panel, mouse_transform: Affine2::ZERO, uv_range: 0.0..=1.0, + panel_hovered: false, }) } @@ -379,7 +382,17 @@ impl OverlayBackend for WvrWindowBackend { let transformed = self.mouse_transform.transform_point2(hit.uv); if !self.uv_range.contains(&transformed.x) || !self.uv_range.contains(&transformed.y) { - return self.panel.on_hover(app, hit); + let Some(meta) = self.meta.as_ref() else { + return HoverResult::default(); + }; + + let mut hit2 = hit.clone(); + hit2.uv.y *= meta.extent[1] as f32 / (meta.extent[1] - self.inner_extent[1]) as f32; + self.panel_hovered = true; + return self.panel.on_hover(app, &hit2); + } else if self.panel_hovered { + self.panel.on_left(app, hit.pointer); + self.panel_hovered = false; } let clamped = transformed.clamp(Vec2::ZERO, Vec2::ONE); @@ -397,14 +410,24 @@ impl OverlayBackend for WvrWindowBackend { } fn on_left(&mut self, app: &mut state::AppState, pointer: usize) { - self.panel.on_left(app, pointer); + if self.panel_hovered { + self.panel.on_left(app, pointer); + self.panel_hovered = false; + } } fn on_pointer(&mut self, app: &mut state::AppState, hit: &input::PointerHit, pressed: bool) { let transformed = self.mouse_transform.transform_point2(hit.uv); if !self.uv_range.contains(&transformed.x) || !self.uv_range.contains(&transformed.y) { - return self.panel.on_pointer(app, hit, pressed); + let Some(meta) = self.meta.as_ref() else { + return; + }; + + let mut hit2 = hit.clone(); + hit2.uv.y *= meta.extent[1] as f32 / (meta.extent[1] - self.inner_extent[1]) as f32; + self.panel_hovered = true; + return self.panel.on_pointer(app, &hit2, pressed); } if let Some(index) = match hit.mode {