use crate::{ mime::{ClipboardLoadData, ClipboardStoreData}, ClipboardProvider, }; use raw_window_handle::{HasDisplayHandle, RawDisplayHandle}; use std::error::Error; pub use clipboard_wayland as wayland; pub use clipboard_x11 as x11; pub enum Clipboard { Wayland(wayland::Clipboard), X11(x11::Clipboard), } impl ClipboardProvider for Clipboard { fn read(&self) -> Result> { match self { Clipboard::Wayland(c) => c.read(), Clipboard::X11(c) => c.read().map_err(Box::from), } } fn write(&mut self, contents: String) -> Result<(), Box> { match self { Clipboard::Wayland(c) => c.write(contents), Clipboard::X11(c) => c.write(contents).map_err(Box::from), } } fn read_primary(&self) -> Option>> { match self { Clipboard::Wayland(c) => Some(c.read_primary()), Clipboard::X11(c) => Some(c.read_primary().map_err(Box::from)), } } fn write_primary( &mut self, contents: String, ) -> Option>> { match self { Clipboard::Wayland(c) => Some(c.write_primary(contents)), Clipboard::X11(c) => { Some(c.write_primary(contents).map_err(Box::from)) } } } fn read_data(&self) -> Option>> where T: mime::AllowedMimeTypes, { match self { Clipboard::Wayland(c) => { let ret = c.read_data::>(); Some(ret.map(|ret| ret.0)) } Clipboard::X11(_) => None, } } fn write_data( &mut self, contents: ClipboardStoreData, ) -> Option>> where T: mime::AsMimeTypes, { match self { Clipboard::Wayland(c) => { Some(c.write_data::>(contents)) } Clipboard::X11(_) => None, } } fn read_primary_data(&self) -> Option>> where T: mime::AllowedMimeTypes, { match self { Clipboard::Wayland(c) => { let ret = c.read_primary_data::>(); Some(ret.map(|ret| ret.0)) } Clipboard::X11(_) => None, } } fn read_primary_raw( &self, allowed: Vec, ) -> Option, String), Box>> { match self { Clipboard::Wayland(c) => Some(c.read_primary_raw(allowed)), Clipboard::X11(_) => None, } } fn read_raw( &self, allowed: Vec, ) -> Option, String), Box>> { match self { Clipboard::Wayland(c) => Some(c.read_raw(allowed)), Clipboard::X11(_) => None, } } fn write_primary_data( &mut self, contents: ClipboardStoreData, ) -> Option>> where T: mime::AsMimeTypes, { match self { Clipboard::Wayland(c) => { Some(c.write_primary_data::>(contents)) } Clipboard::X11(_) => None, } } } pub unsafe fn connect( window: &W, ) -> Result> { let clipboard = match window.display_handle()?.as_raw() { RawDisplayHandle::Wayland(handle) => Clipboard::Wayland( wayland::Clipboard::connect(handle.display.as_ptr()), ) as _, _ => Clipboard::X11(x11::Clipboard::connect()?) as _, }; Ok(clipboard) }