From 1f129e6ef3c7b0c416de3b258a33b117c77dd137 Mon Sep 17 00:00:00 2001 From: rustdesk Date: Sun, 30 Jun 2024 17:05:09 +0800 Subject: [PATCH] change update_clipboard to threaded, since creating a context may take long --- Cargo.lock | 38 ++++++++++++++++++++++++++++++++++++-- Cargo.toml | 2 ++ src/client.rs | 4 ++-- src/client/io_loop.rs | 2 +- src/common.rs | 20 +++++++++++--------- 5 files changed, 52 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f532678fb..5449fad91 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -967,10 +967,24 @@ dependencies = [ "serde_derive", "thiserror", "utf16string", - "x11-clipboard", + "x11-clipboard 0.8.1", "x11rb 0.12.0", ] +[[package]] +name = "clipboard-master" +version = "4.0.0-beta.6" +source = "git+https://github.com/rustdesk-org/clipboard-master#38c0a5c0e5e0cab48abf1209900e3543487fc474" +dependencies = [ + "objc", + "objc-foundation", + "objc_id", + "windows-win", + "wl-clipboard-rs", + "x11-clipboard 0.9.2", + "x11rb 0.13.1", +] + [[package]] name = "clipboard-win" version = "5.3.1" @@ -5456,6 +5470,7 @@ dependencies = [ "cidr-utils", "clap 4.5.8", "clipboard", + "clipboard-master", "cocoa 0.24.1", "core-foundation 0.9.4", "core-graphics 0.22.3", @@ -5532,7 +5547,7 @@ dependencies = [ "winreg 0.11.0", "winres", "wol-rs", - "x11-clipboard", + "x11-clipboard 0.8.1", "x11rb 0.12.0", "zip", ] @@ -7571,6 +7586,15 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "windows-win" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58e23e33622b3b52f948049acbec9bcc34bf6e26d74176b88941f213c75cf2dc" +dependencies = [ + "error-code", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -7862,6 +7886,16 @@ dependencies = [ "x11rb 0.12.0", ] +[[package]] +name = "x11-clipboard" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98785a09322d7446e28a13203d2cae1059a0dd3dfb32cb06d0a225f023d8286" +dependencies = [ + "libc", + "x11rb 0.13.1", +] + [[package]] name = "x11-dl" version = "2.21.0" diff --git a/Cargo.toml b/Cargo.toml index 513057427..f40424caf 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -91,6 +91,8 @@ clipboard = { path = "libs/clipboard" } ctrlc = "3.2" # arboard = { version = "3.4.0", features = ["wayland-data-control"] } arboard = { git = "https://github.com/rustdesk-org/arboard", features = ["wayland-data-control"] } +clipboard-master = { git = "https://github.com/rustdesk-org/clipboard-master"} + system_shutdown = "4.0" qrcode-generator = "4.1" diff --git a/src/client.rs b/src/client.rs index 6f3d88c64..72de94069 100644 --- a/src/client.rs +++ b/src/client.rs @@ -144,8 +144,8 @@ const PUBLIC_SERVER: &str = "public"; #[inline] #[cfg(not(any(target_os = "android", target_os = "ios")))] -pub fn get_old_clipboard_text() -> &'static Arc> { - &OLD_CLIPBOARD_TEXT +pub fn get_old_clipboard_text() -> Arc> { + OLD_CLIPBOARD_TEXT.clone() } #[cfg(not(any(target_os = "android", target_os = "ios")))] diff --git a/src/client/io_loop.rs b/src/client/io_loop.rs index 987f2b814..a3d10fe3d 100644 --- a/src/client/io_loop.rs +++ b/src/client/io_loop.rs @@ -1180,7 +1180,7 @@ impl Remote { Some(message::Union::Clipboard(cb)) => { if !self.handler.lc.read().unwrap().disable_clipboard.v { #[cfg(not(any(target_os = "android", target_os = "ios")))] - update_clipboard(cb, Some(&crate::client::get_old_clipboard_text())); + update_clipboard(cb, Some(crate::client::get_old_clipboard_text())); #[cfg(any(target_os = "android", target_os = "ios"))] { let content = if cb.compress { diff --git a/src/common.rs b/src/common.rs index f5d6b4dbb..7568a762d 100644 --- a/src/common.rs +++ b/src/common.rs @@ -364,7 +364,7 @@ pub fn get_default_sound_input() -> Option { } #[cfg(not(any(target_os = "android", target_os = "ios")))] -pub fn update_clipboard(clipboard: Clipboard, old: Option<&Arc>>) { +fn update_clipboard_(clipboard: Clipboard, old: Option>>) { let content = if clipboard.compress { decompress(&clipboard.content) } else { @@ -378,7 +378,7 @@ pub fn update_clipboard(clipboard: Clipboard, old: Option<&Arc>>) match ClipboardContext::new() { Ok(mut ctx) => { let side = if old.is_none() { "host" } else { "client" }; - let old = if let Some(old) = old { old } else { &CONTENT }; + let old = if let Some(old) = old { old } else { CONTENT.clone() }; *old.lock().unwrap() = content.clone(); let _lock = ARBOARD_MTX.lock().unwrap(); allow_err!(ctx.set_text(content)); @@ -391,6 +391,13 @@ pub fn update_clipboard(clipboard: Clipboard, old: Option<&Arc>>) } } +#[cfg(not(any(target_os = "android", target_os = "ios")))] +pub fn update_clipboard(clipboard: Clipboard, old: Option>>) { + std::thread::spawn(move || { + update_clipboard_(clipboard, old); + }); +} + #[cfg(feature = "use_rubato")] pub fn resample_channels( data: &[f32], @@ -1519,6 +1526,8 @@ impl ClipboardContext { #[inline] #[cfg(any(target_os = "windows", target_os = "macos"))] pub fn new() -> ResultType { + let x: Option<()> = None; + x.unwrap(); Ok(ClipboardContext(arboard::Clipboard::new()?)) } @@ -1543,13 +1552,6 @@ impl ClipboardContext { } } - #[inline] - #[cfg(any(target_os = "windows", target_os = "macos"))] - pub fn get_text(&mut self) -> ResultType { - Ok(self.0.get_text()?) - } - - #[cfg(target_os = "linux")] pub fn get_text(&mut self) -> ResultType { Ok(self.0.get_text()?) }