diff --git a/desktop/src/window.rs b/desktop/src/window.rs index 1b049787..c140ed76 100644 --- a/desktop/src/window.rs +++ b/desktop/src/window.rs @@ -41,7 +41,13 @@ pub(crate) struct Window { #[allow(dead_code)] native_handle: native::NativeWindowImpl, custom_cursors: HashMap, - clipboard: window_clipboard::Clipboard, + clipboard: Option, +} +impl Drop for Window { + fn drop(&mut self) { + // Clipboard must be dropped before `winit_window` + drop(self.clipboard.take()); + } } impl Window { @@ -62,7 +68,7 @@ impl Window { let winit_window = event_loop.create_window(attributes).unwrap(); let native_handle = native::NativeWindowImpl::new(winit_window.as_ref(), app_event_scheduler); - let clipboard = unsafe { window_clipboard::Clipboard::connect(&winit_window) }.expect("failed to create clipboard"); + let clipboard = unsafe { window_clipboard::Clipboard::connect(&winit_window) }.ok(); Self { winit_window: winit_window.into(), native_handle, @@ -158,7 +164,11 @@ impl Window { } pub(crate) fn clipboard_read(&self) -> Option { - match self.clipboard.read() { + let Some(clipboard) = &self.clipboard else { + tracing::error!("Clipboard not available"); + return None; + }; + match clipboard.read() { Ok(data) => Some(data), Err(e) => { tracing::error!("Failed to read from clipboard: {e}"); @@ -168,7 +178,11 @@ impl Window { } pub(crate) fn clipboard_write(&mut self, data: String) { - if let Err(e) = self.clipboard.write(data) { + let Some(clipboard) = &mut self.clipboard else { + tracing::error!("Clipboard not available"); + return; + }; + if let Err(e) = clipboard.write(data) { tracing::error!("Failed to write to clipboard: {e}") } }