t_rust_less_lib/clipboard/
unix_mixed.rs1use std::sync::Arc;
2
3use log::info;
4
5use crate::api::EventHub;
6
7use super::{unix_wayland, unix_x11, ClipboardCommon, ClipboardError, ClipboardResult, SelectionProvider};
8
9pub enum Clipboard {
10 Wayland(unix_wayland::Clipboard),
11 X11(unix_x11::Clipboard),
12}
13
14impl ClipboardCommon for Clipboard {
15 fn new<T>(selection_provider: T, event_hub: Arc<dyn EventHub>) -> ClipboardResult<Self>
16 where
17 T: SelectionProvider + Clone + 'static,
18 {
19 match unix_wayland::Clipboard::new(selection_provider.clone(), event_hub.clone()) {
20 Ok(wayland) => Ok(Clipboard::Wayland(wayland)),
21 Err(ClipboardError::Unavailable) => {
22 info!("Wayland unavailable, fallback to x11");
23 unix_x11::Clipboard::new(selection_provider, event_hub).map(Clipboard::X11)
24 }
25 Err(err) => Err(err),
26 }
27 }
28
29 fn destroy(&self) {
30 match self {
31 Clipboard::Wayland(wayland) => wayland.destroy(),
32 Clipboard::X11(x11) => x11.destroy(),
33 }
34 }
35
36 fn is_open(&self) -> bool {
37 match self {
38 Clipboard::Wayland(wayland) => wayland.is_open(),
39 Clipboard::X11(x11) => x11.is_open(),
40 }
41 }
42
43 fn currently_providing(&self) -> Option<crate::api::ClipboardProviding> {
44 match self {
45 Clipboard::Wayland(wayland) => wayland.currently_providing(),
46 Clipboard::X11(x11) => x11.currently_providing(),
47 }
48 }
49
50 fn provide_next(&self) {
51 match self {
52 Clipboard::Wayland(wayland) => wayland.provide_next(),
53 Clipboard::X11(x11) => x11.provide_next(),
54 }
55 }
56
57 fn wait(&self) -> super::ClipboardResult<()> {
58 match self {
59 Clipboard::Wayland(wayland) => wayland.wait(),
60 Clipboard::X11(x11) => x11.wait(),
61 }
62 }
63}