mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-01-11 14:40:25 +01:00
feat(wm): promote containers by swapping indices
This commit adds a new SocketMessage variant PromoteSwap and corresponding komorebic promote-swap command. PromoteSwap will also promote the focused window container to the largest tile in the layout, but instead of removing the focused container x from the Ring and inserting it into position 0, possibly changing the positions of other windows between 0 and x, the indices x and 0 in the Ring will be swapped directly.
This commit is contained in:
12
docs/cli/promote-swap.md
Normal file
12
docs/cli/promote-swap.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# promote-swap
|
||||||
|
|
||||||
|
```
|
||||||
|
Promote the focused window to the largest tile by swapping container indices with the largest tile
|
||||||
|
|
||||||
|
Usage: komorebic.exe promote-swap
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help
|
||||||
|
Print help
|
||||||
|
|
||||||
|
```
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# promote
|
# promote
|
||||||
|
|
||||||
```
|
```
|
||||||
Promote the focused window to the top of the tree
|
Promote the focused window to the largest tile via container removal and re-insertion
|
||||||
|
|
||||||
Usage: komorebic.exe promote
|
Usage: komorebic.exe promote
|
||||||
|
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ pub enum SocketMessage {
|
|||||||
Close,
|
Close,
|
||||||
Minimize,
|
Minimize,
|
||||||
Promote,
|
Promote,
|
||||||
|
PromoteSwap,
|
||||||
PromoteFocus,
|
PromoteFocus,
|
||||||
PromoteWindow(OperationDirection),
|
PromoteWindow(OperationDirection),
|
||||||
EagerFocus(String),
|
EagerFocus(String),
|
||||||
|
|||||||
@@ -213,6 +213,7 @@ impl WindowManager {
|
|||||||
let mut force_update_borders = false;
|
let mut force_update_borders = false;
|
||||||
match message {
|
match message {
|
||||||
SocketMessage::Promote => self.promote_container_to_front()?,
|
SocketMessage::Promote => self.promote_container_to_front()?,
|
||||||
|
SocketMessage::PromoteSwap => self.promote_container_swap()?,
|
||||||
SocketMessage::PromoteFocus => self.promote_focus_to_front()?,
|
SocketMessage::PromoteFocus => self.promote_focus_to_front()?,
|
||||||
SocketMessage::PromoteWindow(direction) => {
|
SocketMessage::PromoteWindow(direction) => {
|
||||||
self.focus_container_in_direction(direction)?;
|
self.focus_container_in_direction(direction)?;
|
||||||
|
|||||||
@@ -2892,6 +2892,31 @@ impl WindowManager {
|
|||||||
self.update_focused_workspace(self.mouse_follows_focus, true)
|
self.update_focused_workspace(self.mouse_follows_focus, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tracing::instrument(skip(self))]
|
||||||
|
pub fn promote_container_swap(&mut self) -> eyre::Result<()> {
|
||||||
|
self.handle_unmanaged_window_behaviour()?;
|
||||||
|
|
||||||
|
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(
|
||||||
|
layout
|
||||||
|
.primary_idx()
|
||||||
|
.ok_or_eyre("this custom layout does not have a primary column")?,
|
||||||
|
),
|
||||||
|
};
|
||||||
|
|
||||||
|
if matches!(workspace.layout, Layout::Default(DefaultLayout::Grid)) {
|
||||||
|
tracing::debug!("ignoring promote-swap command for grid layout");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
workspace.swap_containers(focused_container_idx, primary_idx);
|
||||||
|
|
||||||
|
self.update_focused_workspace(self.mouse_follows_focus, true)
|
||||||
|
}
|
||||||
|
|
||||||
#[tracing::instrument(skip(self))]
|
#[tracing::instrument(skip(self))]
|
||||||
pub fn promote_focus_to_front(&mut self) -> eyre::Result<()> {
|
pub fn promote_focus_to_front(&mut self) -> eyre::Result<()> {
|
||||||
self.handle_unmanaged_window_behaviour()?;
|
self.handle_unmanaged_window_behaviour()?;
|
||||||
|
|||||||
@@ -1267,8 +1267,10 @@ enum SubCommand {
|
|||||||
/// Flip the layout on the focused workspace
|
/// Flip the layout on the focused workspace
|
||||||
#[clap(arg_required_else_help = true)]
|
#[clap(arg_required_else_help = true)]
|
||||||
FlipLayout(FlipLayout),
|
FlipLayout(FlipLayout),
|
||||||
/// Promote the focused window to the top of the tree
|
/// Promote the focused window to the largest tile via container removal and re-insertion
|
||||||
Promote,
|
Promote,
|
||||||
|
/// Promote the focused window to the largest tile by swapping container indices with the largest tile
|
||||||
|
PromoteSwap,
|
||||||
/// Promote the user focus to the top of the tree
|
/// Promote the user focus to the top of the tree
|
||||||
PromoteFocus,
|
PromoteFocus,
|
||||||
/// Promote the window in the specified direction
|
/// Promote the window in the specified direction
|
||||||
@@ -2029,6 +2031,9 @@ fn main() -> eyre::Result<()> {
|
|||||||
SubCommand::Promote => {
|
SubCommand::Promote => {
|
||||||
send_message(&SocketMessage::Promote)?;
|
send_message(&SocketMessage::Promote)?;
|
||||||
}
|
}
|
||||||
|
SubCommand::PromoteSwap => {
|
||||||
|
send_message(&SocketMessage::PromoteSwap)?;
|
||||||
|
}
|
||||||
SubCommand::PromoteFocus => {
|
SubCommand::PromoteFocus => {
|
||||||
send_message(&SocketMessage::PromoteFocus)?;
|
send_message(&SocketMessage::PromoteFocus)?;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -172,6 +172,7 @@ nav:
|
|||||||
- cli/scrolling-layout-columns.md
|
- cli/scrolling-layout-columns.md
|
||||||
- cli/flip-layout.md
|
- cli/flip-layout.md
|
||||||
- cli/promote.md
|
- cli/promote.md
|
||||||
|
- cli/promote-swap.md
|
||||||
- cli/promote-focus.md
|
- cli/promote-focus.md
|
||||||
- cli/promote-window.md
|
- cli/promote-window.md
|
||||||
- cli/retile.md
|
- cli/retile.md
|
||||||
|
|||||||
Reference in New Issue
Block a user