terminal: Add right-click in terminal to create a new selection if none is present (#29131)

Ho Chun Lau created

This PR adds functionality to right click in terminal create new
selection if none present. The selection is identical with double click
a text in terminal, plus the logic is moved from the double-click in the
terminal::mouse_down.

Closes #28237 

Release Notes:
- Adds functionality to right click in terminal create new selection if
none present

Change summary

crates/terminal/src/terminal.rs           | 12 ++++++++++++
crates/terminal_view/src/terminal_view.rs |  5 +++++
2 files changed, 17 insertions(+)

Detailed changes

crates/terminal/src/terminal.rs 🔗

@@ -1547,6 +1547,18 @@ impl Terminal {
         }
     }
 
+    pub fn select_word_at_event_position(&mut self, e: &MouseDownEvent) {
+        let position = e.position - self.last_content.terminal_bounds.bounds.origin;
+        let (point, side) = grid_point_and_side(
+            position,
+            self.last_content.terminal_bounds,
+            self.last_content.display_offset,
+        );
+        let selection = Selection::new(SelectionType::Semantic, point, side);
+        self.events
+            .push_back(InternalEvent::SetSelection(Some((selection, point))));
+    }
+
     pub fn mouse_drag(
         &mut self,
         e: &MouseMoveEvent,

crates/terminal_view/src/terminal_view.rs 🔗

@@ -1278,6 +1278,11 @@ impl Render for TerminalView {
                 MouseButton::Right,
                 cx.listener(|this, event: &MouseDownEvent, window, cx| {
                     if !this.terminal.read(cx).mouse_mode(event.modifiers.shift) {
+                        if this.terminal.read(cx).last_content.selection.is_none() {
+                            this.terminal.update(cx, |terminal, _| {
+                                terminal.select_word_at_event_position(event);
+                            });
+                        };
                         this.deploy_context_menu(event.position, window, cx);
                         cx.notify();
                     }