From 0298487096e03abc6bc31eec3e8d1339530f2714 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Wed, 25 Feb 2026 13:26:38 -0500 Subject: [PATCH] fix: overlay event handling and mouse interaction --- src/app/mod.rs | 1 - src/widget/context_drawer/overlay.rs | 30 +++++++++++++++++++++++----- src/widget/context_drawer/widget.rs | 2 +- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/app/mod.rs b/src/app/mod.rs index abda71c..e11ed7a 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -12,7 +12,6 @@ use cosmic_config::CosmicConfigEntry; pub mod context_drawer; pub use context_drawer::{ContextDrawer, context_drawer}; use iced::application::BootFn; -use iced_core::Widget; pub mod cosmic; pub mod settings; diff --git a/src/widget/context_drawer/overlay.rs b/src/widget/context_drawer/overlay.rs index eef9183..39b3421 100644 --- a/src/widget/context_drawer/overlay.rs +++ b/src/widget/context_drawer/overlay.rs @@ -8,7 +8,7 @@ use iced::advanced::widget::{self, Operation}; use iced::advanced::{Clipboard, Shell}; use iced::advanced::{overlay, renderer}; use iced::{Event, Point, Size, mouse}; -use iced_core::Renderer; +use iced_core::{Renderer, touch}; pub(super) struct Overlay<'a, 'b, Message> { pub(crate) position: Point, @@ -65,7 +65,20 @@ where clipboard, shell, &layout.bounds(), - ) + ); + match event { + Event::Mouse(e) if !matches!(e, mouse::Event::CursorLeft) => { + if cursor.is_over(layout.bounds()) { + shell.capture_event(); + } + } + Event::Touch(e) if !matches!(e, touch::Event::FingerLost { .. }) => { + if cursor.is_over(layout.bounds()) { + shell.capture_event(); + } + } + _ => {} + } } fn draw( @@ -86,7 +99,7 @@ where cursor, &layout.bounds(), ); - }) + }); } fn operate( @@ -108,9 +121,16 @@ where ) -> mouse::Interaction { // TODO how to handle viewport here? let viewport = &layout.bounds(); - self.content + let interaction = self + .content .as_widget() - .mouse_interaction(self.tree, layout, cursor, viewport, renderer) + .mouse_interaction(self.tree, layout, cursor, viewport, renderer); + if let mouse::Interaction::None = interaction + && cursor.is_over(layout.bounds()) + { + return mouse::Interaction::Idle; + } + interaction } fn overlay<'c>( diff --git a/src/widget/context_drawer/widget.rs b/src/widget/context_drawer/widget.rs index e7ca5da..7420738 100644 --- a/src/widget/context_drawer/widget.rs +++ b/src/widget/context_drawer/widget.rs @@ -238,7 +238,7 @@ impl Widget for ContextDrawer<' clipboard, shell, viewport, - ) + ); } fn mouse_interaction(