diff --git a/komorebi/src/state.rs b/komorebi/src/state.rs index e14223a6..9e3b60d8 100644 --- a/komorebi/src/state.rs +++ b/komorebi/src/state.rs @@ -273,6 +273,7 @@ impl From<&WindowManager> for State { wallpaper: workspace.wallpaper.clone(), workspace_config: None, preselected_container_idx: None, + promotion_swap_container_idx: None, }) .collect::>(); ws.focus(monitor.workspaces.focused_idx()); diff --git a/komorebi/src/window_manager.rs b/komorebi/src/window_manager.rs index 50749139..abd7228c 100644 --- a/komorebi/src/window_manager.rs +++ b/komorebi/src/window_manager.rs @@ -2898,6 +2898,7 @@ impl WindowManager { let workspace = self.focused_workspace_mut()?; let focused_container_idx = workspace.focused_container_idx(); + let primary_idx = match &workspace.layout { Layout::Default(_) => 0, Layout::Custom(layout) => layout.first_container_idx( @@ -2912,7 +2913,14 @@ impl WindowManager { return Ok(()); } - workspace.swap_containers(focused_container_idx, primary_idx); + let primary_tile_is_focused = focused_container_idx == primary_idx; + + if primary_tile_is_focused && let Some(swap_idx) = workspace.promotion_swap_container_idx { + workspace.swap_containers(focused_container_idx, swap_idx); + } else { + workspace.promotion_swap_container_idx = Some(focused_container_idx); + workspace.swap_containers(focused_container_idx, primary_idx); + } self.update_focused_workspace(self.mouse_follows_focus, true) } diff --git a/komorebi/src/workspace.rs b/komorebi/src/workspace.rs index 525f401d..21b7fd47 100644 --- a/komorebi/src/workspace.rs +++ b/komorebi/src/workspace.rs @@ -80,6 +80,8 @@ pub struct Workspace { pub workspace_config: Option, #[serde(skip_serializing_if = "Option::is_none")] pub preselected_container_idx: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub promotion_swap_container_idx: Option, } #[derive(Debug, Default, Copy, Clone, Serialize, Deserialize, PartialEq, Eq)] @@ -132,6 +134,7 @@ impl Default for Workspace { workspace_config: None, wallpaper: None, preselected_container_idx: None, + promotion_swap_container_idx: None, } } }