Make primary clipboard Linux only (#11843)

I guess only Linux supports the primary clipboard.

Release Notes:

- N/A
This commit is contained in:
张小白 2024-05-16 01:44:47 +08:00 committed by GitHub
parent 1c62839295
commit 4ae3396253
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 42 additions and 37 deletions

View file

@ -530,6 +530,7 @@ impl EditorElement {
cx.stop_propagation(); cx.stop_propagation();
} }
#[cfg(target_os = "linux")]
fn mouse_middle_down( fn mouse_middle_down(
editor: &mut Editor, editor: &mut Editor,
event: &MouseDownEvent, event: &MouseDownEvent,
@ -3240,6 +3241,7 @@ impl EditorElement {
MouseButton::Right => editor.update(cx, |editor, cx| { MouseButton::Right => editor.update(cx, |editor, cx| {
Self::mouse_right_down(editor, event, &position_map, &text_hitbox, cx); Self::mouse_right_down(editor, event, &position_map, &text_hitbox, cx);
}), }),
#[cfg(target_os = "linux")]
MouseButton::Middle => editor.update(cx, |editor, cx| { MouseButton::Middle => editor.update(cx, |editor, cx| {
Self::mouse_middle_down(editor, event, &position_map, &text_hitbox, cx); Self::mouse_middle_down(editor, event, &position_map, &text_hitbox, cx);
}), }),

View file

@ -547,6 +547,7 @@ impl AppContext {
/// Writes data to the primary selection buffer. /// Writes data to the primary selection buffer.
/// Only available on Linux. /// Only available on Linux.
#[cfg(target_os = "linux")]
pub fn write_to_primary(&self, item: ClipboardItem) { pub fn write_to_primary(&self, item: ClipboardItem) {
self.platform.write_to_primary(item) self.platform.write_to_primary(item)
} }
@ -558,6 +559,7 @@ impl AppContext {
/// Reads data from the primary selection buffer. /// Reads data from the primary selection buffer.
/// Only available on Linux. /// Only available on Linux.
#[cfg(target_os = "linux")]
pub fn read_from_primary(&self) -> Option<ClipboardItem> { pub fn read_from_primary(&self) -> Option<ClipboardItem> {
self.platform.read_from_primary() self.platform.read_from_primary()
} }

View file

@ -147,8 +147,10 @@ pub(crate) trait Platform: 'static {
fn set_cursor_style(&self, style: CursorStyle); fn set_cursor_style(&self, style: CursorStyle);
fn should_auto_hide_scrollbars(&self) -> bool; fn should_auto_hide_scrollbars(&self) -> bool;
#[cfg(target_os = "linux")]
fn write_to_primary(&self, item: ClipboardItem); fn write_to_primary(&self, item: ClipboardItem);
fn write_to_clipboard(&self, item: ClipboardItem); fn write_to_clipboard(&self, item: ClipboardItem);
#[cfg(target_os = "linux")]
fn read_from_primary(&self) -> Option<ClipboardItem>; fn read_from_primary(&self) -> Option<ClipboardItem>;
fn read_from_clipboard(&self) -> Option<ClipboardItem>; fn read_from_clipboard(&self) -> Option<ClipboardItem>;

View file

@ -817,8 +817,6 @@ impl Platform for MacPlatform {
} }
} }
fn write_to_primary(&self, _item: ClipboardItem) {}
fn write_to_clipboard(&self, item: ClipboardItem) { fn write_to_clipboard(&self, item: ClipboardItem) {
let state = self.0.lock(); let state = self.0.lock();
unsafe { unsafe {
@ -856,10 +854,6 @@ impl Platform for MacPlatform {
} }
} }
fn read_from_primary(&self) -> Option<ClipboardItem> {
None
}
fn read_from_clipboard(&self) -> Option<ClipboardItem> { fn read_from_clipboard(&self) -> Option<ClipboardItem> {
let state = self.0.lock(); let state = self.0.lock();
unsafe { unsafe {

View file

@ -23,6 +23,7 @@ pub(crate) struct TestPlatform {
active_display: Rc<dyn PlatformDisplay>, active_display: Rc<dyn PlatformDisplay>,
active_cursor: Mutex<CursorStyle>, active_cursor: Mutex<CursorStyle>,
current_clipboard_item: Mutex<Option<ClipboardItem>>, current_clipboard_item: Mutex<Option<ClipboardItem>>,
#[cfg(target_os = "linux")]
current_primary_item: Mutex<Option<ClipboardItem>>, current_primary_item: Mutex<Option<ClipboardItem>>,
pub(crate) prompts: RefCell<TestPrompts>, pub(crate) prompts: RefCell<TestPrompts>,
pub opened_url: RefCell<Option<String>>, pub opened_url: RefCell<Option<String>>,
@ -45,6 +46,7 @@ impl TestPlatform {
active_display: Rc::new(TestDisplay::new()), active_display: Rc::new(TestDisplay::new()),
active_window: Default::default(), active_window: Default::default(),
current_clipboard_item: Mutex::new(None), current_clipboard_item: Mutex::new(None),
#[cfg(target_os = "linux")]
current_primary_item: Mutex::new(None), current_primary_item: Mutex::new(None),
weak: weak.clone(), weak: weak.clone(),
opened_url: Default::default(), opened_url: Default::default(),
@ -272,6 +274,7 @@ impl Platform for TestPlatform {
false false
} }
#[cfg(target_os = "linux")]
fn write_to_primary(&self, item: ClipboardItem) { fn write_to_primary(&self, item: ClipboardItem) {
*self.current_primary_item.lock() = Some(item); *self.current_primary_item.lock() = Some(item);
} }
@ -280,6 +283,7 @@ impl Platform for TestPlatform {
*self.current_clipboard_item.lock() = Some(item); *self.current_clipboard_item.lock() = Some(item);
} }
#[cfg(target_os = "linux")]
fn read_from_primary(&self) -> Option<ClipboardItem> { fn read_from_primary(&self) -> Option<ClipboardItem> {
self.current_primary_item.lock().clone() self.current_primary_item.lock().clone()
} }

View file

@ -625,8 +625,6 @@ impl Platform for WindowsPlatform {
false false
} }
fn write_to_primary(&self, _item: ClipboardItem) {}
fn write_to_clipboard(&self, item: ClipboardItem) { fn write_to_clipboard(&self, item: ClipboardItem) {
if item.text.len() > 0 { if item.text.len() > 0 {
let mut ctx = ClipboardContext::new().unwrap(); let mut ctx = ClipboardContext::new().unwrap();
@ -634,10 +632,6 @@ impl Platform for WindowsPlatform {
} }
} }
fn read_from_primary(&self) -> Option<ClipboardItem> {
None
}
fn read_from_clipboard(&self) -> Option<ClipboardItem> { fn read_from_clipboard(&self) -> Option<ClipboardItem> {
let mut ctx = ClipboardContext::new().unwrap(); let mut ctx = ClipboardContext::new().unwrap();
let content = ctx.get_contents().ok()?; let content = ctx.get_contents().ok()?;

View file

@ -1195,7 +1195,7 @@ impl Terminal {
&mut self, &mut self,
e: &MouseDownEvent, e: &MouseDownEvent,
origin: Point<Pixels>, origin: Point<Pixels>,
cx: &mut ModelContext<Self>, _cx: &mut ModelContext<Self>,
) { ) {
let position = e.position - origin; let position = e.position - origin;
let point = grid_point( let point = grid_point(
@ -1210,33 +1210,40 @@ impl Terminal {
{ {
self.pty_tx.notify(bytes); self.pty_tx.notify(bytes);
} }
} else if e.button == MouseButton::Left { } else {
let position = e.position - origin; match e.button {
let (point, side) = grid_point_and_side( MouseButton::Left => {
position, let position = e.position - origin;
self.last_content.size, let (point, side) = grid_point_and_side(
self.last_content.display_offset, position,
); self.last_content.size,
self.last_content.display_offset,
);
let selection_type = match e.click_count { let selection_type = match e.click_count {
0 => return, //This is a release 0 => return, //This is a release
1 => Some(SelectionType::Simple), 1 => Some(SelectionType::Simple),
2 => Some(SelectionType::Semantic), 2 => Some(SelectionType::Semantic),
3 => Some(SelectionType::Lines), 3 => Some(SelectionType::Lines),
_ => None, _ => None,
}; };
let selection = let selection = selection_type
selection_type.map(|selection_type| Selection::new(selection_type, point, side)); .map(|selection_type| Selection::new(selection_type, point, side));
if let Some(sel) = selection { if let Some(sel) = selection {
self.events self.events
.push_back(InternalEvent::SetSelection(Some((sel, point)))); .push_back(InternalEvent::SetSelection(Some((sel, point))));
} }
} else if e.button == MouseButton::Middle { }
if let Some(item) = cx.read_from_primary() { #[cfg(target_os = "linux")]
let text = item.text().to_string(); MouseButton::Middle => {
self.input(text); if let Some(item) = _cx.read_from_primary() {
let text = item.text().to_string();
self.input(text);
}
}
_ => {}
} }
} }
} }