summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rw-r--r--Cargo.toml2
-rw-r--r--src/clipboard.rs72
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<OsStr>,
- 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)
}