@@ -41,7 +41,13 @@ pub(crate) struct Window {
4141 #[ allow( dead_code) ]
4242 native_handle : native:: NativeWindowImpl ,
4343 custom_cursors : HashMap < CustomCursorSource , CustomCursor > ,
44- clipboard : window_clipboard:: Clipboard ,
44+ clipboard : Option < window_clipboard:: Clipboard > ,
45+ }
46+ impl Drop for Window {
47+ fn drop ( & mut self ) {
48+ // Clipboard must be dropped before `winit_window`
49+ drop ( self . clipboard . take ( ) ) ;
50+ }
4551}
4652
4753impl Window {
@@ -62,7 +68,7 @@ impl Window {
6268
6369 let winit_window = event_loop. create_window ( attributes) . unwrap ( ) ;
6470 let native_handle = native:: NativeWindowImpl :: new ( winit_window. as_ref ( ) , app_event_scheduler) ;
65- let clipboard = unsafe { window_clipboard:: Clipboard :: connect ( & winit_window) } . expect ( "failed to create clipboard" ) ;
71+ let clipboard = unsafe { window_clipboard:: Clipboard :: connect ( & winit_window) } . ok ( ) ;
6672 Self {
6773 winit_window : winit_window. into ( ) ,
6874 native_handle,
@@ -158,7 +164,11 @@ impl Window {
158164 }
159165
160166 pub ( crate ) fn clipboard_read ( & self ) -> Option < String > {
161- match self . clipboard . read ( ) {
167+ let Some ( clipboard) = & self . clipboard else {
168+ tracing:: error!( "Clipboard not available" ) ;
169+ return None ;
170+ } ;
171+ match clipboard. read ( ) {
162172 Ok ( data) => Some ( data) ,
163173 Err ( e) => {
164174 tracing:: error!( "Failed to read from clipboard: {e}" ) ;
@@ -168,7 +178,11 @@ impl Window {
168178 }
169179
170180 pub ( crate ) fn clipboard_write ( & mut self , data : String ) {
171- if let Err ( e) = self . clipboard . write ( data) {
181+ let Some ( clipboard) = & mut self . clipboard else {
182+ tracing:: error!( "Clipboard not available" ) ;
183+ return ;
184+ } ;
185+ if let Err ( e) = clipboard. write ( data) {
172186 tracing:: error!( "Failed to write to clipboard: {e}" )
173187 }
174188 }
0 commit comments