Skip to content

Commit f95cd99

Browse files
committed
immediately trigger deferred event if borrowing succeeds
1 parent f1e62a5 commit f95cd99

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed

src/macos/window.rs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use std::cell::{Cell, RefCell};
1+
use std::cell::{Cell, RefCell, RefMut};
22
use std::collections::VecDeque;
33
use std::ffi::c_void;
44
use std::ptr;
@@ -386,20 +386,26 @@ impl WindowState {
386386

387387
pub(super) fn trigger_event(&self, event: Event) -> EventStatus {
388388
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
390393
}
391394

392395
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+
}
394402
}
395403

396404
pub(super) fn trigger_frame(&self) {
397-
for event in self.deferred_events.borrow_mut().drain(..) {
398-
self.trigger_event(event);
399-
}
400-
401405
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);
403409
}
404410

405411
pub(super) fn keyboard_state(&self) -> &KeyboardState {
@@ -433,6 +439,13 @@ impl WindowState {
433439

434440
(*window_state_ptr).frame_timer.set(Some(timer));
435441
}
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+
}
436449
}
437450

438451
unsafe impl<'a> HasRawWindowHandle for Window<'a> {

0 commit comments

Comments
 (0)