summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2012-03-17 22:56:04 +0000
committerNicholas Marriott <nicm@openbsd.org>2012-03-17 22:56:04 +0000
commitd8805af66bb876d762248d1695872eca3296f0e6 (patch)
tree7c152fcb1921509834e88c6ada100c1f969412a9
parent46210344a62b079ff61435b978da41a0f92caf3a (diff)
On xterm 271 and later, put the terminal into SCL 5 and use DECCRA for
scrolling the region in panes (if the large region check isn't hit). With help from Ailin Nemui.
-rw-r--r--tmux.h3
-rw-r--r--tty-keys.c3
-rw-r--r--tty.c43
3 files changed, 44 insertions, 5 deletions
diff --git a/tmux.h b/tmux.h
index 5f2f3a44..8d0b680f 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1472,8 +1472,9 @@ void tty_putc(struct tty *, u_char);
void tty_pututf8(struct tty *, const struct grid_utf8 *);
void tty_init(struct tty *, int, char *);
int tty_resize(struct tty *);
-int tty_set_size(struct tty *tty, u_int sx, u_int sy);
+int tty_set_size(struct tty *, u_int, u_int);
void tty_start_tty(struct tty *);
+void tty_set_version(struct tty *, u_int);
void tty_stop_tty(struct tty *);
void tty_set_title(struct tty *, const char *);
void tty_update_mode(struct tty *, int, struct screen *);
diff --git a/tty-keys.c b/tty-keys.c
index 37265dce..c5b85ce1 100644
--- a/tty-keys.c
+++ b/tty-keys.c
@@ -728,8 +728,7 @@ tty_keys_device(struct tty *tty, const char *buf, size_t len, size_t *size)
a = b = 0;
log_debug("received xterm version %u", b);
- if (tty->xterm_version == 0)
- tty->xterm_version = b;
+ tty_set_version(tty, b);
return (0);
}
diff --git a/tty.c b/tty.c
index a36bf787..c9191a6a 100644
--- a/tty.c
+++ b/tty.c
@@ -177,7 +177,7 @@ tty_error_callback(
void
tty_init_termios(int fd, struct termios *orig_tio, struct bufferevent *bufev)
{
- struct termios tio;
+ struct termios tio;
if (fd == -1 || tcgetattr(fd, orig_tio) != 0)
return;
@@ -235,6 +235,27 @@ tty_start_tty(struct tty *tty)
}
void
+tty_set_version(struct tty *tty, u_int version)
+{
+ if (tty->xterm_version != 0)
+ return;
+ tty->xterm_version = version;
+
+ if (tty->xterm_version > 270) {
+ tty_puts(tty, "\033[65;1\"p");
+
+ tty_putcode(tty, TTYC_RMACS);
+ memcpy(&tty->cell, &grid_default_cell, sizeof tty->cell);
+
+ tty->cx = UINT_MAX;
+ tty->cy = UINT_MAX;
+
+ tty->rupper = UINT_MAX;
+ tty->rlower = UINT_MAX;
+ }
+}
+
+void
tty_stop_tty(struct tty *tty)
{
struct winsize ws;
@@ -276,6 +297,9 @@ tty_stop_tty(struct tty *tty)
tty_raw(tty, "\033[?1000l");
tty_raw(tty, tty_term_string(tty->term, TTYC_RMCUP));
+
+ if (tty->xterm_version > 270)
+ tty_raw(tty, "\033[61;1\"p");
}
void
@@ -844,13 +868,28 @@ tty_cmd_linefeed(struct tty *tty, const struct tty_ctx *ctx)
{
struct window_pane *wp = ctx->wp;
struct screen *s = wp->screen;
+ char tmp[64];
if (ctx->ocy != ctx->orlower)
return;
if (ctx->xoff != 0 || screen_size_x(s) < tty->sx ||
!tty_term_has(tty->term, TTYC_CSR)) {
- tty_redraw_region(tty, ctx);
+ if (tty_large_region(tty, ctx))
+ wp->flags |= PANE_REDRAW;
+ else if (tty->xterm_version > 270) {
+ snprintf(tmp, sizeof tmp,
+ "\033[%u;%u;%u;%u;1;%u;%u;1$v",
+ ctx->yoff + ctx->orupper + 2,
+ ctx->xoff + 1,
+ ctx->yoff + ctx->orlower + 1,
+ ctx->xoff + screen_size_x(s),
+ ctx->yoff + ctx->orupper + 1,
+ ctx->xoff + 1);
+ tty_puts(tty, tmp);
+ tty_cmd_clearline(tty, ctx);
+ } else
+ tty_redraw_region(tty, ctx);
return;
}