Do not go through the whole attributes setting process if the new cell

is the same as the previous one.
This commit is contained in:
nicm 2017-02-06 19:45:23 +00:00
parent 10e14ae504
commit 68e04907de
2 changed files with 26 additions and 6 deletions

3
tmux.h
View File

@ -1054,6 +1054,9 @@ struct tty {
struct grid_cell cell; struct grid_cell cell;
int last_wp;
struct grid_cell last_cell;
#define TTY_NOCURSOR 0x1 #define TTY_NOCURSOR 0x1
#define TTY_FREEZE 0x2 #define TTY_FREEZE 0x2
#define TTY_TIMER 0x4 #define TTY_TIMER 0x4

23
tty.c
View File

@ -246,6 +246,9 @@ tty_start_tty(struct tty *tty)
tty_putcode(tty, TTYC_SGR0); tty_putcode(tty, TTYC_SGR0);
memcpy(&tty->cell, &grid_default_cell, sizeof tty->cell); memcpy(&tty->cell, &grid_default_cell, sizeof tty->cell);
memcpy(&tty->last_cell, &grid_default_cell, sizeof tty->last_cell);
tty->last_wp = -1;
tty_putcode(tty, TTYC_RMKX); tty_putcode(tty, TTYC_RMKX);
if (tty_use_acs(tty)) if (tty_use_acs(tty))
tty_putcode(tty, TTYC_ENACS); tty_putcode(tty, TTYC_ENACS);
@ -1250,13 +1253,15 @@ tty_reset(struct tty *tty)
{ {
struct grid_cell *gc = &tty->cell; struct grid_cell *gc = &tty->cell;
if (grid_cells_equal(gc, &grid_default_cell)) if (!grid_cells_equal(gc, &grid_default_cell)) {
return;
if ((gc->attr & GRID_ATTR_CHARSET) && tty_use_acs(tty)) if ((gc->attr & GRID_ATTR_CHARSET) && tty_use_acs(tty))
tty_putcode(tty, TTYC_RMACS); tty_putcode(tty, TTYC_RMACS);
tty_putcode(tty, TTYC_SGR0); tty_putcode(tty, TTYC_SGR0);
memcpy(gc, &grid_default_cell, sizeof *gc); memcpy(gc, &grid_default_cell, sizeof *gc);
}
memcpy(&tty->last_cell, &grid_default_cell, sizeof tty->last_cell);
tty->last_wp = -1;
} }
/* Turn off margin. */ /* Turn off margin. */
@ -1478,6 +1483,18 @@ tty_attributes(struct tty *tty, const struct grid_cell *gc,
struct grid_cell *tc = &tty->cell, gc2; struct grid_cell *tc = &tty->cell, gc2;
u_char changed; u_char changed;
/* Ignore cell if it is the same as the last one. */
if (wp != NULL &&
(int)wp->id == tty->last_wp &&
~(wp->window->flags & WINDOW_STYLECHANGED) &&
gc->attr == tty->last_cell.attr &&
gc->fg == tty->last_cell.fg &&
gc->bg == tty->last_cell.bg)
return;
tty->last_wp = (wp != NULL ? (int)wp->id : -1);
memcpy(&tty->last_cell, gc, sizeof tty->last_cell);
/* Copy cell and update default colours. */
memcpy(&gc2, gc, sizeof gc2); memcpy(&gc2, gc, sizeof gc2);
if (wp != NULL) if (wp != NULL)
tty_default_colours(&gc2, wp); tty_default_colours(&gc2, wp);