crates/gpui/src/platform/linux/x11.rs 🔗
@@ -1,5 +1,4 @@
mod client;
-mod clipboard;
mod display;
mod event;
mod window;
Ben Kunkle created
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(-)
@@ -1,5 +1,4 @@
mod client;
-mod clipboard;
mod display;
mod event;
mod window;
@@ -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<xinput::DeviceId, PointerDeviceState>,
pub(crate) common: LinuxCommon,
- pub(crate) clipboard: Clipboard,
+ pub(crate) clipboard: x11_clipboard::Clipboard,
pub(crate) clipboard_item: Option<ClipboardItem>,
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<crate::ClipboardItem> {
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<crate::ClipboardItem> {
@@ -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) {