From 3c685d7bf6a36bda9ffbee36ee822b4205b29b36 Mon Sep 17 00:00:00 2001 From: TicClick Date: Fri, 13 May 2022 10:15:43 +0200 Subject: [PATCH] eframe: read native window position and size (#1617) Position and dimensions are available via `eframe::Frame::info().window_info` --- eframe/src/epi.rs | 14 ++++++++++++++ eframe/src/native/epi_integration.rs | 26 +++++++++++++++++++++++++- eframe/src/web/backend.rs | 1 + 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/eframe/src/epi.rs b/eframe/src/epi.rs index b20732301f9..765286227fa 100644 --- a/eframe/src/epi.rs +++ b/eframe/src/epi.rs @@ -424,6 +424,17 @@ pub struct WebInfo { pub location: Location, } +/// Information about the application's main window, if available. +#[derive(Clone, Debug)] +pub struct WindowInfo { + /// Coordinates of the window's outer top left corner, relative to the top left corner of the first display. + /// Unit: egui points (logical pixels). + pub position: egui::Pos2, + + /// Window inner size in egui points (logical pixels). + pub size: egui::Vec2, +} + /// Information about the URL. /// /// Everything has been percent decoded (`%20` -> ` ` etc). @@ -494,6 +505,9 @@ pub struct IntegrationInfo { /// The OS native pixels-per-point pub native_pixels_per_point: Option, + + /// Window-specific geometry information, if provided by the platform. + pub window_info: Option, } // ---------------------------------------------------------------------------- diff --git a/eframe/src/native/epi_integration.rs b/eframe/src/native/epi_integration.rs index 1b0ae8ec3ae..dd7b729eb4c 100644 --- a/eframe/src/native/epi_integration.rs +++ b/eframe/src/native/epi_integration.rs @@ -1,4 +1,4 @@ -use crate::epi; +use crate::{epi, WindowInfo}; use egui_winit::{native_pixels_per_point, WindowSettings}; pub fn points_to_size(points: egui::Vec2) -> winit::dpi::LogicalSize { @@ -8,6 +8,28 @@ pub fn points_to_size(points: egui::Vec2) -> winit::dpi::LogicalSize { } } +pub fn read_window_info( + window: &winit::window::Window, + pixels_per_point: f32, +) -> Option { + match window.outer_position() { + Ok(pos) => { + let pos = pos.to_logical::(pixels_per_point.into()); + let size = window + .inner_size() + .to_logical::(pixels_per_point.into()); + Some(WindowInfo { + position: egui::Pos2 { x: pos.x, y: pos.y }, + size: egui::Vec2 { + x: size.width, + y: size.height, + }, + }) + } + Err(_) => None, + } +} + pub fn window_builder( native_options: &epi::NativeOptions, window_settings: &Option, @@ -177,6 +199,7 @@ impl EpiIntegration { prefer_dark_mode, cpu_usage: None, native_pixels_per_point: Some(native_pixels_per_point(window)), + window_info: read_window_info(window, egui_ctx.pixels_per_point()), }, output: Default::default(), storage, @@ -240,6 +263,7 @@ impl EpiIntegration { ) -> egui::FullOutput { let frame_start = std::time::Instant::now(); + self.frame.info.window_info = read_window_info(window, self.egui_ctx.pixels_per_point()); let raw_input = self.egui_winit.take_egui_input(window); let full_output = self.egui_ctx.run(raw_input, |egui_ctx| { crate::profile_scope!("App::update"); diff --git a/eframe/src/web/backend.rs b/eframe/src/web/backend.rs index cf5eb652a2b..5181615133d 100644 --- a/eframe/src/web/backend.rs +++ b/eframe/src/web/backend.rs @@ -152,6 +152,7 @@ impl AppRunner { prefer_dark_mode, cpu_usage: None, native_pixels_per_point: Some(native_pixels_per_point()), + window_info: None, }; let storage = LocalStorage::default();