From f0041882f1dab1fda828c3b9ac7e37cb3682640d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ekl=C3=B6f?= Date: Mon, 31 May 2021 17:12:38 +0200 Subject: [PATCH] selection: pay attention to hard linebreaks when search for word boundaries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Double-clicking on a word in the left or right margin, would line-wrap the selection if there was a non-empty cell in the corresponding right/left margin on the prev/next line. Regardless of whether there was a hard linebreak or not. Script to reprouce: !/bin/bash cols=$(tput cols) printf "%*coo\nbar\n" $((${cols} - 2)) f Run, then double click either “foo” or “bar”. Neither should select the other part. Closes #565 --- CHANGELOG.md | 2 ++ selection.c | 22 ++++++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c7094aa..6d8e604a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -142,6 +142,8 @@ (https://codeberg.org/dnkl/foot/issues/547). * Crash when a line wrapping OSC-8 URI crossed the scrollback wrap around (https://codeberg.org/dnkl/foot/issues/552). +* Selection incorrectly wrapping rows ending with an explicit newline + (https://codeberg.org/dnkl/foot/issues/565). ### Security diff --git a/selection.c b/selection.c index f684c2fa..4862def2 100644 --- a/selection.c +++ b/selection.c @@ -258,14 +258,21 @@ selection_find_word_boundary_left(struct terminal *term, struct coord *pos, int next_col = pos->col - 1; int next_row = pos->row; + const struct row *row = grid_row_in_view(term->grid, next_row); + /* Linewrap */ if (next_col < 0) { next_col = term->cols - 1; if (--next_row < 0) break; - } - const struct row *row = grid_row_in_view(term->grid, next_row); + row = grid_row_in_view(term->grid, next_row); + + if (row->linebreak) { + /* Hard linebreak, treat as space. I.e. break selection */ + break; + } + } c = row->cells[next_col].wc; while (c >= CELL_SPACER) { @@ -330,14 +337,21 @@ selection_find_word_boundary_right(struct terminal *term, struct coord *pos, int next_col = pos->col + 1; int next_row = pos->row; + const struct row *row = grid_row_in_view(term->grid, next_row); + /* Linewrap */ if (next_col >= term->cols) { + if (row->linebreak) { + /* Hard linebreak, treat as space. I.e. break selection */ + break; + } + next_col = 0; if (++next_row >= term->rows) break; - } - const struct row *row = grid_row_in_view(term->grid, next_row); + row = grid_row_in_view(term->grid, next_row); + } c = row->cells[next_col].wc; while (c >= CELL_SPACER) {