aboutsummaryrefslogtreecommitdiff
path: root/src/platform/macos.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-06-10 02:26:25 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-06-10 02:27:41 +0300
commit77fcde0a2736c3927d1bc589bd9b4d0173a9df46 (patch)
tree209c704342fb52a7ecbb5fe0cdbc291f7650e720 /src/platform/macos.rs
parent0facd819b4747c7634040b561509137c2608b024 (diff)
fix: support paste in modal inputs
refs #302
Diffstat (limited to 'src/platform/macos.rs')
-rw-r--r--src/platform/macos.rs34
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)