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.
This commit is contained in:
Ian Douglas Scott 2025-01-28 11:50:44 -08:00 • committed by Ashley Wulber
parent 1f93ae8c3f
commit 592f17729c
No known key found for this signature in database
GPG key ID: 5216D4F46A90A820

View file

@ -504,46 +504,40 @@ fn update<Message: Clone, Theme, Renderer>(
} }
} }
if let Some(message) = widget.on_release.as_ref() { match event {
match event { Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left))
Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)) | Event::Touch(touch::Event::FingerLifted { .. }) => {
| Event::Touch(touch::Event::FingerLifted { .. }) => { state.drag_initiated = None;
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.publish(message.clone());
shell.capture_event(); shell.capture_event();
return;
} }
Event::Mouse(mouse::Event::ButtonReleased( }
mouse::Button::Right, Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Middle)) => {
)) => { if let Some(message) = widget.on_middle_release.as_ref() {
if let Some(message) = widget.on_right_release.as_ref() { shell.publish(message.clone());
shell.publish(message.clone());
}
} }
Event::Mouse(mouse::Event::ButtonPressed( }
mouse::Button::Middle, Event::Mouse(mouse::Event::WheelScrolled { delta }) => {
)) => { if let Some(on_scroll) = widget.on_scroll.as_ref() {
if let Some(message) = widget.on_middle_press.as_ref() { shell.publish(on_scroll(*delta));
shell.publish(message.clone()); shell.capture_event();
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 Some(on_scroll) = widget.on_scroll.as_ref() {
if let Event::Mouse(mouse::Event::WheelScrolled { delta }) = event { if let Event::Mouse(mouse::Event::WheelScrolled { delta }) = event {