diff options
author | nicm <nicm> | 2017-02-06 19:45:23 +0000 |
---|---|---|
committer | nicm <nicm> | 2017-02-06 19:45:23 +0000 |
commit | 68e04907de6a13933805d3437872bd859f4ce6c1 (patch) | |
tree | ec9bec134d7175cd3e1d613a2a30755031c9d761 | |
parent | 10e14ae504df467234284a1040e91d48b41b2dd0 (diff) | |
download | rtmux-68e04907de6a13933805d3437872bd859f4ce6c1.tar.gz rtmux-68e04907de6a13933805d3437872bd859f4ce6c1.tar.bz2 rtmux-68e04907de6a13933805d3437872bd859f4ce6c1.zip |
Do not go through the whole attributes setting process if the new cell
is the same as the previous one.
-rw-r--r-- | tmux.h | 3 | ||||
-rw-r--r-- | tty.c | 29 |
2 files changed, 26 insertions, 6 deletions
@@ -1054,6 +1054,9 @@ struct tty { struct grid_cell cell; + int last_wp; + struct grid_cell last_cell; + #define TTY_NOCURSOR 0x1 #define TTY_FREEZE 0x2 #define TTY_TIMER 0x4 @@ -246,6 +246,9 @@ tty_start_tty(struct tty *tty) tty_putcode(tty, TTYC_SGR0); 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); if (tty_use_acs(tty)) tty_putcode(tty, TTYC_ENACS); @@ -1250,13 +1253,15 @@ tty_reset(struct tty *tty) { struct grid_cell *gc = &tty->cell; - if (grid_cells_equal(gc, &grid_default_cell)) - return; + if (!grid_cells_equal(gc, &grid_default_cell)) { + if ((gc->attr & GRID_ATTR_CHARSET) && tty_use_acs(tty)) + tty_putcode(tty, TTYC_RMACS); + tty_putcode(tty, TTYC_SGR0); + memcpy(gc, &grid_default_cell, sizeof *gc); + } - if ((gc->attr & GRID_ATTR_CHARSET) && tty_use_acs(tty)) - tty_putcode(tty, TTYC_RMACS); - tty_putcode(tty, TTYC_SGR0); - 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. */ @@ -1478,6 +1483,18 @@ tty_attributes(struct tty *tty, const struct grid_cell *gc, struct grid_cell *tc = &tty->cell, gc2; 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); if (wp != NULL) tty_default_colours(&gc2, wp); |