diff options
Diffstat (limited to 'copypasta/src/x11_clipboard.rs')
-rw-r--r-- | copypasta/src/x11_clipboard.rs | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/copypasta/src/x11_clipboard.rs b/copypasta/src/x11_clipboard.rs new file mode 100644 index 00000000..1b7bdff4 --- /dev/null +++ b/copypasta/src/x11_clipboard.rs @@ -0,0 +1,72 @@ +// Copyright 2017 Avraham Weinstock +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use common::*; +use std::error::Error; +use std::marker::PhantomData; +use std::time::Duration; +use x11_clipboard_crate::xcb::xproto::Atom; +use x11_clipboard_crate::Atoms; +use x11_clipboard_crate::Clipboard as X11Clipboard; + +pub trait Selection: Send { + fn atom(atoms: &Atoms) -> Atom; +} + +pub struct Primary; + +impl Selection for Primary { + fn atom(atoms: &Atoms) -> Atom { + atoms.primary + } +} + +pub struct Clipboard; + +impl Selection for Clipboard { + fn atom(atoms: &Atoms) -> Atom { + atoms.clipboard + } +} + +pub struct X11ClipboardContext<S = Clipboard>(X11Clipboard, PhantomData<S>) +where + S: Selection; + +impl<S> X11ClipboardContext<S> +where + S: Selection, +{ + pub fn new() -> Result<X11ClipboardContext<S>, Box<dyn Error>> { + Ok(X11ClipboardContext(X11Clipboard::new()?, PhantomData)) + } +} + +impl<S> ClipboardProvider for X11ClipboardContext<S> +where + S: Selection, +{ + fn get_contents(&mut self) -> Result<String, Box<dyn Error>> { + Ok(String::from_utf8(self.0.load( + S::atom(&self.0.getter.atoms), + self.0.getter.atoms.utf8_string, + self.0.getter.atoms.property, + Duration::from_secs(3), + )?)?) + } + + fn set_contents(&mut self, data: String) -> Result<(), Box<dyn Error>> { + Ok(self.0.store(S::atom(&self.0.setter.atoms), self.0.setter.atoms.utf8_string, data)?) + } +} |