From f2b1fc66f21f720ba85a4c218546298e527ba8b9 Mon Sep 17 00:00:00 2001 From: Ivan Molodetskikh Date: Sun, 16 Feb 2025 08:46:38 +0300 Subject: Make DnD edge view scroll configurable --- src/layout/mod.rs | 3 +++ src/layout/scrolling.rs | 7 +++++-- src/layout/workspace.rs | 22 ++++++++++++++++------ 3 files changed, 24 insertions(+), 8 deletions(-) (limited to 'src/layout') diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 248a5c4f..1f99f9d1 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -328,6 +328,7 @@ pub struct Options { /// Window height that `toggle_window_height()` switches between. pub preset_window_heights: Vec, pub animations: niri_config::Animations, + pub gestures: niri_config::Gestures, // Debug flags. pub disable_resize_throttling: bool, pub disable_transactions: bool, @@ -354,6 +355,7 @@ impl Default for Options { ], default_column_width: None, animations: Default::default(), + gestures: Default::default(), disable_resize_throttling: false, disable_transactions: false, preset_window_heights: vec![ @@ -582,6 +584,7 @@ impl Options { preset_column_widths, default_column_width, animations: config.animations.clone(), + gestures: config.gestures, disable_resize_throttling: config.debug.disable_resize_throttling, disable_transactions: config.debug.disable_transactions, preset_window_heights, diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs index d559c281..926cfd76 100644 --- a/src/layout/scrolling.rs +++ b/src/layout/scrolling.rs @@ -2806,6 +2806,8 @@ impl ScrollingSpace { return; }; + let config = &self.options.gestures.dnd_edge_view_scroll; + let now = self.clock.now_unadjusted(); gesture.dnd_last_event_time = Some(now); @@ -2819,13 +2821,14 @@ impl ScrollingSpace { // Delay starting the gesture a bit to avoid unwanted movement when dragging across // monitors. - if now.saturating_sub(nonzero_start) < Duration::from_millis(50) { + let delay = Duration::from_millis(u64::from(config.delay_ms)); + if now.saturating_sub(nonzero_start) < delay { return; } let time_delta = now.saturating_sub(last_time).as_secs_f64(); - let delta = delta * time_delta * 50.; + let delta = delta * time_delta * config.max_speed.0; gesture.tracker.push(delta, now); diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs index 37e6aa99..54926a1f 100644 --- a/src/layout/workspace.rs +++ b/src/layout/workspace.rs @@ -1614,22 +1614,32 @@ impl Workspace { } pub fn dnd_scroll_gesture_scroll(&mut self, pos: Point) { - // Taken from GTK 4. - const SCROLL_EDGE_SIZE: f64 = 30.; + let config = &self.options.gestures.dnd_edge_view_scroll; + let trigger_width = config.trigger_width.0; // This working area intentionally does not include extra struts from Options. let x = pos.x - self.working_area.loc.x; let width = self.working_area.size.w; + let x = x.clamp(0., width); + let trigger_width = trigger_width.clamp(0., width / 2.); - let delta = if x < SCROLL_EDGE_SIZE { - -(SCROLL_EDGE_SIZE - x) - } else if width - x < SCROLL_EDGE_SIZE { - SCROLL_EDGE_SIZE - (width - x) + let delta = if x < trigger_width { + -(trigger_width - x) + } else if width - x < trigger_width { + trigger_width - (width - x) } else { 0. }; + let delta = if trigger_width < 0.01 { + // Sanity check for trigger-width 0 or small window sizes. + 0. + } else { + // Normalize to [0, 1]. + delta / trigger_width + }; + self.scrolling.dnd_scroll_gesture_scroll(delta); } -- cgit