aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-01-29 13:45:29 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-01-29 13:56:26 +0300
commit1d3820a064f1f3b686eb6e8a1aab155681a96457 (patch)
tree1e2d5a51bc3db5aadfed04444ea5a60b8051c5cf /src
parent1c749f578c44daa044bce30c2d3f22eb45970e4b (diff)
downloadniri-1d3820a064f1f3b686eb6e8a1aab155681a96457.tar.gz
niri-1d3820a064f1f3b686eb6e8a1aab155681a96457.tar.bz2
niri-1d3820a064f1f3b686eb6e8a1aab155681a96457.zip
layout: Do not update original output for named workspaces upon adding windows
The way named workspaces are generally used makes them more "attached" to their original output. For example, you have a two-monitor setup with named workspaces on both. When you disconnect the monitor to go somewhere and work for a while, then return, you probably want your named workspaces to return to where they were on your second monitor. This is in contrast to unnamed workspaces which are more transient and should more easily follow you wherever you're working.
Diffstat (limited to 'src')
-rw-r--r--src/layout/mod.rs30
-rw-r--r--src/layout/monitor.rs12
2 files changed, 39 insertions, 3 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs
index 17c97592..264bb298 100644
--- a/src/layout/mod.rs
+++ b/src/layout/mod.rs
@@ -6074,6 +6074,36 @@ mod tests {
}
#[test]
+ fn named_workspaces_dont_update_original_output_on_adding_window() {
+ let ops = [
+ Op::AddOutput(1),
+ Op::SetWorkspaceName {
+ new_ws_name: 1,
+ ws_name: None,
+ },
+ Op::AddOutput(2),
+ Op::RemoveOutput(1),
+ Op::FocusWorkspaceUp,
+ // Adding a window updates the original output for unnamed workspaces.
+ Op::AddWindow {
+ params: TestWindowParams::new(1),
+ },
+ // Connecting the previous output should move the named workspace back since its
+ // original output wasn't updated.
+ Op::AddOutput(1),
+ ];
+
+ let layout = check_ops(&ops);
+ let (mon, _, ws) = layout
+ .workspaces()
+ .find(|(_, _, ws)| ws.name().is_some())
+ .unwrap();
+ assert!(ws.name().is_some()); // Sanity check.
+ let mon = mon.unwrap();
+ assert_eq!(mon.output_name(), "output1");
+ }
+
+ #[test]
fn workspaces_update_original_output_on_moving_to_same_output() {
let ops = [
Op::AddOutput(1),
diff --git a/src/layout/monitor.rs b/src/layout/monitor.rs
index 3eaac97f..310121b5 100644
--- a/src/layout/monitor.rs
+++ b/src/layout/monitor.rs
@@ -259,7 +259,9 @@ impl<W: LayoutElement> Monitor<W> {
workspace.add_column(column, activate);
// After adding a new window, workspace becomes this output's own.
- workspace.original_output = OutputId::new(&self.output);
+ if workspace.name().is_none() {
+ workspace.original_output = OutputId::new(&self.output);
+ }
if workspace_idx == self.workspaces.len() - 1 {
self.add_workspace_bottom();
@@ -311,7 +313,9 @@ impl<W: LayoutElement> Monitor<W> {
workspace.add_tile(tile, target, activate, width, is_full_width, is_floating);
// After adding a new window, workspace becomes this output's own.
- workspace.original_output = OutputId::new(&self.output);
+ if workspace.name().is_none() {
+ workspace.original_output = OutputId::new(&self.output);
+ }
if workspace_idx == self.workspaces.len() - 1 {
// Insert a new empty workspace.
@@ -341,7 +345,9 @@ impl<W: LayoutElement> Monitor<W> {
workspace.add_tile_to_column(column_idx, tile_idx, tile, activate);
// After adding a new window, workspace becomes this output's own.
- workspace.original_output = OutputId::new(&self.output);
+ if workspace.name().is_none() {
+ workspace.original_output = OutputId::new(&self.output);
+ }
// Since we're adding window to an existing column, the workspace isn't empty, and
// therefore cannot be the last one, so we never need to insert a new empty workspace.