diff --git a/komorebi-core/src/lib.rs b/komorebi-core/src/lib.rs index 28189c12..607b9c3a 100644 --- a/komorebi-core/src/lib.rs +++ b/komorebi-core/src/lib.rs @@ -52,6 +52,7 @@ pub enum SocketMessage { SendContainerToMonitorWorkspaceNumber(usize, usize), MoveWorkspaceToMonitorNumber(usize), Promote, + PromoteFocus, ToggleFloat, ToggleMonocle, ToggleMaximize, diff --git a/komorebi/src/process_command.rs b/komorebi/src/process_command.rs index ab7fdc35..3a25b32e 100644 --- a/komorebi/src/process_command.rs +++ b/komorebi/src/process_command.rs @@ -111,6 +111,7 @@ impl WindowManager { match message { SocketMessage::Promote => self.promote_container_to_front()?, + SocketMessage::PromoteFocus => self.promote_focus_to_front()?, SocketMessage::FocusWindow(direction) => { self.focus_container_in_direction(direction)?; } @@ -805,6 +806,7 @@ impl WindowManager { | SocketMessage::ToggleMonocle | SocketMessage::ToggleMaximize | SocketMessage::Promote + | SocketMessage::PromoteFocus | SocketMessage::Retile | SocketMessage::InvisibleBorders(_) | SocketMessage::WorkAreaOffset(_) diff --git a/komorebi/src/window_manager.rs b/komorebi/src/window_manager.rs index 4c7f1533..5c2d738b 100644 --- a/komorebi/src/window_manager.rs +++ b/komorebi/src/window_manager.rs @@ -1251,6 +1251,23 @@ impl WindowManager { self.update_focused_workspace(self.mouse_follows_focus) } + #[tracing::instrument(skip(self))] + pub fn promote_focus_to_front(&mut self) -> Result<()> { + self.handle_unmanaged_window_behaviour()?; + + tracing::info!("promoting focus"); + + let workspace = self.focused_workspace_mut()?; + let target_idx = match workspace.layout() { + Layout::Default(_) => 0, + Layout::Custom(custom) => custom + .first_container_idx(custom.primary_idx().map_or(0, |primary_idx| primary_idx)), + }; + + workspace.focus_container(target_idx); + self.update_focused_workspace(self.mouse_follows_focus) + } + #[tracing::instrument(skip(self))] pub fn remove_window_from_container(&mut self) -> Result<()> { self.handle_unmanaged_window_behaviour()?; diff --git a/komorebic.lib.ahk b/komorebic.lib.ahk index 044ac4d3..3fe7b13f 100644 --- a/komorebic.lib.ahk +++ b/komorebic.lib.ahk @@ -164,6 +164,10 @@ Promote() { Run, komorebic.exe promote, , Hide } +PromoteFocus() { + Run, komorebic.exe promote-focus, , Hide +} + Retile() { Run, komorebic.exe retile, , Hide } diff --git a/komorebic/src/main.rs b/komorebic/src/main.rs index a89a3888..351ed30d 100644 --- a/komorebic/src/main.rs +++ b/komorebic/src/main.rs @@ -594,6 +594,8 @@ enum SubCommand { FlipLayout(FlipLayout), /// Promote the focused window to the top of the tree Promote, + /// Promote the user focus to the top of the tree + PromoteFocus, /// Force the retiling of all managed windows Retile, /// Create at least this many workspaces for the specified monitor @@ -769,6 +771,9 @@ fn main() -> Result<()> { SubCommand::Promote => { send_message(&SocketMessage::Promote.as_bytes()?)?; } + SubCommand::PromoteFocus => { + send_message(&SocketMessage::PromoteFocus.as_bytes()?)?; + } SubCommand::TogglePause => { send_message(&SocketMessage::TogglePause.as_bytes()?)?; }