From eb318c1626c9a5ba5941d7abe4ac8ae573d14c2c Mon Sep 17 00:00:00 2001 From: Ben Kunkle Date: Tue, 20 May 2025 12:05:24 -0500 Subject: [PATCH] Revert "linux(x11): Add support for pasting images from clipboard (#29387)" (#31033) Closes: #30523 Release Notes: - linux: Reverted the ability to paste images on X11, as the change broke pasting from some external applications --- crates/gpui/src/platform/linux/x11.rs | 1 - crates/gpui/src/platform/linux/x11/client.rs | 67 ++++++++++++-------- 2 files changed, 40 insertions(+), 28 deletions(-) diff --git a/crates/gpui/src/platform/linux/x11.rs b/crates/gpui/src/platform/linux/x11.rs index 5c7a0c2ac898a8391c8027c9c49890f2d59e1335..6df8e9a3d6397bd862b25b2a650a8ef3be7115d7 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 d279cd4d0592bb3966cab866ee1e3f80fefa734a..a59825b292f4d3739ce00c2977003f4f18438cec 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) {