|
1 |
| -use std::cell::{Cell, RefCell}; |
| 1 | +use std::cell::{Cell, RefCell, RefMut}; |
2 | 2 | use std::collections::VecDeque;
|
3 | 3 | use std::ffi::c_void;
|
4 | 4 | use std::ptr;
|
@@ -386,20 +386,26 @@ impl WindowState {
|
386 | 386 |
|
387 | 387 | pub(super) fn trigger_event(&self, event: Event) -> EventStatus {
|
388 | 388 | let mut window = crate::Window::new(Window { inner: &self.window_inner });
|
389 |
| - self.window_handler.borrow_mut().on_event(&mut window, event) |
| 389 | + let mut window_handler = self.window_handler.borrow_mut(); |
| 390 | + let status = window_handler.on_event(&mut window, event); |
| 391 | + self.trigger_deferred_events(&mut window_handler); |
| 392 | + status |
390 | 393 | }
|
391 | 394 |
|
392 | 395 | pub(super) fn defer_event(&self, event: Event) {
|
393 |
| - self.deferred_events.borrow_mut().push_back(event); |
| 396 | + if let Ok(mut window_handler) = self.window_handler.try_borrow_mut() { |
| 397 | + let mut window = crate::Window::new(Window { inner: &self.window_inner }); |
| 398 | + window_handler.on_event(&mut window, event); |
| 399 | + } else { |
| 400 | + self.deferred_events.borrow_mut().push_back(event); |
| 401 | + } |
394 | 402 | }
|
395 | 403 |
|
396 | 404 | pub(super) fn trigger_frame(&self) {
|
397 |
| - for event in self.deferred_events.borrow_mut().drain(..) { |
398 |
| - self.trigger_event(event); |
399 |
| - } |
400 |
| - |
401 | 405 | let mut window = crate::Window::new(Window { inner: &self.window_inner });
|
402 |
| - self.window_handler.borrow_mut().on_frame(&mut window); |
| 406 | + let mut window_handler = self.window_handler.borrow_mut(); |
| 407 | + self.trigger_deferred_events(&mut window_handler); |
| 408 | + window_handler.on_frame(&mut window); |
403 | 409 | }
|
404 | 410 |
|
405 | 411 | pub(super) fn keyboard_state(&self) -> &KeyboardState {
|
@@ -433,6 +439,13 @@ impl WindowState {
|
433 | 439 |
|
434 | 440 | (*window_state_ptr).frame_timer.set(Some(timer));
|
435 | 441 | }
|
| 442 | + |
| 443 | + fn trigger_deferred_events(&self, window_handler: &mut RefMut<'_, Box<dyn WindowHandler>>) { |
| 444 | + for event in self.deferred_events.borrow_mut().drain(..) { |
| 445 | + let mut window = crate::Window::new(Window { inner: &self.window_inner }); |
| 446 | + window_handler.on_event(&mut window, event); |
| 447 | + } |
| 448 | + } |
436 | 449 | }
|
437 | 450 |
|
438 | 451 | unsafe impl<'a> HasRawWindowHandle for Window<'a> {
|
|
0 commit comments