fix(wm): address monocle mode visual artifacts

This commit addresses two visual artifacts with monocle mode:

* Flashing of background windows when switching to a monocle container
  on another monitor is now gone
* Stackbars are automatically disabled whenever a container enters
  monocle mode

re #819
This commit is contained in:
LGUG2Z
2024-05-17 15:52:14 -07:00
parent bceb28de37
commit 835472d739
+33 -7
View File
@@ -1282,6 +1282,9 @@ impl WindowManager {
let new_idx = workspace.new_idx_for_direction(direction); let new_idx = workspace.new_idx_for_direction(direction);
// TODO: clean this up, this is awful
let mut cross_monitor_monocle = false;
// if there is no container in that direction for this workspace // if there is no container in that direction for this workspace
match new_idx { match new_idx {
None => { None => {
@@ -1297,6 +1300,8 @@ impl WindowManager {
WindowsApi::center_cursor_in_rect(&WindowsApi::window_rect( WindowsApi::center_cursor_in_rect(&WindowsApi::window_rect(
window.hwnd(), window.hwnd(),
)?)?; )?)?;
cross_monitor_monocle = true;
} }
} }
} }
@@ -1314,13 +1319,15 @@ impl WindowManager {
// With this piece of code, we check if we have changed focus to a container stack with // With this piece of code, we check if we have changed focus to a container stack with
// a stackbar, and if we have, we run a quick update to make sure the focused text colour // a stackbar, and if we have, we run a quick update to make sure the focused text colour
// has been applied // has been applied
if let Ok(focused_window) = self.focused_window_mut() { if !cross_monitor_monocle {
let focused_window_hwnd = focused_window.hwnd; if let Ok(focused_window) = self.focused_window_mut() {
focused_window.focus(self.mouse_follows_focus)?; let focused_window_hwnd = focused_window.hwnd;
focused_window.focus(self.mouse_follows_focus)?;
let focused_container = self.focused_container()?; let focused_container = self.focused_container()?;
if let Some(stackbar) = focused_container.stackbar() { if let Some(stackbar) = focused_container.stackbar() {
stackbar.update(focused_container.windows(), focused_window_hwnd)?; stackbar.update(focused_container.windows(), focused_window_hwnd)?;
}
} }
} }
@@ -1741,7 +1748,17 @@ impl WindowManager {
tracing::info!("enabling monocle"); tracing::info!("enabling monocle");
let workspace = self.focused_workspace_mut()?; let workspace = self.focused_workspace_mut()?;
workspace.new_monocle_container() workspace.new_monocle_container()?;
if let Some(monocle) = workspace.monocle_container_mut() {
monocle.set_stackbar_mode(StackbarMode::Never);
}
for container in workspace.containers_mut() {
container.set_stackbar_mode(StackbarMode::Never);
}
Ok(())
} }
#[tracing::instrument(skip(self))] #[tracing::instrument(skip(self))]
@@ -1749,6 +1766,15 @@ impl WindowManager {
tracing::info!("disabling monocle"); tracing::info!("disabling monocle");
let workspace = self.focused_workspace_mut()?; let workspace = self.focused_workspace_mut()?;
if let Some(monocle) = workspace.monocle_container_mut() {
monocle.set_stackbar_mode(STACKBAR_MODE.load());
}
for container in workspace.containers_mut() {
container.set_stackbar_mode(STACKBAR_MODE.load());
}
workspace.reintegrate_monocle_container() workspace.reintegrate_monocle_container()
} }