mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-07-11 15:42:43 +02:00
perf(borders): reduce mutex usage in hot path
This commit is contained in:
@@ -4,7 +4,6 @@ use crate::border_manager::BORDER_WIDTH;
|
|||||||
use crate::border_manager::FOCUSED;
|
use crate::border_manager::FOCUSED;
|
||||||
use crate::border_manager::FOCUS_STATE;
|
use crate::border_manager::FOCUS_STATE;
|
||||||
use crate::border_manager::MONOCLE;
|
use crate::border_manager::MONOCLE;
|
||||||
use crate::border_manager::RECT_STATE;
|
|
||||||
use crate::border_manager::STACK;
|
use crate::border_manager::STACK;
|
||||||
use crate::border_manager::STYLE;
|
use crate::border_manager::STYLE;
|
||||||
use crate::border_manager::UNFOCUSED;
|
use crate::border_manager::UNFOCUSED;
|
||||||
@@ -127,15 +126,9 @@ impl Border {
|
|||||||
rect.add_margin(BORDER_WIDTH.load(Ordering::SeqCst));
|
rect.add_margin(BORDER_WIDTH.load(Ordering::SeqCst));
|
||||||
rect.add_padding(-BORDER_OFFSET.load(Ordering::SeqCst));
|
rect.add_padding(-BORDER_OFFSET.load(Ordering::SeqCst));
|
||||||
|
|
||||||
// Store the border rect so that it can be used by the callback
|
|
||||||
{
|
|
||||||
let mut rects = RECT_STATE.lock();
|
|
||||||
rects.insert(self.hwnd, rect);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the position of the border if required
|
// Update the position of the border if required
|
||||||
if !WindowsApi::window_rect(self.hwnd())?.eq(&rect) {
|
if !WindowsApi::window_rect(self.hwnd())?.eq(&rect) {
|
||||||
WindowsApi::set_border_pos(self.hwnd(), &rect, HWND((*Z_ORDER.lock()).into()))?;
|
WindowsApi::set_border_pos(self.hwnd(), &rect, HWND((Z_ORDER.load()).into()))?;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invalidate the rect to trigger the callback to update colours etc.
|
// Invalidate the rect to trigger the callback to update colours etc.
|
||||||
@@ -157,10 +150,8 @@ impl Border {
|
|||||||
unsafe {
|
unsafe {
|
||||||
match message {
|
match message {
|
||||||
WM_PAINT => {
|
WM_PAINT => {
|
||||||
let rects = RECT_STATE.lock();
|
// With the rect that we set in Self::update
|
||||||
|
if let Ok(rect) = WindowsApi::window_rect(window) {
|
||||||
// With the rect that we stored in Self::update
|
|
||||||
if let Some(rect) = rects.get(&window.0).copied() {
|
|
||||||
// Grab the focus kind for this border
|
// Grab the focus kind for this border
|
||||||
let focus_kind = {
|
let focus_kind = {
|
||||||
FOCUS_STATE
|
FOCUS_STATE
|
||||||
@@ -195,7 +186,7 @@ impl Border {
|
|||||||
// the window was made with DWMWCP_ROUNDSMALL then this is the
|
// the window was made with DWMWCP_ROUNDSMALL then this is the
|
||||||
// wrong size. In the future we should read the DWM properties
|
// wrong size. In the future we should read the DWM properties
|
||||||
// of windows and attempt to match appropriately.
|
// of windows and attempt to match appropriately.
|
||||||
match *STYLE.lock() {
|
match STYLE.load() {
|
||||||
BorderStyle::System => {
|
BorderStyle::System => {
|
||||||
if *WINDOWS_11 {
|
if *WINDOWS_11 {
|
||||||
RoundRect(hdc, 0, 0, rect.right, rect.bottom, 20, 20);
|
RoundRect(hdc, 0, 0, rect.right, rect.bottom, 20, 20);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ mod border;
|
|||||||
|
|
||||||
use crossbeam_channel::Receiver;
|
use crossbeam_channel::Receiver;
|
||||||
use crossbeam_channel::Sender;
|
use crossbeam_channel::Sender;
|
||||||
|
use crossbeam_utils::atomic::AtomicCell;
|
||||||
use crossbeam_utils::atomic::AtomicConsume;
|
use crossbeam_utils::atomic::AtomicConsume;
|
||||||
use komorebi_core::BorderStyle;
|
use komorebi_core::BorderStyle;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
@@ -22,7 +23,6 @@ use windows::Win32::Foundation::HWND;
|
|||||||
|
|
||||||
use crate::workspace_reconciliator::ALT_TAB_HWND;
|
use crate::workspace_reconciliator::ALT_TAB_HWND;
|
||||||
use crate::Colour;
|
use crate::Colour;
|
||||||
use crate::Rect;
|
|
||||||
use crate::Rgb;
|
use crate::Rgb;
|
||||||
use crate::WindowManager;
|
use crate::WindowManager;
|
||||||
use crate::WindowsApi;
|
use crate::WindowsApi;
|
||||||
@@ -36,8 +36,8 @@ pub static BORDER_OFFSET: AtomicI32 = AtomicI32::new(-1);
|
|||||||
pub static BORDER_ENABLED: AtomicBool = AtomicBool::new(true);
|
pub static BORDER_ENABLED: AtomicBool = AtomicBool::new(true);
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
pub static ref Z_ORDER: Arc<Mutex<ZOrder>> = Arc::new(Mutex::new(ZOrder::Bottom));
|
pub static ref Z_ORDER: AtomicCell<ZOrder> = AtomicCell::new(ZOrder::Bottom);
|
||||||
pub static ref STYLE: Arc<Mutex<BorderStyle>> = Arc::new(Mutex::new(BorderStyle::System));
|
pub static ref STYLE: AtomicCell<BorderStyle> = AtomicCell::new(BorderStyle::System);
|
||||||
pub static ref FOCUSED: AtomicU32 =
|
pub static ref FOCUSED: AtomicU32 =
|
||||||
AtomicU32::new(u32::from(Colour::Rgb(Rgb::new(66, 165, 245))));
|
AtomicU32::new(u32::from(Colour::Rgb(Rgb::new(66, 165, 245))));
|
||||||
pub static ref UNFOCUSED: AtomicU32 =
|
pub static ref UNFOCUSED: AtomicU32 =
|
||||||
@@ -50,7 +50,6 @@ lazy_static! {
|
|||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref BORDERS_MONITORS: Mutex<HashMap<String, usize>> = Mutex::new(HashMap::new());
|
static ref BORDERS_MONITORS: Mutex<HashMap<String, usize>> = Mutex::new(HashMap::new());
|
||||||
static ref BORDER_STATE: Mutex<HashMap<String, Border>> = Mutex::new(HashMap::new());
|
static ref BORDER_STATE: Mutex<HashMap<String, Border>> = Mutex::new(HashMap::new());
|
||||||
static ref RECT_STATE: Mutex<HashMap<isize, Rect>> = Mutex::new(HashMap::new());
|
|
||||||
static ref FOCUS_STATE: Mutex<HashMap<isize, WindowKind>> = Mutex::new(HashMap::new());
|
static ref FOCUS_STATE: Mutex<HashMap<isize, WindowKind>> = Mutex::new(HashMap::new());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,7 +81,6 @@ pub fn destroy_all_borders() -> color_eyre::Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
borders.clear();
|
borders.clear();
|
||||||
RECT_STATE.lock().clear();
|
|
||||||
BORDERS_MONITORS.lock().clear();
|
BORDERS_MONITORS.lock().clear();
|
||||||
FOCUS_STATE.lock().clear();
|
FOCUS_STATE.lock().clear();
|
||||||
|
|
||||||
@@ -132,7 +130,7 @@ pub fn handle_notifications(wm: Arc<Mutex<WindowManager>>) -> color_eyre::Result
|
|||||||
let is_paused = state.is_paused;
|
let is_paused = state.is_paused;
|
||||||
let focused_monitor_idx = state.focused_monitor_idx();
|
let focused_monitor_idx = state.focused_monitor_idx();
|
||||||
let monitors = state.monitors.elements().clone();
|
let monitors = state.monitors.elements().clone();
|
||||||
let pending_move_op = state.pending_move_op.clone();
|
let pending_move_op = state.pending_move_op;
|
||||||
drop(state);
|
drop(state);
|
||||||
|
|
||||||
// If borders are disabled
|
// If borders are disabled
|
||||||
@@ -266,8 +264,8 @@ pub fn handle_notifications(wm: Arc<Mutex<WindowManager>>) -> color_eyre::Result
|
|||||||
for (idx, c) in ws.containers().iter().enumerate() {
|
for (idx, c) in ws.containers().iter().enumerate() {
|
||||||
// Update border when moving or resizing with mouse
|
// Update border when moving or resizing with mouse
|
||||||
if pending_move_op.is_some() && idx == ws.focused_container_idx() {
|
if pending_move_op.is_some() && idx == ws.focused_container_idx() {
|
||||||
let restore_z_order = *Z_ORDER.lock();
|
let restore_z_order = Z_ORDER.load();
|
||||||
*Z_ORDER.lock() = ZOrder::TopMost;
|
Z_ORDER.store(ZOrder::TopMost);
|
||||||
|
|
||||||
let mut rect = WindowsApi::window_rect(
|
let mut rect = WindowsApi::window_rect(
|
||||||
c.focused_window().copied().unwrap_or_default().hwnd(),
|
c.focused_window().copied().unwrap_or_default().hwnd(),
|
||||||
@@ -295,7 +293,7 @@ pub fn handle_notifications(wm: Arc<Mutex<WindowManager>>) -> color_eyre::Result
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*Z_ORDER.lock() = restore_z_order;
|
Z_ORDER.store(restore_z_order);
|
||||||
|
|
||||||
continue 'monitors;
|
continue 'monitors;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1256,8 +1256,7 @@ impl WindowManager {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
SocketMessage::BorderStyle(style) => {
|
SocketMessage::BorderStyle(style) => {
|
||||||
let mut border_style = STYLE.lock();
|
STYLE.store(style);
|
||||||
*border_style = style;
|
|
||||||
}
|
}
|
||||||
SocketMessage::BorderWidth(width) => {
|
SocketMessage::BorderWidth(width) => {
|
||||||
border_manager::BORDER_WIDTH.store(width, Ordering::SeqCst);
|
border_manager::BORDER_WIDTH.store(width, Ordering::SeqCst);
|
||||||
|
|||||||
@@ -198,7 +198,7 @@ impl Stackbar {
|
|||||||
bottom: height,
|
bottom: height,
|
||||||
};
|
};
|
||||||
|
|
||||||
match *STYLE.lock() {
|
match STYLE.load() {
|
||||||
BorderStyle::System => {
|
BorderStyle::System => {
|
||||||
if *WINDOWS_11 {
|
if *WINDOWS_11 {
|
||||||
RoundRect(hdc, rect.left, rect.top, rect.right, rect.bottom, 20, 20);
|
RoundRect(hdc, rect.left, rect.top, rect.right, rect.bottom, 20, 20);
|
||||||
|
|||||||
@@ -481,8 +481,8 @@ impl From<&WindowManager> for StaticConfig {
|
|||||||
transparency_alpha: Option::from(
|
transparency_alpha: Option::from(
|
||||||
transparency_manager::TRANSPARENCY_ALPHA.load(Ordering::SeqCst),
|
transparency_manager::TRANSPARENCY_ALPHA.load(Ordering::SeqCst),
|
||||||
),
|
),
|
||||||
border_style: Option::from(*STYLE.lock()),
|
border_style: Option::from(STYLE.load()),
|
||||||
border_z_order: Option::from(*Z_ORDER.lock()),
|
border_z_order: Option::from(Z_ORDER.load()),
|
||||||
default_workspace_padding: Option::from(
|
default_workspace_padding: Option::from(
|
||||||
DEFAULT_WORKSPACE_PADDING.load(Ordering::SeqCst),
|
DEFAULT_WORKSPACE_PADDING.load(Ordering::SeqCst),
|
||||||
),
|
),
|
||||||
@@ -556,8 +556,7 @@ impl StaticConfig {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let border_style = self.border_style.unwrap_or_default();
|
STYLE.store(self.border_style.unwrap_or_default());
|
||||||
*STYLE.lock() = border_style;
|
|
||||||
|
|
||||||
transparency_manager::TRANSPARENCY_ENABLED
|
transparency_manager::TRANSPARENCY_ENABLED
|
||||||
.store(self.transparency.unwrap_or(false), Ordering::SeqCst);
|
.store(self.transparency.unwrap_or(false), Ordering::SeqCst);
|
||||||
|
|||||||
@@ -164,7 +164,7 @@ impl Default for GlobalState {
|
|||||||
border_manager::UNFOCUSED.load(Ordering::SeqCst),
|
border_manager::UNFOCUSED.load(Ordering::SeqCst),
|
||||||
))),
|
))),
|
||||||
},
|
},
|
||||||
border_style: *STYLE.lock(),
|
border_style: STYLE.load(),
|
||||||
border_offset: border_manager::BORDER_OFFSET.load(Ordering::SeqCst),
|
border_offset: border_manager::BORDER_OFFSET.load(Ordering::SeqCst),
|
||||||
border_width: border_manager::BORDER_WIDTH.load(Ordering::SeqCst),
|
border_width: border_manager::BORDER_WIDTH.load(Ordering::SeqCst),
|
||||||
stackbar_mode: STACKBAR_MODE.load(),
|
stackbar_mode: STACKBAR_MODE.load(),
|
||||||
|
|||||||
Reference in New Issue
Block a user