diff --git a/crates/gpui/src/platform/linux/x11.rs b/crates/gpui/src/platform/linux/x11.rs index 5c7a0c2ac8..6df8e9a3d6 100644 --- a/crates/gpui/src/platform/linux/x11.rs +++ b/crates/gpui/src/platform/linux/x11.rs @@ -1,5 +1,4 @@ mod client; -mod clipboard; mod display; mod event; mod window; diff --git a/crates/gpui/src/platform/linux/x11/client.rs b/crates/gpui/src/platform/linux/x11/client.rs index d279cd4d05..a59825b292 100644 --- a/crates/gpui/src/platform/linux/x11/client.rs +++ b/crates/gpui/src/platform/linux/x11/client.rs @@ -1,3 +1,4 @@ +use crate::platform::scap_screen_capture::scap_screen_sources; use core::str; use std::{ cell::RefCell, @@ -40,9 +41,8 @@ use xkbc::x11::ffi::{XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSIO use xkbcommon::xkb::{self as xkbc, LayoutIndex, ModMask, STATE_LAYOUT_EFFECTIVE}; use super::{ - ButtonOrScroll, ScrollDirection, button_or_scroll_from_event_detail, - clipboard::{self, Clipboard}, - get_valuator_axis_index, modifiers_from_state, pressed_button_from_mask, + ButtonOrScroll, ScrollDirection, button_or_scroll_from_event_detail, get_valuator_axis_index, + modifiers_from_state, pressed_button_from_mask, }; use super::{X11Display, X11WindowStatePtr, XcbAtoms}; use super::{XimCallbackEvent, XimHandler}; @@ -56,7 +56,6 @@ use crate::platform::{ reveal_path_internal, xdg_desktop_portal::{Event as XDPEvent, XDPEventSource}, }, - scap_screen_capture::scap_screen_sources, }; use crate::{ AnyWindowHandle, Bounds, ClipboardItem, CursorStyle, DisplayId, FileDropEvent, Keystroke, @@ -202,7 +201,7 @@ pub struct X11ClientState { pointer_device_states: BTreeMap, pub(crate) common: LinuxCommon, - pub(crate) clipboard: Clipboard, + pub(crate) clipboard: x11_clipboard::Clipboard, pub(crate) clipboard_item: Option, pub(crate) xdnd_state: Xdnd, } @@ -389,7 +388,7 @@ impl X11Client { .reply() .unwrap(); - let clipboard = Clipboard::new().unwrap(); + let clipboard = x11_clipboard::Clipboard::new().unwrap(); let xcb_connection = Rc::new(xcb_connection); @@ -1497,36 +1496,39 @@ impl LinuxClient for X11Client { let state = self.0.borrow_mut(); state .clipboard - .set_text( - std::borrow::Cow::Owned(item.text().unwrap_or_default()), - clipboard::ClipboardKind::Primary, - clipboard::WaitConfig::None, + .store( + state.clipboard.setter.atoms.primary, + state.clipboard.setter.atoms.utf8_string, + item.text().unwrap_or_default().as_bytes(), ) - .context("Failed to write to clipboard (primary)") - .log_with_level(log::Level::Debug); + .ok(); } fn write_to_clipboard(&self, item: crate::ClipboardItem) { let mut state = self.0.borrow_mut(); state .clipboard - .set_text( - std::borrow::Cow::Owned(item.text().unwrap_or_default()), - clipboard::ClipboardKind::Clipboard, - clipboard::WaitConfig::None, + .store( + state.clipboard.setter.atoms.clipboard, + state.clipboard.setter.atoms.utf8_string, + item.text().unwrap_or_default().as_bytes(), ) - .context("Failed to write to clipboard (clipboard)") - .log_with_level(log::Level::Debug); + .ok(); state.clipboard_item.replace(item); } fn read_from_primary(&self) -> Option { let state = self.0.borrow_mut(); - return state + state .clipboard - .get_any(clipboard::ClipboardKind::Primary) - .context("Failed to read from clipboard (primary)") - .log_with_level(log::Level::Debug); + .load( + state.clipboard.getter.atoms.primary, + state.clipboard.getter.atoms.utf8_string, + state.clipboard.getter.atoms.property, + Duration::from_secs(3), + ) + .map(|text| crate::ClipboardItem::new_string(String::from_utf8(text).unwrap())) + .ok() } fn read_from_clipboard(&self) -> Option { @@ -1535,15 +1537,26 @@ impl LinuxClient for X11Client { // which has metadata attached. if state .clipboard - .is_owner(clipboard::ClipboardKind::Clipboard) + .setter + .connection + .get_selection_owner(state.clipboard.setter.atoms.clipboard) + .ok() + .and_then(|r| r.reply().ok()) + .map(|reply| reply.owner == state.clipboard.setter.window) + .unwrap_or(false) { return state.clipboard_item.clone(); } - return state + state .clipboard - .get_any(clipboard::ClipboardKind::Clipboard) - .context("Failed to read from clipboard (clipboard)") - .log_with_level(log::Level::Debug); + .load( + state.clipboard.getter.atoms.clipboard, + state.clipboard.getter.atoms.utf8_string, + state.clipboard.getter.atoms.property, + Duration::from_secs(3), + ) + .map(|text| crate::ClipboardItem::new_string(String::from_utf8(text).unwrap())) + .ok() } fn run(&self) {