/****************************************************************************
- * Copyright (c) 1998-2003,2004 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2004,2005 Free Software Foundation, Inc. *
* *
* Permission is hereby granted, free of charge, to any person obtaining a *
* copy of this software and associated documentation files (the *
/****************************************************************************
* Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995 *
* and: Eric S. Raymond <esr@snark.thyrsus.com> *
- * and: Thomas E. Dickey 1996-2004 *
+ * and: Thomas E. Dickey 1996-on *
****************************************************************************/
/*-----------------------------------------------------------------
#include <ctype.h>
#include <term.h>
-MODULE_ID("$Id: tty_update.c,v 1.205 2004/02/07 18:02:42 tom Exp $")
+MODULE_ID("$Id: tty_update.c,v 1.220 2005/08/13 17:12:32 tom Exp $")
/*
* This define controls the line-breakout optimization. Every once in a
#define FILL_BCE() (SP->_coloron && !SP->_default_color && !back_color_erase)
+static const NCURSES_CH_T normal = NewChar2(BLANK_TEXT, BLANK_ATTR);
+
/*
* Enable checking to see if doupdate and friends are tracking the true
* cursor position correctly. NOTE: this is a debugging hack which will
NCURSES_CH_T my_ch;
PUTC_DATA;
NCURSES_CH_T tilde;
- NCURSES_ATTR_T attr = AttrOfD(ch);
+ NCURSES_CH_T attr = CHDEREF(ch);
TR(TRACE_CHARPUT, ("PutAttrChar(%s) at (%d, %d)",
_tracech_t(ch),
/*
* If this is not a valid character, there is nothing more to do.
*/
- if (isnac(CHDEREF(ch)))
+ if (isWidecExt(CHDEREF(ch))) {
+ TR(TRACE_CHARPUT, ("...skip"));
return;
+ }
/*
* Determine the number of character cells which the 'ch' value will use
* on the screen. It should be at least one.
if ((chlen = wcwidth(CharOf(CHDEREF(ch)))) <= 0) {
static NCURSES_CH_T blank = NewChar(BLANK_TEXT);
- if (isprint(CharOf(CHDEREF(ch)))
- || (SP->_posix_locale && CharOf(CHDEREF(ch)) >= 160)) {
+ if (is8bits(CharOf(CHDEREF(ch)))
+ && (isprint(CharOf(CHDEREF(ch)))
+ || (SP->_legacy_coding && CharOf(CHDEREF(ch)) >= 160))) {
;
} else {
ch = CHREF(blank);
}
#endif
- if ((attr & A_ALTCHARSET)
+ if ((AttrOf(attr) & A_ALTCHARSET)
&& SP->_acs_map != 0
&& CharOfD(ch) < ACS_LEN) {
my_ch = CHDEREF(ch); /* work around const param */
* normal one to be broken (by mis-design ;-).
*/
if (SP->_screen_acs_fix
- && SP->_acs_map[CharOf(my_ch)] & A_ALTCHARSET) {
- attr &= ~(A_ALTCHARSET);
+ && SP->_screen_acs_map[CharOf(my_ch)]) {
+ RemAttr(attr, A_ALTCHARSET);
my_ch = _nc_wacs[CharOf(my_ch)];
}
#endif
- if (attr & A_ALTCHARSET) {
- chtype temp = UChar(SP->_acs_map[CharOfD(ch)]);
+ /*
+ * If we (still) have alternate character set, it is the normal 8bit
+ * flavor. The _screen_acs_map[] array tells if the character was
+ * really in acs_chars, needed because of the way wide/normal line
+ * drawing flavors are integrated.
+ */
+ if (AttrOf(attr) & A_ALTCHARSET) {
+ int j = CharOfD(ch);
+ chtype temp = UChar(SP->_acs_map[j]);
+
+ if (!(SP->_screen_acs_map[j]))
+ RemAttr(attr, A_ALTCHARSET);
if (temp != 0)
- SetChar(my_ch, temp, attr);
- RemAttr(my_ch, A_ALTCHARSET);
+ SetChar(my_ch, temp, AttrOf(attr));
}
ch = CHREF(my_ch);
}
if (tilde_glitch && (CharOfD(ch) == L('~'))) {
- SetChar(tilde, L('`'), attr);
+ SetChar(tilde, L('`'), AttrOf(attr));
ch = CHREF(tilde);
}
{
if (!back_color_erase && SP->_coloron) {
#if NCURSES_EXT_FUNCS
+ int pair;
+
if (!SP->_default_color)
return FALSE;
if (SP->_default_fg != C_MASK || SP->_default_bg != C_MASK)
return FALSE;
- if (AttrOfD(ch) & A_COLOR) {
+ if ((pair = GetPair(CHDEREF(ch))) != 0) {
short fg, bg;
- pair_content(PAIR_NUMBER(AttrOfD(ch)), &fg, &bg);
+ pair_content(pair, &fg, &bg);
if (fg != C_MASK || bg != C_MASK)
return FALSE;
}
if (erase_chars
&& runcount > SP->_ech_cost + SP->_cup_ch_cost
&& can_clear_with(CHREF(ntext0))) {
- UpdateAttrs(AttrOf(ntext0));
+ UpdateAttrs(ntext0);
putp(tparm(erase_chars, runcount));
/*
if (wrap_possible)
rep_count--;
- UpdateAttrs(AttrOf(ntext0));
+ UpdateAttrs(ntext0);
tputs(tparm(repeat_char, CharOf(ntext0), rep_count),
rep_count, _nc_outch);
SP->_curscol += rep_count;
if (otext != ntext
&& (last - first + 1) > SP->_inline_cost) {
for (j = first, same = 0; j <= last; j++) {
- if (!same && isnac(otext[j]))
+ if (!same && isWidecExt(otext[j]))
continue;
if (CharEq(otext[j], ntext[j])) {
same++;
* Keep the physical screen in normal mode in case we get other
* processes writing to the screen.
*/
- UpdateAttrs(A_NORMAL);
+ UpdateAttrs(normal);
_nc_flush();
curscr->_attrs = newscr->_attrs;
}
if (needclear) {
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("clr_eol");
if (clr_eol && SP->_el_cost <= (screen_columns - SP->_curscol)) {
putp(clr_eol);
row = SP->_cursrow;
col = SP->_curscol;
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("clr_eos");
tputs(clr_eos, screen_lines - row, _nc_outch);
int n;
bool attrchanged = FALSE;
- TR(TRACE_UPDATE, ("TransformLine(%d) called", lineno));
+ TR(TRACE_UPDATE, (T_CALLED("TransformLine(%d)"), lineno));
/* copy new hash value to old one */
if (SP->oldhash && SP->newhash)
SP->oldhash[lineno] = SP->newhash[lineno];
-#define ColorOf(n) (AttrOf(n) & A_COLOR)
-#define unColor(n) (AttrOf(n) & ALL_BUT_COLOR)
/*
* If we have colors, there is the possibility of having two color pairs
* that display as the same colors. For instance, Lynx does this. Check
* they are equivalent.
*/
if (SP->_coloron) {
- attr_t oldColor;
- attr_t newColor;
int oldPair;
int newPair;
for (n = 0; n < screen_columns; n++) {
if (!CharEq(newLine[n], oldLine[n])) {
- oldColor = ColorOf(oldLine[n]);
- newColor = ColorOf(newLine[n]);
- if (oldColor != newColor
+ oldPair = GetPair(oldLine[n]);
+ newPair = GetPair(newLine[n]);
+ if (oldPair != newPair
&& unColor(oldLine[n]) == unColor(newLine[n])) {
- oldPair = PAIR_NUMBER(oldColor);
- newPair = PAIR_NUMBER(newColor);
if (oldPair < COLOR_PAIRS
&& newPair < COLOR_PAIRS
&& SP->_color_pairs[oldPair] == SP->_color_pairs[newPair]) {
- RemAttr(oldLine[n], A_COLOR);
- AddAttr(oldLine[n], ColorOf(newLine[n]));
+ SetPair(oldLine[n], GetPair(newLine[n]));
}
}
}
if (ceol_standout_glitch && clr_eol) {
firstChar = 0;
while (firstChar < screen_columns) {
- if (AttrOf(newLine[firstChar]) != AttrOf(oldLine[firstChar])) {
+ if (!SameAttrOf(newLine[firstChar], oldLine[firstChar])) {
attrchanged = TRUE;
break;
}
if (nFirstChar >= screen_columns
&& SP->_el_cost <= SP->_el1_cost) {
GoTo(lineno, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("clr_eol");
putp(clr_eol);
} else {
GoTo(lineno, nFirstChar - 1);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("clr_bol");
putp(clr_bol);
}
firstChar++;
}
/* if there wasn't one, we're done */
- if (firstChar >= screen_columns)
+ if (firstChar >= screen_columns) {
+ TR(TRACE_UPDATE, (T_RETURN("")));
return;
+ }
blank = newLine[screen_columns - 1];
newLine + firstChar,
(nLastChar - firstChar + 1) * sizeof(NCURSES_CH_T));
}
+ TR(TRACE_UPDATE, (T_RETURN("")));
return;
}
/* can be -1 if no characters differ */
while (CharEq(newLine[nLastChar], oldLine[oLastChar])) {
/* don't split a wide char */
- if (isnac(newLine[nLastChar]) &&
+ if (isWidecExt(newLine[nLastChar]) &&
!CharEq(newLine[nLastChar - 1], oldLine[oLastChar - 1]))
break;
nLastChar--;
if (oLastChar < nLastChar) {
int m = max(nLastNonblank, oLastNonblank);
+#if USE_WIDEC_SUPPORT
+ while (isWidecExt(newLine[n + 1]) && n) {
+ --n;
+ --oLastChar;
+ }
+#endif
GoTo(lineno, n + 1);
- if (InsCharCost(nLastChar - oLastChar)
- > (m - n)) {
+ if ((nLastChar < nLastNonblank)
+ || InsCharCost(nLastChar - oLastChar) > (m - n)) {
PutRange(oldLine, newLine, lineno, n + 1, m);
} else {
InsStr(&newLine[n + 1], nLastChar - oLastChar);
* setting the video attributes from
* the last character on the row.
*/
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
DelChar(oLastChar - nLastChar);
}
}
memcpy(oldLine + firstChar,
newLine + firstChar,
(screen_columns - firstChar) * sizeof(NCURSES_CH_T));
+ TR(TRACE_UPDATE, (T_RETURN("")));
+ return;
}
/*
#if NCURSES_EXT_FUNCS
if (SP->_coloron
&& !SP->_default_color) {
- _nc_do_color((int) COLOR_PAIR(SP->_current_attr), 0, FALSE, _nc_outch);
+ _nc_do_color(GET_SCREEN_PAIR(SP), 0, FALSE, _nc_outch);
if (!back_color_erase) {
fast_clear = FALSE;
}
if (fast_clear) {
if (clear_screen) {
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("clear_screen");
putp(clear_screen);
SP->_cursrow = SP->_curscol = 0;
SP->_cursrow = SP->_curscol = -1;
GoTo(0, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("clr_eos");
tputs(clr_eos, screen_lines, _nc_outch);
} else if (clr_eol) {
SP->_cursrow = SP->_curscol = -1;
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
for (i = 0; i < screen_lines; i++) {
GoTo(i, 0);
TPUTS_TRACE("clr_eol");
GoTo(0, 0);
}
} else {
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
for (i = 0; i < screen_lines; i++) {
GoTo(i, 0);
for (j = 0; j < screen_columns; j++)
if (n == 1 && scroll_forward && top == miny && bot == maxy) {
GoTo(bot, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("scroll_forward");
putp(scroll_forward);
} else if (n == 1 && delete_line && bot == maxy) {
GoTo(top, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("delete_line");
putp(delete_line);
} else if (parm_index && top == miny && bot == maxy) {
GoTo(bot, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("parm_index");
tputs(tparm(parm_index, n, 0), n, _nc_outch);
} else if (parm_delete_line && bot == maxy) {
GoTo(top, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("parm_delete_line");
tputs(tparm(parm_delete_line, n, 0), n, _nc_outch);
} else if (scroll_forward && top == miny && bot == maxy) {
GoTo(bot, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
for (i = 0; i < n; i++) {
TPUTS_TRACE("scroll_forward");
putp(scroll_forward);
}
} else if (delete_line && bot == maxy) {
GoTo(top, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
for (i = 0; i < n; i++) {
TPUTS_TRACE("delete_line");
putp(delete_line);
if (n == 1 && scroll_reverse && top == miny && bot == maxy) {
GoTo(top, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("scroll_reverse");
putp(scroll_reverse);
} else if (n == 1 && insert_line && bot == maxy) {
GoTo(top, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("insert_line");
putp(insert_line);
} else if (parm_rindex && top == miny && bot == maxy) {
GoTo(top, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("parm_rindex");
tputs(tparm(parm_rindex, n, 0), n, _nc_outch);
} else if (parm_insert_line && bot == maxy) {
GoTo(top, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
TPUTS_TRACE("parm_insert_line");
tputs(tparm(parm_insert_line, n, 0), n, _nc_outch);
} else if (scroll_reverse && top == miny && bot == maxy) {
GoTo(top, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
for (i = 0; i < n; i++) {
TPUTS_TRACE("scroll_reverse");
putp(scroll_reverse);
}
} else if (insert_line && bot == maxy) {
GoTo(top, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
for (i = 0; i < n; i++) {
TPUTS_TRACE("insert_line");
putp(insert_line);
return ERR;
GoTo(del, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
if (n == 1 && delete_line) {
TPUTS_TRACE("delete_line");
putp(delete_line);
}
GoTo(ins, 0);
- UpdateAttrs(AttrOf(blank));
+ UpdateAttrs(blank);
if (n == 1 && insert_line) {
TPUTS_TRACE("insert_line");
putp(insert_line);
_nc_screen_resume(void)
{
/* make sure terminal is in a sane known state */
- SP->_current_attr = A_NORMAL;
+ SetAttr(SCREEN_ATTRS(SP), A_NORMAL);
newscr->_clear = TRUE;
/* reset color pairs and definitions */
NCURSES_EXPORT(void)
_nc_screen_wrap(void)
{
- UpdateAttrs(A_NORMAL);
+ UpdateAttrs(normal);
#if NCURSES_EXT_FUNCS
if (SP->_coloron
&& !SP->_default_color) {
NCURSES_EXPORT(void)
_nc_do_xmc_glitch(attr_t previous)
{
- attr_t chg = XMC_CHANGES(previous ^ SP->_current_attr);
+ attr_t chg = XMC_CHANGES(previous ^ AttrOf(SCREEN_ATTRS(SP)));
while (chg != 0) {
if (chg & 1) {