diff --git a/winit/src/lib.rs b/winit/src/lib.rs index 32c05649..75269d6a 100644 --- a/winit/src/lib.rs +++ b/winit/src/lib.rs @@ -785,22 +785,20 @@ async fn run_instance
( }; let physical_size = window.state.physical_size(); + let mut logical_size = window.state.logical_size(); if physical_size.width == 0 || physical_size.height == 0 { continue; } - if window.viewport_version - != window.state.viewport_version() - { - let logical_size = window.state.logical_size(); - - let layout_span = debug::layout(id); + // Window was resized between redraws + if window.surface_size != physical_size { let ui = user_interfaces .remove(&id) .expect("Remove user interface"); + let layout_span = debug::layout(id); let _ = user_interfaces.insert( id, ui.relayout(logical_size, &mut window.renderer), @@ -813,8 +811,7 @@ async fn run_instance
( physical_size.height, ); - window.viewport_version = - window.state.viewport_version(); + window.surface_size = physical_size; } let redraw_event = core::Event::Window( @@ -922,6 +919,30 @@ async fn run_instance
( current_compositor = next_compositor; window = window_manager.get_mut(id).unwrap(); + + // Window scale factor changed during a redraw request + if logical_size != window.state.logical_size() { + logical_size = window.state.logical_size(); + + log::debug!( + "Window scale factor changed during a redraw request" + ); + + let ui = user_interfaces + .remove(&id) + .expect("Remove user interface"); + + let layout_span = debug::layout(id); + let _ = user_interfaces.insert( + id, + ui.relayout( + logical_size, + &mut window.renderer, + ), + ); + layout_span.finish(); + } + interface = user_interfaces.get_mut(&id).unwrap(); } diff --git a/winit/src/window.rs b/winit/src/window.rs index a1e8c8b3..5d66913f 100644 --- a/winit/src/window.rs +++ b/winit/src/window.rs @@ -57,12 +57,11 @@ where system_theme: theme::Mode, ) -> &mut Window
{
let state = State::new(program, id, &window, system_theme);
- let viewport_version = state.viewport_version();
- let physical_size = state.physical_size();
+ let surface_size = state.physical_size();
let surface = compositor.create_surface(
window.clone(),
- physical_size.width,
- physical_size.height,
+ surface_size.width,
+ surface_size.height,
);
let renderer = compositor.create_renderer();
@@ -73,9 +72,9 @@ where
Window {
raw: window,
state,
- viewport_version,
exit_on_close_request,
surface,
+ surface_size,
renderer,
mouse_interaction: mouse::Interaction::None,
redraw_at: None,
@@ -164,10 +163,10 @@ where
{
pub raw: Arc ,
- pub viewport_version: u64,
pub exit_on_close_request: bool,
pub mouse_interaction: mouse::Interaction,
pub surface: C::Surface,
+ pub surface_size: Size