diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2009-11-04 13:34:27 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2009-11-04 13:34:27 +0000 |
commit | fd2435548b9fc22fbb6cdc5ab9e101166beaa31e (patch) | |
tree | a177a1b675703407e232e69d422ab0f35e7e266c /usr.bin/tmux | |
parent | 7d2bc6ca0faf3d0b4ba3245bc745c86596bf2a82 (diff) |
Fix the reverse emulation when a terminal doesn't have setab to use the correct
fg/bg (adjusted if spaces) and happen before attribute setting.
Diffstat (limited to 'usr.bin/tmux')
-rw-r--r-- | usr.bin/tmux/tty.c | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/usr.bin/tmux/tty.c b/usr.bin/tmux/tty.c index 64084468f39..07a29190575 100644 --- a/usr.bin/tmux/tty.c +++ b/usr.bin/tmux/tty.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty.c,v 1.63 2009/10/28 08:52:36 nicm Exp $ */ +/* $OpenBSD: tty.c,v 1.64 2009/11/04 13:34:26 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -1121,7 +1121,7 @@ tty_attributes(struct tty *tty, const struct grid_cell *gc) { struct grid_cell *tc = &tty->cell, gc2; u_char changed; - u_int fg = gc->fg, bg = gc->bg, attr = gc->attr; + u_int new_attr; /* If the character is space, don't care about foreground. */ if (gc->data == ' ' && !(gc->flags & GRID_FLAG_UTF8)) { @@ -1137,34 +1137,40 @@ tty_attributes(struct tty *tty, const struct grid_cell *gc) gc = &gc2; } - /* If any bits are being cleared, reset everything. */ - if (tc->attr & ~attr) - tty_reset(tty); - - /* - * Set the colours. This may call tty_reset() (so it comes next) and - * may add to the desired attributes in attr. - */ - tty_colours(tty, gc, &attr); - /* * If no setab, try to use the reverse attribute as a best-effort for a * non-default background. This is a bit of a hack but it doesn't do * any serious harm and makes a couple of applications happier. */ if (!tty_term_has(tty->term, TTYC_SETAB)) { - if (attr & GRID_ATTR_REVERSE) { - if (fg != 7 && fg != 8) - attr &= ~GRID_ATTR_REVERSE; + if (gc != &gc2) { + memcpy(&gc2, gc, sizeof gc2); + gc = &gc2; + } + + if (gc->attr & GRID_ATTR_REVERSE) { + if (gc->fg != 7 && gc->fg != 8) + gc2.attr &= ~GRID_ATTR_REVERSE; } else { - if (bg != 0 && bg != 8) - attr |= GRID_ATTR_REVERSE; + if (gc->bg != 0 && gc->bg != 8) + gc2.attr |= GRID_ATTR_REVERSE; } } + /* If any bits are being cleared, reset everything. */ + if (tc->attr & ~gc->attr) + tty_reset(tty); + + /* + * Set the colours. This may call tty_reset() (so it comes next) and + * may add to (NOT remove) the desired attributes by changing new_attr. + */ + new_attr = gc->attr; + tty_colours(tty, gc, &new_attr); + /* Filter out attribute bits already set. */ - changed = attr & ~tc->attr; - tc->attr = attr; + changed = new_attr & ~tc->attr; + tc->attr = new_attr; /* Set the attributes. */ if (changed & GRID_ATTR_BRIGHT) |