aboutsummaryrefslogtreecommitdiff
path: root/tty.c
diff options
context:
space:
mode:
authornicm <nicm>2017-04-25 18:30:29 +0000
committernicm <nicm>2017-04-25 18:30:29 +0000
commitd520dae6ac9acf980d48fbc8307ac83a5cee2938 (patch)
tree07f119b181cb4ac410685f7a728c37d7920aa2b7 /tty.c
parent03d01eabb5c5227f56b6b44d04964c1328802628 (diff)
downloadrtmux-d520dae6ac9acf980d48fbc8307ac83a5cee2938.tar.gz
rtmux-d520dae6ac9acf980d48fbc8307ac83a5cee2938.tar.bz2
rtmux-d520dae6ac9acf980d48fbc8307ac83a5cee2938.zip
Make full width panes try to play more nicely with terminal copy and
paste by avoiding explicit line wraps if we think the terminal will wrap anyway.
Diffstat (limited to 'tty.c')
-rw-r--r--tty.c45
1 files changed, 29 insertions, 16 deletions
diff --git a/tty.c b/tty.c
index 412cac69..fda297c1 100644
--- a/tty.c
+++ b/tty.c
@@ -540,9 +540,13 @@ void
tty_putn(struct tty *tty, const void *buf, size_t len, u_int width)
{
tty_add(tty, buf, len);
- if (tty->cx + width > tty->sx)
- tty->cx = tty->cy = UINT_MAX;
- else
+ if (tty->cx + width > tty->sx) {
+ tty->cx = (tty->cx + width) - tty->sx;
+ if (tty->cx <= tty->sx)
+ tty->cy++;
+ else
+ tty->cx = tty->cy = UINT_MAX;
+ } else
tty->cx += width;
}
@@ -773,18 +777,26 @@ tty_draw_line(struct tty *tty, const struct window_pane *wp,
if (sx > tty->sx)
sx = tty->sx;
- if (screen_size_x(s) < tty->sx &&
- ox == 0 &&
- sx != screen_size_x(s) &&
- tty_term_has(tty->term, TTYC_EL1) &&
- !tty_fake_bce(tty, wp, 8)) {
- tty_default_attributes(tty, wp, 8);
- tty_cursor(tty, screen_size_x(s) - 1, oy + py);
- tty_putcode(tty, TTYC_EL1);
- cleared = 1;
- }
- if (sx != 0)
- tty_cursor(tty, ox, oy + py);
+ if (wp == NULL ||
+ py == 0 ||
+ (~s->grid->linedata[s->grid->hsize + py - 1].flags & GRID_LINE_WRAPPED) ||
+ ox != 0 ||
+ tty->cx < tty->sx ||
+ screen_size_x(s) < tty->sx) {
+ if (screen_size_x(s) < tty->sx &&
+ ox == 0 &&
+ sx != screen_size_x(s) &&
+ tty_term_has(tty->term, TTYC_EL1) &&
+ !tty_fake_bce(tty, wp, 8)) {
+ tty_default_attributes(tty, wp, 8);
+ tty_cursor(tty, screen_size_x(s) - 1, oy + py);
+ tty_putcode(tty, TTYC_EL1);
+ cleared = 1;
+ }
+ if (sx != 0)
+ tty_cursor(tty, ox, oy + py);
+ } else
+ log_debug("%s: wrapped line %u", __func__, oy + py);
memcpy(&last, &grid_default_cell, sizeof last);
len = 0;
@@ -1477,7 +1489,8 @@ static void
tty_cursor_pane_unless_wrap(struct tty *tty, const struct tty_ctx *ctx,
u_int cx, u_int cy)
{
- if (!tty_pane_full_width(tty, ctx) ||
+ if (!ctx->wrapped ||
+ !tty_pane_full_width(tty, ctx) ||
(tty->term->flags & TERM_EARLYWRAP) ||
ctx->xoff + cx != 0 ||
ctx->yoff + cy != tty->cy + 1 ||