From d4949a676b47e0240082a559360e6bb72e99dc73 Mon Sep 17 00:00:00 2001 From: JayceFayne <13365789+JayceFayne@users.noreply.github.com> Date: Wed, 17 Aug 2022 19:46:56 +0200 Subject: [PATCH] support copy to clipboard on wayland (#1233) --- CHANGELOG.md | 1 + Cargo.toml | 2 -- src/clipboard.rs | 72 ++++++++++++++++++++++-------------------------- 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4655363..aa1cda41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * use `GIT_DIR` and `GIT_WORK_DIR` from environment if set ([#1191](https://github.com/extrawurst/gitui/pull/1191)) * new [FAQ](./FAQ.md)s page * mention macports in install section [[@fs111](https://github.com/fs111)]([#1237](https://github.com/extrawurst/gitui/pull/1237)) +* support copy to clipboard on wayland ([#397](https://github.com/extrawurst/gitui/issues/397)) ### Fixed * opening tags list without remotes ([#1111](https://github.com/extrawurst/gitui/issues/1111)) diff --git a/Cargo.toml b/Cargo.toml index ad3f1c3d..7a20cf12 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -50,8 +50,6 @@ tui = { version = "0.18", default-features = false, features = ['crossterm', 'se unicode-segmentation = "1.9" unicode-truncate = "0.2" unicode-width = "0.1" - -[target.'cfg(all(target_family="unix",not(target_os="macos")))'.dependencies] which = "4.2" # pprof is not available on windows diff --git a/src/clipboard.rs b/src/clipboard.rs index a7ab23fa..fcb6af12 100644 --- a/src/clipboard.rs +++ b/src/clipboard.rs @@ -1,14 +1,20 @@ use anyhow::{anyhow, Result}; -#[cfg(target_family = "unix")] -#[cfg(not(target_os = "macos"))] -use std::ffi::OsStr; use std::io::Write; +use std::path::PathBuf; use std::process::{Command, Stdio}; +use which::which; -fn execute_copy_command(command: Command, text: &str) -> Result<()> { - let mut command = command; +fn exec_copy_with_args( + command: &str, + args: &[&str], + text: &str, +) -> Result<()> { + let binary = which(command) + .ok() + .unwrap_or_else(|| PathBuf::from(command)); - let mut process = command + let mut process = Command::new(binary) + .args(args) .stdin(Stdio::piped()) .stdout(Stdio::null()) .spawn() @@ -28,47 +34,35 @@ fn execute_copy_command(command: Command, text: &str) -> Result<()> { Ok(()) } -#[cfg(all(target_family = "unix", not(target_os = "macos")))] -fn gen_command( - path: impl AsRef, - xclip_syntax: bool, -) -> Command { - let mut c = Command::new(path); - if xclip_syntax { - c.arg("-selection"); - c.arg("clipboard"); - } else { - c.arg("--clipboard"); - } - c +fn exec_copy(command: &str, text: &str) -> Result<()> { + exec_copy_with_args(command, &[], text) } #[cfg(all(target_family = "unix", not(target_os = "macos")))] -pub fn copy_string(string: &str) -> Result<()> { - use std::path::PathBuf; - use which::which; - let (path, xclip_syntax) = which("xclip").ok().map_or_else( - || { - ( - which("xsel") - .ok() - .unwrap_or_else(|| PathBuf::from("xsel")), - false, - ) - }, - |path| (path, true), - ); +pub fn copy_string(text: &str) -> Result<()> { + if std::env::var("WAYLAND_DISPLAY").is_ok() { + return exec_copy("wl-copy", text); + } - let cmd = gen_command(path, xclip_syntax); - execute_copy_command(cmd, string) + if exec_copy_with_args( + "xclip", + &["-selection", "clipboard"], + text, + ) + .is_err() + { + return exec_copy_with_args("xsel", &["--clipboard"], text); + } + + Ok(()) } #[cfg(target_os = "macos")] -pub fn copy_string(string: &str) -> Result<()> { - execute_copy_command(Command::new("pbcopy"), string) +pub fn copy_string(text: &str) -> Result<()> { + exec_copy("pbcopy", text) } #[cfg(windows)] -pub fn copy_string(string: &str) -> Result<()> { - execute_copy_command(Command::new("clip"), string) +pub fn copy_string(text: &str) -> Result<()> { + exec_copy("clip", text) }