Skip to content

Commit 8f25eb6

Browse files
Desktop: Fix crash during shutdown caused by clipboard being dropped after the window (#3578)
Desktop: Fix crash during shutdown that was caused by clipboard
1 parent 42440c0 commit 8f25eb6

1 file changed

Lines changed: 18 additions & 4 deletions

File tree

desktop/src/window.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4753
impl 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

Comments
 (0)