diff options
author | 2000-10-08 22:46:53 +0000 | |
---|---|---|
committer | 2000-10-08 22:46:53 +0000 | |
commit | 91421ef511f3d137bc8cbea1d63f2c50663d7a1f (patch) | |
tree | d1326167c538bf562ffc9cfee9ecbc91a458846e /lib/libcurses/tty/tty_update.c | |
parent | Update to ncurses-5.1-20001007 version: (diff) | |
download | wireguard-openbsd-91421ef511f3d137bc8cbea1d63f2c50663d7a1f.tar.xz wireguard-openbsd-91421ef511f3d137bc8cbea1d63f2c50663d7a1f.zip |
update to ncurses-5.1-20001007
Diffstat (limited to 'lib/libcurses/tty/tty_update.c')
-rw-r--r-- | lib/libcurses/tty/tty_update.c | 177 |
1 files changed, 100 insertions, 77 deletions
diff --git a/lib/libcurses/tty/tty_update.c b/lib/libcurses/tty/tty_update.c index dfb983a61cc..ef52d7f7a11 100644 --- a/lib/libcurses/tty/tty_update.c +++ b/lib/libcurses/tty/tty_update.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty_update.c,v 1.11 2000/07/24 04:06:11 millert Exp $ */ +/* $OpenBSD: tty_update.c,v 1.12 2000/10/08 22:47:05 millert Exp $ */ /**************************************************************************** * Copyright (c) 1998,1999,2000 Free Software Foundation, Inc. * @@ -72,7 +72,7 @@ #include <term.h> -MODULE_ID("$From: tty_update.c,v 1.142 2000/07/23 01:41:17 tom Exp $") +MODULE_ID("$From: tty_update.c,v 1.146 2000/10/07 01:11:44 tom Exp $") /* * This define controls the line-breakout optimization. Every once in a @@ -114,15 +114,24 @@ position_check(int expected_y, int expected_x, char *legend) /* check to see if the real cursor position matches the virtual */ { char buf[20]; + char *s; int y, x; if (!_nc_tracing || (expected_y < 0 && expected_x < 0)) return; + _nc_flush(); memset(buf, '\0', sizeof(buf)); putp("\033[6n"); /* only works on ANSI-compatibles */ _nc_flush(); - (void) read(0, buf, sizeof(buf) - 1); + *(s = buf) = 0; + do { + int ask = sizeof(buf) - 1 - (s - buf); + int got = read(0, s, ask); + if (got == 0) + break; + s += got; + } while (strchr(buf, 'R') == 0); _tracef("probe returned %s", _nc_visbuf(buf)); /* try to interpret as a position report */ @@ -135,8 +144,9 @@ position_check(int expected_y, int expected_x, char *legend) expected_y = y - 1; if (y - 1 != expected_y || x - 1 != expected_x) { beep(); + tputs(tparm("\033[%d;%dH", expected_y + 1, expected_x + 1), 1, _nc_outch); _tracef("position seen (%d, %d) doesn't match expected one (%d, %d) in %s", - y - 1, x - 1, expected_y, expected_x, legend); + y - 1, x - 1, expected_y, expected_x, legend); } else { _tracef("position matches OK in %s", legend); } @@ -158,7 +168,7 @@ GoTo(int const row, int const col) chtype oldattr = SP->_current_attr; TR(TRACE_MOVE, ("GoTo(%d, %d) from (%d, %d)", - row, col, SP->_cursrow, SP->_curscol)); + row, col, SP->_cursrow, SP->_curscol)); position_check(SP->_cursrow, SP->_curscol, "GoTo"); @@ -170,7 +180,7 @@ GoTo(int const row, int const col) if ((oldattr & A_ALTCHARSET) || (oldattr && !move_standout_mode)) { TR(TRACE_CHARPUT, ("turning off (%#lx) %s before move", - oldattr, _traceattr(oldattr))); + oldattr, _traceattr(oldattr))); vidattr(A_NORMAL); } @@ -189,8 +199,8 @@ PutAttrChar(chtype ch) ch = ('`' | AttrOf(ch)); TR(TRACE_CHARPUT, ("PutAttrChar(%s) at (%d, %d)", - _tracechtype(ch), - SP->_cursrow, SP->_curscol)); + _tracechtype(ch), + SP->_cursrow, SP->_curscol)); UpdateAttrs(ch); data = TextOf(ch); if (SP->_outch != 0) { @@ -297,7 +307,7 @@ PutCharLR(chtype const ch) TPUTS_TRACE("enter_am_mode"); putp(enter_am_mode); } else if ((enter_insert_mode && exit_insert_mode) - || insert_character || parm_ich) { + || insert_character || parm_ich) { GoTo(screen_lines - 1, screen_columns - 2); callPutChar(ch); GoTo(screen_lines - 1, screen_columns - 2); @@ -363,7 +373,7 @@ can_clear_with(chtype ch) if (!back_color_erase && SP->_coloron) { if (ch & A_COLOR) return FALSE; -#ifdef NCURSES_EXT_FUNCS +#if NCURSES_EXT_FUNCS if (!SP->_default_color) return FALSE; if (SP->_default_fg != C_MASK || SP->_default_bg != C_MASK) @@ -429,10 +439,11 @@ EmitRange(const chtype * ntext, int num) * don't bother moving cursor, since it can be the * last update on the line. */ - if (runcount < num) + if (runcount < num) { GoTo(SP->_cursrow, SP->_curscol + runcount); - else + } else { return 1; /* cursor stays in the middle */ + } } else if (repeat_char && runcount > SP->_rep_cost) { bool wrap_possible = (SP->_curscol + runcount >= screen_columns); int rep_count = runcount; @@ -471,15 +482,15 @@ EmitRange(const chtype * ntext, int num) */ static int PutRange( - const chtype * otext, - const chtype * ntext, - int row, - int first, int last) + const chtype * otext, + const chtype * ntext, + int row, + int first, int last) { int j, run; TR(TRACE_CHARPUT, ("PutRange(%p, %p, %d, %d, %d)", - otext, ntext, row, first, last)); + otext, ntext, row, first, last)); if (otext != ntext && (last - first + 1) > SP->_inline_cost) { @@ -599,8 +610,8 @@ doupdate(void) continue; } - T(("At (%d, %d): from %s...", i, j, _traceattr(rattr))); - T(("...to %s", _traceattr(turnon))); + TR(TRACE_ATTRS, ("At (%d, %d): from %s...", i, j, _traceattr(rattr))); + TR(TRACE_ATTRS, ("...to %s", _traceattr(turnon))); /* * If the attribute change location is a blank with a @@ -630,15 +641,17 @@ doupdate(void) for (; n < screen_columns; n++) { if (AttrOf(newscr->_line[m].text[n]) == rattr) { end_onscreen = TRUE; - T(("Range attributed with %s ends at (%d, %d)", - _traceattr(turnon), m, n)); + TR(TRACE_ATTRS, + ("Range attributed with %s ends at (%d, %d)", + _traceattr(turnon), m, n)); goto foundit; } } n = 0; } - T(("Range attributed with %s ends offscreen", - _traceattr(turnon))); + TR(TRACE_ATTRS, + ("Range attributed with %s ends offscreen", + _traceattr(turnon))); foundit:; if (end_onscreen) { @@ -651,8 +664,8 @@ doupdate(void) * of span. */ while (n >= 0 - && TextOf(lastline[n]) == ' ' - && SAFE(AttrOf(lastline[n]))) + && TextOf(lastline[n]) == ' ' + && SAFE(AttrOf(lastline[n]))) lastline[n--] &= ~turnon; /* check that there's enough room at end of span */ @@ -667,8 +680,9 @@ doupdate(void) if (failed) { int p, q = j; - T(("Clearing %s beginning at (%d, %d)", - _traceattr(turnon), i, j)); + TR(TRACE_ATTRS, + ("Clearing %s beginning at (%d, %d)", + _traceattr(turnon), i, j)); /* turn off new attributes over span */ for (p = i; p < screen_lines; p++) { @@ -681,8 +695,9 @@ doupdate(void) } foundend:; } else { - T(("Cookie space for %s found before (%d, %d)", - _traceattr(turnon), i, j)); + TR(TRACE_ATTRS, + ("Cookie space for %s found before (%d, %d)", + _traceattr(turnon), i, j)); /* * back up the start of range so there's room @@ -708,7 +723,7 @@ doupdate(void) nonempty = 0; if (curscr->_clear || newscr->_clear) { /* force refresh ? */ - T(("clearing and updating from scratch")); + TR(TRACE_UPDATE, ("clearing and updating from scratch")); ClrUpdate(); curscr->_clear = FALSE; /* reset flag */ newscr->_clear = FALSE; /* reset flag */ @@ -726,7 +741,7 @@ doupdate(void) nonempty = ClrBottom(nonempty); - T(("Transforming lines, nonempty %d", nonempty)); + TR(TRACE_UPDATE, ("Transforming lines, nonempty %d", nonempty)); for (i = 0; i < nonempty; i++) { /* * Here is our line-breakout optimization. @@ -787,10 +802,10 @@ doupdate(void) #if USE_TRACE_TIMES (void) times(&after); TR(TRACE_TIMES, - ("Update cost: %ld chars, %ld clocks system time, %ld clocks user time", - _nc_outchars, - after.tms_stime - before.tms_stime, - after.tms_utime - before.tms_utime)); + ("Update cost: %ld chars, %ld clocks system time, %ld clocks user time", + _nc_outchars, + after.tms_stime - before.tms_stime, + after.tms_utime - before.tms_utime)); #endif /* USE_TRACE_TIMES */ _nc_signal_handler(TRUE); @@ -834,11 +849,11 @@ ClrUpdate(void) chtype blank = ClrBlank(stdscr); int nonempty = min(screen_lines, newscr->_maxy + 1); - T(("ClrUpdate() called")); + TR(TRACE_UPDATE, ("ClrUpdate() called")); ClearScreen(blank); - T(("updating screen from scratch")); + TR(TRACE_UPDATE, ("updating screen from scratch")); nonempty = ClrBottom(nonempty); @@ -936,12 +951,14 @@ ClrBottom(int total) for (col = 0, ok = TRUE; ok && col < last; col++) { ok = (newscr->_line[row].text[col] == blank); } - if (!ok) break; + if (!ok) + break; for (col = 0; ok && col < last; col++) { ok = (curscr->_line[row].text[col] == blank); } - if (!ok) top = row; + if (!ok) + top = row; } /* don't use clr_eos for just one line if clr_eol available */ @@ -985,7 +1002,7 @@ TransformLine(int const lineno) int n; bool attrchanged = FALSE; - T(("TransformLine(%d) called", lineno)); + TR(TRACE_UPDATE, ("TransformLine(%d) called", lineno)); /* copy new hash value to old one */ if (SP->oldhash && SP->newhash) @@ -1067,11 +1084,11 @@ TransformLine(int const lineno) */ if (TextOf(newLine[n]) == ' ' && ((n > 0 - && xmc_turn_on(newLine[n - 1], newLine[n])) + && xmc_turn_on(newLine[n - 1], newLine[n])) || (n == 0 && lineno > 0 && xmc_turn_on(NEW(lineno - 1, screen_columns - 1), - newLine[n])))) { + newLine[n])))) { n = m; } @@ -1083,7 +1100,7 @@ TransformLine(int const lineno) */ if (TextOf(newLine[n]) != ' ' && ((n + 1 < screen_columns - && xmc_turn_off(newLine[n], newLine[n + 1])) + && xmc_turn_off(newLine[n], newLine[n + 1])) || (n + 1 >= screen_columns && lineno + 1 < screen_lines && xmc_turn_off(newLine[n], NEW(lineno + 1, 0))))) { @@ -1098,7 +1115,7 @@ TransformLine(int const lineno) /* find the first differing character */ while (firstChar < screen_columns && - newLine[firstChar] == oldLine[firstChar]) + newLine[firstChar] == oldLine[firstChar]) firstChar++; /* if there wasn't one, we're done */ @@ -1144,15 +1161,15 @@ TransformLine(int const lineno) nLastChar = screen_columns - 1; while (nLastChar > firstChar - && newLine[nLastChar] == oldLine[nLastChar]) + && newLine[nLastChar] == oldLine[nLastChar]) nLastChar--; if (nLastChar >= firstChar) { GoTo(lineno, firstChar); PutRange(oldLine, newLine, lineno, firstChar, nLastChar); memcpy(oldLine + firstChar, - newLine + firstChar, - (nLastChar - firstChar + 1) * sizeof(chtype)); + newLine + firstChar, + (nLastChar - firstChar + 1) * sizeof(chtype)); } return; } @@ -1174,8 +1191,8 @@ TransformLine(int const lineno) PutChar(newLine[firstChar]); ClrToEOL(blank, FALSE); } else if ((nLastChar != oLastChar) - && (newLine[nLastChar] != oldLine[oLastChar] - || !(_nc_idcok && has_ic()))) { + && (newLine[nLastChar] != oldLine[oLastChar] + || !(_nc_idcok && has_ic()))) { GoTo(lineno, firstChar); if ((oLastChar - nLastChar) > SP->_el_cost) { if (PutRange(oldLine, newLine, lineno, firstChar, nLastChar)) @@ -1220,7 +1237,7 @@ TransformLine(int const lineno) if (DelCharCost(oLastChar - nLastChar) > SP->_el_cost + nLastNonblank - (n + 1)) { if (PutRange(oldLine, newLine, lineno, - n + 1, nLastNonblank)) + n + 1, nLastNonblank)) GoTo(lineno, nLastNonblank + 1); ClrToEOL(blank, FALSE); } else { @@ -1242,8 +1259,8 @@ TransformLine(int const lineno) /* update the code's internal representation */ if (screen_columns > firstChar) memcpy(oldLine + firstChar, - newLine + firstChar, - (screen_columns - firstChar) * sizeof(chtype)); + newLine + firstChar, + (screen_columns - firstChar) * sizeof(chtype)); } /* @@ -1259,9 +1276,9 @@ ClearScreen(chtype blank) int i, j; bool fast_clear = (clear_screen || clr_eos || clr_eol); - T(("ClearScreen() called")); + TR(TRACE_UPDATE, ("ClearScreen() called")); -#ifdef NCURSES_EXT_FUNCS +#if NCURSES_EXT_FUNCS if (SP->_coloron && !SP->_default_color) { _nc_do_color(COLOR_PAIR(SP->_current_attr), 0, FALSE, _nc_outch); @@ -1311,7 +1328,7 @@ ClearScreen(chtype blank) curscr->_line[i].text[j] = blank; } - T(("screen cleared")); + TR(TRACE_UPDATE, ("screen cleared")); } /* @@ -1324,7 +1341,7 @@ ClearScreen(chtype blank) static void InsStr(chtype * line, int count) { - T(("InsStr(%p,%d) called", line, count)); + TR(TRACE_UPDATE, ("InsStr(%p,%d) called", line, count)); /* Prefer parm_ich as it has the smallest cost - no need to shift * the whole line on each character. */ @@ -1379,7 +1396,8 @@ DelChar(int count) { int n; - T(("DelChar(%d) called, position = (%d,%d)", count, newscr->_cury, newscr->_curx)); + TR(TRACE_UPDATE, ("DelChar(%d) called, position = (%d,%d)", count, + newscr->_cury, newscr->_curx)); if (parm_dch) { TPUTS_TRACE("parm_dch"); @@ -1480,7 +1498,7 @@ scroll_csr_forward(int n, int top, int bot, int miny, int maxy, chtype blank) } else return ERR; -#ifdef NCURSES_EXT_FUNCS +#if NCURSES_EXT_FUNCS if (FILL_BCE()) { for (i = 0; i < n; i++) { GoTo(bot - i, 0); @@ -1536,7 +1554,7 @@ scroll_csr_backward(int n, int top, int bot, int miny, int maxy, chtype blank) } else return ERR; -#ifdef NCURSES_EXT_FUNCS +#if NCURSES_EXT_FUNCS if (FILL_BCE()) { for (i = 0; i < n; i++) { GoTo(top + i, 0); @@ -1616,18 +1634,11 @@ _nc_scrolln(int n, int top, int bot, int maxy) * Explicitly clear if stuff pushed off top of region might * be saved by the terminal. */ - if (non_dest_scroll_region || (memory_above && top == 0)) { - for (i = 0; i < n; i++) { - GoTo(i, 0); - ClrToEOL(BLANK, FALSE); - } - } - res = scroll_csr_forward(n, top, bot, 0, maxy, blank); if (res == ERR && change_scroll_region) { if ((((n == 1 && scroll_forward) || parm_index) - && (SP->_cursrow == bot || SP->_cursrow == bot - 1)) + && (SP->_cursrow == bot || SP->_cursrow == bot - 1)) && save_cursor && restore_cursor) { cursor_saved = TRUE; TPUTS_TRACE("save_cursor"); @@ -1651,23 +1662,24 @@ _nc_scrolln(int n, int top, int bot, int maxy) if (res == ERR && _nc_idlok) res = scroll_idl(n, top, bot - n + 1, blank); - } else { /* (n < 0) - scroll down (backward) */ + /* - * Do explicit clear to end of region if it's possible that the - * terminal might hold on to stuff we push off the end. + * Clear the newly shifted-in text. */ - if (non_dest_scroll_region || (memory_below && bot == maxy)) { + if (res != ERR + && (non_dest_scroll_region || (memory_below && bot == maxy))) { if (bot == maxy && clr_eos) { - GoTo(maxy + n, 0); + GoTo(bot - n, 0); ClrToEOS(BLANK); - } else if (clr_eol) { - for (i = 0; i < -n; i++) { - GoTo(maxy + n + i, 0); + } else { + for (i = 0; i < n; i++) { + GoTo(bot - i, 0); ClrToEOL(BLANK, FALSE); } } } + } else { /* (n < 0) - scroll down (backward) */ res = scroll_csr_backward(-n, top, bot, 0, maxy, blank); if (res == ERR && change_scroll_region) { @@ -1695,6 +1707,17 @@ _nc_scrolln(int n, int top, int bot, int maxy) if (res == ERR && _nc_idlok) res = scroll_idl(-n, bot + n + 1, top, blank); + + /* + * Clear the newly shifted-in text. + */ + if (res != ERR + && (non_dest_scroll_region || (memory_above && top == 0))) { + for (i = 0; i < -n; i++) { + GoTo(i + top, 0); + ClrToEOL(BLANK, FALSE); + } + } } if (res == ERR) @@ -1745,7 +1768,7 @@ void _nc_screen_wrap(void) { UpdateAttrs(A_NORMAL); -#ifdef NCURSES_EXT_FUNCS +#if NCURSES_EXT_FUNCS if (SP->_coloron && !SP->_default_color) { SP->_default_color = TRUE; @@ -1772,7 +1795,7 @@ _nc_do_xmc_glitch(attr_t previous) SP->_curscol += magic_cookie_glitch; if (SP->_curscol >= SP->_columns) wrap_cursor(); - T(("bumped to %d,%d after cookie", SP->_cursrow, SP->_curscol)); + TR(TRACE_UPDATE, ("bumped to %d,%d after cookie", SP->_cursrow, SP->_curscol)); } chg >>= 1; } |