From fab655828544303c59ca925d46fe72cf5db6d1aa Mon Sep 17 00:00:00 2001 From: Sophie Herold Date: Thu, 27 Apr 2023 23:26:46 +0200 Subject: [PATCH] image: Cancel scroll deceleration on gesture Seems like the deceleration from kinetic scrolling can interact with gestures, making the image jump around. Closes #103 Part-of: --- src/widgets/image.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/widgets/image.rs b/src/widgets/image.rs index 0da1a54..a113351 100644 --- a/src/widgets/image.rs +++ b/src/widgets/image.rs @@ -428,6 +428,7 @@ mod imp { } if obj.is_hscrollable() || obj.is_vscrollable() { + obj.cancel_deceleration(); obj.set_cursor(gdk::Cursor::from_name("grabbing", None).as_ref()); obj.imp().last_drag_value.set(Some((0., 0.))); } else { @@ -457,6 +458,9 @@ mod imp { let rotation_gesture = gtk::GestureRotate::new(); obj.add_controller(rotation_gesture.clone()); + rotation_gesture + .connect_begin(glib::clone!(@weak obj => move |_,_|obj.cancel_deceleration())); + rotation_gesture.connect_angle_changed( glib::clone!(@weak obj => move |gesture, _, _| { let angle = gesture.angle_delta().to_degrees(); @@ -499,6 +503,7 @@ mod imp { obj.add_controller(zoom_gesture.clone()); zoom_gesture.connect_begin(glib::clone!(@weak obj => move |gesture, _| { + obj.cancel_deceleration(); obj.imp() .zoom_gesture_center .set(gesture.bounding_box_center()); @@ -1598,6 +1603,21 @@ impl LpImage { self.max_vadjustment_value() != 0. } + /// Cancel kinetic scrolling movements, needed for some gestures + /// + /// If deceleration is not canceled gestures become buggy. + fn cancel_deceleration(&self) { + if let Some(scrolled_window) = self + .parent() + .and_then(|x| x.downcast::().ok()) + { + scrolled_window.set_kinetic_scrolling(false); + scrolled_window.set_kinetic_scrolling(true); + } else { + log::error!("Could not find GtkScrolledWindow parent to cancel deceleration"); + } + } + pub fn widget_height(&self) -> f64 { self.height() as f64 }