Added native Windows clipboard support (#373)

* Added native Windows clipboard support

* make conditional

wip

better conditional

wip

wip

wip

wip

make conditional
This commit is contained in:
Kirawi 2021-06-30 04:11:56 -04:00 committed by GitHub
parent b39e452d77
commit acaf22d005
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 57 additions and 1 deletions

28
Cargo.lock generated
View file

@ -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"

View file

@ -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" }

View file

@ -77,7 +77,11 @@ pub fn get_clipboard_provider() -> Box<dyn ClipboardProvider> {
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<str> {
Cow::Borrowed("clipboard-win")
}
fn get_contents(&self) -> Result<String> {
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,