Skip to content

Commit 70722cc

Browse files
committed
When SendEvent is called during event closure, buffer events
1 parent 5337092 commit 70722cc

File tree

1 file changed

+44
-36
lines changed

1 file changed

+44
-36
lines changed

src/platform_impl/windows/event_loop.rs

+44-36
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ use std::sync::atomic::{AtomicBool, Ordering};
2020
use std::time::{Duration, Instant};
2121
use std::rc::Rc;
2222
use std::cell::RefCell;
23+
use std::collections::VecDeque;
2324
use parking_lot::Mutex;
2425
use crossbeam_channel::{self, Sender, Receiver};
2526

@@ -122,11 +123,7 @@ pub(crate) struct SubclassInput<T> {
122123

123124
impl<T> SubclassInput<T> {
124125
unsafe fn send_event(&self, event: Event<T>) {
125-
let mut runner = self.event_loop_runner.borrow_mut();
126-
match *runner {
127-
ELRSharedOption::Runner(runner) => (*runner).process_event(event),
128-
ELRSharedOption::Buffer(ref mut buffer) => buffer.push(event)
129-
}
126+
self.event_loop_runner.send_event(event);
130127
}
131128
}
132129

@@ -137,11 +134,7 @@ struct ThreadMsgTargetSubclassInput<T> {
137134

138135
impl<T> ThreadMsgTargetSubclassInput<T> {
139136
unsafe fn send_event(&self, event: Event<T>) {
140-
let mut runner = self.event_loop_runner.borrow_mut();
141-
match *runner {
142-
ELRSharedOption::Runner(runner) => (*runner).process_event(event),
143-
ELRSharedOption::Buffer(ref mut buffer) => buffer.push(event)
144-
}
137+
self.event_loop_runner.send_event(event);
145138
}
146139
}
147140

@@ -163,7 +156,10 @@ impl<T> EventLoop<T> {
163156
become_dpi_aware(dpi_aware);
164157

165158
let thread_id = unsafe { processthreadsapi::GetCurrentThreadId() };
166-
let runner_shared = Rc::new(RefCell::new(ELRSharedOption::Buffer(vec![])));
159+
let runner_shared = Rc::new(ELRShared {
160+
runner: RefCell::new(None),
161+
buffer: RefCell::new(VecDeque::new())
162+
});
167163
let (thread_msg_target, thread_msg_sender) = thread_event_target_window(runner_shared.clone());
168164

169165
EventLoop {
@@ -201,15 +197,15 @@ impl<T> EventLoop<T> {
201197
};
202198
{
203199
let runner_shared = self.runner_shared.clone();
204-
let mut runner_shared = runner_shared.borrow_mut();
205-
let mut event_buffer = vec![];
206-
if let ELRSharedOption::Buffer(ref mut buffer) = *runner_shared {
207-
mem::swap(buffer, &mut event_buffer);
208-
}
209-
for event in event_buffer.drain(..) {
210-
unsafe{ runner.process_event(event); }
200+
let mut runner_ref = runner_shared.runner.borrow_mut();
201+
loop {
202+
let event = runner_shared.buffer.borrow_mut().pop_front();
203+
match event {
204+
Some(e) => unsafe{ runner.process_event(e); },
205+
None => break
206+
}
211207
}
212-
*runner_shared = ELRSharedOption::Runner(&mut runner);
208+
*runner_ref = Some(&mut runner);
213209
}
214210

215211
unsafe {
@@ -247,7 +243,7 @@ impl<T> EventLoop<T> {
247243
}
248244

249245
unsafe{ runner.call_event_handler(Event::LoopDestroyed) }
250-
*self.runner_shared.borrow_mut() = ELRSharedOption::Buffer(vec![]);
246+
*self.runner_shared.runner.borrow_mut() = None;
251247
}
252248

253249
pub fn create_proxy(&self) -> EventLoopProxy<T> {
@@ -266,10 +262,10 @@ impl<T> EventLoop<T> {
266262
}
267263
}
268264

269-
pub(crate) type EventLoopRunnerShared<T> = Rc<RefCell<ELRSharedOption<T>>>;
270-
pub(crate) enum ELRSharedOption<T> {
271-
Runner(*mut EventLoopRunner<T>),
272-
Buffer(Vec<Event<T>>)
265+
pub(crate) type EventLoopRunnerShared<T> = Rc<ELRShared<T>>;
266+
pub(crate) struct ELRShared<T> {
267+
runner: RefCell<Option<*mut EventLoopRunner<T>>>,
268+
buffer: RefCell<VecDeque<Event<T>>>
273269
}
274270
pub(crate) struct EventLoopRunner<T> {
275271
event_loop: *const EventLoop<T>,
@@ -280,6 +276,18 @@ pub(crate) struct EventLoopRunner<T> {
280276
event_handler: *mut FnMut(Event<T>, &RootEventLoop<T>, &mut ControlFlow)
281277
}
282278

279+
impl<T> ELRShared<T> {
280+
unsafe fn send_event(&self, event: Event<T>) {
281+
if let Ok(runner_ref) = self.runner.try_borrow_mut() {
282+
if let Some(runner) = *runner_ref {
283+
(*runner).process_event(event);
284+
return;
285+
}
286+
}
287+
self.buffer.borrow_mut().push_back(event)
288+
}
289+
}
290+
283291
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
284292
enum RunnerState {
285293
/// The event loop has just been created, and an `Init` event must be sent.
@@ -749,15 +757,15 @@ unsafe extern "system" fn public_window_callback<T>(
749757

750758
match msg {
751759
winuser::WM_ENTERSIZEMOVE => {
752-
let runner = subclass_input.event_loop_runner.borrow_mut();
753-
if let ELRSharedOption::Runner(runner) = *runner {
760+
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
761+
if let Some(runner) = *runner {
754762
(*runner).in_modal_loop = true;
755763
}
756764
0
757765
},
758766
winuser::WM_EXITSIZEMOVE => {
759-
let runner = subclass_input.event_loop_runner.borrow_mut();
760-
if let ELRSharedOption::Runner(runner) = *runner {
767+
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
768+
if let Some(runner) = *runner {
761769
(*runner).in_modal_loop = false;
762770
}
763771
0
@@ -791,8 +799,8 @@ unsafe extern "system" fn public_window_callback<T>(
791799

792800
_ if msg == *REQUEST_REDRAW_NO_NEWEVENTS_MSG_ID => {
793801
use event::WindowEvent::RedrawRequested;
794-
let runner = subclass_input.event_loop_runner.borrow_mut();
795-
if let ELRSharedOption::Runner(runner) = *runner {
802+
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
803+
if let Some(runner) = *runner {
796804
let runner = &mut *runner;
797805
match runner.runner_state {
798806
RunnerState::Idle(..) |
@@ -814,8 +822,8 @@ unsafe extern "system" fn public_window_callback<T>(
814822

815823
let mut send_event = false;
816824
{
817-
let runner = subclass_input.event_loop_runner.borrow_mut();
818-
if let ELRSharedOption::Runner(runner) = *runner {
825+
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
826+
if let Some(runner) = *runner {
819827
let runner = &mut *runner;
820828
match runner.runner_state {
821829
RunnerState::Idle(..) |
@@ -1502,8 +1510,8 @@ unsafe extern "system" fn thread_event_target_callback<T>(
15021510
);
15031511
};
15041512
let in_modal_loop = {
1505-
let runner = subclass_input.event_loop_runner.borrow_mut();
1506-
if let ELRSharedOption::Runner(runner) = *runner {
1513+
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
1514+
if let Some(runner) = *runner {
15071515
(*runner).in_modal_loop
15081516
} else {
15091517
false
@@ -1537,8 +1545,8 @@ unsafe extern "system" fn thread_event_target_callback<T>(
15371545
}
15381546
}
15391547

1540-
let runner = subclass_input.event_loop_runner.borrow_mut();
1541-
if let ELRSharedOption::Runner(runner) = *runner {
1548+
let runner = subclass_input.event_loop_runner.runner.borrow_mut();
1549+
if let Some(runner) = *runner {
15421550
let runner = &mut *runner;
15431551
runner.events_cleared();
15441552
match runner.control_flow {

0 commit comments

Comments
 (0)