t_rust_less_lib/clipboard/
unix_mixed.rs

1use 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}