From 95debc59d1b422e0c544a5b80286dfdadda5512b Mon Sep 17 00:00:00 2001 From: otomist Date: Tue, 14 Jan 2025 12:04:43 -0500 Subject: [PATCH] add and use flag for selecting empty lines in the selectLine function --- src/Surface.zig | 25 +++++++++++++------------ src/terminal/Screen.zig | 6 ++++++ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/Surface.zig b/src/Surface.zig index 5a1d8c01d..a8fd4a817 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -3563,22 +3563,23 @@ fn dragLeftClickTriple( const screen = &self.io.terminal.screen; const click_pin = self.mouse.left_click_pin.?.*; - // Get the word under our current point. If there isn't a word, do nothing. - const word = screen.selectLine(.{ .pin = drag_pin }) orelse return; + // Get the line selection under our current drag point. If there isn't a line, do nothing. + const line = screen.selectLine(.{ .pin = drag_pin }) orelse return; - // Get our selection to grow it. If we don't have a selection, start it now. - // We may not have a selection if we started our dbl-click in an area - // that had no data, then we dragged our mouse into an area with data. - var sel = screen.selectLine(.{ .pin = click_pin }) orelse { - try self.setSelection(word); - return; - }; + // get the selection under our click point. + var sel_ = screen.selectLine(.{ .pin = click_pin }); - // Grow our selection + // We may not have a selection if we started our triple-click in an area + // that had no data, in this case recall selectLine with allow_empty_lines. + if (sel_ == null) { + sel_ = screen.selectLine(.{ .pin = click_pin, .allow_empty_lines = true }); + } + + var sel = sel_ orelse return; if (drag_pin.before(click_pin)) { - sel.startPtr().* = word.start(); + sel.startPtr().* = line.start(); } else { - sel.endPtr().* = word.end(); + sel.endPtr().* = line.end(); } try self.setSelection(sel); } diff --git a/src/terminal/Screen.zig b/src/terminal/Screen.zig index eb70d32d0..db890ad3f 100644 --- a/src/terminal/Screen.zig +++ b/src/terminal/Screen.zig @@ -2215,6 +2215,7 @@ pub const SelectLine = struct { /// state changing a boundary. State changing is ANY state /// change. semantic_prompt_boundary: bool = true, + allow_empty_lines: bool = false, }; /// Select the line under the given point. This will select across soft-wrapped @@ -2292,6 +2293,11 @@ pub fn selectLine(self: *const Screen, opts: SelectLine) ?Selection { return null; }; + // If we allow empty lines, we don't need to do any further checks. + if (opts.allow_empty_lines) { + return Selection.init(start_pin, end_pin, false); + } + // Go forward from the start to find the first non-whitespace character. const start: Pin = start: { const whitespace = opts.whitespace orelse break :start start_pin;