Skip to content

Commit

Permalink
feat: ensure monitors are sorted after display setting changes
Browse files Browse the repository at this point in the history
  • Loading branch information
lars-berger committed Aug 2, 2024
1 parent b379aba commit 4049c14
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ use crate::{
traits::{CommonGetters, PositionGetters},
WindowContainer,
},
monitors::commands::{add_monitor, remove_monitor, update_monitor},
monitors::commands::{
add_monitor, remove_monitor, sort_monitors, update_monitor,
},
user_config::UserConfig,
windows::traits::WindowGetters,
wm_state::WmState,
Expand Down Expand Up @@ -109,6 +111,9 @@ pub fn handle_display_settings_changed(
}
}

// Sort monitors by position.
sort_monitors(state.root_container.clone())?;

for window in state.windows() {
// Display setting changes can spread windows out sporadically, so mark
// all windows as needing a DPI adjustment (just in case).
Expand Down
2 changes: 1 addition & 1 deletion packages/wm/src/common/platform/platform.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ impl Platform {
pub fn sorted_monitors() -> anyhow::Result<Vec<NativeMonitor>> {
let monitors = native_monitor::available_monitors()?;

// Create a tuple of monitor and its rect.
// Create a tuple of monitors and their rects.
let mut monitors_with_rect = monitors
.into_iter()
.map(|monitor| {
Expand Down
2 changes: 2 additions & 0 deletions packages/wm/src/monitors/commands/mod.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
mod add_monitor;
mod remove_monitor;
mod sort_monitors;
mod update_monitor;

pub use add_monitor::*;
pub use remove_monitor::*;
pub use sort_monitors::*;
pub use update_monitor::*;
35 changes: 35 additions & 0 deletions packages/wm/src/monitors/commands/sort_monitors.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
use crate::containers::{
traits::{CommonGetters, PositionGetters},
RootContainer,
};

/// Sorts the root container's monitors from left-to-right and
/// top-to-bottom.
pub fn sort_monitors(root: RootContainer) -> anyhow::Result<()> {
let monitors = root.monitors();

// Create a tuple of monitors and their rects.
let mut monitors_with_rect = monitors
.into_iter()
.map(|monitor| {
let rect = monitor.to_rect()?.clone();
anyhow::Ok((monitor, rect))
})
.try_collect::<Vec<_>>()?;

// Sort monitors from left-to-right, top-to-bottom.
monitors_with_rect.sort_by(|(_, rect_a), (_, rect_b)| {
if rect_a.x() == rect_b.x() {
rect_a.y().cmp(&rect_b.y())
} else {
rect_a.x().cmp(&rect_b.x())
}
});

*root.borrow_children_mut() = monitors_with_rect
.into_iter()
.map(|(monitor, _)| monitor.into())
.collect();

Ok(())
}

0 comments on commit 4049c14

Please sign in to comment.