Try to fix window resize race conditons during RedrawRequested
This commit is contained in:
parent
bfc27e4691
commit
d5608162de
3 changed files with 37 additions and 37 deletions
|
|
@ -785,22 +785,20 @@ async fn run_instance<P>(
|
||||||
};
|
};
|
||||||
|
|
||||||
let physical_size = window.state.physical_size();
|
let physical_size = window.state.physical_size();
|
||||||
|
let mut logical_size = window.state.logical_size();
|
||||||
|
|
||||||
if physical_size.width == 0 || physical_size.height == 0
|
if physical_size.width == 0 || physical_size.height == 0
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if window.viewport_version
|
// Window was resized between redraws
|
||||||
!= window.state.viewport_version()
|
if window.surface_size != physical_size {
|
||||||
{
|
|
||||||
let logical_size = window.state.logical_size();
|
|
||||||
|
|
||||||
let layout_span = debug::layout(id);
|
|
||||||
let ui = user_interfaces
|
let ui = user_interfaces
|
||||||
.remove(&id)
|
.remove(&id)
|
||||||
.expect("Remove user interface");
|
.expect("Remove user interface");
|
||||||
|
|
||||||
|
let layout_span = debug::layout(id);
|
||||||
let _ = user_interfaces.insert(
|
let _ = user_interfaces.insert(
|
||||||
id,
|
id,
|
||||||
ui.relayout(logical_size, &mut window.renderer),
|
ui.relayout(logical_size, &mut window.renderer),
|
||||||
|
|
@ -813,8 +811,7 @@ async fn run_instance<P>(
|
||||||
physical_size.height,
|
physical_size.height,
|
||||||
);
|
);
|
||||||
|
|
||||||
window.viewport_version =
|
window.surface_size = physical_size;
|
||||||
window.state.viewport_version();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let redraw_event = core::Event::Window(
|
let redraw_event = core::Event::Window(
|
||||||
|
|
@ -922,6 +919,30 @@ async fn run_instance<P>(
|
||||||
|
|
||||||
current_compositor = next_compositor;
|
current_compositor = next_compositor;
|
||||||
window = window_manager.get_mut(id).unwrap();
|
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 =
|
interface =
|
||||||
user_interfaces.get_mut(&id).unwrap();
|
user_interfaces.get_mut(&id).unwrap();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -57,12 +57,11 @@ where
|
||||||
system_theme: theme::Mode,
|
system_theme: theme::Mode,
|
||||||
) -> &mut Window<P, C> {
|
) -> &mut Window<P, C> {
|
||||||
let state = State::new(program, id, &window, system_theme);
|
let state = State::new(program, id, &window, system_theme);
|
||||||
let viewport_version = state.viewport_version();
|
let surface_size = state.physical_size();
|
||||||
let physical_size = state.physical_size();
|
|
||||||
let surface = compositor.create_surface(
|
let surface = compositor.create_surface(
|
||||||
window.clone(),
|
window.clone(),
|
||||||
physical_size.width,
|
surface_size.width,
|
||||||
physical_size.height,
|
surface_size.height,
|
||||||
);
|
);
|
||||||
let renderer = compositor.create_renderer();
|
let renderer = compositor.create_renderer();
|
||||||
|
|
||||||
|
|
@ -73,9 +72,9 @@ where
|
||||||
Window {
|
Window {
|
||||||
raw: window,
|
raw: window,
|
||||||
state,
|
state,
|
||||||
viewport_version,
|
|
||||||
exit_on_close_request,
|
exit_on_close_request,
|
||||||
surface,
|
surface,
|
||||||
|
surface_size,
|
||||||
renderer,
|
renderer,
|
||||||
mouse_interaction: mouse::Interaction::None,
|
mouse_interaction: mouse::Interaction::None,
|
||||||
redraw_at: None,
|
redraw_at: None,
|
||||||
|
|
@ -164,10 +163,10 @@ where
|
||||||
{
|
{
|
||||||
pub raw: Arc<winit::window::Window>,
|
pub raw: Arc<winit::window::Window>,
|
||||||
pub state: State<P>,
|
pub state: State<P>,
|
||||||
pub viewport_version: u64,
|
|
||||||
pub exit_on_close_request: bool,
|
pub exit_on_close_request: bool,
|
||||||
pub mouse_interaction: mouse::Interaction,
|
pub mouse_interaction: mouse::Interaction,
|
||||||
pub surface: C::Surface,
|
pub surface: C::Surface,
|
||||||
|
pub surface_size: Size<u32>,
|
||||||
pub renderer: P::Renderer,
|
pub renderer: P::Renderer,
|
||||||
pub redraw_at: Option<Instant>,
|
pub redraw_at: Option<Instant>,
|
||||||
preedit: Option<Preedit<P::Renderer>>,
|
preedit: Option<Preedit<P::Renderer>>,
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,6 @@ where
|
||||||
title: String,
|
title: String,
|
||||||
scale_factor: f32,
|
scale_factor: f32,
|
||||||
viewport: Viewport,
|
viewport: Viewport,
|
||||||
viewport_version: u64,
|
|
||||||
cursor_position: Option<winit::dpi::PhysicalPosition<f64>>,
|
cursor_position: Option<winit::dpi::PhysicalPosition<f64>>,
|
||||||
modifiers: winit::keyboard::ModifiersState,
|
modifiers: winit::keyboard::ModifiersState,
|
||||||
theme: Option<P::Theme>,
|
theme: Option<P::Theme>,
|
||||||
|
|
@ -35,7 +34,6 @@ where
|
||||||
.field("title", &self.title)
|
.field("title", &self.title)
|
||||||
.field("scale_factor", &self.scale_factor)
|
.field("scale_factor", &self.scale_factor)
|
||||||
.field("viewport", &self.viewport)
|
.field("viewport", &self.viewport)
|
||||||
.field("viewport_version", &self.viewport_version)
|
|
||||||
.field("cursor_position", &self.cursor_position)
|
.field("cursor_position", &self.cursor_position)
|
||||||
.field("style", &self.style)
|
.field("style", &self.style)
|
||||||
.finish()
|
.finish()
|
||||||
|
|
@ -74,7 +72,6 @@ where
|
||||||
title,
|
title,
|
||||||
scale_factor,
|
scale_factor,
|
||||||
viewport,
|
viewport,
|
||||||
viewport_version: 0,
|
|
||||||
cursor_position: None,
|
cursor_position: None,
|
||||||
modifiers: winit::keyboard::ModifiersState::default(),
|
modifiers: winit::keyboard::ModifiersState::default(),
|
||||||
theme,
|
theme,
|
||||||
|
|
@ -89,13 +86,6 @@ where
|
||||||
&self.viewport
|
&self.viewport
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the version of the [`Viewport`] of the [`State`].
|
|
||||||
///
|
|
||||||
/// The version is incremented every time the [`Viewport`] changes.
|
|
||||||
pub fn viewport_version(&self) -> u64 {
|
|
||||||
self.viewport_version
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the physical [`Size`] of the [`Viewport`] of the [`State`].
|
/// Returns the physical [`Size`] of the [`Viewport`] of the [`State`].
|
||||||
pub fn physical_size(&self) -> Size<u32> {
|
pub fn physical_size(&self) -> Size<u32> {
|
||||||
self.viewport.physical_size()
|
self.viewport.physical_size()
|
||||||
|
|
@ -164,8 +154,6 @@ where
|
||||||
size,
|
size,
|
||||||
window.scale_factor() as f32 * self.scale_factor,
|
window.scale_factor() as f32 * self.scale_factor,
|
||||||
);
|
);
|
||||||
|
|
||||||
self.viewport_version = self.viewport_version.wrapping_add(1);
|
|
||||||
}
|
}
|
||||||
WindowEvent::ScaleFactorChanged {
|
WindowEvent::ScaleFactorChanged {
|
||||||
scale_factor: new_scale_factor,
|
scale_factor: new_scale_factor,
|
||||||
|
|
@ -177,8 +165,6 @@ where
|
||||||
size,
|
size,
|
||||||
*new_scale_factor as f32 * self.scale_factor,
|
*new_scale_factor as f32 * self.scale_factor,
|
||||||
);
|
);
|
||||||
|
|
||||||
self.viewport_version = self.viewport_version.wrapping_add(1);
|
|
||||||
}
|
}
|
||||||
WindowEvent::CursorMoved { position, .. }
|
WindowEvent::CursorMoved { position, .. }
|
||||||
| WindowEvent::Touch(Touch {
|
| WindowEvent::Touch(Touch {
|
||||||
|
|
@ -225,20 +211,14 @@ where
|
||||||
self.title = new_title;
|
self.title = new_title;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update scale factor and size
|
// Update scale factor
|
||||||
let new_scale_factor = program.scale_factor(window_id);
|
let new_scale_factor = program.scale_factor(window_id);
|
||||||
let new_size = window.inner_size();
|
|
||||||
let current_size = self.viewport.physical_size();
|
|
||||||
|
|
||||||
if self.scale_factor != new_scale_factor
|
if self.scale_factor != new_scale_factor {
|
||||||
|| (current_size.width, current_size.height)
|
|
||||||
!= (new_size.width, new_size.height)
|
|
||||||
{
|
|
||||||
self.viewport = Viewport::with_physical_size(
|
self.viewport = Viewport::with_physical_size(
|
||||||
Size::new(new_size.width, new_size.height),
|
self.viewport.physical_size(),
|
||||||
window.scale_factor() as f32 * new_scale_factor,
|
window.scale_factor() as f32 * new_scale_factor,
|
||||||
);
|
);
|
||||||
self.viewport_version = self.viewport_version.wrapping_add(1);
|
|
||||||
|
|
||||||
self.scale_factor = new_scale_factor;
|
self.scale_factor = new_scale_factor;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue