diff --git a/Cargo.lock b/Cargo.lock
index e67a1b587..2652296ec 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -978,10 +978,15 @@ dependencies = [
"cacao",
"cc",
"dashmap",
+ "dirs 5.0.1",
+ "fsevent",
"fuser",
"hbb_common",
"lazy_static",
"libc",
+ "objc2 0.5.2",
+ "objc2-app-kit",
+ "objc2-foundation",
"once_cell",
"parking_lot",
"percent-encoding",
@@ -990,8 +995,10 @@ dependencies = [
"serde_derive",
"thiserror",
"utf16string",
+ "uuid",
"x11-clipboard 0.8.1",
"x11rb 0.12.0",
+ "xattr",
]
[[package]]
@@ -2218,6 +2225,25 @@ dependencies = [
"time 0.1.45",
]
+[[package]]
+name = "fsevent"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8836d1f147a0a195bf517a5fd211ea7023d19ced903135faf6c4504f2cf8775f"
+dependencies = [
+ "bitflags 1.3.2",
+ "fsevent-sys",
+]
+
+[[package]]
+name = "fsevent-sys"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2"
+dependencies = [
+ "libc",
+]
+
[[package]]
name = "fuchsia-cprng"
version = "0.1.1"
@@ -7999,6 +8025,17 @@ version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d"
+[[package]]
+name = "xattr"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e105d177a3871454f754b33bb0ee637ecaaac997446375fd3e5d43a2ed00c909"
+dependencies = [
+ "libc",
+ "linux-raw-sys 0.4.14",
+ "rustix 0.38.34",
+]
+
[[package]]
name = "xdg-home"
version = "1.2.0"
diff --git a/libs/clipboard/Cargo.toml b/libs/clipboard/Cargo.toml
index 9db2e5a99..afe2f2f31 100644
--- a/libs/clipboard/Cargo.toml
+++ b/libs/clipboard/Cargo.toml
@@ -47,3 +47,11 @@ fuser = {version = "0.15", default-features = false, optional = true}
[target.'cfg(target_os = "macos")'.dependencies]
cacao = {git="https://github.com/clslaid/cacao", branch = "feat/set-file-urls", optional = true}
+# Use `relax-void-encoding`, as that allows us to pass `c_void` instead of implementing `Encode` correctly for `&CGImageRef`
+objc2 = { version = "0.5.1", features = ["relax-void-encoding"] }
+objc2-foundation = { version = "0.2.0", features = ["NSArray", "NSString", "NSEnumerator", "NSGeometry", "NSProgress"] }
+objc2-app-kit = { version = "0.2.0", features = ["NSPasteboard", "NSPasteboardItem", "NSImage", "NSFilePromiseProvider"] }
+uuid = { version = "1.3", features = ["v4"] }
+fsevent = "2.1.2"
+dirs = "5.0"
+xattr = "1.4.0"
diff --git a/libs/clipboard/src/context_send.rs b/libs/clipboard/src/context_send.rs
index f3606509f..caa9d4a48 100644
--- a/libs/clipboard/src/context_send.rs
+++ b/libs/clipboard/src/context_send.rs
@@ -1,22 +1,29 @@
use hbb_common::{log, ResultType};
-use std::sync::Mutex;
+use std::{ops::Deref, sync::Mutex};
use crate::CliprdrServiceContext;
const CLIPBOARD_RESPONSE_WAIT_TIMEOUT_SECS: u32 = 30;
lazy_static::lazy_static! {
- static ref CONTEXT_SEND: ContextSend = ContextSend{addr: Mutex::new(None)};
+ static ref CONTEXT_SEND: ContextSend = ContextSend::default();
}
-pub struct ContextSend {
- addr: Mutex