diff --git a/komorebi/src/process_command.rs b/komorebi/src/process_command.rs index f1b1bdcc..ca80b243 100644 --- a/komorebi/src/process_command.rs +++ b/komorebi/src/process_command.rs @@ -650,7 +650,9 @@ impl WindowManager { self.focus_monitor(monitor_idx)?; } - self.focus_workspace(workspace_idx)?; + if self.focused_workspace_idx().unwrap_or_default() != workspace_idx { + self.focus_workspace(workspace_idx)?; + } } SocketMessage::FocusWorkspaceNumbers(workspace_idx) => { // This is to ensure that even on an empty workspace on a secondary monitor, the @@ -672,8 +674,15 @@ impl WindowManager { self.focus_workspace(workspace_idx)?; } SocketMessage::FocusMonitorWorkspaceNumber(monitor_idx, workspace_idx) => { - self.focus_monitor(monitor_idx)?; - self.focus_workspace(workspace_idx)?; + let focused_monitor_idx = self.focused_monitor_idx(); + let focused_workspace_idx = self.focused_workspace_idx().unwrap_or_default(); + + let focused_pair = (focused_monitor_idx, focused_workspace_idx); + + if focused_pair != (monitor_idx, workspace_idx) { + self.focus_monitor(monitor_idx)?; + self.focus_workspace(workspace_idx)?; + } } SocketMessage::FocusNamedWorkspace(ref name) => { if let Some((monitor_idx, workspace_idx)) = diff --git a/komorebi/src/window_manager.rs b/komorebi/src/window_manager.rs index c45293bf..adc1d35b 100644 --- a/komorebi/src/window_manager.rs +++ b/komorebi/src/window_manager.rs @@ -2312,6 +2312,13 @@ impl WindowManager { None } + pub fn focused_workspace_idx(&self) -> Result { + Ok(self + .focused_monitor() + .ok_or_else(|| anyhow!("there is no monitor"))? + .focused_workspace_idx()) + } + pub fn focused_workspace(&self) -> Result<&Workspace> { self.focused_monitor() .ok_or_else(|| anyhow!("there is no monitor"))?