Desktop: Fix crash during shutdown caused by clipboard being dropped after the window (#3578)
Desktop: Fix crash during shutdown that was caused by clipboard
This commit is contained in:
parent
42440c0d0b
commit
8f25eb6ca4
|
|
@ -41,7 +41,13 @@ pub(crate) struct Window {
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
native_handle: native::NativeWindowImpl,
|
native_handle: native::NativeWindowImpl,
|
||||||
custom_cursors: HashMap<CustomCursorSource, CustomCursor>,
|
custom_cursors: HashMap<CustomCursorSource, CustomCursor>,
|
||||||
clipboard: window_clipboard::Clipboard,
|
clipboard: Option<window_clipboard::Clipboard>,
|
||||||
|
}
|
||||||
|
impl Drop for Window {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
// Clipboard must be dropped before `winit_window`
|
||||||
|
drop(self.clipboard.take());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Window {
|
impl Window {
|
||||||
|
|
@ -62,7 +68,7 @@ impl Window {
|
||||||
|
|
||||||
let winit_window = event_loop.create_window(attributes).unwrap();
|
let winit_window = event_loop.create_window(attributes).unwrap();
|
||||||
let native_handle = native::NativeWindowImpl::new(winit_window.as_ref(), app_event_scheduler);
|
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 {
|
Self {
|
||||||
winit_window: winit_window.into(),
|
winit_window: winit_window.into(),
|
||||||
native_handle,
|
native_handle,
|
||||||
|
|
@ -158,7 +164,11 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn clipboard_read(&self) -> Option<String> {
|
pub(crate) fn clipboard_read(&self) -> Option<String> {
|
||||||
match self.clipboard.read() {
|
let Some(clipboard) = &self.clipboard else {
|
||||||
|
tracing::error!("Clipboard not available");
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
match clipboard.read() {
|
||||||
Ok(data) => Some(data),
|
Ok(data) => Some(data),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
tracing::error!("Failed to read from clipboard: {e}");
|
tracing::error!("Failed to read from clipboard: {e}");
|
||||||
|
|
@ -168,7 +178,11 @@ impl Window {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn clipboard_write(&mut self, data: String) {
|
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}")
|
tracing::error!("Failed to write to clipboard: {e}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue