window_clipboard/
lib.rs

1#[cfg(all(
2    unix,
3    not(any(
4        target_os = "macos",
5        target_os = "ios",
6        target_os = "android",
7        target_os = "emscripten",
8        target_os = "redox"
9    ))
10))]
11#[path = "platform/linux.rs"]
12mod platform;
13
14#[cfg(target_os = "windows")]
15#[path = "platform/windows.rs"]
16mod platform;
17
18#[cfg(target_os = "macos")]
19#[path = "platform/macos.rs"]
20mod platform;
21
22#[cfg(target_os = "ios")]
23#[path = "platform/ios.rs"]
24mod platform;
25
26#[cfg(target_os = "android")]
27#[path = "platform/android.rs"]
28mod platform;
29
30#[cfg(not(any(
31    all(
32        unix,
33        not(any(
34            target_os = "macos",
35            target_os = "ios",
36            target_os = "android",
37            target_os = "emscripten",
38            target_os = "redox"
39        ))
40    ),
41    target_os = "windows",
42    target_os = "macos",
43    target_os = "ios",
44    target_os = "android"
45)))]
46#[path = "platform/dummy.rs"]
47mod platform;
48
49use raw_window_handle::HasDisplayHandle;
50use std::error::Error;
51
52pub struct Clipboard {
53    raw: Box<dyn ClipboardProvider>,
54}
55
56impl Clipboard {
57    /// Safety: the display handle must be valid for the lifetime of `Clipboard`
58    pub unsafe fn connect<W: HasDisplayHandle>(
59        window: &W,
60    ) -> Result<Self, Box<dyn Error>> {
61        let raw = platform::connect(window)?;
62
63        Ok(Clipboard { raw })
64    }
65
66    pub fn read(&self) -> Result<String, Box<dyn Error>> {
67        self.raw.read()
68    }
69
70    pub fn write(&mut self, contents: String) -> Result<(), Box<dyn Error>> {
71        self.raw.write(contents)
72    }
73}
74
75impl Clipboard {
76    pub fn read_primary(&self) -> Option<Result<String, Box<dyn Error>>> {
77        self.raw.read_primary()
78    }
79
80    pub fn write_primary(&mut self, contents: String) -> Option<Result<(), Box<dyn Error>>> {
81        self.raw.write_primary(contents)
82    }
83}
84
85pub trait ClipboardProvider {
86    fn read(&self) -> Result<String, Box<dyn Error>>;
87
88    fn write(&mut self, contents: String) -> Result<(), Box<dyn Error>>;
89
90    fn read_primary(&self) -> Option<Result<String, Box<dyn Error>>> {
91        None
92    }
93
94    fn write_primary(&mut self, _contents: String) -> Option<Result<(), Box<dyn Error>>> {
95        None
96    }
97}