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 = &blank;
+				
+				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>

Reply via email to