Module Name: src Committed By: blymn Date: Tue Apr 12 07:03:05 UTC 2022
Modified Files: src/lib/libcurses: add_wchstr.c addbytes.c attributes.c background.c border.c clrtobot.c clrtoeol.c color.c copywin.c curses_private.h delch.c erase.c get_wstr.c ins_wch.c ins_wstr.c insdelln.c mvwin.c newwin.c refresh.c shlib_version slk.c touchwin.c Log Message: Make the default colour pair be pair 0 which appears to match other curses implementations. To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/lib/libcurses/add_wchstr.c cvs rdiff -u -r1.61 -r1.62 src/lib/libcurses/addbytes.c cvs rdiff -u -r1.33 -r1.34 src/lib/libcurses/attributes.c \ src/lib/libcurses/clrtoeol.c src/lib/libcurses/touchwin.c cvs rdiff -u -r1.28 -r1.29 src/lib/libcurses/background.c \ src/lib/libcurses/clrtobot.c cvs rdiff -u -r1.22 -r1.23 src/lib/libcurses/border.c \ src/lib/libcurses/ins_wstr.c cvs rdiff -u -r1.45 -r1.46 src/lib/libcurses/color.c cvs rdiff -u -r1.20 -r1.21 src/lib/libcurses/copywin.c \ src/lib/libcurses/insdelln.c cvs rdiff -u -r1.77 -r1.78 src/lib/libcurses/curses_private.h cvs rdiff -u -r1.27 -r1.28 src/lib/libcurses/delch.c cvs rdiff -u -r1.34 -r1.35 src/lib/libcurses/erase.c cvs rdiff -u -r1.10 -r1.11 src/lib/libcurses/get_wstr.c cvs rdiff -u -r1.18 -r1.19 src/lib/libcurses/ins_wch.c cvs rdiff -u -r1.23 -r1.24 src/lib/libcurses/mvwin.c cvs rdiff -u -r1.65 -r1.66 src/lib/libcurses/newwin.c cvs rdiff -u -r1.118 -r1.119 src/lib/libcurses/refresh.c cvs rdiff -u -r1.46 -r1.47 src/lib/libcurses/shlib_version cvs rdiff -u -r1.19 -r1.20 src/lib/libcurses/slk.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libcurses/add_wchstr.c diff -u src/lib/libcurses/add_wchstr.c:1.11 src/lib/libcurses/add_wchstr.c:1.12 --- src/lib/libcurses/add_wchstr.c:1.11 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/add_wchstr.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: add_wchstr.c,v 1.11 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: add_wchstr.c,v 1.12 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 2005 The NetBSD Foundation Inc. @@ -36,7 +36,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: add_wchstr.c,v 1.11 2022/01/25 03:05:06 blymn Exp $"); +__RCSID("$NetBSD: add_wchstr.c,v 1.12 2022/04/12 07:03:04 blymn Exp $"); #endif /* not lint */ #include <stdlib.h> @@ -170,7 +170,7 @@ wadd_wchnstr(WINDOW *win, const cchar_t if (wcwidth(chp->vals[0])) { /* clear the partial character before cursor */ for (tp = lp + cw; tp < lp; tp++) { - tp->ch = (wchar_t) btowc((int) win->bch); + tp->ch = win->bch; if (_cursesi_copy_nsp(win->bnsp, tp) == ERR) return ERR; tp->attr = win->battr; @@ -205,8 +205,7 @@ wadd_wchnstr(WINDOW *win, const cchar_t if (cw > win->maxx - ex) { /* clear to EOL */ while (ex < win->maxx) { - lp->ch = (wchar_t) - btowc((int) win->bch); + lp->ch = win->bch; if (_cursesi_copy_nsp(win->bnsp, lp) == ERR) return ERR; Index: src/lib/libcurses/addbytes.c diff -u src/lib/libcurses/addbytes.c:1.61 src/lib/libcurses/addbytes.c:1.62 --- src/lib/libcurses/addbytes.c:1.61 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/addbytes.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: addbytes.c,v 1.61 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: addbytes.c,v 1.62 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 1987, 1993, 1994 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)addbytes.c 8.4 (Berkeley) 5/4/94"; #else -__RCSID("$NetBSD: addbytes.c,v 1.61 2022/01/25 03:05:06 blymn Exp $"); +__RCSID("$NetBSD: addbytes.c,v 1.62 2022/04/12 07:03:04 blymn Exp $"); #endif #endif /* not lint */ @@ -448,7 +448,7 @@ _cursesi_addwchar(WINDOW *win, __LINE ** "_cursesi_addwchar: clear current char (%d,%d)\n", *y, sx); tp = &win->alines[*y]->line[sx]; - tp->ch = (wchar_t) btowc((int) win->bch); + tp->ch = win->bch; if (_cursesi_copy_nsp(win->bnsp, tp) == ERR) return ERR; @@ -481,7 +481,7 @@ _cursesi_addwchar(WINDOW *win, __LINE ** if (newx < *(*lnp)->firstchp) *(*lnp)->firstchp = newx; for (tp = lp; *x < win->maxx; tp++, (*x)++) { - tp->ch = (wchar_t) btowc((int) win->bch); + tp->ch = win->bch; if (_cursesi_copy_nsp(win->bnsp, tp) == ERR) return ERR; tp->attr = win->battr; @@ -595,7 +595,7 @@ _cursesi_addwchar(WINDOW *win, __LINE ** "_cursesi_addwchar: clear " "remaining of current char (%d,%d)nn", *y, ex); - tp->ch = (wchar_t) btowc((int) win->bch); + tp->ch = win->bch; if (_cursesi_copy_nsp(win->bnsp, tp) == ERR) return ERR; tp->attr = win->battr; Index: src/lib/libcurses/attributes.c diff -u src/lib/libcurses/attributes.c:1.33 src/lib/libcurses/attributes.c:1.34 --- src/lib/libcurses/attributes.c:1.33 Wed Dec 8 20:50:01 2021 +++ src/lib/libcurses/attributes.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: attributes.c,v 1.33 2021/12/08 20:50:01 andvar Exp $ */ +/* $NetBSD: attributes.c,v 1.34 2022/04/12 07:03:04 blymn Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: attributes.c,v 1.33 2021/12/08 20:50:01 andvar Exp $"); +__RCSID("$NetBSD: attributes.c,v 1.34 2022/04/12 07:03:04 blymn Exp $"); #endif /* not lint */ #include "curses.h" @@ -460,6 +460,6 @@ __wcolor_set(WINDOW *win, attr_t attr) /* If another color pair is set, turn that off first. */ win->wattr &= ~__COLOR; /* If can do color video, set the color pair bits. */ - if (t_max_colors(t) != 0 && attr & __COLOR) + if (t_max_colors(t) != 0) win->wattr |= attr & __COLOR; } Index: src/lib/libcurses/clrtoeol.c diff -u src/lib/libcurses/clrtoeol.c:1.33 src/lib/libcurses/clrtoeol.c:1.34 --- src/lib/libcurses/clrtoeol.c:1.33 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/clrtoeol.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: clrtoeol.c,v 1.33 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: clrtoeol.c,v 1.34 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 1981, 1993, 1994 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)clrtoeol.c 8.2 (Berkeley) 5/4/94"; #else -__RCSID("$NetBSD: clrtoeol.c,v 1.33 2022/01/25 03:05:06 blymn Exp $"); +__RCSID("$NetBSD: clrtoeol.c,v 1.34 2022/04/12 07:03:04 blymn Exp $"); #endif #endif /* not lint */ @@ -68,11 +68,7 @@ wclrtoeol(WINDOW *win) wchar_t bch; attr_t battr; -#ifdef HAVE_WCHAR - bch = (wchar_t)btowc((int)win->bch); -#else bch = win->bch; -#endif if (win != curscr) battr = win->battr & __ATTRIBUTES; else Index: src/lib/libcurses/touchwin.c diff -u src/lib/libcurses/touchwin.c:1.33 src/lib/libcurses/touchwin.c:1.34 --- src/lib/libcurses/touchwin.c:1.33 Mon Sep 6 07:03:50 2021 +++ src/lib/libcurses/touchwin.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: touchwin.c,v 1.33 2021/09/06 07:03:50 rin Exp $ */ +/* $NetBSD: touchwin.c,v 1.34 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 1981, 1993, 1994 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)touchwin.c 8.2 (Berkeley) 5/4/94"; #else -__RCSID("$NetBSD: touchwin.c,v 1.33 2021/09/06 07:03:50 rin Exp $"); +__RCSID("$NetBSD: touchwin.c,v 1.34 2022/04/12 07:03:04 blymn Exp $"); #endif #endif /* not lint */ @@ -187,15 +187,20 @@ wtouchln(WINDOW *win, int line, int n, i return OK; } +/* + * Touch all the lines in a window. If force is set to 1 then screen + * update optimisation will disabled to force the change out. + */ int -__touchwin(WINDOW *win) +__touchwin(WINDOW *win, int force) { int y, maxy; __CTRACE(__CTRACE_LINE, "__touchwin: (%p)\n", win); maxy = win->maxy; for (y = 0; y < maxy; y++) - __touchline(win, y, 0, (int) win->maxx - 1); + _cursesi_touchline_force(win, y, 0, (int) win->maxx - 1, + force); return OK; } @@ -241,7 +246,7 @@ wsyncup(WINDOW *win) { do { - __touchwin(win); + __touchwin(win, 0); win = win->orig; } while (win); } @@ -253,7 +258,7 @@ wsyncdown(WINDOW *win) while (w) { if (is_wintouched(w)) { - __touchwin(win); + __touchwin(win, 0); break; } w = w->orig; Index: src/lib/libcurses/background.c diff -u src/lib/libcurses/background.c:1.28 src/lib/libcurses/background.c:1.29 --- src/lib/libcurses/background.c:1.28 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/background.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: background.c,v 1.28 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: background.c,v 1.29 2022/04/12 07:03:04 blymn Exp $ */ /*- * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: background.c,v 1.28 2022/01/25 03:05:06 blymn Exp $"); +__RCSID("$NetBSD: background.c,v 1.29 2022/04/12 07:03:04 blymn Exp $"); #endif /* not lint */ #include <stdlib.h> @@ -110,7 +110,7 @@ wbkgd(WINDOW *win, chtype ch) #endif } } - __touchwin(win); + __touchwin(win, 1); return OK; } @@ -230,7 +230,7 @@ wbkgrnd(WINDOW *win, const cchar_t *wch) return ERR; wbkgrndset(win, wch); - __touchwin(win); + __touchwin(win, 1); return OK; } Index: src/lib/libcurses/clrtobot.c diff -u src/lib/libcurses/clrtobot.c:1.28 src/lib/libcurses/clrtobot.c:1.29 --- src/lib/libcurses/clrtobot.c:1.28 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/clrtobot.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: clrtobot.c,v 1.28 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: clrtobot.c,v 1.29 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 1981, 1993, 1994 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)clrtobot.c 8.2 (Berkeley) 5/4/94"; #else -__RCSID("$NetBSD: clrtobot.c,v 1.28 2022/01/25 03:05:06 blymn Exp $"); +__RCSID("$NetBSD: clrtobot.c,v 1.29 2022/04/12 07:03:04 blymn Exp $"); #endif #endif /* not lint */ @@ -68,11 +68,7 @@ wclrtobot(WINDOW *win) wchar_t bch; attr_t battr; -#ifdef HAVE_WCHAR - bch = (wchar_t)btowc((int)win->bch); -#else bch = win->bch; -#endif if (win != curscr) battr = win->battr & __ATTRIBUTES; else Index: src/lib/libcurses/border.c diff -u src/lib/libcurses/border.c:1.22 src/lib/libcurses/border.c:1.23 --- src/lib/libcurses/border.c:1.22 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/border.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: border.c,v 1.22 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: border.c,v 1.23 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: border.c,v 1.22 2022/01/25 03:05:06 blymn Exp $"); +__RCSID("$NetBSD: border.c,v 1.23 2022/04/12 07:03:04 blymn Exp $"); #endif /* not lint */ #include <stdlib.h> @@ -154,7 +154,7 @@ wborder(WINDOW *win, chtype left, chtype lp[endx].ch = (wchar_t) botright & __CHARTEXT; lp[endx].attr = (attr_t) botright & __ATTRIBUTES; } - __touchwin(win); + __touchwin(win, 0); return OK; #else /* HAVE_WCHAR */ cchar_t ls, rs, ts, bs, tl, tr, bl, br; @@ -331,7 +331,7 @@ int wborder_set(WINDOW *win, const cchar for (j = cw; win->alines[i]->line[j].wcols < 0; j++) { __CTRACE(__CTRACE_INPUT, "wborder_set: clean out partial char[%d]", j); - win->alines[i]->line[j].ch = ( wchar_t )btowc(win->bch); + win->alines[i]->line[j].ch = win->bch; if (_cursesi_copy_nsp(win->bnsp, &win->alines[i]->line[j]) == ERR) return ERR; @@ -377,8 +377,7 @@ int wborder_set(WINDOW *win, const cchar endx - cw + pcw, endx - cw); k = pcw < 0 ? endx -cw + pcw : endx - cw; for (j = endx - cw; j >= k; j--) { - win->alines[i]->line[j].ch - = (wchar_t)btowc(win->bch); + win->alines[i]->line[j].ch = win->bch; if (_cursesi_copy_nsp(win->bnsp, &win->alines[i]->line[j]) == ERR) return ERR; @@ -435,8 +434,7 @@ int wborder_set(WINDOW *win, const cchar } } while (i <= endx - trcw) { - win->alines[0]->line[i].ch = - (wchar_t)btowc((int) win->bch); + win->alines[0]->line[i].ch = win->bch; if (_cursesi_copy_nsp(win->bnsp, &win->alines[0]->line[i]) == ERR) return ERR; @@ -476,7 +474,7 @@ int wborder_set(WINDOW *win, const cchar } } while (i <= endx - brcw) { - win->alines[endy]->line[i].ch = (wchar_t)btowc((int) win->bch ); + win->alines[endy]->line[i].ch = win->bch; if (_cursesi_copy_nsp(win->bnsp, &win->alines[endy]->line[i]) == ERR) return ERR; @@ -603,7 +601,7 @@ int wborder_set(WINDOW *win, const cchar endx - brcw + 1 - i; } } - __touchwin(win); + __touchwin(win, 0); return OK; #endif /* HAVE_WCHAR */ } Index: src/lib/libcurses/ins_wstr.c diff -u src/lib/libcurses/ins_wstr.c:1.22 src/lib/libcurses/ins_wstr.c:1.23 --- src/lib/libcurses/ins_wstr.c:1.22 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/ins_wstr.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: ins_wstr.c,v 1.22 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: ins_wstr.c,v 1.23 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 2005 The NetBSD Foundation Inc. @@ -36,7 +36,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: ins_wstr.c,v 1.22 2022/01/25 03:05:06 blymn Exp $"); +__RCSID("$NetBSD: ins_wstr.c,v 1.23 2022/04/12 07:03:04 blymn Exp $"); #endif /* not lint */ #include <string.h> @@ -317,7 +317,7 @@ loopdone: win->maxx + pcw, win->maxx - 1); temp2 += pcw; while (temp1 > temp2 + width) { - temp1->ch = (wchar_t)btowc((int) win->bch); + temp1->ch = win->bch; if (_cursesi_copy_nsp(win->bnsp, temp1) == ERR) { free(lstr); return ERR; Index: src/lib/libcurses/color.c diff -u src/lib/libcurses/color.c:1.45 src/lib/libcurses/color.c:1.46 --- src/lib/libcurses/color.c:1.45 Fri Dec 17 03:50:18 2021 +++ src/lib/libcurses/color.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: color.c,v 1.45 2021/12/17 03:50:18 uwe Exp $ */ +/* $NetBSD: color.c,v 1.46 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: color.c,v 1.45 2021/12/17 03:50:18 uwe Exp $"); +__RCSID("$NetBSD: color.c,v 1.46 2022/04/12 07:03:04 blymn Exp $"); #endif /* not lint */ #include "curses.h" @@ -39,6 +39,7 @@ __RCSID("$NetBSD: color.c,v 1.45 2021/12 /* Have we initialised colours? */ int __using_color = 0; +int __do_color_init = 0; /* force refresh to init color in all cells */ /* Default colour number */ attr_t __default_color = 0; @@ -110,7 +111,11 @@ start_color(void) COLOR_PAIRS = (max_pairs > MAX_PAIRS - 1 ? MAX_PAIRS - 1 : max_pairs); /* Use the last colour pair for curses default. */ +#ifdef __OLD_DEFAULT_COLOR __default_color = COLOR_PAIR(MAX_PAIRS - 1); +#else + __default_color = COLOR_PAIR(0); +#endif } } if (!COLORS) @@ -235,6 +240,7 @@ start_color(void) __default_pair.flags; __using_color = 1; + __do_color_init = 1; /* Set all positions on all windows to curses default colours. */ for (wlp = _cursesi_screen->winlistp; wlp != NULL; wlp = wlp->nextp) { @@ -243,12 +249,13 @@ start_color(void) /* Set color attribute on other windows */ win->battr |= __default_color; for (y = 0; y < win->maxy; y++) { + win->alines[y]->flags |= __ISFORCED; for (x = 0; x < win->maxx; x++) { win->alines[y]->line[x].attr &= ~__COLOR; win->alines[y]->line[x].attr |= __default_color; } } - __touchwin(win); + __touchwin(win, 0); } } @@ -528,7 +535,8 @@ __set_color( /*ARGSUSED*/ WINDOW *win, a { short pair; - if ((curscr->wattr & __COLOR) == (attr & __COLOR)) + if ((__do_color_init != 1) && + ((curscr->wattr & __COLOR) == (attr & __COLOR))) return; pair = PAIR_NUMBER((uint32_t)attr); Index: src/lib/libcurses/copywin.c diff -u src/lib/libcurses/copywin.c:1.20 src/lib/libcurses/copywin.c:1.21 --- src/lib/libcurses/copywin.c:1.20 Mon Sep 6 07:03:49 2021 +++ src/lib/libcurses/copywin.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: copywin.c,v 1.20 2021/09/06 07:03:49 rin Exp $ */ +/* $NetBSD: copywin.c,v 1.21 2022/04/12 07:03:04 blymn Exp $ */ /*- * Copyright (c) 1998-1999 Brett Lymn @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: copywin.c,v 1.20 2021/09/06 07:03:49 rin Exp $"); +__RCSID("$NetBSD: copywin.c,v 1.21 2022/04/12 07:03:04 blymn Exp $"); #endif /* not lint */ #include <ctype.h> @@ -134,6 +134,6 @@ int copywin(const WINDOW *srcwin, WINDOW } } } - __touchwin(dstwin); + __touchwin(dstwin, 0); return OK; } Index: src/lib/libcurses/insdelln.c diff -u src/lib/libcurses/insdelln.c:1.20 src/lib/libcurses/insdelln.c:1.21 --- src/lib/libcurses/insdelln.c:1.20 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/insdelln.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: insdelln.c,v 1.20 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: insdelln.c,v 1.21 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 2000 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: insdelln.c,v 1.20 2022/01/25 03:05:06 blymn Exp $"); +__RCSID("$NetBSD: insdelln.c,v 1.21 2022/04/12 07:03:04 blymn Exp $"); #endif /* not lint */ /* @@ -116,11 +116,8 @@ winsdelln(WINDOW *win, int nlines) for (i = 0; i < win->maxx; i++) { win->alines[y]->line[i].ch = win->bch; win->alines[y]->line[i].attr = attr; -#ifndef HAVE_WCHAR win->alines[y]->line[i].ch = win->bch; -#else - win->alines[y]->line[i].ch - = (wchar_t)btowc((int)win->bch ); +#ifdef HAVE_WCHAR lp = &win->alines[y]->line[i]; if (_cursesi_copy_nsp(win->bnsp, lp) == ERR) return ERR; @@ -160,11 +157,8 @@ winsdelln(WINDOW *win, int nlines) for (i = 0; i < win->maxx; i++) { win->alines[y]->line[i].ch = win->bch; win->alines[y]->line[i].attr = attr; -#ifndef HAVE_WCHAR win->alines[y]->line[i].ch = win->bch; -#else - win->alines[y]->line[i].ch - = (wchar_t)btowc((int)win->bch); +#ifndef HAVE_WCHAR lp = &win->alines[y]->line[i]; lp->wcols = 1; if (_cursesi_copy_nsp(win->bnsp, lp) == ERR) Index: src/lib/libcurses/curses_private.h diff -u src/lib/libcurses/curses_private.h:1.77 src/lib/libcurses/curses_private.h:1.78 --- src/lib/libcurses/curses_private.h:1.77 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/curses_private.h Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: curses_private.h,v 1.77 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: curses_private.h,v 1.78 2022/04/12 07:03:04 blymn Exp $ */ /*- * Copyright (c) 1998-2000 Brett Lymn @@ -404,7 +404,7 @@ void __swflags(WINDOW *); void __sync(WINDOW *); int __timeout(int); int __touchline(WINDOW *, int, int, int); -int __touchwin(WINDOW *); +int __touchwin(WINDOW *, int); int __unripoffline(int (*)(WINDOW *, int)); void __unsetattr(int); void __unset_color(WINDOW *win); Index: src/lib/libcurses/delch.c diff -u src/lib/libcurses/delch.c:1.27 src/lib/libcurses/delch.c:1.28 --- src/lib/libcurses/delch.c:1.27 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/delch.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: delch.c,v 1.27 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: delch.c,v 1.28 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 1981, 1993, 1994 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)delch.c 8.2 (Berkeley) 5/4/94"; #else -__RCSID("$NetBSD: delch.c,v 1.27 2022/01/25 03:05:06 blymn Exp $"); +__RCSID("$NetBSD: delch.c,v 1.28 2022/04/12 07:03:04 blymn Exp $"); #endif #endif /* not lint */ @@ -134,7 +134,7 @@ wdelch(WINDOW *win) } } while (temp1 <= end) { - temp1->ch = ( wchar_t )btowc((int) win->bch); + temp1->ch = win->bch; temp1->attr = 0; if (_cursesi_copy_nsp(win->bnsp, temp1) == ERR) return ERR; Index: src/lib/libcurses/erase.c diff -u src/lib/libcurses/erase.c:1.34 src/lib/libcurses/erase.c:1.35 --- src/lib/libcurses/erase.c:1.34 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/erase.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: erase.c,v 1.34 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: erase.c,v 1.35 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 1981, 1993, 1994 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)erase.c 8.2 (Berkeley) 5/4/94"; #else -__RCSID("$NetBSD: erase.c,v 1.34 2022/01/25 03:05:06 blymn Exp $"); +__RCSID("$NetBSD: erase.c,v 1.35 2022/04/12 07:03:04 blymn Exp $"); #endif #endif /* not lint */ @@ -70,11 +70,8 @@ werase(WINDOW *win) attr_t battr; __CTRACE(__CTRACE_ERASE, "werase: (%p)\n", win); -#ifdef HAVE_WCHAR - bch = (wchar_t)btowc((int)win->bch); -#else + bch = win->bch; -#endif if (win != curscr) battr = win->battr & __ATTRIBUTES; else @@ -101,7 +98,7 @@ werase(WINDOW *win) * Mark the whole window as changed in case we have overlapping * windows - this will result in the (intended) clearing of the * screen over the area covered by the window. */ - __touchwin(win); + __touchwin(win, 0); wmove(win, 0, 0); return OK; } Index: src/lib/libcurses/get_wstr.c diff -u src/lib/libcurses/get_wstr.c:1.10 src/lib/libcurses/get_wstr.c:1.11 --- src/lib/libcurses/get_wstr.c:1.10 Mon Sep 6 07:03:49 2021 +++ src/lib/libcurses/get_wstr.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: get_wstr.c,v 1.10 2021/09/06 07:03:49 rin Exp $ */ +/* $NetBSD: get_wstr.c,v 1.11 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 2005 The NetBSD Foundation Inc. @@ -36,7 +36,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: get_wstr.c,v 1.10 2021/09/06 07:03:49 rin Exp $"); +__RCSID("$NetBSD: get_wstr.c,v 1.11 2022/04/12 07:03:04 blymn Exp $"); #endif /* not lint */ #include "curses.h" @@ -167,7 +167,7 @@ __wgetn_wstr(WINDOW *win, wchar_t *wstr, return ERR; if (killwchar(&kc) == ERR) return ERR; - sc[0] = (wchar_t)btowc( ' ' ); + sc[0] = win->bch; sc[1] = L'\0'; setcchar(&cc, sc, win->wattr, 0, NULL); oldx = win->curx; Index: src/lib/libcurses/ins_wch.c diff -u src/lib/libcurses/ins_wch.c:1.18 src/lib/libcurses/ins_wch.c:1.19 --- src/lib/libcurses/ins_wch.c:1.18 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/ins_wch.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: ins_wch.c,v 1.18 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: ins_wch.c,v 1.19 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 2005 The NetBSD Foundation Inc. @@ -36,7 +36,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: ins_wch.c,v 1.18 2022/01/25 03:05:06 blymn Exp $"); +__RCSID("$NetBSD: ins_wch.c,v 1.19 2022/04/12 07:03:04 blymn Exp $"); #endif /* not lint */ #include <string.h> @@ -164,7 +164,7 @@ wins_wch(WINDOW *win, const cchar_t *wch } temp1->nsp = NULL; } - temp1->ch = (wchar_t)btowc((int)win->bch ); + temp1->ch = win->bch; if (_cursesi_copy_nsp(win->bnsp, temp1) == ERR) return ERR; temp1->attr = win->battr; Index: src/lib/libcurses/mvwin.c diff -u src/lib/libcurses/mvwin.c:1.23 src/lib/libcurses/mvwin.c:1.24 --- src/lib/libcurses/mvwin.c:1.23 Mon Sep 6 07:45:48 2021 +++ src/lib/libcurses/mvwin.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: mvwin.c,v 1.23 2021/09/06 07:45:48 rin Exp $ */ +/* $NetBSD: mvwin.c,v 1.24 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 1981, 1993, 1994 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)mvwin.c 8.2 (Berkeley) 5/4/94"; #else -__RCSID("$NetBSD: mvwin.c,v 1.23 2021/09/06 07:45:48 rin Exp $"); +__RCSID("$NetBSD: mvwin.c,v 1.24 2022/04/12 07:03:04 blymn Exp $"); #endif #endif /* not lint */ @@ -126,6 +126,6 @@ mvwin(WINDOW *win, int by, int bx) __swflags(win); __set_subwin(orig, win); } - __touchwin(win); + __touchwin(win, 0); return OK; } Index: src/lib/libcurses/newwin.c diff -u src/lib/libcurses/newwin.c:1.65 src/lib/libcurses/newwin.c:1.66 --- src/lib/libcurses/newwin.c:1.65 Sat Mar 26 16:03:02 2022 +++ src/lib/libcurses/newwin.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: newwin.c,v 1.65 2022/03/26 16:03:02 uwe Exp $ */ +/* $NetBSD: newwin.c,v 1.66 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 1981, 1993, 1994 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)newwin.c 8.3 (Berkeley) 7/27/94"; #else -__RCSID("$NetBSD: newwin.c,v 1.65 2022/03/26 16:03:02 uwe Exp $"); +__RCSID("$NetBSD: newwin.c,v 1.66 2022/04/12 07:03:04 blymn Exp $"); #endif #endif /* not lint */ @@ -142,7 +142,12 @@ __newwin(SCREEN *screen, int nlines, int if ((win = __makenew(screen, maxy, maxx, by, bx, 0, ispad)) == NULL) return NULL; +#ifdef HAVE_WCHAR + win->bch = (wchar_t) btowc((int) ' '); +#else win->bch = ' '; +#endif + if (__using_color) win->battr |= __default_color; win->nextp = win; @@ -161,10 +166,8 @@ __newwin(SCREEN *screen, int nlines, int lp->flags = 0; for (sp = lp->line, j = 0; j < maxx; j++, sp++) { sp->attr = 0; -#ifndef HAVE_WCHAR sp->ch = win->bch; -#else - sp->ch = (wchar_t)btowc((int) win->bch); +#ifdef HAVE_WCHAR sp->nsp = NULL; sp->wcols = 1; #endif /* HAVE_WCHAR */ Index: src/lib/libcurses/refresh.c diff -u src/lib/libcurses/refresh.c:1.118 src/lib/libcurses/refresh.c:1.119 --- src/lib/libcurses/refresh.c:1.118 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/refresh.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: refresh.c,v 1.118 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: refresh.c,v 1.119 2022/04/12 07:03:04 blymn Exp $ */ /* * Copyright (c) 1981, 1993, 1994 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)refresh.c 8.7 (Berkeley) 8/13/94"; #else -__RCSID("$NetBSD: refresh.c,v 1.118 2022/01/25 03:05:06 blymn Exp $"); +__RCSID("$NetBSD: refresh.c,v 1.119 2022/04/12 07:03:04 blymn Exp $"); #endif #endif /* not lint */ @@ -57,22 +57,8 @@ static void scrolln(int, int, int, int, static int _wnoutrefresh(WINDOW *, int, int, int, int, int, int); -#ifdef HAVE_WCHAR static int celleq(__LDATA *, __LDATA *); static int lineeq(__LDATA *, __LDATA *, size_t); -#else /* !HAVE_WCHAR */ -static inline int -celleq(__LDATA *x, __LDATA *y) -{ - return memcmp(x, y, sizeof(__LDATA)) == 0; -} - -static int -lineeq(__LDATA *xl, __LDATA *yl, size_t len) -{ - return memcmp(xl, yl, len * __LDATASIZE) == 0; -} -#endif /* HAVE_WCHAR */ #define CHECK_INTERVAL 5 /* Change N lines before checking typeahead */ @@ -304,7 +290,7 @@ _wnoutrefresh(WINDOW *win, int begy, int while (wx < mx) { __CTRACE(__CTRACE_REFRESH, "_wnoutrefresh: copy from %d, " - "%d to %d, %d: %s, 0x%x", + "%d to %d, %d: '%s', 0x%x", wy, wx, y_off, x_off, unctrl(wlp->line[wx].ch), wlp->line[wx].attr); @@ -331,8 +317,7 @@ _wnoutrefresh(WINDOW *win, int begy, int } #ifdef HAVE_WCHAR - if (wlp->line[wx].ch - == (wchar_t)btowc((int) win->bch)) { + if (wlp->line[wx].ch == win->bch) { vlp->line[x_off].ch = win->bch; vlp->line[x_off].wcols = win->wcols; if (_cursesi_copy_nsp(win->bnsp, @@ -351,10 +336,10 @@ _wnoutrefresh(WINDOW *win, int begy, int } } #endif /* HAVE_WCHAR */ - __CTRACE(__CTRACE_REFRESH, " = %s, 0x%x\n", + __CTRACE(__CTRACE_REFRESH, " = '%s', 0x%x\n", unctrl(vlp->line[x_off].ch), vlp->line[x_off].attr); - wx++; + wx++; /* XXX should be + wcols, need to properly set continuation flag on multi-col */ x_off++; dx_off++; } @@ -557,7 +542,7 @@ doupdate(void) curscr->curx = 0; werase(curscr); } - __touchwin(win); + __touchwin(win, 0); win->flags &= ~__CLEAROK; /* note we cleared for later */ was_cleared = 1; @@ -665,9 +650,11 @@ doupdate(void) /* * We have just cleared so don't force an update * otherwise we spray neeedless blanks to a cleared - * screen. + * screen. That is, unless, we are using color, + * in this case we need to force the background + * color to default. */ - if (was_cleared == 1) + if ((was_cleared == 1) && (__using_color == 0)) win->alines[wy]->flags &= ~__ISFORCED; if (makech(wy) == ERR) @@ -734,6 +721,7 @@ doupdate(void) cleanup: /* Don't leave the screen with attributes set. */ __unsetattr(0); + __do_color_init = 0; #ifdef DEBUG #ifdef HAVE_WCHAR { @@ -770,7 +758,7 @@ putattr(__LDATA *nsp) attr_t off, on; __CTRACE(__CTRACE_REFRESH, - "makech: have attr %08x, need attr %08x\n", + "putattr: have attr %08x, need attr %08x\n", curscr->wattr #ifndef HAVE_WCHAR & __ATTRIBUTES @@ -981,9 +969,13 @@ putch(__LDATA *nsp, __LDATA *csp, int wy #else if (nsp->wcols <= 0) goto out; + + if (((_cursesi_screen->nca & nsp->attr) == 0) && (__using_color == 1) && + csp == NULL) + __set_color(curscr, nsp->attr & __COLOR); __cputwchar((int)nsp->ch); __CTRACE(__CTRACE_REFRESH, - "makech: (%d,%d)putwchar(0x%x)\n", wy, wx - 1, nsp->ch); + "putch: (%d,%d)putwchar(0x%x)\n", wy, wx - 1, nsp->ch); /* Output non-spacing characters for the cell. */ __cursesi_putnsp(nsp->nsp, wy, wx); @@ -1071,13 +1063,15 @@ static int makech(int wy) { WINDOW *win; - static __LDATA blank; - __LDATA *nsp, *csp, *cp, *cep, *fsp; + static __LDATA blank, space; + __LDATA *nsp, *csp, *cp, *cep, *fsp, *tld; __LINE *wlp; size_t clsp, nlsp; /* Last space in lines. */ int lch, wx, owx, chw; const char *ce; attr_t lspc; /* Last space colour */ + attr_t battr; /* background attribute bits */ + attr_t attr_mask; /* attributes mask */ #ifdef __GNUC__ nlsp = lspc = 0; /* XXX gcc -Wuninitialized */ @@ -1086,13 +1080,26 @@ makech(int wy) win = curscr; else win = __virtscr; + + blank.ch = win->bch; + blank.attr = win->battr; #ifdef HAVE_WCHAR - blank.ch = (wchar_t)btowc((int) win->bch); - blank.attr = 0; if (_cursesi_copy_nsp(win->bnsp, &blank) == ERR) return ERR; blank.wcols = win->wcols; + attr_mask = WA_ATTRIBUTES; + + space.ch = (wchar_t) btowc((int) ' '); + space.nsp = NULL; + space.wcols = 1; + space.attr = WA_NORMAL; +#else + space.ch = ' '; + space.attr = A_NORMAL; + attr_mask = A_ATTRIBUTES; #endif /* HAVE_WCHAR */ + battr = win->battr & attr_mask; + #ifdef DEBUG #if HAVE_WCHAR { @@ -1116,6 +1123,7 @@ makech(int wy) } #endif /* HAVE_WCHAR */ #endif /* DEBUG */ + /* Is the cursor still on the end of the last line? */ if (wy > 0 && curscr->alines[wy - 1]->flags & __ISPASTEOL) { domvcur(win, _cursesi_screen->ly, _cursesi_screen->lx, @@ -1147,6 +1155,7 @@ makech(int wy) } nsp = fsp = &win->alines[wy]->line[wx]; + #ifdef DEBUG if (_cursesi_screen->curwin) __CTRACE(__CTRACE_REFRESH, @@ -1155,33 +1164,43 @@ makech(int wy) __CTRACE(__CTRACE_REFRESH, "makech: nsp is at __virtscr:(%d,%d)\n", wy, wx); #endif /* DEBUG */ - if (clr_eol && !_cursesi_screen->curwin) { + + /* + * Work out if we can use a clear to end of line. If we are + * using color then we can only erase the line if the terminal + * can erase to the background color. + */ + if (clr_eol && !_cursesi_screen->curwin && (!(__using_color) + || (__using_color && back_color_erase))) { cp = &win->alines[wy]->line[win->maxx - 1]; - lspc = cp->attr & __COLOR; -#ifndef HAVE_WCHAR - while (cp->ch == ' ' && cp->attr == lspc) /* XXX */ - if (cp-- <= win->alines[wy]->line) - break; +#ifdef HAVE_WCHAR + while ((celleq(cp, &space) == 1) && #else - while (cp->ch == ( wchar_t )btowc(( int )' ' ) - && ( cp->attr & WA_ATTRIBUTES ) == lspc) + while (cp->ch == space.ch && +#endif /* HAVE_WCHAR */ + ((cp->attr & attr_mask) == battr)) { if (cp-- <= win->alines[wy]->line) break; + } + +#ifdef HAVE_WCHAR + if ((cp->wflags & WCA_CONTINUATION) == WCA_CONTINUATION) + cp--; #endif /* HAVE_WCHAR */ + if (win->alines[wy]->line > cp) nlsp = 0; else nlsp = cp - win->alines[wy]->line; } - if (!_cursesi_screen->curwin) - ce = clr_eol; - else - ce = NULL; + + ce = clr_eol; while (wx <= lch) { -#ifndef HAVE_WCHAR __CTRACE(__CTRACE_REFRESH, "makech: wx=%d,lch=%d\n", wx, lch); -#else +#ifdef HAVE_WCHAR + __CTRACE(__CTRACE_REFRESH, "makech: farnarkle: flags 0x%x, wflags 0x%x, color_init %d, celleq %d\n", + wlp->flags, nsp->wflags, __do_color_init, celleq(nsp, csp)); __CTRACE(__CTRACE_REFRESH, "makech: nsp=(%x,%x,%d,%x,%x,%d,%p)\n", nsp->ch, nsp->attr, nsp->wcols, win->bch, win->battr, win->wcols, nsp->nsp); @@ -1214,66 +1233,72 @@ makech(int wy) domvcur(win, _cursesi_screen->ly, _cursesi_screen->lx, wy, wx); __CTRACE(__CTRACE_REFRESH, "makech: 1: wx = %d, ly= %d, " - "lx = %d, newy = %d, newx = %d\n", - wx, _cursesi_screen->ly, _cursesi_screen->lx, wy, wx); + "lx = %d, newy = %d, newx = %d, lch = %d\n", + wx, _cursesi_screen->ly, _cursesi_screen->lx, wy, wx, lch); _cursesi_screen->ly = wy; _cursesi_screen->lx = wx; owx = wx; while (wx <= lch && ((wlp->flags & __ISFORCED) || !celleq(nsp, csp))) { -#ifndef HAVE_WCHAR - if (ce != NULL && wx >= nlsp - && nsp->ch == ' ' && nsp->attr == lspc) -#else - if (ce != NULL && wx >= nlsp - && nsp->ch == (wchar_t)btowc((int)' ') /* XXX */ - && (nsp->attr & WA_ATTRIBUTES) == lspc) -#endif + if ((ce != NULL) && (wx >= nlsp) && + (nsp->ch == space.ch) && + (__do_color_init == 1 || nsp->attr == space.attr)) { /* Check for clear to end-of-line. */ cep = &curscr->alines[wy]->line[win->maxx - 1]; -#ifndef HAVE_WCHAR - while (cep->ch == ' ' && cep->attr == lspc) /* XXX */ -#else - while (cep->ch == (wchar_t)btowc((int)' ') - && (cep->attr & WA_ATTRIBUTES) == lspc) -#endif /* HAVE_WCHAR */ + while (cep->ch == blank.ch && cep->attr == battr) if (cep-- <= csp) break; - if (cep > (curscr->alines[wy]->line + win->begx * __LDATASIZE)) + if (cep >= (curscr->alines[wy]->line + win->begx * __LDATASIZE)) clsp = cep - curscr->alines[wy]->line - - win->begx * __LDATASIZE; + win->begx * __LDATASIZE; else clsp = 0; __CTRACE(__CTRACE_REFRESH, - "makech: clsp = %zu, nlsp = %zu\n", - clsp, nlsp); + "makech: clsp = %zu, nlsp = %zu, strlen(ce) = %ld\n", + clsp, nlsp, strlen(ce)); __CTRACE(__CTRACE_REFRESH, "makech: line = %p, cep = %p, begx = %u\n", curscr->alines[wy]->line, cep, win->begx); - if (((clsp - nlsp >= strlen(ce) && - clsp < win->maxx * __LDATASIZE) || - wy == win->maxy - 1) && - (!(lspc & __COLOR) || - ((lspc & __COLOR) && back_color_erase))) + + /* + * work out how to clear the line. If: + * - clear len is greater than clear_to_eol len + * - background char == ' ' + * - we are not at EOL + * - using color and term can erase to + * background color + * - if we are at the bottom of the window + * (to prevent a scroll) + * then emit the ce string. + */ + if (((((clsp - nlsp > strlen(ce)) || + (__do_color_init && back_color_erase)) && + (clsp != win->maxx * __LDATASIZE)) || + (wy == win->maxy - 1)) && + (!(__using_color) || + (__using_color && back_color_erase))) { - __unsetattr(0); - if (__using_color && + if(wlp->line[wx].attr & win->screen->nca) { + __unsetattr(0); + } else if (__using_color && + ((__do_color_init == 1) || ((lspc & __COLOR) != - (curscr->wattr & __COLOR))) + (curscr->wattr & __COLOR)))) { __set_color(curscr, lspc & __COLOR); + } tputs(ce, 0, __cputchar); _cursesi_screen->lx = wx + win->begx; while (wx++ <= clsp) { - csp->attr = lspc; -#ifndef HAVE_WCHAR - csp->ch = ' '; /* XXX */ -#else - csp->ch = (wchar_t)btowc((int)' '); - csp->wcols = 1; + csp->attr = blank.attr; + csp->ch = blank.ch; +#ifdef HAVE_WCHAR + if (_cursesi_copy_nsp(blank.nsp, csp) == ERR) + return ERR; #endif /* HAVE_WCHAR */ + csp->wcols = blank.wcols; assert(csp != &blank); csp++; } @@ -1320,7 +1345,11 @@ makech(int wy) if (wx + chw < win->maxx || wy < win->maxy - 1 || !(win->flags & __SCROLLWIN)) { - if (putch(nsp, csp, wy, wx) == ERR) + tld = nsp; + if (celleq(&blank, nsp)) + tld = ␣ + + if (putch(tld, csp, wy, wx) == ERR) return ERR; if (!_cursesi_screen->curwin) { assert(csp != &blank); @@ -1440,7 +1469,7 @@ quickch(void) __LINE *clp, *tmp1, *tmp2; int bsize, curs, curw, starts, startw, i, j; int n, target, cur_period, bot, top, sc_region; - unsigned int blank_hash; + unsigned int blank_hash, found; attr_t bcolor; #ifdef __GNUC__ @@ -1454,9 +1483,9 @@ quickch(void) (__virtscr->alines[top]->hash != curscr->alines[top]->hash || !lineeq(__virtscr->alines[top]->line, curscr->alines[top]->line, - (size_t) __virtscr->maxx))) + (size_t) __virtscr->maxx))) { break; - else + } else __virtscr->alines[top]->flags &= ~__ISDIRTY; } /* @@ -1467,9 +1496,9 @@ quickch(void) (__virtscr->alines[bot]->hash != curscr->alines[bot]->hash || !lineeq(__virtscr->alines[bot]->line, curscr->alines[bot]->line, - (size_t) __virtscr->maxx))) + (size_t) __virtscr->maxx))) { break; - else + } else __virtscr->alines[bot]->flags &= ~__ISDIRTY; } @@ -1516,36 +1545,40 @@ quickch(void) * - bsize is the current size of the examined block. */ + found = 0; for (bsize = bot - top; bsize >= THRESH; bsize--) { for (startw = top; startw <= bot - bsize; startw++) for (starts = top; starts <= bot - bsize; starts++) { - for (curw = startw, curs = starts; +/* for (curw = startw, curs = starts; curs < starts + bsize; curw++, curs++) if (__virtscr->alines[curw]->hash != curscr->alines[curs]->hash) break; if (curs != starts + bsize) - continue; + continue;*/ for (curw = startw, curs = starts; curs < starts + bsize; curw++, curs++) if (!lineeq(__virtscr->alines[curw]->line, curscr->alines[curs]->line, - (size_t) __virtscr->maxx)) + (size_t) __virtscr->maxx)) { + found = 1; break; - if (curs == starts + bsize) + } + if ((curs == starts + bsize) && (found == 1)) { goto done; + } } } done: + __CTRACE(__CTRACE_REFRESH, "quickch:bsize=%d, THRESH=%d, starts=%d, " + "startw=%d, curw=%d, curs=%d, top=%d, bot=%d\n", + bsize, THRESH, starts, startw, curw, curs, top, bot); + /* Did not find anything */ if (bsize < THRESH) return; - __CTRACE(__CTRACE_REFRESH, "quickch:bsize=%d, starts=%d, startw=%d, " - "curw=%d, curs=%d, top=%d, bot=%d\n", - bsize, starts, startw, curw, curs, top, bot); - /* * Make sure that there is no overlap between the bottom and top * regions and the middle scrolled block. @@ -1559,6 +1592,7 @@ done: #ifdef DEBUG __CTRACE(__CTRACE_REFRESH, "#####################################\n"); + __CTRACE(__CTRACE_REFRESH, "quickch: n = %d\n", n); for (i = 0; i < curscr->maxy; i++) { __CTRACE(__CTRACE_REFRESH, "C: %d:", i); __CTRACE(__CTRACE_REFRESH, " 0x%x \n", curscr->alines[i]->hash); @@ -1589,16 +1623,16 @@ done: #endif #ifndef HAVE_WCHAR - if (buf[0].ch != ' ') { + if (buf[0].ch != curscr->bch) { for (i = 0; i < BLANKSIZE; i++) { - buf[i].ch = ' '; + buf[i].ch = curscr->bch; buf[i].attr = 0; } } #else - if (buf[0].ch != (wchar_t)btowc((int)curscr->bch )) { + if (buf[0].ch != curscr->bch) { for (i = 0; i < BLANKSIZE; i++) { /* XXXX: BLANKSIZE may not be valid if wcols > 1 */ - buf[i].ch = (wchar_t)btowc((int)curscr->bch); + buf[i].ch = curscr->bch; if (_cursesi_copy_nsp(curscr->bnsp, &buf[i]) == ERR) return; buf[i].attr = 0; @@ -1956,19 +1990,24 @@ __unsetattr(int checkms) __unset_color(curscr); } -#ifdef HAVE_WCHAR /* compare two cells on screen, must have the same foreground/background, - * and the same sequence of non-spacing characters */ + * and for wide characters the same sequence of non-spacing characters + */ static int celleq(__LDATA *x, __LDATA *y) { +#ifdef HAVE_WCHAR nschar_t *xnp = x->nsp, *ynp = y->nsp; +#endif /* HAVE_WCHAR */ int ret = ( x->ch == y->ch ) && ( x->attr == y->attr ); +#ifdef HAVE_WCHAR if (!ret) return 0; + if (!xnp && !ynp) return 1; + if ((xnp && !ynp) || (!xnp && ynp)) return 0; @@ -1978,7 +2017,11 @@ celleq(__LDATA *x, __LDATA *y) xnp = xnp->next; ynp = ynp->next; } + return !xnp && !ynp; +#else + return ret; +#endif /* HAVE_WCHAR */ } /* compare two line segments */ @@ -1995,6 +2038,7 @@ lineeq(__LDATA *xl, __LDATA *yl, size_t return 1; } +#ifdef HAVE_WCHAR /* * Output the non-spacing characters associated with the given character * cell to the screen. Index: src/lib/libcurses/shlib_version diff -u src/lib/libcurses/shlib_version:1.46 src/lib/libcurses/shlib_version:1.47 --- src/lib/libcurses/shlib_version:1.46 Mon Sep 6 15:17:25 2021 +++ src/lib/libcurses/shlib_version Tue Apr 12 07:03:04 2022 @@ -1,7 +1,7 @@ -# $NetBSD: shlib_version,v 1.46 2021/09/06 15:17:25 rin Exp $ +# $NetBSD: shlib_version,v 1.47 2022/04/12 07:03:04 blymn Exp $ # Remember to update distrib/sets/lists/base/shl.* when changing # Remember to increment the major numbers of libform, libmenu and # libpanel when the libcurses major number increments. # major=9 -minor=0 +minor=1 Index: src/lib/libcurses/slk.c diff -u src/lib/libcurses/slk.c:1.19 src/lib/libcurses/slk.c:1.20 --- src/lib/libcurses/slk.c:1.19 Tue Jan 25 03:05:06 2022 +++ src/lib/libcurses/slk.c Tue Apr 12 07:03:04 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: slk.c,v 1.19 2022/01/25 03:05:06 blymn Exp $ */ +/* $NetBSD: slk.c,v 1.20 2022/04/12 07:03:04 blymn Exp $ */ /*- * Copyright (c) 2017 The NetBSD Foundation, Inc. @@ -32,9 +32,10 @@ #include <sys/cdefs.h> #include <limits.h> #ifndef lint -__RCSID("$NetBSD: slk.c,v 1.19 2022/01/25 03:05:06 blymn Exp $"); +__RCSID("$NetBSD: slk.c,v 1.20 2022/04/12 07:03:04 blymn Exp $"); #endif /* not lint */ +#include <limits.h> #include <ctype.h> #include <stdlib.h> #include <string.h>