diff --git a/runtime/src/window.rs b/runtime/src/window.rs index a2d8b339..bcebc631 100644 --- a/runtime/src/window.rs +++ b/runtime/src/window.rs @@ -175,6 +175,9 @@ pub enum Action { /// Set the window size increment. SetResizeIncrements(Id, Option), + /// Get the size of the monitor on which the window currently resides in logical dimensions. + GetMonitorSize(Id, oneshot::Sender>), + /// Redraws all the windows. RedrawAll, @@ -491,3 +494,10 @@ pub fn enable_mouse_passthrough(id: Id) -> Task { pub fn disable_mouse_passthrough(id: Id) -> Task { task::effect(crate::Action::Window(Action::DisableMousePassthrough(id))) } + +/// Get the size of the monitor on which the window currently resides in logical dimensions. +pub fn monitor_size(id: Id) -> Task> { + task::oneshot(move |channel| { + crate::Action::Window(Action::GetMonitorSize(id, channel)) + }) +} diff --git a/winit/src/lib.rs b/winit/src/lib.rs index d06fa6e2..1e6394e4 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -1631,7 +1631,7 @@ fn run_action<'a, P, C>( let _ = channel.send(core::window::Screenshot::new( bytes, window.state.physical_size(), - window.state.viewport().scale_factor(), + window.state.scale_factor(), )); } } @@ -1645,6 +1645,18 @@ fn run_action<'a, P, C>( let _ = window.raw.set_cursor_hittest(true); } } + window::Action::GetMonitorSize(id, channel) => { + if let Some(window) = window_manager.get(id) { + let size = window.raw.current_monitor().map(|monitor| { + let scale = window.state.scale_factor(); + let size = monitor.size().to_logical(f64::from(scale)); + + Size::new(size.width, size.height) + }); + + let _ = channel.send(size); + } + } window::Action::RedrawAll => { for (_id, window) in window_manager.iter_mut() { window.raw.request_redraw();