diff --git a/runtime/src/window.rs b/runtime/src/window.rs index e448edef..5219fbfd 100644 --- a/runtime/src/window.rs +++ b/runtime/src/window.rs @@ -9,6 +9,7 @@ pub use screenshot::Screenshot; use crate::command::{self, Command}; use crate::core::time::Instant; use crate::core::window::{Event, Icon, Level, Mode, UserAttention}; +use crate::core::Size; use crate::futures::subscription::{self, Subscription}; /// Subscribes to the frames of the window of the running application. @@ -37,8 +38,15 @@ pub fn drag() -> Command { } /// Resizes the window to the given logical dimensions. -pub fn resize(width: u32, height: u32) -> Command { - Command::single(command::Action::Window(Action::Resize { width, height })) +pub fn resize(new_size: Size) -> Command { + Command::single(command::Action::Window(Action::Resize(new_size))) +} + +/// Fetches the current window size in logical dimensions. +pub fn fetch_size( + f: impl FnOnce(Size) -> Message + 'static, +) -> Command { + Command::single(command::Action::Window(Action::FetchSize(Box::new(f)))) } /// Maximizes the window. diff --git a/runtime/src/window/action.rs b/runtime/src/window/action.rs index 09be1810..b6964e36 100644 --- a/runtime/src/window/action.rs +++ b/runtime/src/window/action.rs @@ -1,4 +1,5 @@ use crate::core::window::{Icon, Level, Mode, UserAttention}; +use crate::core::Size; use crate::futures::MaybeSend; use crate::window::Screenshot; @@ -15,12 +16,9 @@ pub enum Action { /// button was pressed immediately before this function is called. Drag, /// Resize the window. - Resize { - /// The new logical width of the window - width: u32, - /// The new logical height of the window - height: u32, - }, + Resize(Size), + /// Fetch the current size of the window. + FetchSize(Box) -> T + 'static>), /// Set the window to maximized or back Maximize(bool), /// Set the window to minimized or back @@ -106,7 +104,8 @@ impl Action { match self { Self::Close => Action::Close, Self::Drag => Action::Drag, - Self::Resize { width, height } => Action::Resize { width, height }, + Self::Resize(size) => Action::Resize(size), + Self::FetchSize(o) => Action::FetchSize(Box::new(move |s| f(o(s)))), Self::Maximize(maximized) => Action::Maximize(maximized), Self::Minimize(minimized) => Action::Minimize(minimized), Self::Move { x, y } => Action::Move { x, y }, @@ -135,10 +134,8 @@ impl fmt::Debug for Action { match self { Self::Close => write!(f, "Action::Close"), Self::Drag => write!(f, "Action::Drag"), - Self::Resize { width, height } => write!( - f, - "Action::Resize {{ widget: {width}, height: {height} }}" - ), + Self::Resize(size) => write!(f, "Action::Resize({size:?})"), + Self::FetchSize(_) => write!(f, "Action::FetchSize"), Self::Maximize(maximized) => { write!(f, "Action::Maximize({maximized})") } diff --git a/winit/src/application.rs b/winit/src/application.rs index 6e7b94ef..d1689452 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -748,12 +748,22 @@ pub fn run_command( window::Action::Drag => { let _res = window.drag_window(); } - window::Action::Resize { width, height } => { + window::Action::Resize(size) => { window.set_inner_size(winit::dpi::LogicalSize { - width, - height, + width: size.width, + height: size.height, }); } + window::Action::FetchSize(callback) => { + let size = window.inner_size(); + + proxy + .send_event(callback(Size::new( + size.width, + size.height, + ))) + .expect("Send message to event loop") + } window::Action::Maximize(maximized) => { window.set_maximized(maximized); }