mirror of
https://github.com/tmate-io/tmate.git
synced 2024-12-24 15:48:58 +01:00
Sync OpenBSD patchset 488:
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.
This commit is contained in:
parent
fdda6ef8bd
commit
344a241c28
44
tty.c
44
tty.c
@ -1,4 +1,4 @@
|
|||||||
/* $Id: tty.c,v 1.167 2009-10-28 23:17:28 tcunha Exp $ */
|
/* $Id: tty.c,v 1.168 2009-11-04 23:09:48 tcunha Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
|
||||||
@ -1126,7 +1126,7 @@ 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;
|
||||||
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 the character is space, don't care about foreground. */
|
||||||
if (gc->data == ' ' && !(gc->flags & GRID_FLAG_UTF8)) {
|
if (gc->data == ' ' && !(gc->flags & GRID_FLAG_UTF8)) {
|
||||||
@ -1142,34 +1142,40 @@ tty_attributes(struct tty *tty, const struct grid_cell *gc)
|
|||||||
gc = &gc2;
|
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
|
* 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
|
* 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.
|
* any serious harm and makes a couple of applications happier.
|
||||||
*/
|
*/
|
||||||
if (!tty_term_has(tty->term, TTYC_SETAB)) {
|
if (!tty_term_has(tty->term, TTYC_SETAB)) {
|
||||||
if (attr & GRID_ATTR_REVERSE) {
|
if (gc != &gc2) {
|
||||||
if (fg != 7 && fg != 8)
|
memcpy(&gc2, gc, sizeof gc2);
|
||||||
attr &= ~GRID_ATTR_REVERSE;
|
gc = &gc2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gc->attr & GRID_ATTR_REVERSE) {
|
||||||
|
if (gc->fg != 7 && gc->fg != 8)
|
||||||
|
gc2.attr &= ~GRID_ATTR_REVERSE;
|
||||||
} else {
|
} else {
|
||||||
if (bg != 0 && bg != 8)
|
if (gc->bg != 0 && gc->bg != 8)
|
||||||
attr |= GRID_ATTR_REVERSE;
|
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. */
|
/* Filter out attribute bits already set. */
|
||||||
changed = attr & ~tc->attr;
|
changed = new_attr & ~tc->attr;
|
||||||
tc->attr = attr;
|
tc->attr = new_attr;
|
||||||
|
|
||||||
/* Set the attributes. */
|
/* Set the attributes. */
|
||||||
if (changed & GRID_ATTR_BRIGHT)
|
if (changed & GRID_ATTR_BRIGHT)
|
||||||
|
Loading…
Reference in New Issue
Block a user