diff --git a/CHANGELOG.md b/CHANGELOG.md index 960428fe..1a59bba5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,6 +80,8 @@ (https://codeberg.org/dnkl/foot/issues/900). * File pasted, or dropped, on the alt screen is no longer quoted (https://codeberg.org/dnkl/foot/issues/379). +* Line-based selections now include a trailing newline when copied + (https://codeberg.org/dnkl/foot/issues/869). ### Deprecated diff --git a/extract.c b/extract.c index 4acd481c..7c1f0afb 100644 --- a/extract.c +++ b/extract.c @@ -86,9 +86,24 @@ extract_finish_wide(struct extraction_context *ctx, wchar_t **text, size_t *len) } else { xassert(ctx->idx > 0); xassert(ctx->idx <= ctx->size); - if (ctx->buf[ctx->idx - 1] == L'\n') - ctx->buf[ctx->idx - 1] = L'\0'; - else { + + switch (ctx->selection_kind) { + default: + if (ctx->buf[ctx->idx - 1] == L'\n') + ctx->buf[ctx->idx - 1] = L'\0'; + break; + + case SELECTION_LINE_WISE: + if (ctx->buf[ctx->idx - 1] != L'\n') { + if (!ensure_size(ctx, 1)) + goto err; + ctx->buf[ctx->idx++] = L'\n'; + } + break; + + } + + if (ctx->buf[ctx->idx - 1] != L'\0') { if (!ensure_size(ctx, 1)) goto err; ctx->buf[ctx->idx++] = L'\0';