From 592f17729c36269482bebfb96ae03459a5d7b929 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Tue, 28 Jan 2025 11:50:44 -0800 Subject: [PATCH] mouse_area: Fix `on_drag` behavior without `on_release` Mouse/touch release events should end the drag even if there's not an `on_release` callback. This was causing https://github.com/pop-os/cosmic-comp/issues/1071. --- widget/src/mouse_area.rs | 64 ++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 35 deletions(-) diff --git a/widget/src/mouse_area.rs b/widget/src/mouse_area.rs index 735f9295..1265a309 100644 --- a/widget/src/mouse_area.rs +++ b/widget/src/mouse_area.rs @@ -504,46 +504,40 @@ fn update( } } - if let Some(message) = widget.on_release.as_ref() { - match event { - Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)) - | Event::Touch(touch::Event::FingerLifted { .. }) => { - state.drag_initiated = None; + match event { + Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)) + | Event::Touch(touch::Event::FingerLifted { .. }) => { + state.drag_initiated = None; + if let Some(message) = widget.on_release.as_ref() { + shell.publish(message.clone()); + } + shell.capture_event(); + return; + } + Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Right)) => { + if let Some(message) = widget.on_right_release.as_ref() { + shell.publish(message.clone()); + } + } + Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Middle)) => { + if let Some(message) = widget.on_middle_press.as_ref() { shell.publish(message.clone()); shell.capture_event(); - return; } - Event::Mouse(mouse::Event::ButtonReleased( - mouse::Button::Right, - )) => { - if let Some(message) = widget.on_right_release.as_ref() { - shell.publish(message.clone()); - } + } + Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Middle)) => { + if let Some(message) = widget.on_middle_release.as_ref() { + shell.publish(message.clone()); } - Event::Mouse(mouse::Event::ButtonPressed( - mouse::Button::Middle, - )) => { - if let Some(message) = widget.on_middle_press.as_ref() { - shell.publish(message.clone()); - shell.capture_event(); - } + } + Event::Mouse(mouse::Event::WheelScrolled { delta }) => { + if let Some(on_scroll) = widget.on_scroll.as_ref() { + shell.publish(on_scroll(*delta)); + shell.capture_event(); } - Event::Mouse(mouse::Event::ButtonReleased( - mouse::Button::Middle, - )) => { - if let Some(message) = widget.on_middle_release.as_ref() { - shell.publish(message.clone()); - } - } - Event::Mouse(mouse::Event::WheelScrolled { delta }) => { - if let Some(on_scroll) = widget.on_scroll.as_ref() { - shell.publish(on_scroll(*delta)); - shell.capture_event(); - } - } - _ => {} - }; - } + } + _ => {} + }; if let Some(on_scroll) = widget.on_scroll.as_ref() { if let Event::Mouse(mouse::Event::WheelScrolled { delta }) = event {