Browse Source

eframe: read native window position and size (#1617)

Position and dimensions are available via `eframe::Frame::info().window_info`
pull/1631/head
TicClick 3 years ago
committed by GitHub
parent
commit
3c685d7bf6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 14
      eframe/src/epi.rs
  2. 26
      eframe/src/native/epi_integration.rs
  3. 1
      eframe/src/web/backend.rs

14
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<f32>,
/// Window-specific geometry information, if provided by the platform.
pub window_info: Option<WindowInfo>,
}
// ----------------------------------------------------------------------------

26
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<f64> {
@ -8,6 +8,28 @@ pub fn points_to_size(points: egui::Vec2) -> winit::dpi::LogicalSize<f64> {
}
}
pub fn read_window_info(
window: &winit::window::Window,
pixels_per_point: f32,
) -> Option<WindowInfo> {
match window.outer_position() {
Ok(pos) => {
let pos = pos.to_logical::<f32>(pixels_per_point.into());
let size = window
.inner_size()
.to_logical::<f32>(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<WindowSettings>,
@ -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");

1
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();

Loading…
Cancel
Save