Skip to main content

fenestra_shell/
os_clipboard.rs

1//! The OS clipboard (arboard), injected into `FrameState` by the windowed
2//! runner. Headless rendering keeps core's in-memory clipboard.
3
4use fenestra_core::Clipboard;
5
6/// Lazy arboard wrapper; failures (no display server) degrade to a no-op.
7#[derive(Default)]
8pub struct OsClipboard {
9    inner: Option<arboard::Clipboard>,
10}
11
12impl OsClipboard {
13    fn ensure(&mut self) -> Option<&mut arboard::Clipboard> {
14        if self.inner.is_none() {
15            self.inner = arboard::Clipboard::new().ok();
16        }
17        self.inner.as_mut()
18    }
19}
20
21impl Clipboard for OsClipboard {
22    fn get(&mut self) -> Option<String> {
23        self.ensure().and_then(|c| c.get_text().ok())
24    }
25
26    fn set(&mut self, text: String) {
27        if let Some(c) = self.ensure() {
28            let _ = c.set_text(text);
29        }
30    }
31}