From 5ee827ecaf89a16f8a3e7ae626682b9db871ea62 Mon Sep 17 00:00:00 2001 From: James Tucker Date: Sun, 25 Feb 2024 11:33:23 -0800 Subject: [PATCH] fix(komorebi): account for border offset and width in layout The layout should leave the space configured for the border, so that the border always stays within the workspace bounds. Border offset is cleaned up, as it is no longer a rect, but instead just a fixed value. The rect function for adjusting padding now takes a concrete value, as the optional has no local meaning to the operation, being equivalent to the default value. A margin function is added to centralize the notion of increasing the size of a rect by the given margin, the opposite of the padding operation. --- komorebi-core/src/arrangement.rs | 4 ++-- komorebi-core/src/rect.rs | 21 ++++++++++++++------- komorebi/src/border.rs | 15 ++------------- komorebi/src/lib.rs | 3 +-- komorebi/src/process_command.rs | 12 +----------- komorebi/src/static_config.rs | 21 ++------------------- komorebi/src/workspace.rs | 23 ++++++++++++++++++++--- 7 files changed, 42 insertions(+), 57 deletions(-) diff --git a/komorebi-core/src/arrangement.rs b/komorebi-core/src/arrangement.rs index 0383f88f..b8f19749 100644 --- a/komorebi-core/src/arrangement.rs +++ b/komorebi-core/src/arrangement.rs @@ -189,7 +189,7 @@ impl Arrangement for DefaultLayout { dimensions .iter_mut() - .for_each(|l| l.add_padding(container_padding)); + .for_each(|l| l.add_padding(container_padding.unwrap_or_default())); dimensions } @@ -312,7 +312,7 @@ impl Arrangement for CustomLayout { dimensions .iter_mut() - .for_each(|l| l.add_padding(container_padding)); + .for_each(|l| l.add_padding(container_padding.unwrap_or_default())); dimensions } diff --git a/komorebi-core/src/rect.rs b/komorebi-core/src/rect.rs index 5248ab86..811aaef9 100644 --- a/komorebi-core/src/rect.rs +++ b/komorebi-core/src/rect.rs @@ -27,13 +27,20 @@ impl From for Rect { } impl Rect { - pub fn add_padding(&mut self, padding: Option) { - if let Some(padding) = padding { - self.left += padding; - self.top += padding; - self.right -= padding * 2; - self.bottom -= padding * 2; - } + /// decrease the size of self by the padding amount. + pub fn add_padding(&mut self, padding: i32) { + self.left += padding; + self.top += padding; + self.right -= padding * 2; + self.bottom -= padding * 2; + } + + /// increase the size of self by the margin amount. + pub fn add_margin(&mut self, margin: i32) { + self.left -= margin; + self.top -= margin; + self.right += margin * 2; + self.bottom += margin * 2; } #[must_use] diff --git a/komorebi/src/border.rs b/komorebi/src/border.rs index 36ee4eba..763ba50f 100644 --- a/komorebi/src/border.rs +++ b/komorebi/src/border.rs @@ -99,21 +99,10 @@ impl Border { } let mut rect = WindowsApi::window_rect(window.hwnd())?; - - let border_offset = BORDER_OFFSET.lock(); - if let Some(border_offset) = *border_offset { - rect.left -= border_offset.left; - rect.top -= border_offset.top; - rect.right += border_offset.right; - rect.bottom += border_offset.bottom; - } + rect.add_padding(-BORDER_OFFSET.load(Ordering::SeqCst)); let border_width = BORDER_WIDTH.load(Ordering::SeqCst); - - rect.left -= border_width; - rect.top -= border_width; - rect.right += border_width * 2; - rect.bottom += border_width * 2; + rect.add_margin(border_width); *BORDER_RECT.lock() = rect; diff --git a/komorebi/src/lib.rs b/komorebi/src/lib.rs index f32816be..039fb135 100644 --- a/komorebi/src/lib.rs +++ b/komorebi/src/lib.rs @@ -192,8 +192,7 @@ lazy_static! { static ref BORDER_RECT: Arc> = Arc::new(Mutex::new(Rect::default())); - static ref BORDER_OFFSET: Arc>> = - Arc::new(Mutex::new(None)); + static ref BORDER_OFFSET: AtomicI32 = Default::default(); // Use app-specific titlebar removal options where possible // eg. Windows Terminal, IntelliJ IDEA, Firefox diff --git a/komorebi/src/process_command.rs b/komorebi/src/process_command.rs index 5d901296..03a0d5c0 100644 --- a/komorebi/src/process_command.rs +++ b/komorebi/src/process_command.rs @@ -1249,17 +1249,7 @@ impl WindowManager { WindowsApi::invalidate_border_rect()?; } SocketMessage::ActiveWindowBorderOffset(offset) => { - let mut current_border_offset = BORDER_OFFSET.lock(); - - let new_border_offset = Rect { - left: offset, - top: offset, - right: offset * 2, - bottom: offset * 2, - }; - - *current_border_offset = Option::from(new_border_offset); - + BORDER_OFFSET.store(offset, Ordering::SeqCst); WindowsApi::invalidate_border_rect()?; } SocketMessage::AltFocusHack(enable) => { diff --git a/komorebi/src/static_config.rs b/komorebi/src/static_config.rs index bb563e66..b584d615 100644 --- a/komorebi/src/static_config.rs +++ b/komorebi/src/static_config.rs @@ -378,9 +378,7 @@ impl From<&WindowManager> for StaticConfig { mouse_follows_focus: Option::from(value.mouse_follows_focus), app_specific_configuration_path: None, active_window_border_width: Option::from(BORDER_WIDTH.load(Ordering::SeqCst)), - active_window_border_offset: BORDER_OFFSET - .lock() - .map_or(None, |offset| Option::from(offset.left)), + active_window_border_offset: Option::from(BORDER_OFFSET.load(Ordering::SeqCst)), active_window_border: Option::from(BORDER_ENABLED.load(Ordering::SeqCst)), active_window_border_colours: border_colours, default_workspace_padding: Option::from( @@ -439,23 +437,8 @@ impl StaticConfig { BORDER_WIDTH.store(width, Ordering::SeqCst); }, ); - self.active_window_border_offset.map_or_else( - || { - let mut border_offset = BORDER_OFFSET.lock(); - *border_offset = None; - }, - |offset| { - let new_border_offset = Rect { - left: offset, - top: offset, - right: offset * 2, - bottom: offset * 2, - }; - let mut border_offset = BORDER_OFFSET.lock(); - *border_offset = Some(new_border_offset); - }, - ); + BORDER_OFFSET.store(self.active_window_border_offset.unwrap_or_default(), Ordering::SeqCst); if let Some(colours) = &self.active_window_border_colours { BORDER_COLOUR_SINGLE.store(u32::from(colours.single), Ordering::SeqCst); diff --git a/komorebi/src/workspace.rs b/komorebi/src/workspace.rs index 6449042b..ab7ed74d 100644 --- a/komorebi/src/workspace.rs +++ b/komorebi/src/workspace.rs @@ -26,6 +26,8 @@ use crate::static_config::WorkspaceConfig; use crate::window::Window; use crate::window::WindowDetails; use crate::windows_api::WindowsApi; +use crate::BORDER_OFFSET; +use crate::BORDER_WIDTH; use crate::DEFAULT_CONTAINER_PADDING; use crate::DEFAULT_WORKSPACE_PADDING; use crate::INITIAL_CONFIGURATION_LOADED; @@ -224,7 +226,7 @@ impl Workspace { }, ); - adjusted_work_area.add_padding(self.workspace_padding()); + adjusted_work_area.add_padding(self.workspace_padding().unwrap_or_default()); self.enforce_resize_constraints(); @@ -251,7 +253,13 @@ impl Workspace { if *self.tile() { if let Some(container) = self.monocle_container_mut() { if let Some(window) = container.focused_window_mut() { - adjusted_work_area.add_padding(container_padding); + adjusted_work_area.add_padding(container_padding.unwrap_or_default()); + { + let border_offset = BORDER_OFFSET.load(Ordering::SeqCst); + adjusted_work_area.add_padding(border_offset); + let width = BORDER_WIDTH.load(Ordering::SeqCst); + adjusted_work_area.add_padding(width); + } window.set_position(&adjusted_work_area, true)?; }; } else if let Some(window) = self.maximized_window_mut() { @@ -287,7 +295,16 @@ impl Workspace { WindowsApi::restore_window(window.hwnd()); } - window.set_position(layout, false)?; + let mut rect = *layout; + { + let border_offset = BORDER_OFFSET.load(Ordering::SeqCst); + rect.add_padding(border_offset); + + let width = BORDER_WIDTH.load(Ordering::SeqCst); + rect.add_padding(width); + } + + window.set_position(&rect, false)?; } }