From c6ebd9eb9cfcbec87f900cbcb276ad5261e372c3 Mon Sep 17 00:00:00 2001 From: Wilson Glasser Date: Mon, 27 Apr 2026 15:24:46 -0300 Subject: [PATCH] feat(window): expose monitor_position alongside monitor_size Adds runtime::window::monitor_position(id) -> Task> and the matching Action::GetMonitorPosition / winit handler that returns monitor.position() in logical coordinates. Pairs with the existing monitor_size to let an app align a window flush with the current monitor's edges in a multi-monitor setup, where (0, 0) lives on the primary monitor. --- runtime/src/window.rs | 14 ++++++++++++++ winit/src/lib.rs | 12 ++++++++++++ 2 files changed, 26 insertions(+) diff --git a/runtime/src/window.rs b/runtime/src/window.rs index e5ecb756bd..f87fc7b4e9 100644 --- a/runtime/src/window.rs +++ b/runtime/src/window.rs @@ -173,6 +173,12 @@ pub enum Action { /// Get the logical dimensions of the monitor containing the window with the given [`Id`]. GetMonitorSize(Id, oneshot::Sender>), + /// Get the logical top-left position of the monitor containing the + /// window with the given [`Id`]. In multi-monitor setups, lets the + /// caller align the window to its current monitor's edge instead of + /// `(0, 0)`, which lives on the primary monitor. + GetMonitorPosition(Id, oneshot::Sender>), + /// Set whether the system can automatically organize windows into tabs. /// /// See @@ -469,6 +475,14 @@ pub fn monitor_size(id: Id) -> Task> { task::oneshot(move |channel| crate::Action::Window(Action::GetMonitorSize(id, channel))) } +/// Gets the logical top-left position of the monitor containing the +/// window with the given [`Id`]. Pair with [`monitor_size`] to align a +/// window flush with the current monitor's edge in a multi-monitor +/// setup, where `(0, 0)` is the primary monitor. +pub fn monitor_position(id: Id) -> Task> { + task::oneshot(move |channel| crate::Action::Window(Action::GetMonitorPosition(id, channel))) +} + /// Sets whether the system can automatically organize windows into tabs. /// /// See diff --git a/winit/src/lib.rs b/winit/src/lib.rs index a3da2ff3f1..26d0c56a76 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -1589,6 +1589,18 @@ fn run_action<'a, P, C>( let _ = channel.send(size); } } + window::Action::GetMonitorPosition(id, channel) => { + if let Some(window) = window_manager.get(id) { + let position = window.raw.current_monitor().map(|monitor| { + let scale = window.state.scale_factor(); + let position = monitor.position().to_logical(f64::from(scale)); + + Point::new(position.x, position.y) + }); + + let _ = channel.send(position); + } + } window::Action::SetAllowAutomaticTabbing(enabled) => { control_sender .start_send(Control::SetAutomaticWindowTabbing(enabled))