@@ -31,19 +31,13 @@ use crate::x11::visual_info::WindowVisualConfig;
3131
3232pub struct WindowHandle {
3333 raw_window_handle : Option < RawWindowHandle > ,
34- close_requested : Arc < AtomicBool > ,
34+ close_requested : mpsc :: SyncSender < ( ) > ,
3535 is_open : Arc < AtomicBool > ,
3636}
3737
3838impl WindowHandle {
3939 pub fn close ( & mut self ) {
40- if self . raw_window_handle . take ( ) . is_some ( ) {
41- // FIXME: This will need to be changed from just setting an atomic to somehow
42- // synchronizing with the window being closed (using a synchronous channel, or
43- // by joining on the event loop thread).
44-
45- self . close_requested . store ( true , Ordering :: Relaxed ) ;
46- }
40+ self . close_requested . send ( ( ) ) . ok ( ) ;
4741 }
4842
4943 pub fn is_open ( & self ) -> bool {
@@ -64,26 +58,26 @@ unsafe impl HasRawWindowHandle for WindowHandle {
6458}
6559
6660pub ( crate ) struct ParentHandle {
67- close_requested : Arc < AtomicBool > ,
61+ close_requested : mpsc :: Receiver < ( ) > ,
6862 is_open : Arc < AtomicBool > ,
6963}
7064
7165impl ParentHandle {
7266 pub fn new ( ) -> ( Self , WindowHandle ) {
73- let close_requested = Arc :: new ( AtomicBool :: new ( false ) ) ;
67+ let ( close_sender , close_receiver ) = mpsc :: sync_channel ( 0 ) ;
7468 let is_open = Arc :: new ( AtomicBool :: new ( true ) ) ;
7569
7670 let handle = WindowHandle {
7771 raw_window_handle : None ,
78- close_requested : Arc :: clone ( & close_requested ) ,
72+ close_requested : close_sender ,
7973 is_open : Arc :: clone ( & is_open) ,
8074 } ;
8175
82- ( Self { close_requested, is_open } , handle)
76+ ( Self { close_requested : close_receiver , is_open } , handle)
8377 }
8478
8579 pub fn parent_did_drop ( & self ) -> bool {
86- self . close_requested . load ( Ordering :: Relaxed )
80+ self . close_requested . try_recv ( ) . is_ok ( )
8781 }
8882}
8983
0 commit comments