mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-03-21 08:59:11 +01:00
feat(wm): cycle monocle container when focusing in direction
This commit implements something I've found myself wanting while working on the Macbook. When I have a monocle container active, I want to quickly be able to switch back and forth with an adjacent window in the underlying layout without having to toggle monocle mode off and back on again. This is now accomplished by using focus left/down to promote the previous window in the Ring to monocle, and by using focus right/down to focus the next window in the Ring to monocle. Borders were being funny so I just ended up nuking them whenever we cycle.
This commit is contained in:
@@ -2103,12 +2103,19 @@ impl WindowManager {
|
||||
|
||||
tracing::info!("focusing container");
|
||||
|
||||
let new_idx =
|
||||
if workspace.maximized_window.is_some() || workspace.monocle_container.is_some() {
|
||||
None
|
||||
} else {
|
||||
workspace.new_idx_for_direction(direction)
|
||||
if workspace.monocle_container.is_some() {
|
||||
let cycle_direction = match direction {
|
||||
OperationDirection::Left | OperationDirection::Down => CycleDirection::Previous,
|
||||
OperationDirection::Right | OperationDirection::Up => CycleDirection::Next,
|
||||
};
|
||||
return self.cycle_monocle(cycle_direction);
|
||||
}
|
||||
|
||||
let new_idx = if workspace.maximized_window.is_some() {
|
||||
None
|
||||
} else {
|
||||
workspace.new_idx_for_direction(direction)
|
||||
};
|
||||
|
||||
let mut cross_monitor_monocle_or_max = false;
|
||||
|
||||
@@ -3093,6 +3100,27 @@ impl WindowManager {
|
||||
workspace.reintegrate_monocle_container()
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(self))]
|
||||
pub fn cycle_monocle(&mut self, direction: CycleDirection) -> eyre::Result<()> {
|
||||
tracing::info!("cycling monocle container");
|
||||
|
||||
if self.focused_workspace()?.containers().is_empty() {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
self.focused_workspace_mut()?
|
||||
.cycle_monocle_container(direction)?;
|
||||
|
||||
for container in self.focused_workspace_mut()?.containers_mut() {
|
||||
container.hide(None);
|
||||
}
|
||||
|
||||
// borders were getting funny during cycles, can't be bothered to root cause it
|
||||
border_manager::destroy_all_borders()?;
|
||||
|
||||
self.update_focused_workspace(true, true)
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip(self))]
|
||||
pub fn toggle_maximize(&mut self) -> eyre::Result<()> {
|
||||
self.handle_unmanaged_window_behaviour()?;
|
||||
|
||||
@@ -1515,6 +1515,23 @@ impl Workspace {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn cycle_monocle_container(&mut self, direction: CycleDirection) -> eyre::Result<()> {
|
||||
if self.containers().is_empty() {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
self.reintegrate_monocle_container()?;
|
||||
|
||||
let new_idx = self
|
||||
.new_idx_for_cycle_direction(direction)
|
||||
.ok_or_eyre("there is no container to cycle monocle to")?;
|
||||
|
||||
self.focus_container(new_idx);
|
||||
self.new_monocle_container()?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn new_maximized_window(&mut self) -> eyre::Result<()> {
|
||||
let focused_idx = self.focused_container_idx();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user