mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2025-02-02 23:06:32 +11:00
On Wayland, fix resize not propagating properly
On Wayland window size and scaling are double buffered, so winit should send redraw requested for a client on the next frame as well.
This commit is contained in:
parent
7846e6a31e
commit
78e5a395da
2 changed files with 23 additions and 8 deletions
|
@ -21,6 +21,7 @@ And please only add new entries to the top of this list, right below the `# Unre
|
||||||
- **Breaking:** Replaced `EventLoopExtMacOS` with `EventLoopBuilderExtMacOS` (which also has renamed methods).
|
- **Breaking:** Replaced `EventLoopExtMacOS` with `EventLoopBuilderExtMacOS` (which also has renamed methods).
|
||||||
- **Breaking:** Replaced `EventLoopExtWindows` with `EventLoopBuilderExtWindows` (which also has renamed methods).
|
- **Breaking:** Replaced `EventLoopExtWindows` with `EventLoopBuilderExtWindows` (which also has renamed methods).
|
||||||
- **Breaking:** Replaced `EventLoopExtUnix` with `EventLoopBuilderExtUnix` (which also has renamed methods).
|
- **Breaking:** Replaced `EventLoopExtUnix` with `EventLoopBuilderExtUnix` (which also has renamed methods).
|
||||||
|
- On Wayland, fix resize and scale factor changes not being propagated properly.
|
||||||
|
|
||||||
# 0.26.1 (2022-01-05)
|
# 0.26.1 (2022-01-05)
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ use crate::platform_impl::EventLoopWindowTarget as PlatformEventLoopWindowTarget
|
||||||
use super::env::{WindowingFeatures, WinitEnv};
|
use super::env::{WindowingFeatures, WinitEnv};
|
||||||
use super::output::OutputManager;
|
use super::output::OutputManager;
|
||||||
use super::seat::SeatManager;
|
use super::seat::SeatManager;
|
||||||
use super::window::shim::{self, WindowUpdate};
|
use super::window::shim::{self, WindowRequest, WindowUpdate};
|
||||||
use super::{DeviceId, WindowId};
|
use super::{DeviceId, WindowId};
|
||||||
|
|
||||||
mod proxy;
|
mod proxy;
|
||||||
|
@ -249,7 +249,8 @@ impl<T: 'static> EventLoop<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process 'new' pending updates.
|
// Process 'new' pending updates.
|
||||||
self.with_state(|state| {
|
self.with_window_target(|window_target| {
|
||||||
|
let state = window_target.state.get_mut();
|
||||||
window_updates.clear();
|
window_updates.clear();
|
||||||
window_updates.extend(
|
window_updates.extend(
|
||||||
state
|
state
|
||||||
|
@ -261,7 +262,8 @@ impl<T: 'static> EventLoop<T> {
|
||||||
|
|
||||||
for (window_id, window_update) in window_updates.iter_mut() {
|
for (window_id, window_update) in window_updates.iter_mut() {
|
||||||
if let Some(scale_factor) = window_update.scale_factor.map(|f| f as f64) {
|
if let Some(scale_factor) = window_update.scale_factor.map(|f| f as f64) {
|
||||||
let mut physical_size = self.with_state(|state| {
|
let mut physical_size = self.with_window_target(|window_target| {
|
||||||
|
let state = window_target.state.get_mut();
|
||||||
let window_handle = state.window_map.get(window_id).unwrap();
|
let window_handle = state.window_map.get(window_id).unwrap();
|
||||||
let mut size = window_handle.size.lock().unwrap();
|
let mut size = window_handle.size.lock().unwrap();
|
||||||
|
|
||||||
|
@ -294,7 +296,8 @@ impl<T: 'static> EventLoop<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(size) = window_update.size.take() {
|
if let Some(size) = window_update.size.take() {
|
||||||
let physical_size = self.with_state(|state| {
|
let physical_size = self.with_window_target(|window_target| {
|
||||||
|
let state = window_target.state.get_mut();
|
||||||
let window_handle = state.window_map.get_mut(window_id).unwrap();
|
let window_handle = state.window_map.get_mut(window_id).unwrap();
|
||||||
let mut window_size = window_handle.size.lock().unwrap();
|
let mut window_size = window_handle.size.lock().unwrap();
|
||||||
|
|
||||||
|
@ -320,6 +323,15 @@ impl<T: 'static> EventLoop<T> {
|
||||||
// Mark that refresh isn't required, since we've done it right now.
|
// Mark that refresh isn't required, since we've done it right now.
|
||||||
window_update.refresh_frame = false;
|
window_update.refresh_frame = false;
|
||||||
|
|
||||||
|
// Queue request for redraw into the next iteration of the loop, since
|
||||||
|
// resize and scale factor changes are double buffered.
|
||||||
|
window_handle
|
||||||
|
.pending_window_requests
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.push(WindowRequest::Redraw);
|
||||||
|
window_target.event_loop_awakener.ping();
|
||||||
|
|
||||||
physical_size
|
physical_size
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -356,7 +368,8 @@ impl<T: 'static> EventLoop<T> {
|
||||||
// The purpose of the back buffer and that swap is to not hold borrow_mut when
|
// The purpose of the back buffer and that swap is to not hold borrow_mut when
|
||||||
// we're doing callback to the user, since we can double borrow if the user decides
|
// we're doing callback to the user, since we can double borrow if the user decides
|
||||||
// to create a window in one of those callbacks.
|
// to create a window in one of those callbacks.
|
||||||
self.with_state(|state| {
|
self.with_window_target(|window_target| {
|
||||||
|
let state = window_target.state.get_mut();
|
||||||
std::mem::swap(
|
std::mem::swap(
|
||||||
&mut event_sink_back_buffer,
|
&mut event_sink_back_buffer,
|
||||||
&mut state.event_sink.window_events,
|
&mut state.event_sink.window_events,
|
||||||
|
@ -381,7 +394,8 @@ impl<T: 'static> EventLoop<T> {
|
||||||
for (window_id, window_update) in window_updates.iter() {
|
for (window_id, window_update) in window_updates.iter() {
|
||||||
// Handle refresh of the frame.
|
// Handle refresh of the frame.
|
||||||
if window_update.refresh_frame {
|
if window_update.refresh_frame {
|
||||||
self.with_state(|state| {
|
self.with_window_target(|window_target| {
|
||||||
|
let state = window_target.state.get_mut();
|
||||||
let window_handle = state.window_map.get_mut(window_id).unwrap();
|
let window_handle = state.window_map.get_mut(window_id).unwrap();
|
||||||
window_handle.window.refresh();
|
window_handle.window.refresh();
|
||||||
if !window_update.redraw_requested {
|
if !window_update.redraw_requested {
|
||||||
|
@ -526,9 +540,9 @@ impl<T: 'static> EventLoop<T> {
|
||||||
&self.window_target
|
&self.window_target
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_state<U, F: FnOnce(&mut WinitState) -> U>(&mut self, f: F) -> U {
|
fn with_window_target<U, F: FnOnce(&mut EventLoopWindowTarget<T>) -> U>(&mut self, f: F) -> U {
|
||||||
let state = match &mut self.window_target.p {
|
let state = match &mut self.window_target.p {
|
||||||
PlatformEventLoopWindowTarget::Wayland(window_target) => window_target.state.get_mut(),
|
PlatformEventLoopWindowTarget::Wayland(window_target) => window_target,
|
||||||
#[cfg(feature = "x11")]
|
#[cfg(feature = "x11")]
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue