@@ -20,6 +20,7 @@ use std::sync::atomic::{AtomicBool, Ordering};
20
20
use std:: time:: { Duration , Instant } ;
21
21
use std:: rc:: Rc ;
22
22
use std:: cell:: RefCell ;
23
+ use std:: collections:: VecDeque ;
23
24
use parking_lot:: Mutex ;
24
25
use crossbeam_channel:: { self , Sender , Receiver } ;
25
26
@@ -122,11 +123,7 @@ pub(crate) struct SubclassInput<T> {
122
123
123
124
impl < T > SubclassInput < T > {
124
125
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) ;
130
127
}
131
128
}
132
129
@@ -137,11 +134,7 @@ struct ThreadMsgTargetSubclassInput<T> {
137
134
138
135
impl < T > ThreadMsgTargetSubclassInput < T > {
139
136
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) ;
145
138
}
146
139
}
147
140
@@ -163,7 +156,10 @@ impl<T> EventLoop<T> {
163
156
become_dpi_aware ( dpi_aware) ;
164
157
165
158
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
+ } ) ;
167
163
let ( thread_msg_target, thread_msg_sender) = thread_event_target_window ( runner_shared. clone ( ) ) ;
168
164
169
165
EventLoop {
@@ -201,15 +197,15 @@ impl<T> EventLoop<T> {
201
197
} ;
202
198
{
203
199
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
+ }
211
207
}
212
- * runner_shared = ELRSharedOption :: Runner ( & mut runner) ;
208
+ * runner_ref = Some ( & mut runner) ;
213
209
}
214
210
215
211
unsafe {
@@ -247,7 +243,7 @@ impl<T> EventLoop<T> {
247
243
}
248
244
249
245
unsafe { runner. call_event_handler ( Event :: LoopDestroyed ) }
250
- * self . runner_shared . borrow_mut ( ) = ELRSharedOption :: Buffer ( vec ! [ ] ) ;
246
+ * self . runner_shared . runner . borrow_mut ( ) = None ;
251
247
}
252
248
253
249
pub fn create_proxy ( & self ) -> EventLoopProxy < T > {
@@ -266,10 +262,10 @@ impl<T> EventLoop<T> {
266
262
}
267
263
}
268
264
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 > > >
273
269
}
274
270
pub ( crate ) struct EventLoopRunner < T > {
275
271
event_loop : * const EventLoop < T > ,
@@ -280,6 +276,18 @@ pub(crate) struct EventLoopRunner<T> {
280
276
event_handler : * mut FnMut ( Event < T > , & RootEventLoop < T > , & mut ControlFlow )
281
277
}
282
278
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
+
283
291
#[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
284
292
enum RunnerState {
285
293
/// 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>(
749
757
750
758
match msg {
751
759
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 {
754
762
( * runner) . in_modal_loop = true ;
755
763
}
756
764
0
757
765
} ,
758
766
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 {
761
769
( * runner) . in_modal_loop = false ;
762
770
}
763
771
0
@@ -791,8 +799,8 @@ unsafe extern "system" fn public_window_callback<T>(
791
799
792
800
_ if msg == * REQUEST_REDRAW_NO_NEWEVENTS_MSG_ID => {
793
801
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 {
796
804
let runner = & mut * runner;
797
805
match runner. runner_state {
798
806
RunnerState :: Idle ( ..) |
@@ -814,8 +822,8 @@ unsafe extern "system" fn public_window_callback<T>(
814
822
815
823
let mut send_event = false ;
816
824
{
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 {
819
827
let runner = & mut * runner;
820
828
match runner. runner_state {
821
829
RunnerState :: Idle ( ..) |
@@ -1502,8 +1510,8 @@ unsafe extern "system" fn thread_event_target_callback<T>(
1502
1510
) ;
1503
1511
} ;
1504
1512
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 {
1507
1515
( * runner) . in_modal_loop
1508
1516
} else {
1509
1517
false
@@ -1537,8 +1545,8 @@ unsafe extern "system" fn thread_event_target_callback<T>(
1537
1545
}
1538
1546
}
1539
1547
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 {
1542
1550
let runner = & mut * runner;
1543
1551
runner. events_cleared ( ) ;
1544
1552
match runner. control_flow {
0 commit comments