@@ -17,12 +17,12 @@ use winapi::shared::basetsd::UINT_PTR;
17
17
use std:: { mem, ptr} ;
18
18
use std:: sync:: Arc ;
19
19
use std:: sync:: atomic:: { AtomicBool , Ordering } ;
20
+ use std:: sync:: mpsc:: { self , Sender , Receiver } ;
20
21
use std:: time:: { Duration , Instant } ;
21
22
use std:: rc:: Rc ;
22
23
use std:: cell:: RefCell ;
23
24
use std:: collections:: VecDeque ;
24
25
use parking_lot:: Mutex ;
25
- use crossbeam_channel:: { self , Sender , Receiver } ;
26
26
27
27
use winapi:: ctypes:: c_int;
28
28
use winapi:: shared:: minwindef:: {
@@ -147,7 +147,7 @@ pub struct EventLoop<T> {
147
147
pub ( crate ) runner_shared : EventLoopRunnerShared < T > ,
148
148
}
149
149
150
- impl < T > EventLoop < T > {
150
+ impl < T : ' static > EventLoop < T > {
151
151
pub fn new ( ) -> EventLoop < T > {
152
152
Self :: with_dpi_awareness ( true )
153
153
}
@@ -181,27 +181,24 @@ impl<T> EventLoop<T> {
181
181
where F : FnMut ( Event < T > , & RootEventLoop < T > , & mut ControlFlow )
182
182
{
183
183
unsafe { winuser:: IsGUIThread ( 1 ) ; }
184
- let mut runner = EventLoopRunner {
185
- event_loop : self ,
186
- control_flow : ControlFlow :: default ( ) ,
187
- runner_state : RunnerState :: New ,
188
- in_modal_loop : false ,
189
- modal_redraw_window : self . thread_msg_target ,
190
- event_handler : unsafe {
191
- // Transmute used to erase lifetimes.
192
- mem:: transmute :: <
193
- & mut FnMut ( Event < T > , & RootEventLoop < T > , & mut ControlFlow ) ,
194
- * mut FnMut ( Event < T > , & RootEventLoop < T > , & mut ControlFlow )
195
- > ( & mut event_handler)
184
+
185
+ assert_eq ! ( mem:: size_of:: <RootEventLoop <T >>( ) , mem:: size_of:: <EventLoop <T >>( ) ) ;
186
+ let self_ptr = self as * const EventLoop < T > ;
187
+
188
+ let mut runner = unsafe { EventLoopRunner :: new (
189
+ self ,
190
+ move |event, control_flow| {
191
+ let event_loop_ref = & * ( self_ptr as * const RootEventLoop < T > ) ;
192
+ event_handler ( event, event_loop_ref, control_flow)
196
193
}
197
- } ;
194
+ ) } ;
198
195
{
199
196
let runner_shared = self . runner_shared . clone ( ) ;
200
197
let mut runner_ref = runner_shared. runner . borrow_mut ( ) ;
201
198
loop {
202
199
let event = runner_shared. buffer . borrow_mut ( ) . pop_front ( ) ;
203
200
match event {
204
- Some ( e) => unsafe { runner. process_event ( e) ; } ,
201
+ Some ( e) => { runner. process_event ( e) ; } ,
205
202
None => break
206
203
}
207
204
}
@@ -246,7 +243,7 @@ impl<T> EventLoop<T> {
246
243
}
247
244
}
248
245
249
- unsafe { runner ! ( ) . call_event_handler ( Event :: LoopDestroyed ) }
246
+ runner ! ( ) . call_event_handler ( Event :: LoopDestroyed ) ;
250
247
* self . runner_shared . runner . borrow_mut ( ) = None ;
251
248
}
252
249
@@ -272,16 +269,16 @@ pub(crate) struct ELRShared<T> {
272
269
buffer : RefCell < VecDeque < Event < T > > >
273
270
}
274
271
pub ( crate ) struct EventLoopRunner < T > {
275
- event_loop : * const EventLoop < T > ,
272
+ trigger_newevents_on_redraw : Arc < AtomicBool > ,
276
273
control_flow : ControlFlow ,
277
274
runner_state : RunnerState ,
278
275
modal_redraw_window : HWND ,
279
276
in_modal_loop : bool ,
280
- event_handler : * mut FnMut ( Event < T > , & RootEventLoop < T > , & mut ControlFlow )
277
+ event_handler : Box < FnMut ( Event < T > , & mut ControlFlow ) >
281
278
}
282
279
283
280
impl < T > ELRShared < T > {
284
- unsafe fn send_event ( & self , event : Event < T > ) {
281
+ pub ( crate ) unsafe fn send_event ( & self , event : Event < T > ) {
285
282
if let Ok ( mut runner_ref) = self . runner . try_borrow_mut ( ) {
286
283
if let Some ( ref mut runner) = * runner_ref {
287
284
runner. process_event ( event) ;
@@ -308,7 +305,23 @@ enum RunnerState {
308
305
}
309
306
310
307
impl < T > EventLoopRunner < T > {
311
- unsafe fn new_events ( & mut self ) {
308
+ unsafe fn new < F > ( event_loop : & EventLoop < T > , f : F ) -> EventLoopRunner < T >
309
+ where F : FnMut ( Event < T > , & mut ControlFlow )
310
+ {
311
+ EventLoopRunner {
312
+ trigger_newevents_on_redraw : event_loop. trigger_newevents_on_redraw . clone ( ) ,
313
+ control_flow : ControlFlow :: default ( ) ,
314
+ runner_state : RunnerState :: New ,
315
+ in_modal_loop : false ,
316
+ modal_redraw_window : event_loop. thread_msg_target ,
317
+ event_handler : mem:: transmute :: <
318
+ Box < FnMut ( Event < T > , & mut ControlFlow ) > ,
319
+ Box < FnMut ( Event < T > , & mut ControlFlow ) >
320
+ > ( Box :: new ( f) )
321
+ }
322
+ }
323
+
324
+ fn new_events ( & mut self ) {
312
325
self . runner_state = match self . runner_state {
313
326
// If we're already handling events or have deferred `NewEvents`, we don't need to do
314
327
// do any processing.
@@ -359,19 +372,21 @@ impl<T> EventLoopRunner<T> {
359
372
} ;
360
373
}
361
374
362
- unsafe fn process_event ( & mut self , event : Event < T > ) {
375
+ fn process_event ( & mut self , event : Event < T > ) {
363
376
// If we're in the modal loop, we need to have some mechanism for finding when the event
364
377
// queue has been cleared so we can call `events_cleared`. Windows doesn't give any utilities
365
378
// for doing this, but it DOES guarantee that WM_PAINT will only occur after input events have
366
379
// been processed. So, we send WM_PAINT to a dummy window which calls `events_cleared` when
367
380
// the events queue has been emptied.
368
381
if self . in_modal_loop {
369
- winuser:: RedrawWindow (
370
- self . modal_redraw_window ,
371
- ptr:: null ( ) ,
372
- ptr:: null_mut ( ) ,
373
- winuser:: RDW_INTERNALPAINT
374
- ) ;
382
+ unsafe {
383
+ winuser:: RedrawWindow (
384
+ self . modal_redraw_window ,
385
+ ptr:: null ( ) ,
386
+ ptr:: null_mut ( ) ,
387
+ winuser:: RDW_INTERNALPAINT
388
+ ) ;
389
+ }
375
390
}
376
391
377
392
// If new event processing has to be done (i.e. call NewEvents or defer), do it. If we're
@@ -419,7 +434,7 @@ impl<T> EventLoopRunner<T> {
419
434
self . call_event_handler ( event) ;
420
435
}
421
436
422
- unsafe fn events_cleared ( & mut self ) {
437
+ fn events_cleared ( & mut self ) {
423
438
match self . runner_state {
424
439
// If we were handling events, send the EventsCleared message.
425
440
RunnerState :: HandlingEvents => {
@@ -462,20 +477,18 @@ impl<T> EventLoopRunner<T> {
462
477
}
463
478
}
464
479
465
- unsafe fn call_event_handler ( & mut self , event : Event < T > ) {
480
+ fn call_event_handler ( & mut self , event : Event < T > ) {
466
481
match event {
467
- Event :: NewEvents ( _) => ( * self . event_loop ) . trigger_newevents_on_redraw . store ( true , Ordering :: Relaxed ) ,
468
- Event :: EventsCleared => ( * self . event_loop ) . trigger_newevents_on_redraw . store ( false , Ordering :: Relaxed ) ,
482
+ Event :: NewEvents ( _) => self . trigger_newevents_on_redraw . store ( true , Ordering :: Relaxed ) ,
483
+ Event :: EventsCleared => self . trigger_newevents_on_redraw . store ( false , Ordering :: Relaxed ) ,
469
484
_ => ( )
470
485
}
471
486
472
- assert_eq ! ( mem:: size_of:: <RootEventLoop <T >>( ) , mem:: size_of:: <EventLoop <T >>( ) ) ;
473
- let event_loop_ref = & * ( self . event_loop as * const RootEventLoop < T > ) ;
474
487
475
488
if self . control_flow != ControlFlow :: Exit {
476
- ( * self . event_handler ) ( event, event_loop_ref , & mut self . control_flow ) ;
489
+ ( * self . event_handler ) ( event, & mut self . control_flow ) ;
477
490
} else {
478
- ( * self . event_handler ) ( event, event_loop_ref , & mut ControlFlow :: Exit ) ;
491
+ ( * self . event_handler ) ( event, & mut ControlFlow :: Exit ) ;
479
492
}
480
493
}
481
494
}
@@ -699,7 +712,7 @@ fn thread_event_target_window<T>(event_loop_runner: EventLoopRunnerShared<T>) ->
699
712
( winuser:: WS_VISIBLE | winuser:: WS_POPUP ) as _
700
713
) ;
701
714
702
- let ( tx, rx) = crossbeam_channel :: unbounded ( ) ;
715
+ let ( tx, rx) = mpsc :: channel ( ) ;
703
716
704
717
let subclass_input = ThreadMsgTargetSubclassInput {
705
718
event_loop_runner,
0 commit comments