diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-10 02:26:25 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-10 02:27:41 +0300 |
| commit | 77fcde0a2736c3927d1bc589bd9b4d0173a9df46 (patch) | |
| tree | 209c704342fb52a7ecbb5fe0cdbc291f7650e720 /src/platform/macos.rs | |
| parent | 0facd819b4747c7634040b561509137c2608b024 (diff) | |
fix: support paste in modal inputs
refs #302
Diffstat (limited to 'src/platform/macos.rs')
| -rw-r--r-- | src/platform/macos.rs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/platform/macos.rs b/src/platform/macos.rs index 652b7a41..df957652 100644 --- a/src/platform/macos.rs +++ b/src/platform/macos.rs @@ -463,6 +463,40 @@ pub fn write_clipboard(bytes: &[u8]) -> bool { ) } +pub fn read_clipboard_text() -> Option<String> { + const MAX_CLIPBOARD_TEXT_BYTES: usize = 1024 * 1024; + + let mut child = Command::new("pbpaste") + .stdin(Stdio::null()) + .stdout(Stdio::piped()) + .stderr(Stdio::null()) + .spawn() + .ok()?; + let stdout = child.stdout.take()?; + let read = match read_limited_reader(stdout, MAX_CLIPBOARD_TEXT_BYTES) { + Ok(LimitedRead::Oversized) => { + let _ = child.kill(); + let _ = child.wait(); + return None; + } + Ok(read) => read, + Err(_) => { + let _ = child.kill(); + let _ = child.wait(); + return None; + } + }; + let status = child.wait().ok()?; + if !status.success() { + return None; + } + match read { + LimitedRead::Complete(bytes) => String::from_utf8(bytes).ok(), + LimitedRead::Empty => None, + LimitedRead::Oversized => unreachable!("oversized clipboard text is handled before wait"), + } +} + pub fn open_url(url: &str) -> std::io::Result<()> { Command::new("open") .arg(url) |
