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)?; } }