@@ -22,6 +22,7 @@ use std::time::{Duration, Instant};
2222use std:: rc:: Rc ;
2323use std:: cell:: RefCell ;
2424use std:: collections:: VecDeque ;
25+ use std:: marker:: PhantomData ;
2526use parking_lot:: Mutex ;
2627
2728use winapi:: ctypes:: c_int;
@@ -43,7 +44,7 @@ use winapi::um::winnt::{LONG, LPCSTR, SHORT};
4344
4445use window:: WindowId as RootWindowId ;
4546use monitor:: MonitorHandle ;
46- use event_loop:: { ControlFlow , EventLoop as RootEventLoop , EventLoopClosed } ;
47+ use event_loop:: { ControlFlow , EventLoopWindowTarget as RootELW , EventLoopClosed } ;
4748use dpi:: { LogicalPosition , LogicalSize , PhysicalSize } ;
4849use event:: { DeviceEvent , Touch , TouchPhase , StartCause , KeyboardInput , Event , WindowEvent } ;
4950use platform_impl:: platform:: { event, Cursor , WindowId , DEVICE_ID , wrap_device_id, util} ;
@@ -138,11 +139,15 @@ impl<T> ThreadMsgTargetSubclassInput<T> {
138139 }
139140}
140141
141- pub struct EventLoop < T > {
142+ pub struct EventLoop < T : ' static > {
142143 // Id of the background thread from the Win32 API.
143- thread_id : DWORD ,
144144 thread_msg_target : HWND ,
145145 thread_msg_sender : Sender < T > ,
146+ window_target : RootELW < T >
147+ }
148+
149+ pub struct EventLoopWindowTarget < T > {
150+ thread_id : DWORD ,
146151 trigger_newevents_on_redraw : Arc < AtomicBool > ,
147152 pub ( crate ) runner_shared : EventLoopRunnerShared < T > ,
148153}
@@ -152,6 +157,10 @@ impl<T: 'static> EventLoop<T> {
152157 Self :: with_dpi_awareness ( true )
153158 }
154159
160+ pub fn window_target ( & self ) -> & RootELW < T > {
161+ & self . window_target
162+ }
163+
155164 pub fn with_dpi_awareness ( dpi_aware : bool ) -> EventLoop < T > {
156165 become_dpi_aware ( dpi_aware) ;
157166
@@ -163,37 +172,40 @@ impl<T: 'static> EventLoop<T> {
163172 let ( thread_msg_target, thread_msg_sender) = thread_event_target_window ( runner_shared. clone ( ) ) ;
164173
165174 EventLoop {
166- thread_id,
167175 thread_msg_target, thread_msg_sender,
168- trigger_newevents_on_redraw : Arc :: new ( AtomicBool :: new ( true ) ) ,
169- runner_shared
176+ window_target : RootELW {
177+ p : EventLoopWindowTarget {
178+ thread_id,
179+ trigger_newevents_on_redraw : Arc :: new ( AtomicBool :: new ( true ) ) ,
180+ runner_shared
181+ } ,
182+ _marker : PhantomData
183+ }
170184 }
171185 }
172186
173187 pub fn run < F > ( mut self , event_handler : F ) -> !
174- where F : ' static + FnMut ( Event < T > , & RootEventLoop < T > , & mut ControlFlow )
188+ where F : ' static + FnMut ( Event < T > , & RootELW < T > , & mut ControlFlow )
175189 {
176190 self . run_return ( event_handler) ;
177191 :: std:: process:: exit ( 0 ) ;
178192 }
179193
180194 pub fn run_return < F > ( & mut self , mut event_handler : F )
181- where F : FnMut ( Event < T > , & RootEventLoop < T > , & mut ControlFlow )
195+ where F : FnMut ( Event < T > , & RootELW < T > , & mut ControlFlow )
182196 {
183197 unsafe { winuser:: IsGUIThread ( 1 ) ; }
184198
185- assert_eq ! ( mem:: size_of:: <RootEventLoop <T >>( ) , mem:: size_of:: <EventLoop <T >>( ) ) ;
186- let self_ptr = self as * const EventLoop < T > ;
199+ let event_loop_windows_ref = & self . window_target ;
187200
188201 let mut runner = unsafe { EventLoopRunner :: new (
189202 self ,
190203 move |event, control_flow| {
191- let event_loop_ref = & * ( self_ptr as * const RootEventLoop < T > ) ;
192- event_handler ( event, event_loop_ref, control_flow)
204+ event_handler ( event, event_loop_windows_ref, control_flow)
193205 }
194206 ) } ;
195207 {
196- let runner_shared = self . runner_shared . clone ( ) ;
208+ let runner_shared = self . window_target . p . runner_shared . clone ( ) ;
197209 let mut runner_ref = runner_shared. runner . borrow_mut ( ) ;
198210 loop {
199211 let event = runner_shared. buffer . borrow_mut ( ) . pop_front ( ) ;
@@ -206,7 +218,7 @@ impl<T: 'static> EventLoop<T> {
206218 }
207219
208220 macro_rules! runner {
209- ( ) => { { self . runner_shared. runner. borrow_mut( ) . as_mut( ) . unwrap( ) } } ;
221+ ( ) => { { self . window_target . p . runner_shared. runner. borrow_mut( ) . as_mut( ) . unwrap( ) } } ;
210222 }
211223
212224 unsafe {
@@ -244,7 +256,7 @@ impl<T: 'static> EventLoop<T> {
244256 }
245257
246258 runner ! ( ) . call_event_handler ( Event :: LoopDestroyed ) ;
247- * self . runner_shared . runner . borrow_mut ( ) = None ;
259+ * self . window_target . p . runner_shared . runner . borrow_mut ( ) = None ;
248260 }
249261
250262 pub fn create_proxy ( & self ) -> EventLoopProxy < T > {
@@ -253,7 +265,9 @@ impl<T: 'static> EventLoop<T> {
253265 event_send : self . thread_msg_sender . clone ( )
254266 }
255267 }
268+ }
256269
270+ impl < T > EventLoopWindowTarget < T > {
257271 #[ inline( always) ]
258272 pub ( crate ) fn create_thread_executor ( & self ) -> EventLoopThreadExecutor {
259273 EventLoopThreadExecutor {
@@ -309,7 +323,7 @@ impl<T> EventLoopRunner<T> {
309323 where F : FnMut ( Event < T > , & mut ControlFlow )
310324 {
311325 EventLoopRunner {
312- trigger_newevents_on_redraw : event_loop. trigger_newevents_on_redraw . clone ( ) ,
326+ trigger_newevents_on_redraw : event_loop. window_target . p . trigger_newevents_on_redraw . clone ( ) ,
313327 control_flow : ControlFlow :: default ( ) ,
314328 runner_state : RunnerState :: New ,
315329 in_modal_loop : false ,
@@ -545,8 +559,6 @@ impl<T> Drop for EventLoop<T> {
545559 fn drop ( & mut self ) {
546560 unsafe {
547561 winuser:: DestroyWindow ( self . thread_msg_target ) ;
548- // Posting `WM_QUIT` will cause `GetMessage` to stop.
549- winuser:: PostThreadMessageA ( self . thread_id , winuser:: WM_QUIT , 0 , 0 ) ;
550562 }
551563 }
552564}
0 commit comments