diff --git a/tmux.h b/tmux.h index fa11708c..0681100f 100644 --- a/tmux.h +++ b/tmux.h @@ -257,6 +257,7 @@ enum { /* Termcap codes. */ enum tty_code_code { TTYC_ACSC, + TTYC_AM, TTYC_AX, TTYC_BCE, TTYC_BEL, @@ -477,7 +478,6 @@ enum tty_code_code { TTYC_TSL, TTYC_U8, TTYC_VPA, - TTYC_XENL, TTYC_XT }; @@ -1256,7 +1256,7 @@ struct tty_term { struct tty_code *codes; #define TERM_256COLOURS 0x1 -#define TERM_NOXENL 0x2 +#define TERM_NOAM 0x2 #define TERM_DECSLRM 0x4 #define TERM_DECFRA 0x8 #define TERM_RGBCOLOURS 0x10 diff --git a/tty-term.c b/tty-term.c index 76c4fb57..3ccff2ff 100644 --- a/tty-term.c +++ b/tty-term.c @@ -54,6 +54,7 @@ struct tty_term_code_entry { static const struct tty_term_code_entry tty_term_codes[] = { [TTYC_ACSC] = { TTYCODE_STRING, "acsc" }, + [TTYC_AM] = { TTYCODE_FLAG, "am" }, [TTYC_AX] = { TTYCODE_FLAG, "AX" }, [TTYC_BCE] = { TTYCODE_FLAG, "bce" }, [TTYC_BEL] = { TTYCODE_STRING, "bel" }, @@ -274,7 +275,6 @@ static const struct tty_term_code_entry tty_term_codes[] = { [TTYC_TSL] = { TTYCODE_STRING, "tsl" }, [TTYC_U8] = { TTYCODE_NUMBER, "U8" }, [TTYC_VPA] = { TTYCODE_STRING, "vpa" }, - [TTYC_XENL] = { TTYCODE_FLAG, "xenl" }, [TTYC_XT] = { TTYCODE_FLAG, "XT" } }; @@ -580,17 +580,22 @@ tty_term_create(struct tty *tty, char *name, int *feat, int fd, char **cause) tty_term_apply_overrides(term); /* - * Terminals without xenl (eat newline glitch) wrap at at $COLUMNS - 1 + * Terminals without am (auto right margin) wrap at at $COLUMNS - 1 * rather than $COLUMNS (the cursor can never be beyond $COLUMNS - 1). * - * This is irritating, most notably because it is impossible to write - * to the very bottom-right of the screen without scrolling. + * Terminals without xenl (eat newline glitch) ignore a newline beyond + * the right edge of the terminal, but tmux doesn't care about this - + * it always uses absolute only moves the cursor with a newline when + * also sending a linefeed. + * + * This is irritating, most notably because it is painful to write to + * the very bottom-right of the screen without scrolling. * * Flag the terminal here and apply some workarounds in other places to * do the best possible. */ - if (!tty_term_flag(term, TTYC_XENL)) - term->flags |= TERM_NOXENL; + if (!tty_term_flag(term, TTYC_AM)) + term->flags |= TERM_NOAM; /* Generate ACS table. If none is present, use nearest ASCII. */ memset(term->acs, 0, sizeof term->acs); diff --git a/tty.c b/tty.c index 77eb90be..14b770e2 100644 --- a/tty.c +++ b/tty.c @@ -564,7 +564,7 @@ tty_putc(struct tty *tty, u_char ch) { const char *acs; - if ((tty->term->flags & TERM_NOXENL) && + if ((tty->term->flags & TERM_NOAM) && ch >= 0x20 && ch != 0x7f && tty->cy == tty->sy - 1 && tty->cx + 1 >= tty->sx) @@ -586,11 +586,11 @@ tty_putc(struct tty *tty, u_char ch) tty->cy++; /* - * On !xenl terminals, force the cursor position to - * where we think it should be after a line wrap - this - * means it works on sensible terminals as well. + * On !am terminals, force the cursor position to where + * we think it should be after a line wrap - this means + * it works on sensible terminals as well. */ - if (tty->term->flags & TERM_NOXENL) + if (tty->term->flags & TERM_NOAM) tty_putcode2(tty, TTYC_CUP, tty->cy, tty->cx); } else tty->cx++; @@ -600,7 +600,7 @@ tty_putc(struct tty *tty, u_char ch) void tty_putn(struct tty *tty, const void *buf, size_t len, u_int width) { - if ((tty->term->flags & TERM_NOXENL) && + if ((tty->term->flags & TERM_NOAM) && tty->cy == tty->sy - 1 && tty->cx + len >= tty->sx) len = tty->sx - tty->cx - 1; @@ -1875,7 +1875,7 @@ tty_cmd_cells(struct tty *tty, const struct tty_ctx *ctx) ctx->xoff + ctx->ocx + ctx->num > ctx->wox + ctx->wsx)) { if (!ctx->wrapped || !tty_full_width(tty, ctx) || - (tty->term->flags & TERM_NOXENL) || + (tty->term->flags & TERM_NOAM) || ctx->xoff + ctx->ocx != 0 || ctx->yoff + ctx->ocy != tty->cy + 1 || tty->cx < tty->sx || @@ -1931,7 +1931,7 @@ tty_cell(struct tty *tty, const struct grid_cell *gc, const struct grid_cell *gcp; /* Skip last character if terminal is stupid. */ - if ((tty->term->flags & TERM_NOXENL) && + if ((tty->term->flags & TERM_NOAM) && tty->cy == tty->sy - 1 && tty->cx == tty->sx - 1) return; @@ -2087,7 +2087,7 @@ tty_cursor_pane_unless_wrap(struct tty *tty, const struct tty_ctx *ctx, { if (!ctx->wrapped || !tty_full_width(tty, ctx) || - (tty->term->flags & TERM_NOXENL) || + (tty->term->flags & TERM_NOAM) || ctx->xoff + cx != 0 || ctx->yoff + cy != tty->cy + 1 || tty->cx < tty->sx ||