From 1da986ae2b5dd7c54875d45716eb2820920feaae Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Mon, 12 Aug 2019 02:16:24 +0300 Subject: Fix smithay-clipboard integration Fixes: #2574 --- copypasta/Cargo.toml | 2 +- copypasta/examples/wayland.rs | 4 ++-- copypasta/src/wayland_clipboard.rs | 49 +++++++++++++++++++------------------- 3 files changed, 27 insertions(+), 28 deletions(-) (limited to 'copypasta') diff --git a/copypasta/Cargo.toml b/copypasta/Cargo.toml index ae65a7cb..3b9dd48c 100644 --- a/copypasta/Cargo.toml +++ b/copypasta/Cargo.toml @@ -17,7 +17,7 @@ objc-foundation = "0.1" [target.'cfg(all(unix, not(any(target_os="macos", target_os="android", target_os="emscripten"))))'.dependencies] x11-clipboard = "0.3" -smithay-clipboard = "0.3.2" +smithay-clipboard = "0.3.4" wayland-client = { version = "0.23.3", features = ["dlopen"] } [target.'cfg(all(unix, not(any(target_os="macos", target_os="android", target_os="emscripten"))))'.dev-dependencies] diff --git a/copypasta/examples/wayland.rs b/copypasta/examples/wayland.rs index a718a3e8..159b708c 100644 --- a/copypasta/examples/wayland.rs +++ b/copypasta/examples/wayland.rs @@ -14,7 +14,7 @@ mod wayland { extern crate copypasta; extern crate smithay_client_toolkit as sctk; - use wayland::copypasta::wayland_clipboard::{Clipboard, WaylandClipboardContext}; + use wayland::copypasta::wayland_clipboard::create_clipboards; use wayland::copypasta::ClipboardProvider; use std::io::{Read, Seek, SeekFrom, Write}; @@ -37,7 +37,7 @@ mod wayland { Display::connect_to_env().expect("Failed to connect to the wayland server."); let env = Environment::from_display(&*display, &mut event_queue).unwrap(); - let mut ctx = WaylandClipboardContext::::new(&display); + let (mut ctx, _) = create_clipboards(&display); let cb_contents = Arc::new(Mutex::new(String::new())); let seat = env.manager.instantiate_range(2, 6, NewProxy::implement_dummy).unwrap(); diff --git a/copypasta/src/wayland_clipboard.rs b/copypasta/src/wayland_clipboard.rs index cb450725..b32f1290 100644 --- a/copypasta/src/wayland_clipboard.rs +++ b/copypasta/src/wayland_clipboard.rs @@ -14,57 +14,56 @@ use std::error::Error; use std::ffi::c_void; -use std::marker::PhantomData; +use std::sync::{Arc, Mutex}; use smithay_clipboard::WaylandClipboard; + use wayland_client::sys::client::wl_display; use wayland_client::Display; use common::ClipboardProvider; -pub trait ClipboardType: Send {} +pub struct Clipboard { + context: Arc>, +} -pub struct Clipboard; -impl ClipboardType for Clipboard {} +pub struct Primary { + context: Arc>, +} -pub struct Primary; -impl ClipboardType for Primary {} +pub fn create_clipboards(display: &Display) -> (Primary, Clipboard) { + let context = Arc::new(Mutex::new(WaylandClipboard::new(display))); -pub struct WaylandClipboardContext(WaylandClipboard, PhantomData); + (Primary { context: context.clone() }, Clipboard { context } ) +} -impl WaylandClipboardContext { - /// Create a new clipboard context. - pub fn new(display: &Display) -> Self { - WaylandClipboardContext(WaylandClipboard::new(display), PhantomData) - } +pub unsafe fn create_clipboards_from_external(display: *mut c_void) -> (Primary, Clipboard) { + let context = + Arc::new(Mutex::new(WaylandClipboard::new_from_external(display as *mut wl_display))); - /// Create a new clipboard context from an external pointer. - pub unsafe fn new_from_external(display: *mut c_void) -> Self { - WaylandClipboardContext( - WaylandClipboard::new_from_external(display as *mut wl_display), - PhantomData, - ) - } + (Primary { context: context.clone() }, Clipboard { context} ) } -impl ClipboardProvider for WaylandClipboardContext { +impl ClipboardProvider for Clipboard { fn get_contents(&mut self) -> Result> { - Ok(self.0.load(None)) + Ok(self.context.lock().unwrap().load(None)) } fn set_contents(&mut self, data: String) -> Result<(), Box> { - self.0.store(None, data); + self.context.lock().unwrap().store(None, data); + Ok(()) } } -impl ClipboardProvider for WaylandClipboardContext { +impl ClipboardProvider for Primary { fn get_contents(&mut self) -> Result> { - Ok(self.0.load_primary(None)) + Ok(self.context.lock().unwrap().load_primary(None)) } fn set_contents(&mut self, data: String) -> Result<(), Box> { - self.0.store_primary(None, data); + self.context.lock().unwrap().store_primary(None, data); + Ok(()) } } -- cgit v1.2.3