Sync OpenBSD patchset 395:

Use relative cursor movement instead of absolute when possible and when
supported by the terminal to reduce the size of the output data (generally
about 10-20%).
This commit is contained in:
Tiago Cunha 2009-10-15 01:33:21 +00:00
parent 8ab3a3d9aa
commit 44fd6f4381
3 changed files with 138 additions and 13 deletions

13
tmux.h
View File

@ -1,4 +1,4 @@
/* $Id: tmux.h,v 1.472 2009-10-15 01:30:00 tcunha Exp $ */ /* $Id: tmux.h,v 1.473 2009-10-15 01:33:21 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -193,9 +193,15 @@ enum tty_code_code {
TTYC_CNORM, /* cursor_normal, ve */ TTYC_CNORM, /* cursor_normal, ve */
TTYC_COLORS, /* max_colors, Co */ TTYC_COLORS, /* max_colors, Co */
TTYC_CSR, /* change_scroll_region, cs */ TTYC_CSR, /* change_scroll_region, cs */
TTYC_CUB, /* parm_left_cursor, LE */
TTYC_CUB1, /* cursor_left, le */
TTYC_CUD, /* parm_down_cursor, DO */ TTYC_CUD, /* parm_down_cursor, DO */
TTYC_CUD1, /* cursor_down, do */ TTYC_CUD1, /* cursor_down, do */
TTYC_CUF, /* parm_right_cursor, RI */
TTYC_CUF1, /* cursor_right, nd */
TTYC_CUP, /* cursor_address, cm */ TTYC_CUP, /* cursor_address, cm */
TTYC_CUU, /* parm_up_cursor, UP */
TTYC_CUU1, /* cursor_up, up */
TTYC_DCH, /* parm_dch, DC */ TTYC_DCH, /* parm_dch, DC */
TTYC_DCH1, /* delete_character, dc */ TTYC_DCH1, /* delete_character, dc */
TTYC_DIM, /* enter_dim_mode, mh */ TTYC_DIM, /* enter_dim_mode, mh */
@ -204,6 +210,8 @@ enum tty_code_code {
TTYC_EL, /* clr_eol, ce */ TTYC_EL, /* clr_eol, ce */
TTYC_EL1, /* clr_bol, cb */ TTYC_EL1, /* clr_bol, cb */
TTYC_ENACS, /* ena_acs, eA */ TTYC_ENACS, /* ena_acs, eA */
TTYC_HOME, /* cursor_home, ho */
TTYC_HPA, /* column_address, ch */
TTYC_ICH, /* parm_ich, IC */ TTYC_ICH, /* parm_ich, IC */
TTYC_ICH1, /* insert_character, ic */ TTYC_ICH1, /* insert_character, ic */
TTYC_IL, /* parm_insert_line, IL */ TTYC_IL, /* parm_insert_line, IL */
@ -230,8 +238,8 @@ enum tty_code_code {
TTYC_KF17, /* key_f17, F7 */ TTYC_KF17, /* key_f17, F7 */
TTYC_KF18, /* key_f18, F8 */ TTYC_KF18, /* key_f18, F8 */
TTYC_KF19, /* key_f19, F9 */ TTYC_KF19, /* key_f19, F9 */
TTYC_KF20, /* key_f20, F10 */
TTYC_KF2, /* key_f2, k2 */ TTYC_KF2, /* key_f2, k2 */
TTYC_KF20, /* key_f20, F10 */
TTYC_KF3, /* key_f3, k3 */ TTYC_KF3, /* key_f3, k3 */
TTYC_KF4, /* key_f4, k4 */ TTYC_KF4, /* key_f4, k4 */
TTYC_KF5, /* key_f5, k5 */ TTYC_KF5, /* key_f5, k5 */
@ -260,6 +268,7 @@ enum tty_code_code {
TTYC_SMKX, /* keypad_xmit, ks */ TTYC_SMKX, /* keypad_xmit, ks */
TTYC_SMSO, /* enter_standout_mode, so */ TTYC_SMSO, /* enter_standout_mode, so */
TTYC_SMUL, /* enter_underline_mode, us */ TTYC_SMUL, /* enter_underline_mode, us */
TTYC_VPA, /* row_address, cv */
TTYC_XENL, /* eat_newline_glitch, xn */ TTYC_XENL, /* eat_newline_glitch, xn */
}; };
#define NTTYCODE (TTYC_XENL + 1) #define NTTYCODE (TTYC_XENL + 1)

View File

@ -1,4 +1,4 @@
/* $Id: tty-term.c,v 1.31 2009-09-22 19:20:08 nicm Exp $ */ /* $Id: tty-term.c,v 1.32 2009-10-15 01:33:21 tcunha Exp $ */
/* /*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@ -42,9 +42,15 @@ struct tty_term_code_entry tty_term_codes[NTTYCODE] = {
{ TTYC_CNORM, TTYCODE_STRING, "cnorm" }, { TTYC_CNORM, TTYCODE_STRING, "cnorm" },
{ TTYC_COLORS, TTYCODE_NUMBER, "colors" }, { TTYC_COLORS, TTYCODE_NUMBER, "colors" },
{ TTYC_CSR, TTYCODE_STRING, "csr" }, { TTYC_CSR, TTYCODE_STRING, "csr" },
{ TTYC_CUB, TTYCODE_STRING, "cub" },
{ TTYC_CUB1, TTYCODE_STRING, "cub1" },
{ TTYC_CUD, TTYCODE_STRING, "cud" }, { TTYC_CUD, TTYCODE_STRING, "cud" },
{ TTYC_CUD1, TTYCODE_STRING, "cud1" }, { TTYC_CUD1, TTYCODE_STRING, "cud1" },
{ TTYC_CUF, TTYCODE_STRING, "cuf" },
{ TTYC_CUF1, TTYCODE_STRING, "cuf1" },
{ TTYC_CUP, TTYCODE_STRING, "cup" }, { TTYC_CUP, TTYCODE_STRING, "cup" },
{ TTYC_CUU, TTYCODE_STRING, "cuu" },
{ TTYC_CUU1, TTYCODE_STRING, "cuu1" },
{ TTYC_DCH, TTYCODE_STRING, "dch" }, { TTYC_DCH, TTYCODE_STRING, "dch" },
{ TTYC_DCH1, TTYCODE_STRING, "dch1" }, { TTYC_DCH1, TTYCODE_STRING, "dch1" },
{ TTYC_DIM, TTYCODE_STRING, "dim" }, { TTYC_DIM, TTYCODE_STRING, "dim" },
@ -53,6 +59,8 @@ struct tty_term_code_entry tty_term_codes[NTTYCODE] = {
{ TTYC_EL, TTYCODE_STRING, "el" }, { TTYC_EL, TTYCODE_STRING, "el" },
{ TTYC_EL1, TTYCODE_STRING, "el1" }, { TTYC_EL1, TTYCODE_STRING, "el1" },
{ TTYC_ENACS, TTYCODE_STRING, "enacs" }, { TTYC_ENACS, TTYCODE_STRING, "enacs" },
{ TTYC_HOME, TTYCODE_STRING, "home" },
{ TTYC_HPA, TTYCODE_STRING, "hpa" },
{ TTYC_ICH, TTYCODE_STRING, "ich" }, { TTYC_ICH, TTYCODE_STRING, "ich" },
{ TTYC_ICH1, TTYCODE_STRING, "ich1" }, { TTYC_ICH1, TTYCODE_STRING, "ich1" },
{ TTYC_IL, TTYCODE_STRING, "il" }, { TTYC_IL, TTYCODE_STRING, "il" },
@ -79,8 +87,8 @@ struct tty_term_code_entry tty_term_codes[NTTYCODE] = {
{ TTYC_KF17, TTYCODE_STRING, "kf17" }, { TTYC_KF17, TTYCODE_STRING, "kf17" },
{ TTYC_KF18, TTYCODE_STRING, "kf18" }, { TTYC_KF18, TTYCODE_STRING, "kf18" },
{ TTYC_KF19, TTYCODE_STRING, "kf19" }, { TTYC_KF19, TTYCODE_STRING, "kf19" },
{ TTYC_KF20, TTYCODE_STRING, "kf20" },
{ TTYC_KF2, TTYCODE_STRING, "kf2" }, { TTYC_KF2, TTYCODE_STRING, "kf2" },
{ TTYC_KF20, TTYCODE_STRING, "kf20" },
{ TTYC_KF3, TTYCODE_STRING, "kf3" }, { TTYC_KF3, TTYCODE_STRING, "kf3" },
{ TTYC_KF4, TTYCODE_STRING, "kf4" }, { TTYC_KF4, TTYCODE_STRING, "kf4" },
{ TTYC_KF5, TTYCODE_STRING, "kf5" }, { TTYC_KF5, TTYCODE_STRING, "kf5" },
@ -109,6 +117,7 @@ struct tty_term_code_entry tty_term_codes[NTTYCODE] = {
{ TTYC_SMKX, TTYCODE_STRING, "smkx" }, { TTYC_SMKX, TTYCODE_STRING, "smkx" },
{ TTYC_SMSO, TTYCODE_STRING, "smso" }, { TTYC_SMSO, TTYCODE_STRING, "smso" },
{ TTYC_SMUL, TTYCODE_STRING, "smul" }, { TTYC_SMUL, TTYCODE_STRING, "smul" },
{ TTYC_VPA, TTYCODE_STRING, "vpa" },
{ TTYC_XENL, TTYCODE_FLAG, "xenl" }, { TTYC_XENL, TTYCODE_FLAG, "xenl" },
}; };

125
tty.c
View File

@ -1,4 +1,4 @@
/* $Id: tty.c,v 1.145 2009-10-15 01:30:00 tcunha Exp $ */ /* $Id: tty.c,v 1.146 2009-10-15 01:33:21 tcunha Exp $ */
/* /*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@ -21,6 +21,7 @@
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <stdlib.h>
#include <string.h> #include <string.h>
#include <termios.h> #include <termios.h>
#include <unistd.h> #include <unistd.h>
@ -921,13 +922,14 @@ tty_region(struct tty *tty, u_int rupper, u_int rlower)
tty->rupper = rupper; tty->rupper = rupper;
tty->rlower = rlower; tty->rlower = rlower;
tty->cx = 0; tty->cx = 0;
tty->cy = 0; tty->cy = 0;
tty_putcode2(tty, TTYC_CSR, tty->rupper, tty->rlower); tty_putcode2(tty, TTYC_CSR, tty->rupper, tty->rlower);
} }
/* Move cursor inside pane. */
void void
tty_cursor_pane(struct tty *tty, const struct tty_ctx *ctx, u_int cx, u_int cy) tty_cursor_pane(struct tty *tty, const struct tty_ctx *ctx, u_int cx, u_int cy)
{ {
@ -936,17 +938,122 @@ tty_cursor_pane(struct tty *tty, const struct tty_ctx *ctx, u_int cx, u_int cy)
tty_cursor(tty, wp->xoff + cx, wp->yoff + cy); tty_cursor(tty, wp->xoff + cx, wp->yoff + cy);
} }
/* Move cursor to absolute position. */
void void
tty_cursor(struct tty *tty, u_int cx, u_int cy) tty_cursor(struct tty *tty, u_int cx, u_int cy)
{ {
if (cx == 0 && tty->cx != 0 && tty->cy == cy) { struct tty_term *term = tty->term;
tty->cx = 0; u_int thisx, thisy;
tty_putc(tty, '\r'); int change;
} else if (tty->cx != cx || tty->cy != cy) {
tty->cx = cx; if (cx > tty->sx - 1)
tty->cy = cy; cx = tty->sx - 1;
tty_putcode2(tty, TTYC_CUP, tty->cy, tty->cx);
thisx = tty->cx;
if (thisx > tty->sx - 1)
thisx = tty->sx - 1;
thisy = tty->cy;
/* No change. */
if (cx == thisx && cy == thisy)
return;
/* Move to home position (0, 0). */
if (cx == 0 && cy == 0 && tty_term_has(term, TTYC_HOME)) {
tty_putcode(tty, TTYC_HOME);
goto out;
} }
/* Zero on the next line. */
if (cx == 0 && cy == thisy + 1) {
tty_putc(tty, '\r');
tty_putc(tty, '\n');
goto out;
}
/* Row staying the same. */
if (cy == thisy) {
/* To left edge. */
if (cx == 0) {
tty_putc(tty, '\r');
goto out;
}
/* One to the left. */
if (cx == thisx - 1 && tty_term_has(term, TTYC_CUB1)) {
tty_putcode(tty, TTYC_CUB1);
goto out;
}
/* One to the right. */
if (cx == thisx + 1 && tty_term_has(term, TTYC_CUF1)) {
tty_putcode(tty, TTYC_CUF1);
goto out;
}
/* Calculate difference. */
change = thisx - cx; /* +ve left, -ve right */
/*
* Use HPA if change is larger than absolute, otherwise move
* the cursor with CUB/CUF.
*/
if (abs(change) > cx && tty_term_has(term, TTYC_HPA)) {
tty_putcode1(tty, TTYC_HPA, cx);
goto out;
} else if (change > 0 && tty_term_has(term, TTYC_CUB)) {
tty_putcode1(tty, TTYC_CUB, change);
goto out;
} else if (change < 0 && tty_term_has(term, TTYC_CUF)) {
tty_putcode1(tty, TTYC_CUF, -change);
goto out;
}
}
/* Column staying the same. */
if (cx == thisx ) {
/* One above. */
if (cy != tty->rupper &&
cy == thisy - 1 && tty_term_has(term, TTYC_CUU1)) {
tty_putcode(tty, TTYC_CUU1);
goto out;
}
/* One below. */
if (cy != tty->rlower &&
cy == thisy + 1 && tty_term_has(term, TTYC_CUD1)) {
tty_putcode(tty, TTYC_CUD1);
goto out;
}
/* Calculate difference. */
change = thisy - cy; /* +ve up, -ve down */
/*
* Use VPA if change is larger than absolute or if this change
* would cross the scroll region, otherwise use CUU/CUD.
*/
if ((abs(change) > cy ||
(change < 0 && cy - change > tty->rlower) ||
(change > 0 && cy - change < tty->rupper)) &&
tty_term_has(term, TTYC_VPA)) {
tty_putcode1(tty, TTYC_VPA, cy);
goto out;
} else if (change > 0 && tty_term_has(term, TTYC_CUU)) {
tty_putcode1(tty, TTYC_CUU, change);
goto out;
} else if (change < 0 && tty_term_has(term, TTYC_CUD)) {
tty_putcode1(tty, TTYC_CUD, -change);
goto out;
}
}
/* Absolute movement. */
tty_putcode2(tty, TTYC_CUP, cy, cx);
out:
tty->cx = cx;
tty->cy = cy;
} }
void void