1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
use crate::errors::{Error, Result}; use crate::message::{Action, Selection}; use crate::response::Response; use bytes::BytesMut; #[cfg(target_os = "linux")] use clipboard::x11_clipboard::{Primary, X11ClipboardContext}; use clipboard::{ClipboardContext, ClipboardProvider}; use log::*; use std::convert::{TryFrom, TryInto}; #[cfg(target_os = "linux")] pub fn handle_action(bytes: BytesMut) -> Result<BytesMut> { let mut ctx: ClipboardContext = ClipboardProvider::new().map_err(|e| { error!("{}", e); Error::ClipboardProviderError })?; let mut ctx_primary: X11ClipboardContext<Primary> = ClipboardProvider::new().unwrap(); let content = match Action::try_from(bytes)? { Action::Clear(select) => { match select { Selection::Clipboard => { ctx.set_contents(String::new()).map_err(|e| { error!("{}", e); Error::GetContentsError })?; } Selection::Primary => { ctx_primary.set_contents(String::new()).map_err(|e| { error!("{}", e); Error::GetContentsError })?; } _ => unimplemented!(), } None } Action::Get(select) => match select { Selection::Clipboard => Some(ctx.get_contents().map_err(|e| { error!("{}", e); Error::GetContentsError })?), Selection::Primary => Some(ctx_primary.get_contents().map_err(|e| { error!("{}", e); Error::GetContentsError })?), _ => unimplemented!(), }, Action::Set { content, select } => { match select { Selection::Clipboard => { ctx.set_contents(content).map_err(|e| { error!("{}", e); Error::SetContentsError })?; } Selection::Primary => { ctx_primary.set_contents(content).map_err(|e| { error!("{}", e); Error::SetContentsError })?; } _ => unimplemented!(), } None } }; Response { success: true, content, } .try_into() } #[cfg(target_os = "macos")] pub fn handle_action(bytes: BytesMut) -> Result<BytesMut> { let mut ctx: ClipboardContext = ClipboardProvider::new().map_err(|e| { error!("{}", e); Error::ClipboardProviderError })?; let content = match Action::try_from(bytes)? { Action::Clear(_) => { ctx.set_contents(String::new()).map_err(|e| { error!("{}", e); Error::GetContentsError })?; None } Action::Get(_) => Some(ctx.get_contents().map_err(|e| { error!("{}", e); Error::GetContentsError })?), Action::Set { content, .. } => { ctx.set_contents(content).map_err(|e| { error!("{}", e); Error::SetContentsError })?; None } }; Response { success: true, content, } .try_into() }