From e5bcfeaad531272aaedd472eeb122aaa6d409bf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E7=95=A5?= Date: Sat, 9 Sep 2023 09:47:27 +0800 Subject: [PATCH] patch: linux set clipboard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 蔡略 --- libs/clipboard/src/platform/fuse.rs | 10 ++++++++++ libs/clipboard/src/platform/linux/mod.rs | 19 +++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/libs/clipboard/src/platform/fuse.rs b/libs/clipboard/src/platform/fuse.rs index 06f3a1381..e78d865b0 100644 --- a/libs/clipboard/src/platform/fuse.rs +++ b/libs/clipboard/src/platform/fuse.rs @@ -555,6 +555,16 @@ impl FuseServer { return; } + // get files and directory path right in root of FUSE fs + pub fn list_root(&self) -> Vec { + let files = self.files.read(); + let mut paths = Vec::new(); + for file in files.iter().filter(|f| f.parent == Some(FUSE_ROOT_ID)) { + paths.push(PathBuf::from(&file.name)); + } + paths + } + /// gc filesystem fn gc_files(&self) { { diff --git a/libs/clipboard/src/platform/linux/mod.rs b/libs/clipboard/src/platform/linux/mod.rs index fa0da68cf..57a5f41e5 100644 --- a/libs/clipboard/src/platform/linux/mod.rs +++ b/libs/clipboard/src/platform/linux/mod.rs @@ -362,6 +362,13 @@ impl ClipboardContext { }) } + /// set clipboard data from file list + pub fn set_clipboard(&self, paths: &[PathBuf]) -> Result<(), CliprdrError> { + let prefix = self.fuse_mount_point.clone(); + let paths: Vec = paths.iter().cloned().map(|p| prefix.join(p)).collect(); + self.clipboard.set_file_list(&paths) + } + pub fn listen_clipboard(&self) -> Result<(), CliprdrError> { while let Ok(v) = self.clipboard.wait_file_list() { let filtered: Vec<_> = v @@ -663,8 +670,16 @@ impl ClipboardContext { } Ok(()) } - ClipboardFile::FormatDataResponse { .. } - | ClipboardFile::FileContentsResponse { .. } => { + ClipboardFile::FormatDataResponse { .. } => { + // we don't know its corresponding request, no resend can be performed + + self.fuse_server.recv(conn_id, msg); + let paths = self.fuse_server.list_root(); + self.set_clipboard(&paths)?; + Ok(()) + } + ClipboardFile::FileContentsResponse { .. } => { + // we don't know its corresponding request, no resend can be performed self.fuse_server.recv(conn_id, msg); Ok(()) }