aboutsummaryrefslogtreecommitdiff
path: root/src/layout
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-02-18 18:56:09 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-02-18 19:06:40 +0300
commitdca187de37164df2584f7388cd0bb6429337a580 (patch)
tree2599407cbd167ce4e643f4ec3cf6ce9c0872ed67 /src/layout
parentfe660a253b445163ff243d7eab842d40937a6bd1 (diff)
downloadniri-dca187de37164df2584f7388cd0bb6429337a580.tar.gz
niri-dca187de37164df2584f7388cd0bb6429337a580.tar.bz2
niri-dca187de37164df2584f7388cd0bb6429337a580.zip
Don't snap after DnD scroll if view position didn't change
Otherwise, any DnD breaks temporarily centered columns.
Diffstat (limited to 'src/layout')
-rw-r--r--src/layout/mod.rs10
-rw-r--r--src/layout/scrolling.rs20
-rw-r--r--src/layout/workspace.rs4
3 files changed, 29 insertions, 5 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs
index b46f5e3c..dfb0565b 100644
--- a/src/layout/mod.rs
+++ b/src/layout/mod.rs
@@ -1105,7 +1105,7 @@ impl<W: LayoutElement> Layout<W> {
// Unlock the view on the workspaces.
for ws in self.workspaces_mut() {
- ws.view_offset_gesture_end(false, None);
+ ws.dnd_scroll_gesture_end();
}
return Some(RemovedTile {
@@ -3853,7 +3853,7 @@ impl<W: LayoutElement> Layout<W> {
let moved_tile_was_active =
ws.active_window().is_some_and(|win| *win.id() == window_id);
- ws.view_offset_gesture_end(false, None);
+ ws.dnd_scroll_gesture_end();
if moved_tile_was_active {
ws.activate_window(&window_id);
@@ -3876,7 +3876,7 @@ impl<W: LayoutElement> Layout<W> {
// Unlock the view on the workspaces.
if !move_.is_floating {
for ws in self.workspaces_mut() {
- ws.view_offset_gesture_end(false, None);
+ ws.dnd_scroll_gesture_end();
}
}
@@ -4050,7 +4050,7 @@ impl<W: LayoutElement> Layout<W> {
self.dnd = None;
for ws in self.workspaces_mut() {
- ws.view_offset_gesture_end(false, None);
+ ws.dnd_scroll_gesture_end();
}
}
@@ -4459,7 +4459,7 @@ impl<W: LayoutElement> Layout<W> {
if is_scrolling {
ws.dnd_scroll_gesture_begin();
} else {
- ws.view_offset_gesture_end(false, None);
+ ws.dnd_scroll_gesture_end();
}
} else {
// Cancel the view offset gesture after workspace switches, moves, etc.
diff --git a/src/layout/scrolling.rs b/src/layout/scrolling.rs
index f1819a08..8a86f7bf 100644
--- a/src/layout/scrolling.rs
+++ b/src/layout/scrolling.rs
@@ -3232,6 +3232,26 @@ impl<W: LayoutElement> ScrollingSpace<W> {
true
}
+ pub fn dnd_scroll_gesture_end(&mut self) {
+ let ViewOffset::Gesture(gesture) = &mut self.view_offset else {
+ return;
+ };
+
+ if gesture.dnd_last_event_time.is_some() && gesture.tracker.pos() == 0. {
+ // DnD didn't scroll anything, so preserve the current view position (rather than
+ // snapping the window).
+ self.view_offset = ViewOffset::Static(gesture.delta_from_tracker);
+
+ if !self.columns.is_empty() {
+ // Just in case, make sure the active window remains on screen.
+ self.animate_view_offset_to_column(None, self.active_column_idx, None);
+ }
+ return;
+ }
+
+ self.view_offset_gesture_end(false, None);
+ }
+
pub fn interactive_resize_begin(&mut self, window: W::Id, edges: ResizeEdge) -> bool {
if self.interactive_resize.is_some() {
return false;
diff --git a/src/layout/workspace.rs b/src/layout/workspace.rs
index 15f6b9b0..226c4411 100644
--- a/src/layout/workspace.rs
+++ b/src/layout/workspace.rs
@@ -1650,6 +1650,10 @@ impl<W: LayoutElement> Workspace<W> {
self.scrolling.dnd_scroll_gesture_scroll(delta);
}
+ pub fn dnd_scroll_gesture_end(&mut self) {
+ self.scrolling.dnd_scroll_gesture_end();
+ }
+
pub fn interactive_resize_begin(&mut self, window: W::Id, edges: ResizeEdge) -> bool {
if self.floating.has_window(&window) {
self.floating.interactive_resize_begin(window, edges)