From e14235c3a945433db2f383e998653c822b70dd47 Mon Sep 17 00:00:00 2001 From: LGUG2Z Date: Sun, 12 May 2024 12:40:34 -0700 Subject: [PATCH] perf(wm): ignore same-workspace switch requests This commit ensures that if a user uses index-based commands to switch workspaces, workspace layout update code paths will not be run if the user is already on the desired monitor and workspace indices. resolve #647 --- komorebi/src/process_command.rs | 15 ++++++++++++--- komorebi/src/window_manager.rs | 7 +++++++ 2 files changed, 19 insertions(+), 3 deletions(-) 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"))?