From 21a71b753d6da2233bce913f4e623ee14859ec23 Mon Sep 17 00:00:00 2001 From: Yiğit Özdemir Date: Wed, 21 Jun 2023 19:43:20 +0300 Subject: Add command to retrieve window size --- core/src/window.rs | 2 ++ core/src/window/fetch_size.rs | 8 ++++++++ runtime/src/window/action.rs | 16 ++++++++++++++++ winit/src/application.rs | 16 ++++++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 core/src/window/fetch_size.rs diff --git a/core/src/window.rs b/core/src/window.rs index a6dbdfb4..cd343893 100644 --- a/core/src/window.rs +++ b/core/src/window.rs @@ -6,6 +6,7 @@ mod level; mod mode; mod redraw_request; mod user_attention; +mod fetch_size; pub use event::Event; pub use icon::Icon; @@ -13,3 +14,4 @@ pub use level::Level; pub use mode::Mode; pub use redraw_request::RedrawRequest; pub use user_attention::UserAttention; +pub use fetch_size::SizeType; \ No newline at end of file diff --git a/core/src/window/fetch_size.rs b/core/src/window/fetch_size.rs new file mode 100644 index 00000000..aa3431aa --- /dev/null +++ b/core/src/window/fetch_size.rs @@ -0,0 +1,8 @@ +/// A `struct` defining which size to fetch. +#[derive(Debug, Clone, Copy)] +pub enum SizeType { + /// Inner size. (not including title bars and so other OS decorations) + Inner, + /// Outer size. (including everything) + Outer, +} \ No newline at end of file diff --git a/runtime/src/window/action.rs b/runtime/src/window/action.rs index a9d2a3d0..4ea9d474 100644 --- a/runtime/src/window/action.rs +++ b/runtime/src/window/action.rs @@ -1,3 +1,7 @@ + + +use iced_core::window::SizeType; + use crate::core::window::{Icon, Level, Mode, UserAttention}; use crate::futures::MaybeSend; @@ -20,6 +24,13 @@ pub enum Action { /// The new logical height of the window height: u32, }, + /// Fetch the current size of the window. + FetchSize { + /// Which size to fetch + size_type: SizeType, + /// Callback function + callback: Box T + 'static>, + }, /// Set the window to maximized or back Maximize(bool), /// Set the window to minimized or back @@ -104,6 +115,10 @@ impl Action { Self::Close => Action::Close, Self::Drag => Action::Drag, Self::Resize { width, height } => Action::Resize { width, height }, + Self::FetchSize { size_type, callback } => Action::FetchSize { + size_type: size_type, + callback: Box::new(move |s| f(callback(s))), + }, Self::Maximize(maximized) => Action::Maximize(maximized), Self::Minimize(minimized) => Action::Minimize(minimized), Self::Move { x, y } => Action::Move { x, y }, @@ -131,6 +146,7 @@ impl fmt::Debug for Action { f, "Action::Resize {{ widget: {width}, height: {height} }}" ), + Self::FetchSize { size_type, .. } => write!(f, "Action::FetchSize {{ size_type: {size_type:?} }}"), Self::Maximize(maximized) => { write!(f, "Action::Maximize({maximized})") } diff --git a/winit/src/application.rs b/winit/src/application.rs index be416ac8..ff5afa69 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -3,6 +3,7 @@ mod profiler; mod state; +use iced_graphics::core::window::SizeType; pub use state::State; use crate::conversion; @@ -747,6 +748,21 @@ pub fn run_command( height, }); } + window::Action::FetchSize { + size_type, + callback, + } => { + let width_height = match size_type { + SizeType::Inner => window.inner_size(), + SizeType::Outer => window.outer_size(), + }; + let width_height = + (width_height.width, width_height.height); + + proxy + .send_event(callback(width_height)) + .expect("Send message to event loop") + } window::Action::Maximize(maximized) => { window.set_maximized(maximized); } -- cgit