mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-03-31 07:11:09 -04:00
selection: recognize empty padding cells in a forced linewrap
When printing a multi-column character at the end of the line, and it doesn't fit, we currently insert a forced line-wrap. This means the last character(s) on the previous line will be empty, followed by a multi-column character in the first cell on the next line. Without special code to handle this, the selection text extraction code will insert a hard newline, since this is normally the correct thing to do. Add a TODO, to consider writing a special place holder value to these padding cells.
This commit is contained in:
parent
3bc404b5a3
commit
4cf7195695
2 changed files with 45 additions and 9 deletions
44
selection.c
44
selection.c
|
|
@ -269,15 +269,41 @@ extract_one(struct terminal *term, struct row *row, struct cell *cell,
|
||||||
{
|
{
|
||||||
struct extract *ctx = data;
|
struct extract *ctx = data;
|
||||||
|
|
||||||
if (ctx->last_row != NULL && row != ctx->last_row &&
|
if (ctx->last_row != NULL && row != ctx->last_row) {
|
||||||
((term->selection.kind == SELECTION_NORMAL &&
|
/* New row - determine if we should insert a newline or not */
|
||||||
(ctx->last_row->linebreak ||
|
|
||||||
ctx->empty_count > 0 || cell->wc == 0)) ||
|
if (term->selection.kind == SELECTION_NORMAL) {
|
||||||
term->selection.kind == SELECTION_BLOCK))
|
int width = max(1, wcwidth(cell->wc));
|
||||||
{
|
|
||||||
/* Last cell was the last column in the selection */
|
if (width > 1) {
|
||||||
ctx->buf[ctx->idx++] = L'\n';
|
/* Heuristict to handle force-wrapped multi-column
|
||||||
ctx->empty_count = 0;
|
* characters */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: maybe we should print a placeholder value to
|
||||||
|
* the empty cells at the end of the line when
|
||||||
|
* force-wrapping? Then extract() could simply skip
|
||||||
|
* those cells
|
||||||
|
*/
|
||||||
|
ctx->empty_count -= min(width, ctx->empty_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (ctx->last_row->linebreak ||
|
||||||
|
ctx->empty_count > 0 ||
|
||||||
|
cell->wc == 0)
|
||||||
|
{
|
||||||
|
/* Row has a hard linebreak, or either last cell or
|
||||||
|
* current cell is empty */
|
||||||
|
ctx->buf[ctx->idx++] = L'\n';
|
||||||
|
ctx->empty_count = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (term->selection.kind == SELECTION_BLOCK) {
|
||||||
|
/* Always insert a linebreak */
|
||||||
|
ctx->buf[ctx->idx++] = L'\n';
|
||||||
|
ctx->empty_count = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cell->wc == 0) {
|
if (cell->wc == 0) {
|
||||||
|
|
|
||||||
10
terminal.c
10
terminal.c
|
|
@ -2399,6 +2399,16 @@ term_print(struct terminal *term, wchar_t wc, int width)
|
||||||
/* Multi-column character that doesn't fit on current line -
|
/* Multi-column character that doesn't fit on current line -
|
||||||
* force a line wrap */
|
* force a line wrap */
|
||||||
term->grid->cursor.lcf = 1;
|
term->grid->cursor.lcf = 1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: should we insert place holder values in the remaining
|
||||||
|
* cells? This would allow e.g. text extraction to simply
|
||||||
|
* skip these, instead of trying to recognize a sequence of
|
||||||
|
* empty cells at the end of the line followed by a
|
||||||
|
* multi-column character...
|
||||||
|
*
|
||||||
|
* Might also make text reflow easier, or even more correct.
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
print_linewrap(term);
|
print_linewrap(term);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue