aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2022-06-22 16:38:47 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2022-07-05 11:42:28 +0000
commit4437a2e1ddcb11b125824d5840056690f8e2138a (patch)
tree8c569136a72f25f63a75b6bab4c1a7930f9e078c
parent549974d6854647a4b809d0b6510b0938a2bbc0e3 (diff)
downloadsrc-4437a2e1ddcb11b125824d5840056690f8e2138a.tar.gz
src-4437a2e1ddcb11b125824d5840056690f8e2138a.zip
vt: Fix contents of paste buffer for newcons.
Trim all word separators from end of line, except for last line and only use '\r' to terminate the pasted lines as expected by TTY. Submitted by: Ivan Quitschal <tezeka@hotmail.com> Differential Revision: https://reviews.freebsd.org/D35552 PR: 263084 Sponsored by: NVIDIA Networking (cherry picked from commit 5fe0a82501cb86278b9aa426c4bf11d992e95aaa)
-rw-r--r--sys/dev/vt/vt_buf.c27
-rw-r--r--sys/dev/vt/vt_core.c5
2 files changed, 22 insertions, 10 deletions
diff --git a/sys/dev/vt/vt_buf.c b/sys/dev/vt/vt_buf.c
index 041c8193ca93..fa6c7c8fec5f 100644
--- a/sys/dev/vt/vt_buf.c
+++ b/sys/dev/vt/vt_buf.c
@@ -741,8 +741,8 @@ vtbuf_get_marked_len(struct vt_buf *vb)
si = s.tp_row * vb->vb_scr_size.tp_col + s.tp_col;
ei = e.tp_row * vb->vb_scr_size.tp_col + e.tp_col;
- /* Number symbols and number of rows to inject \n */
- sz = ei - si + ((e.tp_row - s.tp_row) * 2);
+ /* Number symbols and number of rows to inject \r */
+ sz = ei - si + (e.tp_row - s.tp_row);
return (sz * sizeof(term_char_t));
}
@@ -750,7 +750,7 @@ vtbuf_get_marked_len(struct vt_buf *vb)
void
vtbuf_extract_marked(struct vt_buf *vb, term_char_t *buf, int sz)
{
- int i, r, c, cs, ce;
+ int i, j, r, c, cs, ce;
term_pos_t s, e;
/* Swap according to window coordinates. */
@@ -769,15 +769,28 @@ vtbuf_extract_marked(struct vt_buf *vb, term_char_t *buf, int sz)
for (r = s.tp_row; r <= e.tp_row; r++) {
cs = (r == s.tp_row)?s.tp_col:0;
ce = (r == e.tp_row)?e.tp_col:vb->vb_scr_size.tp_col;
- for (c = cs; c < ce; c++) {
+
+ /* Copy characters from terminal window. */
+ j = i;
+ for (c = cs; c < ce; c++)
buf[i++] = vb->vb_rows[r][c];
- }
- /* Add new line for all rows, but not for last one. */
+
+ /* For all rows, but the last one. */
if (r != e.tp_row) {
+ /* Trim trailing word separators, if any. */
+ for (; i != j; i--) {
+ if (TCHAR_CHARACTER(buf[i - 1]) != ' ')
+ break;
+ }
+ /* Add newline character as expected by TTY. */
buf[i++] = '\r';
- buf[i++] = '\n';
}
}
+ /* Zero rest of expected buffer size, if any. */
+ while ((i * sizeof(buf[0])) < sz)
+ buf[i++] = '\0';
+
+ MPASS((i * sizeof(buf[0])) == sz);
}
int
diff --git a/sys/dev/vt/vt_core.c b/sys/dev/vt/vt_core.c
index 38fda0a501c5..27cbe5ad8294 100644
--- a/sys/dev/vt/vt_core.c
+++ b/sys/dev/vt/vt_core.c
@@ -2135,7 +2135,7 @@ vt_mouse_paste()
buf = VD_PASTEBUF(main_vd);
len /= sizeof(term_char_t);
for (i = 0; i < len; i++) {
- if (buf[i] == '\0')
+ if (TCHAR_CHARACTER(buf[i]) == '\0')
continue;
terminal_input_char(main_vd->vd_curwindow->vw_terminal,
buf[i]);
@@ -2287,8 +2287,7 @@ vt_mouse_event(int type, int x, int y, int event, int cnt, int mlevel)
VD_PASTEBUFSZ(vd) = len;
}
/* Request copy/paste buffer data, no more than `len' */
- vtbuf_extract_marked(&vw->vw_buf, VD_PASTEBUF(vd),
- VD_PASTEBUFSZ(vd));
+ vtbuf_extract_marked(&vw->vw_buf, VD_PASTEBUF(vd), len);
VD_PASTEBUFLEN(vd) = len;