aboutsummaryrefslogtreecommitdiff
path: root/tty.c
diff options
context:
space:
mode:
authornicm <nicm>2017-04-28 17:58:44 +0000
committernicm <nicm>2017-04-28 17:58:44 +0000
commit54e2205e545d72d8d9ccaadfd4d1212bafb2f41b (patch)
treecbb1cfb78032e32092c546131a4f5ed720caced0 /tty.c
parentc12711affd5d5124f05fc0f6e08ad1bb4d27e6e5 (diff)
downloadrtmux-54e2205e545d72d8d9ccaadfd4d1212bafb2f41b.tar.gz
rtmux-54e2205e545d72d8d9ccaadfd4d1212bafb2f41b.tar.bz2
rtmux-54e2205e545d72d8d9ccaadfd4d1212bafb2f41b.zip
Konsole incorrectly ignores SU (CSI S) if the parameter is bigger than
the scroll region, so clamp it. Reported by Moritz Bunkus.
Diffstat (limited to 'tty.c')
-rw-r--r--tty.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/tty.c b/tty.c
index fda297c1..e951f25c 100644
--- a/tty.c
+++ b/tty.c
@@ -1117,7 +1117,7 @@ void
tty_cmd_scrollup(struct tty *tty, const struct tty_ctx *ctx)
{
struct window_pane *wp = ctx->wp;
- u_int i;
+ u_int i, lines;
if ((!tty_pane_full_width(tty, ctx) && !tty_use_margin(tty)) ||
tty_fake_bce(tty, wp, 8) ||
@@ -1131,12 +1131,21 @@ tty_cmd_scrollup(struct tty *tty, const struct tty_ctx *ctx)
tty_region_pane(tty, ctx, ctx->orupper, ctx->orlower);
tty_margin_pane(tty, ctx);
- if (ctx->num == 1 || !tty_term_has(tty->term, TTYC_INDN)) {
+ /*
+ * Konsole has a bug where it will ignore SU if the parameter is more
+ * than the height of the scroll region. Clamping the parameter doesn't
+ * hurt in any case.
+ */
+ lines = tty->rlower - tty->rupper;
+ if (lines > ctx->num)
+ lines = ctx->num;
+
+ if (lines == 1 || !tty_term_has(tty->term, TTYC_INDN)) {
tty_cursor(tty, tty->rright, tty->rlower);
- for (i = 0; i < ctx->num; i++)
+ for (i = 0; i < lines; i++)
tty_putc(tty, '\n');
} else
- tty_putcode1(tty, TTYC_INDN, ctx->num);
+ tty_putcode1(tty, TTYC_INDN, lines);
}
void