aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2017-02-06 22:01:16 +0000
committerThomas Adam <thomas@xteddy.org>2017-02-06 22:01:16 +0000
commitdfdc23d86c1cc2ee26173db9c1a209eac736b5ab (patch)
tree3e23ba79ab895d5dd752281ee41a940a4d835cb3
parent7417e391d5ab127adb6c598776547119f516bb7b (diff)
parent68e04907de6a13933805d3437872bd859f4ce6c1 (diff)
downloadrtmux-dfdc23d86c1cc2ee26173db9c1a209eac736b5ab.tar.gz
rtmux-dfdc23d86c1cc2ee26173db9c1a209eac736b5ab.tar.bz2
rtmux-dfdc23d86c1cc2ee26173db9c1a209eac736b5ab.zip
Merge branch 'obsd-master'
-rw-r--r--tmux.h3
-rw-r--r--tty.c29
2 files changed, 26 insertions, 6 deletions
diff --git a/tmux.h b/tmux.h
index f52dc6b3..f865a13b 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1056,6 +1056,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
diff --git a/tty.c b/tty.c
index 7ecf2a2d..c1769d14 100644
--- a/tty.c
+++ b/tty.c
@@ -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);