aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgavynriebau2023-01-16 07:13:48 +0000
committerGitHub2023-01-16 07:13:48 +0000
commitcce19713fb970df1a96be7e76e3217e4e50efc42 (patch)
tree0c6b22c0ef42aa44d9f651931eebd83a299fa45e
parentb6331394a3f341ad21f8fad3e6e0b93becda9ce5 (diff)
Fix for lost clipboard contents (#5424) (#5426)
* Fix for lost clipboard contents (#5424) * PR feedback: Call "setsid" for all unix systems * PR Feedback: Only install libc for unix targets
-rw-r--r--Cargo.lock1
-rw-r--r--helix-view/Cargo.toml3
-rw-r--r--helix-view/src/clipboard.rs21
3 files changed, 22 insertions, 3 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 69ba8444..ede4ae0d 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1274,6 +1274,7 @@ dependencies = [
"helix-lsp",
"helix-tui",
"helix-vcs",
+ "libc",
"log",
"once_cell",
"serde",
diff --git a/helix-view/Cargo.toml b/helix-view/Cargo.toml
index e7a20496..7d130317 100644
--- a/helix-view/Cargo.toml
+++ b/helix-view/Cargo.toml
@@ -48,5 +48,8 @@ which = "4.2"
[target.'cfg(windows)'.dependencies]
clipboard-win = { version = "4.5", features = ["std"] }
+[target.'cfg(unix)'.dependencies]
+libc = "0.2"
+
[dev-dependencies]
helix-tui = { path = "../helix-tui" }
diff --git a/helix-view/src/clipboard.rs b/helix-view/src/clipboard.rs
index 4f83fb4d..3c620c14 100644
--- a/helix-view/src/clipboard.rs
+++ b/helix-view/src/clipboard.rs
@@ -276,12 +276,27 @@ pub mod provider {
let stdin = input.map(|_| Stdio::piped()).unwrap_or_else(Stdio::null);
let stdout = pipe_output.then(Stdio::piped).unwrap_or_else(Stdio::null);
- let mut child = Command::new(self.prg)
+ let mut command: Command = Command::new(self.prg);
+
+ let mut command_mut: &mut Command = command
.args(self.args)
.stdin(stdin)
.stdout(stdout)
- .stderr(Stdio::null())
- .spawn()?;
+ .stderr(Stdio::null());
+
+ // Fix for https://github.com/helix-editor/helix/issues/5424
+ if cfg!(unix) {
+ use std::os::unix::process::CommandExt;
+
+ unsafe {
+ command_mut = command_mut.pre_exec(|| match libc::setsid() {
+ -1 => Err(std::io::Error::last_os_error()),
+ _ => Ok(()),
+ });
+ }
+ }
+
+ let mut child = command_mut.spawn()?;
if let Some(input) = input {
let mut stdin = child.stdin.take().context("stdin is missing")?;