From acaf22d00548c39c5bc86eea58cf523508a9c3b6 Mon Sep 17 00:00:00 2001 From: Kirawi <67773714+kirawi@users.noreply.github.com> Date: Wed, 30 Jun 2021 04:11:56 -0400 Subject: [PATCH] Added native Windows clipboard support (#373) * Added native Windows clipboard support * make conditional wip better conditional wip wip wip wip make conditional --- Cargo.lock | 28 ++++++++++++++++++++++++++++ helix-view/Cargo.toml | 3 +++ helix-view/src/clipboard.rs | 27 ++++++++++++++++++++++++++- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 5dc6c44a3..473ae8c88 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,6 +100,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "clipboard-win" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4ea1881992efc993e4dc50a324cdbd03216e41bdc8385720ff47efc9bd2ca8" +dependencies = [ + "error-code", + "str-buf", + "winapi", +] + [[package]] name = "crossbeam-utils" version = "0.8.5" @@ -172,6 +183,16 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "error-code" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5115567ac25674e0043e472be13d14e537f37ea8aa4bdc4aef0c89add1db1ff" +dependencies = [ + "libc", + "str-buf", +] + [[package]] name = "etcetera" version = "0.3.2" @@ -383,6 +404,7 @@ dependencies = [ "anyhow", "bitflags", "chardetng", + "clipboard-win", "crossterm", "encoding_rs", "futures-util", @@ -871,6 +893,12 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" +[[package]] +name = "str-buf" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d44a3643b4ff9caf57abcee9c2c621d6c03d9135e0d8b589bd9afb5992cb176a" + [[package]] name = "syn" version = "1.0.73" diff --git a/helix-view/Cargo.toml b/helix-view/Cargo.toml index b43799527..cb2032de5 100644 --- a/helix-view/Cargo.toml +++ b/helix-view/Cargo.toml @@ -38,5 +38,8 @@ log = "~0.4" which = "4.1" +[target.'cfg(windows)'.dependencies] +clipboard-win = { version = "4.2", features = ["std"] } + [dev-dependencies] helix-tui = { path = "../helix-tui" } diff --git a/helix-view/src/clipboard.rs b/helix-view/src/clipboard.rs index e32933e31..401c0459c 100644 --- a/helix-view/src/clipboard.rs +++ b/helix-view/src/clipboard.rs @@ -77,7 +77,11 @@ pub fn get_clipboard_provider() -> Box { copy => "tmux", "load-buffer", "-"; } } else { - Box::new(provider::NopProvider) + #[cfg(target_os = "windows")] + return Box::new(provider::WindowsProvider); + + #[cfg(not(target_os = "windows"))] + return Box::new(provider::NopProvider); } } @@ -120,6 +124,27 @@ mod provider { } } + #[cfg(target_os = "windows")] + #[derive(Debug)] + pub struct WindowsProvider; + + #[cfg(target_os = "windows")] + impl ClipboardProvider for WindowsProvider { + fn name(&self) -> Cow { + Cow::Borrowed("clipboard-win") + } + + fn get_contents(&self) -> Result { + let contents = clipboard_win::get_clipboard(clipboard_win::formats::Unicode)?; + Ok(contents) + } + + fn set_contents(&self, contents: String) -> Result<()> { + clipboard_win::set_clipboard(clipboard_win::formats::Unicode, contents)?; + Ok(()) + } + } + #[derive(Debug)] pub struct CommandConfig { pub prg: &'static str,