summaryrefslogtreecommitdiff
path: root/alacritty_terminal/src/clipboard.rs
diff options
context:
space:
mode:
authorChristian Duerr <chrisduerr@users.noreply.github.com>2019-04-28 20:21:39 +0000
committerGitHub <noreply@github.com>2019-04-28 20:21:39 +0000
commit9e89aaa477369b20a06f4b9f636d7fd543c4c985 (patch)
tree81deb1b250541a3c8fe7b6f9274f5a87f265a314 /alacritty_terminal/src/clipboard.rs
parent37b66a7cd2e53fae93e3c2c8bc3ddbd9cbe140d2 (diff)
downloadalacritty-9e89aaa477369b20a06f4b9f636d7fd543c4c985.tar.gz
alacritty-9e89aaa477369b20a06f4b9f636d7fd543c4c985.zip
Switch from copypasta to rust-clipboard
This switches our own `copypasta` crate with the more standardized `clipboard` library, which allows us to get rid of the `xclip` dependency on X11. Additionally, this lays the foundation for native Wayland clipboard support once the clipboard crate is updated (or a fork is created). Fixes #5.
Diffstat (limited to 'alacritty_terminal/src/clipboard.rs')
-rw-r--r--alacritty_terminal/src/clipboard.rs90
1 files changed, 90 insertions, 0 deletions
diff --git a/alacritty_terminal/src/clipboard.rs b/alacritty_terminal/src/clipboard.rs
new file mode 100644
index 00000000..ca70c3bf
--- /dev/null
+++ b/alacritty_terminal/src/clipboard.rs
@@ -0,0 +1,90 @@
+// Copyright 2016 Joe Wilm, The Alacritty Project Contributors
+//
+// 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.
+
+#[cfg(not(any(target_os = "macos", target_os = "windows")))]
+use std::ffi::c_void;
+
+use clipboard::nop_clipboard::NopClipboardContext;
+#[cfg(not(any(target_os = "macos", target_os = "windows")))]
+use clipboard::wayland_clipboard::WaylandClipboardContext;
+#[cfg(not(any(target_os = "macos", target_os = "windows")))]
+use clipboard::x11_clipboard::{Primary as X11SecondaryClipboard, X11ClipboardContext};
+use clipboard::{ClipboardContext, ClipboardProvider};
+
+pub struct Clipboard {
+ primary: Box<ClipboardProvider>,
+ secondary: Option<Box<ClipboardProvider>>,
+}
+
+impl Clipboard {
+ #[cfg(any(target_os = "macos", target_os = "windows"))]
+ pub fn new() -> Self {
+ Self::default()
+ }
+
+ #[cfg(not(any(target_os = "macos", target_os = "windows")))]
+ pub fn new(display: Option<*mut c_void>) -> Self {
+ if let Some(display) = display {
+ return Self {
+ primary: unsafe { Box::new(WaylandClipboardContext::new_from_external(display)) },
+ secondary: None,
+ };
+ }
+
+ Self {
+ primary: Box::new(ClipboardContext::new().unwrap()),
+ secondary: Some(Box::new(X11ClipboardContext::<X11SecondaryClipboard>::new().unwrap())),
+ }
+ }
+
+ // Use for tests and ref-tests
+ pub fn new_nop() -> Self {
+ Self { primary: Box::new(NopClipboardContext::new().unwrap()), secondary: None }
+ }
+}
+
+impl Default for Clipboard {
+ fn default() -> Self {
+ Self { primary: Box::new(ClipboardContext::new().unwrap()), secondary: None }
+ }
+}
+
+#[derive(Debug)]
+pub enum ClipboardType {
+ Primary,
+ Secondary,
+}
+
+impl Clipboard {
+ pub fn store(&mut self, ty: ClipboardType, text: impl Into<String>) {
+ let clipboard = match (ty, &mut self.secondary) {
+ (ClipboardType::Secondary, Some(provider)) => provider,
+ (ClipboardType::Secondary, None) => return,
+ _ => &mut self.primary,
+ };
+
+ clipboard.set_contents(text.into()).unwrap_or_else(|err| {
+ warn!("Error storing selection to clipboard. {}", err);
+ });
+ }
+
+ pub fn load(&mut self, ty: ClipboardType) -> Result<String, Box<std::error::Error>> {
+ let clipboard = match (ty, &mut self.secondary) {
+ (ClipboardType::Secondary, Some(provider)) => provider,
+ _ => &mut self.primary,
+ };
+
+ clipboard.get_contents()
+ }
+}