@@ -182,35 +182,44 @@ impl<T> EventLoop<T> {
182182 }
183183 }
184184
185- pub fn run < F > ( self , mut event_handler : F ) -> !
185+ pub fn run < F > ( mut self , event_handler : F ) -> !
186186 where F : ' static + FnMut ( Event < T > , & :: EventLoop < T > , & mut ControlFlow )
187187 {
188- unsafe {
189- winuser:: IsGUIThread ( 1 ) ;
188+ self . run_return ( event_handler) ;
189+ :: std:: process:: exit ( 0 ) ;
190+ }
190191
191- let mut runner = EventLoopRunner {
192- event_loop : :: EventLoop {
193- events_loop : self ,
194- _marker : :: std:: marker:: PhantomData
195- } ,
196- control_flow : ControlFlow :: default ( ) ,
197- runner_state : RunnerState :: New ,
198- modal_loop_data : None ,
199- event_handler : & mut event_handler
200- } ;
201- {
202- let runner_shared = runner. event_loop . events_loop . runner_shared . clone ( ) ;
203- let mut runner_shared = runner_shared. borrow_mut ( ) ;
204- let mut event_buffer = vec ! [ ] ;
205- if let ELRSharedOption :: Buffer ( ref mut buffer) = * runner_shared {
206- mem:: swap ( buffer, & mut event_buffer) ;
207- }
208- for event in event_buffer. drain ( ..) {
209- runner. process_event ( event) ;
210- }
211- * runner_shared = ELRSharedOption :: Runner ( & mut runner) ;
192+ pub fn run_return < F > ( & mut self , mut event_handler : F )
193+ where F : FnMut ( Event < T > , & :: EventLoop < T > , & mut ControlFlow )
194+ {
195+ unsafe { winuser:: IsGUIThread ( 1 ) ; }
196+ let mut runner = EventLoopRunner {
197+ event_loop : self ,
198+ control_flow : ControlFlow :: default ( ) ,
199+ runner_state : RunnerState :: New ,
200+ modal_loop_data : None ,
201+ event_handler : unsafe {
202+ // Transmute used to erase lifetimes.
203+ mem:: transmute :: <
204+ & mut FnMut ( Event < T > , & :: EventLoop < T > , & mut ControlFlow ) ,
205+ * mut FnMut ( Event < T > , & :: EventLoop < T > , & mut ControlFlow )
206+ > ( & mut event_handler)
212207 }
208+ } ;
209+ {
210+ let runner_shared = self . runner_shared . clone ( ) ;
211+ let mut runner_shared = runner_shared. borrow_mut ( ) ;
212+ let mut event_buffer = vec ! [ ] ;
213+ if let ELRSharedOption :: Buffer ( ref mut buffer) = * runner_shared {
214+ mem:: swap ( buffer, & mut event_buffer) ;
215+ }
216+ for event in event_buffer. drain ( ..) {
217+ unsafe { runner. process_event ( event) ; }
218+ }
219+ * runner_shared = ELRSharedOption :: Runner ( & mut runner) ;
220+ }
213221
222+ unsafe {
214223 let timer_handle = winuser:: SetTimer ( ptr:: null_mut ( ) , 0 , 0x7FFFFFFF , None ) ;
215224
216225 let mut msg = mem:: uninitialized ( ) ;
@@ -253,13 +262,10 @@ impl<T> EventLoop<T> {
253262 ControlFlow :: Poll => ( )
254263 }
255264 }
256-
257- runner. call_event_handler ( Event :: LoopDestroyed ) ;
258- * runner. event_loop . events_loop . runner_shared . borrow_mut ( ) = ELRSharedOption :: Buffer ( vec ! [ ] ) ;
259265 }
260266
261- drop ( event_handler ) ;
262- :: std :: process :: exit ( 0 ) ;
267+ unsafe { runner . call_event_handler ( Event :: LoopDestroyed ) }
268+ * self . runner_shared . borrow_mut ( ) = ELRSharedOption :: Buffer ( vec ! [ ] ) ;
263269 }
264270
265271 pub fn create_proxy ( & self ) -> EventLoopProxy < T > {
@@ -284,7 +290,7 @@ pub(crate) enum ELRSharedOption<T> {
284290 Buffer ( Vec < Event < T > > )
285291}
286292pub ( crate ) struct EventLoopRunner < T > {
287- event_loop : :: EventLoop < T > ,
293+ event_loop : * const EventLoop < T > ,
288294 control_flow : ControlFlow ,
289295 runner_state : RunnerState ,
290296 modal_loop_data : Option < ModalLoopData > ,
@@ -457,15 +463,18 @@ impl<T> EventLoopRunner<T> {
457463 unsafe fn call_event_handler ( & mut self , event : Event < T > ) {
458464 if self . event_handler != mem:: zeroed ( ) {
459465 match event {
460- Event :: NewEvents ( _) => self . event_loop . events_loop . trigger_newevents_on_redraw . store ( true , Ordering :: Relaxed ) ,
461- Event :: EventsCleared => self . event_loop . events_loop . trigger_newevents_on_redraw . store ( false , Ordering :: Relaxed ) ,
466+ Event :: NewEvents ( _) => ( * self . event_loop ) . trigger_newevents_on_redraw . store ( true , Ordering :: Relaxed ) ,
467+ Event :: EventsCleared => ( * self . event_loop ) . trigger_newevents_on_redraw . store ( false , Ordering :: Relaxed ) ,
462468 _ => ( )
463469 }
464470
471+ assert_eq ! ( mem:: size_of:: <:: EventLoop <T >>( ) , mem:: size_of:: <EventLoop <T >>( ) ) ;
472+ let event_loop_ref = & * ( self . event_loop as * const :: EventLoop < T > ) ;
473+
465474 if self . control_flow != ControlFlow :: Exit {
466- ( * self . event_handler ) ( event, & self . event_loop , & mut self . control_flow ) ;
475+ ( * self . event_handler ) ( event, event_loop_ref , & mut self . control_flow ) ;
467476 } else {
468- ( * self . event_handler ) ( event, & self . event_loop , & mut ControlFlow :: Exit ) ;
477+ ( * self . event_handler ) ( event, event_loop_ref , & mut ControlFlow :: Exit ) ;
469478 }
470479 } else {
471480 panic ! ( "Tried to call event handler with null handler" ) ;
0 commit comments