Change the window property update event to use a window id

This will hopefully enable the custom event to be sendable across threads.
This commit is contained in:
Simon Hausmann 2021-04-02 12:00:32 +02:00
parent f0bda6a3be
commit b654646722
2 changed files with 25 additions and 9 deletions

View file

@ -109,7 +109,7 @@ pub enum CustomEvent {
/// request an animation frame. /// request an animation frame.
#[cfg(target_arch = "wasm32")] #[cfg(target_arch = "wasm32")]
WakeUpAndPoll, WakeUpAndPoll,
UpdateWindowProperties(Weak<Window>), UpdateWindowProperties(winit::window::WindowId),
Exit, Exit,
} }
@ -397,8 +397,14 @@ pub fn run() {
}); });
} }
winit::event::Event::UserEvent(CustomEvent::UpdateWindowProperties(window)) => { winit::event::Event::UserEvent(CustomEvent::UpdateWindowProperties(window_id)) => {
window.upgrade().map(|window| window.update_window_properties()); ALL_WINDOWS.with(|windows| {
if let Some(Some(window)) =
windows.borrow().get(&window_id).map(|weakref| weakref.upgrade())
{
window.self_weak.upgrade().unwrap().update_window_properties();
}
});
} }
winit::event::Event::UserEvent(CustomEvent::Exit) => { winit::event::Event::UserEvent(CustomEvent::Exit) => {

View file

@ -461,12 +461,22 @@ impl PlatformWindow for GraphicsWindow {
} }
fn request_window_properties_update(&self) { fn request_window_properties_update(&self) {
crate::eventloop::with_window_target(|event_loop| { match &*self.map_state.borrow() {
event_loop.event_loop_proxy().send_event( GraphicsWindowBackendState::Unmapped => {
crate::eventloop::CustomEvent::UpdateWindowProperties(self.self_weak.clone()), // Nothing to be done if the window isn't visible. When it becomes visible,
) // ComponentWindow::show() calls update_window_properties()
}) }
.ok(); GraphicsWindowBackendState::Mapped(window) => {
let backend = window.backend.borrow();
let window_id = backend.window().id();
crate::eventloop::with_window_target(|event_loop| {
event_loop.event_loop_proxy().send_event(
crate::eventloop::CustomEvent::UpdateWindowProperties(window_id),
)
})
.ok();
}
}
} }
fn apply_window_properties(&self, window_item: Pin<&sixtyfps_corelib::items::Window>) { fn apply_window_properties(&self, window_item: Pin<&sixtyfps_corelib::items::Window>) {