diff --git a/komorebi-core/src/lib.rs b/komorebi-core/src/lib.rs index 627097e8..281405a5 100644 --- a/komorebi-core/src/lib.rs +++ b/komorebi-core/src/lib.rs @@ -232,7 +232,16 @@ pub enum BorderStyle { } #[derive( - Copy, Clone, Debug, Serialize, Deserialize, Display, EnumString, ValueEnum, JsonSchema, + Copy, + Clone, + Debug, + Serialize, + Deserialize, + Display, + EnumString, + ValueEnum, + JsonSchema, + PartialEq, )] pub enum WindowKind { Single, diff --git a/komorebi/src/border_manager/border.rs b/komorebi/src/border_manager/border.rs index 590caf97..b5e90752 100644 --- a/komorebi/src/border_manager/border.rs +++ b/komorebi/src/border_manager/border.rs @@ -119,7 +119,7 @@ impl Border { WindowsApi::close_window(self.hwnd()) } - pub fn update(&self, rect: &Rect) -> color_eyre::Result<()> { + pub fn update(&self, rect: &Rect, mut should_invalidate: bool) -> color_eyre::Result<()> { // Make adjustments to the border let mut rect = *rect; rect.add_margin(BORDER_WIDTH.load(Ordering::SeqCst)); @@ -128,10 +128,13 @@ impl Border { // Update the position of the border if required if !WindowsApi::window_rect(self.hwnd())?.eq(&rect) { WindowsApi::set_border_pos(self.hwnd(), &rect, HWND((Z_ORDER.load()).into()))?; + should_invalidate = true; } // Invalidate the rect to trigger the callback to update colours etc. - self.invalidate(); + if should_invalidate { + self.invalidate(); + } Ok(()) } diff --git a/komorebi/src/border_manager/mod.rs b/komorebi/src/border_manager/mod.rs index 4aa1ac82..02ccde42 100644 --- a/komorebi/src/border_manager/mod.rs +++ b/komorebi/src/border_manager/mod.rs @@ -236,7 +236,7 @@ pub fn handle_notifications(wm: Arc>) -> color_eyre::Result monocle.focused_window().copied().unwrap_or_default().hwnd(), )?; - border.update(&rect)?; + border.update(&rect, true)?; let border_hwnd = border.hwnd; let mut to_remove = vec![]; @@ -325,7 +325,7 @@ pub fn handle_notifications(wm: Arc>) -> color_eyre::Result if rect != new_rect { rect = new_rect; - border.update(&rect)?; + border.update(&rect, true)?; } } @@ -348,28 +348,35 @@ pub fn handle_notifications(wm: Arc>) -> color_eyre::Result borders_monitors.insert(c.id().clone(), monitor_idx); + #[allow(unused_assignments)] + let mut last_focus_state = None; + + let new_focus_state = if idx != ws.focused_container_idx() + || monitor_idx != focused_monitor_idx + { + WindowKind::Unfocused + } else if c.windows().len() > 1 { + WindowKind::Stack + } else { + WindowKind::Single + }; + // Update the focused state for all containers on this workspace { let mut focus_state = FOCUS_STATE.lock(); - focus_state.insert( - border.hwnd, - if idx != ws.focused_container_idx() - || monitor_idx != focused_monitor_idx - { - WindowKind::Unfocused - } else if c.windows().len() > 1 { - WindowKind::Stack - } else { - WindowKind::Single - }, - ); + last_focus_state = focus_state.insert(border.hwnd, new_focus_state); } let rect = WindowsApi::window_rect( c.focused_window().copied().unwrap_or_default().hwnd(), )?; - border.update(&rect)?; + let should_invalidate = match last_focus_state { + None => true, + Some(last_focus_state) => last_focus_state != new_focus_state, + }; + + border.update(&rect, should_invalidate)?; } } }