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>