Skip to content

Commit

Permalink
eframe: read native window position and size (emilk#1617)
Browse files Browse the repository at this point in the history
Position and dimensions are available via `eframe::Frame::info().window_info`
  • Loading branch information
TicClick authored May 13, 2022
1 parent aef5942 commit 3c685d7
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 1 deletion.
14 changes: 14 additions & 0 deletions eframe/src/epi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down Expand Up @@ -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>,
}

// ----------------------------------------------------------------------------
Expand Down
26 changes: 25 additions & 1 deletion eframe/src/native/epi_integration.rs
Original file line number Diff line number Diff line change
@@ -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> {
Expand All @@ -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>,
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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");
Expand Down
1 change: 1 addition & 0 deletions eframe/src/web/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down

0 comments on commit 3c685d7

Please sign in to comment.