Fix cannot select in terminal when copy_on_select is enabled (#34131)

Closes #33989


![terminal_select](https://github.com/user-attachments/assets/5027d2f2-f2b3-43a4-8262-3c266fdc5256)

Release Notes:

- N/A
This commit is contained in:
feeiyu 2025-07-14 19:04:54 +08:00 committed by GitHub
parent cf1ce1beed
commit 84124c60db
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 12 additions and 12 deletions

View file

@ -162,7 +162,8 @@ enum InternalEvent {
UpdateSelection(Point<Pixels>),
// Adjusted mouse position, should open
FindHyperlink(Point<Pixels>, bool),
Copy,
// Whether keep selection when copy
Copy(Option<bool>),
// Vi mode events
ToggleViMode,
ViMotion(ViMotion),
@ -931,13 +932,13 @@ impl Terminal {
}
}
InternalEvent::Copy => {
InternalEvent::Copy(keep_selection) => {
if let Some(txt) = term.selection_to_string() {
cx.write_to_clipboard(ClipboardItem::new_string(txt));
let settings = TerminalSettings::get_global(cx);
if !settings.keep_selection_on_copy {
if !keep_selection.unwrap_or_else(|| {
let settings = TerminalSettings::get_global(cx);
settings.keep_selection_on_copy
}) {
self.events.push_back(InternalEvent::SetSelection(None));
}
}
@ -1108,8 +1109,8 @@ impl Terminal {
.push_back(InternalEvent::SetSelection(selection));
}
pub fn copy(&mut self) {
self.events.push_back(InternalEvent::Copy);
pub fn copy(&mut self, keep_selection: Option<bool>) {
self.events.push_back(InternalEvent::Copy(keep_selection));
}
pub fn clear(&mut self) {
@ -1267,8 +1268,7 @@ impl Terminal {
}
"y" => {
self.events.push_back(InternalEvent::Copy);
self.events.push_back(InternalEvent::SetSelection(None));
self.copy(Some(false));
return;
}
@ -1653,7 +1653,7 @@ impl Terminal {
}
} else {
if e.button == MouseButton::Left && setting.copy_on_select {
self.copy();
self.copy(Some(true));
}
//Hyperlinks

View file

@ -715,7 +715,7 @@ impl TerminalView {
///Attempt to paste the clipboard into the terminal
fn copy(&mut self, _: &Copy, _: &mut Window, cx: &mut Context<Self>) {
self.terminal.update(cx, |term, _| term.copy());
self.terminal.update(cx, |term, _| term.copy(None));
cx.notify();
}