aboutsummaryrefslogtreecommitdiff
path: root/src/layout/mod.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-12-23 18:29:58 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2024-12-30 20:12:37 +0300
commit96e493d8b1bcfdd62f608256f2fe1b90904d5798 (patch)
tree7b402b328466c0d594ddb2b79eb6d0dc213d493d /src/layout/mod.rs
parente409453fbd49a30e2059271b78567b430dc5800a (diff)
downloadniri-96e493d8b1bcfdd62f608256f2fe1b90904d5798.tar.gz
niri-96e493d8b1bcfdd62f608256f2fe1b90904d5798.tar.bz2
niri-96e493d8b1bcfdd62f608256f2fe1b90904d5798.zip
Restore floating size during interactive move
Diffstat (limited to 'src/layout/mod.rs')
-rw-r--r--src/layout/mod.rs17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs
index be5eadc1..74afa501 100644
--- a/src/layout/mod.rs
+++ b/src/layout/mod.rs
@@ -2717,6 +2717,23 @@ impl<W: LayoutElement> Layout<W> {
if let Some(InteractiveMoveState::Moving(move_)) = &mut self.interactive_move {
if window.is_none() || window == Some(move_.tile.window().id()) {
move_.is_floating = !move_.is_floating;
+
+ // When going to floating, restore the floating window size.
+ if move_.is_floating {
+ let floating_size = move_.tile.floating_window_size();
+ let win = move_.tile.window_mut();
+ let mut size = floating_size.unwrap_or_else(|| win.expected_size());
+ // Make sure fixed-size through window rules keeps working.
+ let min_size = win.min_size();
+ let max_size = win.max_size();
+ if min_size.w != 0 && min_size.w == max_size.w {
+ size.w = min_size.w;
+ }
+ if min_size.h != 0 && min_size.h == max_size.h {
+ size.h = min_size.h;
+ }
+ win.request_size_once(size, true);
+ }
return;
}
}