Module Name: src
Committed By: blymn
Date: Wed Oct 19 06:09:27 UTC 2022
Modified Files:
src/lib/libcurses: add_wchstr.c addbytes.c background.c chgat.c
clrtobot.c color.c cr_put.c curses.c delch.c erase.c ins_wch.c
ins_wstr.c insch.c insdelln.c insstr.c refresh.c resize.c
Log Message:
Fixes for lib/56926 amongst other things:
- plod now correctly accounts for wide characters when plodding
- use erase line when in color mode if the terminal has the capability
- ensure that the CA_CONTINUATION flag is applied consistently to the
subsequent characters in a wide character.
- fix a bunch of refresh bugs that caused inconsistent placement of
wide characters.
To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/lib/libcurses/add_wchstr.c
cvs rdiff -u -r1.64 -r1.65 src/lib/libcurses/addbytes.c
cvs rdiff -u -r1.32 -r1.33 src/lib/libcurses/background.c
cvs rdiff -u -r1.8 -r1.9 src/lib/libcurses/chgat.c
cvs rdiff -u -r1.30 -r1.31 src/lib/libcurses/clrtobot.c \
src/lib/libcurses/curses.c
cvs rdiff -u -r1.46 -r1.47 src/lib/libcurses/color.c
cvs rdiff -u -r1.39 -r1.40 src/lib/libcurses/cr_put.c
cvs rdiff -u -r1.29 -r1.30 src/lib/libcurses/delch.c
cvs rdiff -u -r1.36 -r1.37 src/lib/libcurses/erase.c
cvs rdiff -u -r1.19 -r1.20 src/lib/libcurses/ins_wch.c
cvs rdiff -u -r1.23 -r1.24 src/lib/libcurses/ins_wstr.c
cvs rdiff -u -r1.27 -r1.28 src/lib/libcurses/insch.c
cvs rdiff -u -r1.22 -r1.23 src/lib/libcurses/insdelln.c
cvs rdiff -u -r1.10 -r1.11 src/lib/libcurses/insstr.c
cvs rdiff -u -r1.123 -r1.124 src/lib/libcurses/refresh.c
cvs rdiff -u -r1.35 -r1.36 src/lib/libcurses/resize.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.13 src/lib/libcurses/add_wchstr.c:1.14
--- src/lib/libcurses/add_wchstr.c:1.13 Tue May 3 07:25:34 2022
+++ src/lib/libcurses/add_wchstr.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: add_wchstr.c,v 1.13 2022/05/03 07:25:34 blymn Exp $ */
+/* $NetBSD: add_wchstr.c,v 1.14 2022/10/19 06:09:27 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.13 2022/05/03 07:25:34 blymn Exp $");
+__RCSID("$NetBSD: add_wchstr.c,v 1.14 2022/10/19 06:09:27 blymn Exp $");
#endif /* not lint */
#include <stdlib.h>
@@ -174,7 +174,8 @@ wadd_wchnstr(WINDOW *win, const cchar_t
if (_cursesi_copy_nsp(win->bnsp, tp) == ERR)
return ERR;
tp->attr = win->battr;
- (*tp).wcols = 1;
+ tp->wcols = 1;
+ tp->cflags = CA_BACKGROUND;
np = tp->nsp;
}
} else {
@@ -186,7 +187,7 @@ wadd_wchnstr(WINDOW *win, const cchar_t
}
lnp->flags |= __ISDIRTY;
newx = sx + win->ch_off;
- if (newx < *lnp->firstchp)
+ if (newx < *lnp->firstchp)
*lnp->firstchp = newx;
/* add characters in the string */
@@ -210,7 +211,7 @@ wadd_wchnstr(WINDOW *win, const cchar_t
== ERR)
return ERR;
lp->attr = win->battr;
- lp->cflags |= CA_BACKGROUND;
+ lp->cflags = CA_BACKGROUND;
(*lp).wcols = 1;
lp++, ex++;
}
@@ -259,6 +260,8 @@ wadd_wchnstr(WINDOW *win, const cchar_t
}
lp->ch = chp->vals[0];
lp->attr = chp->attributes & WA_ATTRIBUTES;
+ lp->cflags &= ~CA_BACKGROUND;
+ lp->cflags |= CA_CONTINUATION;
(*lp).wcols = x - ex;
lp++, ex++;
}
Index: src/lib/libcurses/addbytes.c
diff -u src/lib/libcurses/addbytes.c:1.64 src/lib/libcurses/addbytes.c:1.65
--- src/lib/libcurses/addbytes.c:1.64 Thu May 19 07:41:26 2022
+++ src/lib/libcurses/addbytes.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: addbytes.c,v 1.64 2022/05/19 07:41:26 blymn Exp $ */
+/* $NetBSD: addbytes.c,v 1.65 2022/10/19 06:09:27 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.64 2022/05/19 07:41:26 blymn Exp $");
+__RCSID("$NetBSD: addbytes.c,v 1.65 2022/10/19 06:09:27 blymn Exp $");
#endif
#endif /* not lint */
@@ -293,6 +293,7 @@ _cursesi_addbyte(WINDOW *win, __LINE **l
*/
if (newx < *(*lp)->firstchp)
*(*lp)->firstchp = newx;
+
if (newx > *(*lp)->lastchp)
*(*lp)->lastchp = newx;
__CTRACE(__CTRACE_INPUT, "ADDBYTES: change gives f/l: %d/%d [%d/%d]\n",
@@ -311,7 +312,7 @@ _cursesi_addbyte(WINDOW *win, __LINE **l
#endif
}
- (*lp)->line[*x].cflags &= ~ CA_BACKGROUND;
+ (*lp)->line[*x].cflags &= ~ (CA_BACKGROUND | CA_CONTINUATION);
if (attributes & __COLOR)
(*lp)->line[*x].attr =
@@ -421,6 +422,7 @@ _cursesi_addwchar(WINDOW *win, __LINE **
newx = *x + win->ch_off;
if (newx < *(*lnp)->firstchp)
*(*lnp)->firstchp = newx;
+
if (newx > *(*lnp)->lastchp)
*(*lnp)->lastchp = newx;
__touchline(win, *y, *x, *x);
@@ -451,7 +453,7 @@ _cursesi_addwchar(WINDOW *win, __LINE **
*y, sx);
tp = &win->alines[*y]->line[sx];
tp->ch = win->bch;
- tp->cflags |= CA_BACKGROUND;
+ tp->cflags = CA_BACKGROUND;
if (_cursesi_copy_nsp(win->bnsp, tp) == ERR)
return ERR;
@@ -483,12 +485,14 @@ _cursesi_addwchar(WINDOW *win, __LINE **
newx = *x + win->ch_off;
if (newx < *(*lnp)->firstchp)
*(*lnp)->firstchp = newx;
+
for (tp = lp; *x < win->maxx; tp++, (*x)++) {
tp->ch = win->bch;
if (_cursesi_copy_nsp(win->bnsp, tp) == ERR)
return ERR;
tp->attr = win->battr;
tp->wcols = win->wcols;
+ tp->cflags = CA_BACKGROUND;
}
newx = win->maxx - 1 + win->ch_off;
if (newx > *(*lnp)->lastchp)
@@ -510,13 +514,14 @@ _cursesi_addwchar(WINDOW *win, __LINE **
newx = *x + win->ch_off;
if (newx < *(*lnp)->firstchp)
*(*lnp)->firstchp = newx;
+
if (lp->nsp) {
__cursesi_free_nsp(lp->nsp);
lp->nsp = NULL;
}
lp->ch = wch->vals[0];
- lp->cflags &= ~CA_BACKGROUND;
+ lp->cflags &= ~ (CA_BACKGROUND | CA_CONTINUATION);
attributes = (win->wattr | wch->attributes)
& (WA_ATTRIBUTES & ~__COLOR);
@@ -555,7 +560,9 @@ _cursesi_addwchar(WINDOW *win, __LINE **
sx + 1, sx + cw - 1);
__CTRACE(__CTRACE_INPUT, "_cursesi_addwchar: *x = %d, win->maxx = %d\n",
*x, win->maxx);
- for (tp = lp + 1, *x = sx + 1; *x - sx <= cw - 1; tp++, (*x)++) {
+ for (tp = lp + 1, *x = sx + 1, i = cw - 1; i > 0; tp++, (*x)++, i--) {
+ __CTRACE(__CTRACE_INPUT,
+ "_cursesi_addwchar: setting continuation at x %d\n", *x);
if (tp->nsp) {
__cursesi_free_nsp(tp->nsp);
tp->nsp = NULL;
@@ -564,9 +571,10 @@ _cursesi_addwchar(WINDOW *win, __LINE **
tp->attr = lp->attr & WA_ATTRIBUTES;
/* Mark as "continuation" cell */
tp->cflags |= CA_CONTINUATION;
+ tp->cflags &= ~ CA_BACKGROUND;
+ tp->wcols = i;
}
-
if (*x >= win->maxx) {
__CTRACE(__CTRACE_INPUT, "_cursesi_addwchar: do line wrap\n");
if (*y == win->scr_b) {
@@ -590,7 +598,6 @@ _cursesi_addwchar(WINDOW *win, __LINE **
(*lnp) = win->alines[*y];
*(*lnp)->lastchp = win->ch_off + win->maxx - 1;
} else {
-
/* clear the remaining of the current character */
if (*x && *x < win->maxx) {
ex = sx + cw;
@@ -601,7 +608,7 @@ _cursesi_addwchar(WINDOW *win, __LINE **
"remaining of current char (%d,%d)nn",
*y, ex);
tp->ch = win->bch;
- tp->cflags |= CA_BACKGROUND;
+ tp->cflags = CA_BACKGROUND;
if (_cursesi_copy_nsp(win->bnsp, tp) == ERR)
return ERR;
tp->attr = win->battr;
Index: src/lib/libcurses/background.c
diff -u src/lib/libcurses/background.c:1.32 src/lib/libcurses/background.c:1.33
--- src/lib/libcurses/background.c:1.32 Thu May 5 22:02:17 2022
+++ src/lib/libcurses/background.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: background.c,v 1.32 2022/05/05 22:02:17 blymn Exp $ */
+/* $NetBSD: background.c,v 1.33 2022/10/19 06:09:27 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.32 2022/05/05 22:02:17 blymn Exp $");
+__RCSID("$NetBSD: background.c,v 1.33 2022/10/19 06:09:27 blymn Exp $");
#endif /* not lint */
#include <stdlib.h>
@@ -172,7 +172,7 @@ wbkgrndset(WINDOW *win, const cchar_t *w
/* get a copy of the old background, we will need it. */
obkgrnd.ch = win->bch;
obkgrnd.attr = win->battr;
- obkgrnd.cflags |= CA_BACKGROUND;
+ obkgrnd.cflags = CA_BACKGROUND;
obkgrnd.wcols = win->wcols;
obkgrnd.nsp = NULL;
_cursesi_copy_nsp(win->bnsp, &obkgrnd);
@@ -223,7 +223,7 @@ wbkgrndset(WINDOW *win, const cchar_t *w
nbkgrnd.ch = win->bch;
nbkgrnd.attr = win->battr;
- nbkgrnd.cflags |= CA_BACKGROUND;
+ nbkgrnd.cflags = CA_BACKGROUND;
nbkgrnd.wcols = win->wcols;
nbkgrnd.nsp = NULL;
_cursesi_copy_nsp(win->bnsp, &nbkgrnd);
Index: src/lib/libcurses/chgat.c
diff -u src/lib/libcurses/chgat.c:1.8 src/lib/libcurses/chgat.c:1.9
--- src/lib/libcurses/chgat.c:1.8 Mon Nov 22 21:25:25 2021
+++ src/lib/libcurses/chgat.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: chgat.c,v 1.8 2021/11/22 21:25:25 blymn Exp $ */
+/* $NetBSD: chgat.c,v 1.9 2022/10/19 06:09:27 blymn Exp $ */
/*
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: chgat.c,v 1.8 2021/11/22 21:25:25 blymn Exp $");
+__RCSID("$NetBSD: chgat.c,v 1.9 2022/10/19 06:09:27 blymn Exp $");
#include "curses.h"
#include "curses_private.h"
@@ -79,6 +79,7 @@ mvwchgat(WINDOW *win , int y, int x, int
if (x + win->ch_off < *lp->firstchp)
*lp->firstchp = x + win->ch_off;
+
if (x + win->ch_off + count > *lp->lastchp)
*lp->lastchp = x + win->ch_off + count;
Index: src/lib/libcurses/clrtobot.c
diff -u src/lib/libcurses/clrtobot.c:1.30 src/lib/libcurses/clrtobot.c:1.31
--- src/lib/libcurses/clrtobot.c:1.30 Tue May 3 07:25:34 2022
+++ src/lib/libcurses/clrtobot.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: clrtobot.c,v 1.30 2022/05/03 07:25:34 blymn Exp $ */
+/* $NetBSD: clrtobot.c,v 1.31 2022/10/19 06:09:27 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.30 2022/05/03 07:25:34 blymn Exp $");
+__RCSID("$NetBSD: clrtobot.c,v 1.31 2022/10/19 06:09:27 blymn Exp $");
#endif
#endif /* not lint */
@@ -98,6 +98,7 @@ wclrtobot(WINDOW *win)
sp->ch = bch;
sp->cflags |= CA_BACKGROUND;
+ sp->cflags &= CA_CONTINUATION;
sp->attr = battr | (sp->attr & __ALTCHARSET);
#ifdef HAVE_WCHAR
if (_cursesi_copy_nsp(win->bnsp, sp) == ERR)
Index: src/lib/libcurses/curses.c
diff -u src/lib/libcurses/curses.c:1.30 src/lib/libcurses/curses.c:1.31
--- src/lib/libcurses/curses.c:1.30 Tue May 3 07:25:34 2022
+++ src/lib/libcurses/curses.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: curses.c,v 1.30 2022/05/03 07:25:34 blymn Exp $ */
+/* $NetBSD: curses.c,v 1.31 2022/10/19 06:09:27 blymn Exp $ */
/*
* Copyright (c) 1981, 1993, 1994
@@ -35,7 +35,7 @@
#if 0
static char sccsid[] = "@(#)curses.c 8.3 (Berkeley) 5/4/94";
#else
-__RCSID("$NetBSD: curses.c,v 1.30 2022/05/03 07:25:34 blymn Exp $");
+__RCSID("$NetBSD: curses.c,v 1.31 2022/10/19 06:09:27 blymn Exp $");
#endif
#endif /* not lint */
@@ -92,6 +92,9 @@ _cursesi_celleq(__LDATA *x, __LDATA *y)
if (!ret)
return 0;
+ if ((x->cflags & CA_CONTINUATION) != (y->cflags & CA_CONTINUATION))
+ return 0;
+
if (!xnp && !ynp)
return 1;
Index: src/lib/libcurses/color.c
diff -u src/lib/libcurses/color.c:1.46 src/lib/libcurses/color.c:1.47
--- src/lib/libcurses/color.c:1.46 Tue Apr 12 07:03:04 2022
+++ src/lib/libcurses/color.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: color.c,v 1.46 2022/04/12 07:03:04 blymn Exp $ */
+/* $NetBSD: color.c,v 1.47 2022/10/19 06:09:27 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.46 2022/04/12 07:03:04 blymn Exp $");
+__RCSID("$NetBSD: color.c,v 1.47 2022/10/19 06:09:27 blymn Exp $");
#endif /* not lint */
#include "curses.h"
@@ -678,6 +678,7 @@ __change_pair(short pair)
*/
if (*lp->firstchp > x)
*lp->firstchp = x;
+
if (*lp->lastchp < x)
*lp->lastchp = x;
}
Index: src/lib/libcurses/cr_put.c
diff -u src/lib/libcurses/cr_put.c:1.39 src/lib/libcurses/cr_put.c:1.40
--- src/lib/libcurses/cr_put.c:1.39 Sun Apr 10 09:50:44 2022
+++ src/lib/libcurses/cr_put.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: cr_put.c,v 1.39 2022/04/10 09:50:44 andvar Exp $ */
+/* $NetBSD: cr_put.c,v 1.40 2022/10/19 06:09:27 blymn Exp $ */
/*
* Copyright (c) 1981, 1993, 1994
@@ -36,7 +36,7 @@
#if 0
static char sccsid[] = "@(#)cr_put.c 8.3 (Berkeley) 5/4/94";
#else
-__RCSID("$NetBSD: cr_put.c,v 1.39 2022/04/10 09:50:44 andvar Exp $");
+__RCSID("$NetBSD: cr_put.c,v 1.40 2022/10/19 06:09:27 blymn Exp $");
#endif
#endif /* not lint */
@@ -221,6 +221,7 @@ static int
plod(int cnt, int in_refresh)
{
int i, j, k, soutcol, soutline;
+ __LDATA *csp;
__CTRACE(__CTRACE_OUTPUT, "plod: cnt=%d, in_refresh=%d\n",
cnt, in_refresh);
@@ -423,16 +424,23 @@ dontcr:while (outline < destline) {
* If destcol is halfway through a multicolumn
* wide char, we have no chance of plodding.
*/
- k = outcol - destcol;
- if (k < 0)
- k = -k;
- if ((k != 0) && (curscr->alines[outline]->line[outcol].wcols > k)) {
+ if (curscr->alines[outline]->line[outcol].cflags & CA_CONTINUATION) {
plodcnt = -1;
goto out;
}
#endif /* HAVE_WCHAR */
while (outcol < destcol) {
+ int chw;
+
+ csp = &curscr->alines[outline]->line[outcol];
+#ifdef HAVE_WCHAR
+ chw = csp->wcols;
+#else
+ chw = 1;
+#endif /* HAVE_WCHAR */
+
+
/*
* Move one char to the right. We don't use nd space because
* it's better to just print the char we are moving over.
@@ -442,44 +450,42 @@ dontcr:while (outline < destline) {
plodcnt--;
else {
#ifndef HAVE_WCHAR
- i = curscr->alines[outline]->line[outcol].ch
- & __CHARTEXT;
- if (curscr->alines[outline]->line[outcol].attr
- == curscr->wattr)
+ i = csp->ch & __CHARTEXT;
+ if (csp->attr == curscr->wattr)
__cputchar(i);
#else
- if ((curscr->alines[outline]->line[outcol].attr
- & WA_ATTRIBUTES)
+ if ((csp->attr & WA_ATTRIBUTES)
== curscr->wattr) {
- switch (curscr->alines[outline]->line[outcol].wcols) {
- case 1:
- __cputwchar(curscr->alines[outline]->line[outcol].ch);
- __cursesi_putnsp(curscr->alines[outline]->line[outcol].nsp,
+ if (csp->cflags & CA_CONTINUATION)
+ goto nondes;
+
+ if (csp->wcols >= 1) {
+ __cputwchar(csp->ch);
+ __cursesi_putnsp(csp->nsp,
outline,
outcol);
__CTRACE(__CTRACE_OUTPUT,
"plod: (%d,%d)wcols(%d), "
"putwchar(%x)\n",
outline, outcol,
- curscr->alines[outline]->line[outcol].wcols,
- curscr->alines[outline]->line[outcol].ch);
- /*FALLTHROUGH*/
- case 0:
- break;
- default:
- goto nondes;
+ csp->wcols, csp->ch);
}
+
+ if (csp->wcols == 0)
+ break;
}
#endif /* HAVE_WCHAR */
else
goto nondes;
}
- else
- nondes: if (cursor_right)
- tputs(cursor_right, 0, plodput);
- else
- plodput(' ');
- outcol++;
+ else {
+ nondes: if (cursor_right)
+ tputs(cursor_right, 0, plodput);
+ else
+ plodput(' ');
+ }
+
+ outcol += chw;
if (plodcnt < 0)
goto out;
}
Index: src/lib/libcurses/delch.c
diff -u src/lib/libcurses/delch.c:1.29 src/lib/libcurses/delch.c:1.30
--- src/lib/libcurses/delch.c:1.29 Tue May 3 07:25:34 2022
+++ src/lib/libcurses/delch.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: delch.c,v 1.29 2022/05/03 07:25:34 blymn Exp $ */
+/* $NetBSD: delch.c,v 1.30 2022/10/19 06:09:27 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.29 2022/05/03 07:25:34 blymn Exp $");
+__RCSID("$NetBSD: delch.c,v 1.30 2022/10/19 06:09:27 blymn Exp $");
#endif
#endif /* not lint */
@@ -98,7 +98,7 @@ wdelch(WINDOW *win)
temp1++, temp2++;
}
temp1->ch = win->bch;
- temp1->cflags |= CA_BACKGROUND;
+ temp1->cflags = CA_BACKGROUND;
if (__using_color && win != curscr)
temp1->attr = win->battr & __COLOR;
else
@@ -137,6 +137,7 @@ wdelch(WINDOW *win)
while (temp1 <= end) {
temp1->ch = win->bch;
temp1->cflags |= CA_BACKGROUND;
+ temp1->cflags &= ~CA_CONTINUATION;
temp1->attr = win->battr;
if (_cursesi_copy_nsp(win->bnsp, temp1) == ERR)
return ERR;
Index: src/lib/libcurses/erase.c
diff -u src/lib/libcurses/erase.c:1.36 src/lib/libcurses/erase.c:1.37
--- src/lib/libcurses/erase.c:1.36 Tue May 3 07:25:34 2022
+++ src/lib/libcurses/erase.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: erase.c,v 1.36 2022/05/03 07:25:34 blymn Exp $ */
+/* $NetBSD: erase.c,v 1.37 2022/10/19 06:09:27 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.36 2022/05/03 07:25:34 blymn Exp $");
+__RCSID("$NetBSD: erase.c,v 1.37 2022/10/19 06:09:27 blymn Exp $");
#endif
#endif /* not lint */
@@ -86,6 +86,7 @@ werase(WINDOW *win)
sp->ch = bch;
sp->cflags |= CA_BACKGROUND;
+ sp->cflags &= ~CA_CONTINUATION;
sp->attr = battr | (sp->attr & __ALTCHARSET);
#ifdef HAVE_WCHAR
if (_cursesi_copy_nsp(win->bnsp, sp) == ERR)
Index: src/lib/libcurses/ins_wch.c
diff -u src/lib/libcurses/ins_wch.c:1.19 src/lib/libcurses/ins_wch.c:1.20
--- src/lib/libcurses/ins_wch.c:1.19 Tue Apr 12 07:03:04 2022
+++ src/lib/libcurses/ins_wch.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: ins_wch.c,v 1.19 2022/04/12 07:03:04 blymn Exp $ */
+/* $NetBSD: ins_wch.c,v 1.20 2022/10/19 06:09:27 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.19 2022/04/12 07:03:04 blymn Exp $");
+__RCSID("$NetBSD: ins_wch.c,v 1.20 2022/10/19 06:09:27 blymn Exp $");
#endif /* not lint */
#include <string.h>
@@ -200,6 +200,7 @@ wins_wch(WINDOW *win, const cchar_t *wch
temp1->ch = wch->vals[0];
temp1->wcols = x - ex;
temp1->nsp = NULL;
+ temp1->cflags |= CA_CONTINUATION;
ex++, temp1++;
}
Index: src/lib/libcurses/ins_wstr.c
diff -u src/lib/libcurses/ins_wstr.c:1.23 src/lib/libcurses/ins_wstr.c:1.24
--- src/lib/libcurses/ins_wstr.c:1.23 Tue Apr 12 07:03:04 2022
+++ src/lib/libcurses/ins_wstr.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: ins_wstr.c,v 1.23 2022/04/12 07:03:04 blymn Exp $ */
+/* $NetBSD: ins_wstr.c,v 1.24 2022/10/19 06:09:27 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.23 2022/04/12 07:03:04 blymn Exp $");
+__RCSID("$NetBSD: ins_wstr.c,v 1.24 2022/10/19 06:09:27 blymn Exp $");
#endif /* not lint */
#include <string.h>
@@ -291,6 +291,7 @@ loopdone:
newx = sx + win->ch_off;
if (newx < *lnp->firstchp)
*lnp->firstchp = newx;
+
#ifdef DEBUG
{
int i;
@@ -298,9 +299,11 @@ loopdone:
__CTRACE(__CTRACE_INPUT, "========before=======\n");
for (i = 0; i < win->maxx; i++)
__CTRACE(__CTRACE_INPUT,
- "wins_nwstr: (%d,%d)=(%x,%x,%p)\n",
+ "wins_nwstr: (%d,%d)=(%x,%x,%d,%x,%p)\n",
y, i, win->alines[y]->line[i].ch,
win->alines[y]->line[i].attr,
+ win->alines[y]->line[i].wcols,
+ win->alines[y]->line[i].cflags,
win->alines[y]->line[i].nsp);
}
#endif /* DEBUG */
@@ -323,6 +326,8 @@ loopdone:
return ERR;
}
temp1->attr = win->battr;
+ temp1->cflags |= CA_BACKGROUND;
+ temp1->cflags &= ~CA_CONTINUATION;
temp1->wcols = 1;
__CTRACE(__CTRACE_INPUT,
"wins_nwstr: empty cell(%p)\n", temp1);
@@ -340,10 +345,11 @@ loopdone:
__CTRACE(__CTRACE_INPUT, "=====after shift====\n");
for (i = 0; i < win->maxx; i++)
__CTRACE(__CTRACE_INPUT,
- "wins_nwstr: (%d,%d)=(%x,%x,%p)\n",
+ "wins_nwstr: (%d,%d)=(%x,%x,%x,%p)\n",
y, i,
win->alines[y]->line[i].ch,
win->alines[y]->line[i].attr,
+ win->alines[y]->line[i].cflags,
win->alines[y]->line[i].nsp);
__CTRACE(__CTRACE_INPUT, "=====lstr====\n");
for (i = 0; i < len; i++)
@@ -372,10 +378,12 @@ loopdone:
__CTRACE(__CTRACE_INPUT, "========after=======\n");
for (i = 0; i < win->maxx; i++)
__CTRACE(__CTRACE_INPUT,
- "wins_nwstr: (%d,%d)=(%x,%x,%p)\n",
+ "wins_nwstr: (%d,%d)=(%x,%x,%d,%x,%p)\n",
y, i,
win->alines[y]->line[i].ch,
win->alines[y]->line[i].attr,
+ win->alines[y]->line[i].wcols,
+ win->alines[y]->line[i].cflags,
win->alines[y]->line[i].nsp);
}
#endif /* DEBUG */
Index: src/lib/libcurses/insch.c
diff -u src/lib/libcurses/insch.c:1.27 src/lib/libcurses/insch.c:1.28
--- src/lib/libcurses/insch.c:1.27 Tue Jan 25 03:05:06 2022
+++ src/lib/libcurses/insch.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: insch.c,v 1.27 2022/01/25 03:05:06 blymn Exp $ */
+/* $NetBSD: insch.c,v 1.28 2022/10/19 06:09:27 blymn Exp $ */
/*
* Copyright (c) 1981, 1993, 1994
@@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "@(#)insch.c 8.2 (Berkeley) 5/4/94";
#else
-__RCSID("$NetBSD: insch.c,v 1.27 2022/01/25 03:05:06 blymn Exp $");
+__RCSID("$NetBSD: insch.c,v 1.28 2022/10/19 06:09:27 blymn Exp $");
#endif
#endif /* not lint */
@@ -106,8 +106,14 @@ winsch(WINDOW *win, chtype ch)
temp1--, temp2--;
}
temp1->ch = (wchar_t)ch & __CHARTEXT;
- if (temp1->ch == ' ')
+ if (temp1->ch == win->bch) {
temp1->ch = win->bch;
+ temp1->cflags &= ~CA_CONTINUATION;
+ temp1->cflags |= CA_BACKGROUND;
+ } else {
+ temp1->cflags &= ~ CA_BACKGROUND;
+ }
+
temp1->attr = (attr_t) ch & __ATTRIBUTES;
if (temp1->attr & __COLOR)
temp1->attr |= (win->battr & ~__COLOR);
Index: src/lib/libcurses/insdelln.c
diff -u src/lib/libcurses/insdelln.c:1.22 src/lib/libcurses/insdelln.c:1.23
--- src/lib/libcurses/insdelln.c:1.22 Tue Apr 12 21:54:16 2022
+++ src/lib/libcurses/insdelln.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: insdelln.c,v 1.22 2022/04/12 21:54:16 blymn Exp $ */
+/* $NetBSD: insdelln.c,v 1.23 2022/10/19 06:09:27 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.22 2022/04/12 21:54:16 blymn Exp $");
+__RCSID("$NetBSD: insdelln.c,v 1.23 2022/10/19 06:09:27 blymn Exp $");
#endif /* not lint */
/*
@@ -116,7 +116,10 @@ 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;
- win->alines[y]->line[i].ch = win->bch;
+ win->alines[y]->line[i].cflags |=
+ CA_BACKGROUND;
+ win->alines[y]->line[i].cflags &=
+ ~CA_CONTINUATION;
#ifdef HAVE_WCHAR
lp = &win->alines[y]->line[i];
if (_cursesi_copy_nsp(win->bnsp, lp) == ERR)
@@ -157,7 +160,10 @@ 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;
- win->alines[y]->line[i].ch = win->bch;
+ win->alines[y]->line[i].cflags |=
+ CA_BACKGROUND;
+ win->alines[y]->line[i].cflags &=
+ ~CA_CONTINUATION;
#ifdef HAVE_WCHAR
lp = &win->alines[y]->line[i];
lp->wcols = 1;
Index: src/lib/libcurses/insstr.c
diff -u src/lib/libcurses/insstr.c:1.10 src/lib/libcurses/insstr.c:1.11
--- src/lib/libcurses/insstr.c:1.10 Tue Jan 25 03:05:06 2022
+++ src/lib/libcurses/insstr.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: insstr.c,v 1.10 2022/01/25 03:05:06 blymn Exp $ */
+/* $NetBSD: insstr.c,v 1.11 2022/10/19 06:09:27 blymn Exp $ */
/*
* Copyright (c) 2005 The NetBSD Foundation Inc.
@@ -36,7 +36,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: insstr.c,v 1.10 2022/01/25 03:05:06 blymn Exp $");
+__RCSID("$NetBSD: insstr.c,v 1.11 2022/10/19 06:09:27 blymn Exp $");
#endif /* not lint */
#include <string.h>
@@ -186,6 +186,8 @@ winsnstr(WINDOW *win, const char *str, i
{
temp1->ch = (wchar_t)*scp & __CHARTEXT;
temp1->attr = win->wattr;
+ temp1->cflags &= ~CA_BACKGROUND;
+ temp1->cflags &= ~CA_CONTINUATION;
#ifdef HAVE_WCHAR
temp1->wcols = 1;
#endif /* HAVE_WCHAR */
Index: src/lib/libcurses/refresh.c
diff -u src/lib/libcurses/refresh.c:1.123 src/lib/libcurses/refresh.c:1.124
--- src/lib/libcurses/refresh.c:1.123 Tue May 3 07:25:34 2022
+++ src/lib/libcurses/refresh.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: refresh.c,v 1.123 2022/05/03 07:25:34 blymn Exp $ */
+/* $NetBSD: refresh.c,v 1.124 2022/10/19 06:09:27 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.123 2022/05/03 07:25:34 blymn Exp $");
+__RCSID("$NetBSD: refresh.c,v 1.124 2022/10/19 06:09:27 blymn Exp $");
#endif
#endif /* not lint */
@@ -150,6 +150,10 @@ _wnoutrefresh(WINDOW *win, int begy, int
SCREEN *screen = win->screen;
short sy, wy, wx, y_off, x_off, mx, dy_off, dx_off, endy;
int newy, newx;
+#ifdef HAVE_WCHAR
+ int i, tx;
+ wchar_t ch;
+#endif
__LINE *wlp, *vlp, *dwlp;
WINDOW *sub_win, *orig, *swin, *dwin;
@@ -289,29 +293,51 @@ _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, 0x%x",
wy, wx, y_off, x_off,
unctrl(wlp->line[wx].ch),
- wlp->line[wx].attr);
+ wlp->line[wx].attr, wlp->line[wx].cflags);
__CTRACE(__CTRACE_REFRESH,
- " (curdest %s, 0x%x)",
+ " (curdest %s, 0x%x, 0x%x)",
unctrl(vlp->line[x_off].ch),
- vlp->line[x_off].attr);
+ vlp->line[x_off].attr,
+ vlp->line[x_off].cflags);
/* Copy character */
vlp->line[x_off].ch = wlp->line[wx].ch;
/* Copy attributes */
vlp->line[x_off].attr = wlp->line[wx].attr;
+ /* Copy character flags */
+ vlp->line[x_off].cflags = wlp->line[wx].cflags;
#ifdef HAVE_WCHAR
vlp->line[x_off].wcols = wlp->line[wx].wcols;
+
+ ch = wlp->line[wx].ch;
+ for (tx = x_off + 1, i = wlp->line[wx].wcols - 1;
+ i > 0; i--, tx++) {
+ vlp->line[tx].ch = ch;
+ vlp->line[tx].wcols = i;
+ vlp->line[tx].cflags =
+ CA_CONTINUATION;
+ }
#endif /* HAVE_WCHAR */
if (win->flags & __ISDERWIN) {
dwlp->line[dx_off].ch =
wlp->line[wx].ch;
dwlp->line[dx_off].attr =
wlp->line[wx].attr;
+ dwlp->line[dx_off].cflags =
+ wlp->line[wx].cflags;
#ifdef HAVE_WCHAR
dwlp->line[dx_off].wcols =
wlp->line[wx].wcols;
+
+ for (tx = dx_off + 1, i = wlp->line[wx].wcols - 1;
+ i > 0; i--, tx++) {
+ dwlp->line[tx].ch = ch;
+ dwlp->line[tx].wcols = i;
+ dwlp->line[tx].cflags =
+ CA_CONTINUATION;
+ }
#endif /* HAVE_WCHAR */
}
@@ -319,6 +345,7 @@ _wnoutrefresh(WINDOW *win, int begy, int
if (wlp->line[wx].ch == win->bch) {
vlp->line[x_off].ch = win->bch;
vlp->line[x_off].wcols = win->wcols;
+ vlp->line[x_off].cflags = CA_BACKGROUND;
if (_cursesi_copy_nsp(win->bnsp,
&vlp->line[x_off])
== ERR)
@@ -328,6 +355,8 @@ _wnoutrefresh(WINDOW *win, int begy, int
win->bch;
dwlp->line[dx_off].wcols =
win->wcols;
+ dwlp->line[dx_off].cflags =
+ wlp->line[wx].cflags;
if (_cursesi_copy_nsp(win->bnsp,
&dwlp->line[dx_off])
== ERR)
@@ -338,9 +367,15 @@ _wnoutrefresh(WINDOW *win, int begy, int
__CTRACE(__CTRACE_REFRESH, " = '%s', 0x%x\n",
unctrl(vlp->line[x_off].ch),
vlp->line[x_off].attr);
- wx++; /* XXX should be + wcols, need to properly set continuation flag on multi-col */
+#ifdef HAVE_WCHAR
+ x_off += wlp->line[wx].wcols;
+ dx_off += wlp->line[wx].wcols;
+ wx += wlp->line[wx].wcols;
+#else
+ wx++;
x_off++;
dx_off++;
+#endif /* HAVE_WCHAR */
}
/* Set flags on "__virtscr" and unset on "win". */
@@ -400,7 +435,7 @@ _wnoutrefresh(WINDOW *win, int begy, int
* are not forcing a redraw. A pad can be displayed
* again without any of the contents changing.
*/
- if ((!(win->flags & __ISPAD)) ||
+ if (!((win->flags & __ISPAD)) ||
((wlp->flags & __ISFORCED) == __ISFORCED))
{
/* Set change pointers on "win". */
@@ -578,7 +613,7 @@ doupdate(void)
"stdscr(%p)-curscr(%p)-__virtscr(%p)\n",
stdscr, curscr, _cursesi_screen->__virtscr);
for (i = 0; i < curscr->maxy; i++) {
- __CTRACE(__CTRACE_REFRESH, "C: %d:", i);
+ __CTRACE(__CTRACE_REFRESH, "curscr: %d:", i);
__CTRACE(__CTRACE_REFRESH, " 0x%x \n",
curscr->alines[i]->hash);
for (j = 0; j < curscr->maxx; j++)
@@ -596,8 +631,14 @@ doupdate(void)
__CTRACE(__CTRACE_REFRESH, " %d",
curscr->alines[i]->line[j].wcols);
__CTRACE(__CTRACE_REFRESH, "\n");
+
+ __CTRACE(__CTRACE_REFRESH, " cflags:");
+ for (j = 0; j < curscr->maxx; j++)
+ __CTRACE(__CTRACE_REFRESH, " 0x%x",
+ curscr->alines[i]->line[j].cflags);
+ __CTRACE(__CTRACE_REFRESH, "\n");
#endif /* HAVE_WCHAR */
- __CTRACE(__CTRACE_REFRESH, "W: %d:", i);
+ __CTRACE(__CTRACE_REFRESH, "win %p: %d:", win, i);
__CTRACE(__CTRACE_REFRESH, " 0x%x \n",
win->alines[i]->hash);
__CTRACE(__CTRACE_REFRESH, " 0x%x ",
@@ -617,6 +658,11 @@ doupdate(void)
__CTRACE(__CTRACE_REFRESH, " %d",
win->alines[i]->line[j].wcols);
__CTRACE(__CTRACE_REFRESH, "\n");
+ __CTRACE(__CTRACE_REFRESH, " cflags:");
+ for (j = 0; j < win->maxx; j++)
+ __CTRACE(__CTRACE_REFRESH, " 0x%x",
+ win->alines[i]->line[j].cflags);
+ __CTRACE(__CTRACE_REFRESH, "\n");
__CTRACE(__CTRACE_REFRESH, " nsp:");
for (j = 0; j < curscr->maxx; j++)
__CTRACE(__CTRACE_REFRESH, " %p",
@@ -654,7 +700,9 @@ doupdate(void)
* color to default.
*/
if ((was_cleared == 1) && (__using_color == 0))
- win->alines[wy]->flags &= ~__ISFORCED;
+ win->alines[wy]->flags &= ~ 0L;
+ /*if ((was_cleared == 1) && (__using_color == 0))
+ win->alines[wy]->flags &= ~__ISFORCED;*/
if (makech(wy) == ERR)
return ERR;
@@ -734,15 +782,17 @@ cleanup:
for (i = 0; i < curscr->maxy; i++) {
for (j = 0; j < curscr->maxx; j++)
__CTRACE(__CTRACE_REFRESH,
- "[%d,%d](%x,%x,%d,%p)-(%x,%x,%d,%p)\n",
+ "[%d,%d](%x,%x,%d,%x,%p)-(%x,%x,%d,%x,%p)\n",
i, j,
curscr->alines[i]->line[j].ch,
curscr->alines[i]->line[j].attr,
curscr->alines[i]->line[j].wcols,
+ curscr->alines[i]->line[j].cflags,
curscr->alines[i]->line[j].nsp,
_cursesi_screen->__virtscr->alines[i]->line[j].ch,
_cursesi_screen->__virtscr->alines[i]->line[j].attr,
_cursesi_screen->__virtscr->alines[i]->line[j].wcols,
+ _cursesi_screen->__virtscr->alines[i]->line[j].cflags,
_cursesi_screen->__virtscr->alines[i]->line[j].nsp);
}
}
@@ -949,6 +999,10 @@ putattr_out(__LDATA *nsp)
static int
putch(__LDATA *nsp, __LDATA *csp, int wy, int wx)
{
+#ifdef HAVE_WCHAR
+ int i;
+ __LDATA *tcsp;
+#endif /* HAVE_WCHAR */
if (csp != NULL)
putattr(nsp);
@@ -956,17 +1010,30 @@ putch(__LDATA *nsp, __LDATA *csp, int wy
if (!_cursesi_screen->curwin && csp) {
csp->attr = nsp->attr;
csp->ch = nsp->ch;
+ csp->cflags = nsp->cflags;
#ifdef HAVE_WCHAR
if (_cursesi_copy_nsp(nsp->nsp, csp) == ERR)
return ERR;
csp->wcols = nsp->wcols;
+
+ if (nsp->wcols > 1) {
+ tcsp = csp;
+ tcsp++;
+ for (i = nsp->wcols - 1; i > 0; i--) {
+ tcsp->ch = csp->ch;
+ tcsp->attr = csp->attr;
+ tcsp->wcols = i;
+ tcsp->cflags = CA_CONTINUATION;
+ tcsp++;
+ }
+ }
#endif /* HAVE_WCHAR */
}
#ifndef HAVE_WCHAR
__cputchar((int)nsp->ch);
#else
- if (nsp->wcols <= 0)
+ if ((nsp->wcols <= 0) || (nsp->cflags & CA_CONTINUATION))
goto out;
if (((_cursesi_screen->nca & nsp->attr) == 0) && (__using_color == 1) &&
@@ -974,7 +1041,7 @@ putch(__LDATA *nsp, __LDATA *csp, int wy
__set_color(curscr, nsp->attr & __COLOR);
__cputwchar((int)nsp->ch);
__CTRACE(__CTRACE_REFRESH,
- "putch: (%d,%d)putwchar(0x%x)\n", wy, wx - 1, nsp->ch);
+ "putch: (%d,%d)putwchar(0x%x)\n", wy, wx, nsp->ch);
/* Output non-spacing characters for the cell. */
__cursesi_putnsp(nsp->nsp, wy, wx);
@@ -1062,10 +1129,11 @@ static int
makech(int wy)
{
WINDOW *win;
- static __LDATA blank, space;
- __LDATA *nsp, *csp, *cp, *cep, *fsp, *tld;
+ static __LDATA blank;
+ __LDATA *nsp, *csp, *cp, *cep, *fsp;
__LINE *wlp;
- size_t clsp, nlsp; /* Last space in lines. */
+ int nlsp; /* offset to first space at eol. */
+ size_t mlsp;
int lch, wx, owx, chw;
const char *ce;
attr_t lspc; /* Last space colour */
@@ -1082,19 +1150,13 @@ makech(int wy)
blank.ch = win->bch;
blank.attr = win->battr;
+ blank.cflags = CA_BACKGROUND;
#ifdef HAVE_WCHAR
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;
@@ -1153,6 +1215,15 @@ makech(int wy)
"makech: csp is on curscr:(%d,%d)\n", wy, wx);
}
+
+ while (win->alines[wy]->line[wx].cflags & CA_CONTINUATION) {
+ wx--;
+ if (wx <= 0) {
+ wx = 0;
+ break;
+ }
+ }
+
nsp = fsp = &win->alines[wy]->line[wx];
#ifdef DEBUG
@@ -1171,32 +1242,35 @@ makech(int wy)
*/
if (clr_eol && !_cursesi_screen->curwin && (!(__using_color)
|| (__using_color && back_color_erase))) {
+ nlsp = win->maxx - 1;
cp = &win->alines[wy]->line[win->maxx - 1];
#ifdef HAVE_WCHAR
- while ((_cursesi_celleq(cp, &space) == 1) &&
+ while ((_cursesi_celleq(cp, &blank) == 1) &&
#else
- while (cp->ch == space.ch &&
+ while (cp->ch == blank.ch &&
#endif /* HAVE_WCHAR */
((cp->attr & attr_mask) == battr)) {
- if (cp-- <= win->alines[wy]->line)
- break;
- }
-
#ifdef HAVE_WCHAR
- if ((cp->cflags & CA_CONTINUATION) == CA_CONTINUATION)
+ nlsp -= cp->wcols;
+ cp -= cp->wcols;
+#else
+ nlsp--;
cp--;
#endif /* HAVE_WCHAR */
- if (win->alines[wy]->line > cp)
+ if (nlsp <= 0)
+ break;
+ }
+
+
+ if (nlsp < 0)
nlsp = 0;
- else
- nlsp = cp - win->alines[wy]->line;
}
ce = clr_eol;
while (wx <= lch) {
- __CTRACE(__CTRACE_REFRESH, "makech: wx=%d,lch=%d\n", wx, lch);
+ __CTRACE(__CTRACE_REFRESH, "makech: wx=%d,lch=%d, nlsp=%d\n", wx, lch, nlsp);
#ifdef HAVE_WCHAR
__CTRACE(__CTRACE_REFRESH, "makech: farnarkle: flags 0x%x, cflags 0x%x, color_init %d, celleq %d\n",
wlp->flags, nsp->cflags, __do_color_init, _cursesi_celleq(nsp, csp));
@@ -1217,12 +1291,15 @@ makech(int wy)
while (wx <= lch && _cursesi_celleq(nsp, csp)) {
#ifdef HAVE_WCHAR
wx += nsp->wcols;
+ if (!_cursesi_screen->curwin)
+ csp += nsp->wcols;
+ nsp += nsp->wcols;
#else
wx++;
-#endif
nsp++;
if (!_cursesi_screen->curwin)
++csp;
+#endif
}
continue;
}
@@ -1241,25 +1318,25 @@ makech(int wy)
((wlp->flags & __ISFORCED) || !_cursesi_celleq(nsp, csp)))
{
if ((ce != NULL) && (wx >= nlsp) &&
- (nsp->ch == space.ch) &&
- (__do_color_init == 1 || nsp->attr == space.attr))
+ (nsp->ch == blank.ch) &&
+ (__do_color_init == 1 || nsp->attr == blank.attr))
{
/* Check for clear to end-of-line. */
- cep = &curscr->alines[wy]->line[win->maxx - 1];
+ cep = &win->alines[wy]->line[win->maxx - 1];
while (cep->ch == blank.ch && cep->attr == battr)
if (cep-- <= csp)
break;
- if (cep >= (curscr->alines[wy]->line + win->begx * __LDATASIZE))
- clsp = cep - curscr->alines[wy]->line -
- win->begx * __LDATASIZE;
- else
- clsp = 0;
+
+ mlsp = &win->alines[wy]->line[win->maxx - 1]
+ - win->alines[wy]->line
+ - win->begx * __LDATASIZE;
+
__CTRACE(__CTRACE_REFRESH,
- "makech: clsp = %zu, nlsp = %zu, strlen(ce) = %zu\n",
- clsp, nlsp, strlen(ce));
+ "makech: nlsp = %d, max = %zu, strlen(ce) = %zu\n",
+ nlsp, mlsp, strlen(ce));
__CTRACE(__CTRACE_REFRESH,
"makech: line = %p, cep = %p, begx = %u\n",
- curscr->alines[wy]->line, cep, win->begx);
+ win->alines[wy]->line, cep, win->begx);
/*
* work out how to clear the line. If:
@@ -1272,14 +1349,11 @@ makech(int wy)
* (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)))
- {
- if(wlp->line[wx].attr & win->screen->nca) {
+ if (((wy == win->maxy - 1) ||
+ ((mlsp - wx) > strlen(ce))) &&
+ ((__using_color && back_color_erase) ||
+ (! __using_color))) {
+ if (wlp->line[wx].attr & win->screen->nca) {
__unsetattr(0);
} else if (__using_color &&
((__do_color_init == 1) ||
@@ -1290,16 +1364,21 @@ makech(int wy)
}
tputs(ce, 0, __cputchar);
_cursesi_screen->lx = wx + win->begx;
- while (wx++ <= clsp) {
+ csp = &curscr->alines[wy]->line[wx + win->begx];
+ wx = wx + win->begx;
+ while (wx++ <= (curscr->maxx - 1)) {
csp->attr = blank.attr;
csp->ch = blank.ch;
+ csp->cflags = CA_BACKGROUND;
#ifdef HAVE_WCHAR
if (_cursesi_copy_nsp(blank.nsp, csp) == ERR)
return ERR;
csp->wcols = blank.wcols;
+ csp += blank.wcols;
+#else
+ csp++;
#endif /* HAVE_WCHAR */
assert(csp != &blank);
- csp++;
}
return OK;
}
@@ -1314,7 +1393,7 @@ makech(int wy)
chw = 1;
#endif /* HAVE_WCHAR */
owx = wx;
- if (wx + chw >= win->maxx &&
+ if (wx + chw >= (win->maxx) &&
wy == win->maxy - 1 && !_cursesi_screen->curwin)
{
if (win->flags & __ENDLINE)
@@ -1324,10 +1403,11 @@ makech(int wy)
if (win->flags & __SCROLLOK)
e = putch(nsp, csp, wy, wx);
- else
+ else {
e = putchbr(nsp, csp,
nsp == fsp ? NULL : nsp - 1,
wy, wx);
+ }
if (e == ERR)
return ERR;
}
@@ -1344,22 +1424,17 @@ makech(int wy)
if (wx + chw < win->maxx || wy < win->maxy - 1 ||
!(win->flags & __SCROLLWIN))
{
- tld = nsp;
- if (_cursesi_celleq(&blank, nsp))
- tld = ␣
-
- if (putch(tld, csp, wy, wx) == ERR)
+ if (putch(nsp, csp, wy, wx) == ERR)
return ERR;
- if (!_cursesi_screen->curwin) {
- assert(csp != &blank);
- csp++;
- }
} else {
putattr(nsp);
putattr_out(nsp);
}
wx += chw;
nsp += chw;
+ if (!_cursesi_screen->curwin)
+ csp += chw;
+
__CTRACE(__CTRACE_REFRESH,
"makech: 2: wx = %d, lx = %d\n",
wx, _cursesi_screen->lx);
@@ -1626,6 +1701,7 @@ done:
for (i = 0; i < BLANKSIZE; i++) {
buf[i].ch = curscr->bch;
buf[i].attr = 0;
+ buf[i].cflags = CA_BACKGROUND;
}
}
#else
@@ -1635,6 +1711,7 @@ done:
if (_cursesi_copy_nsp(curscr->bnsp, &buf[i]) == ERR)
return;
buf[i].attr = 0;
+ buf[i].cflags = CA_BACKGROUND;
buf[i].wcols = curscr->wcols;
}
}
Index: src/lib/libcurses/resize.c
diff -u src/lib/libcurses/resize.c:1.35 src/lib/libcurses/resize.c:1.36
--- src/lib/libcurses/resize.c:1.35 Tue Apr 26 22:40:32 2022
+++ src/lib/libcurses/resize.c Wed Oct 19 06:09:27 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: resize.c,v 1.35 2022/04/26 22:40:32 blymn Exp $ */
+/* $NetBSD: resize.c,v 1.36 2022/10/19 06:09:27 blymn Exp $ */
/*
* Copyright (c) 2001
@@ -33,7 +33,7 @@
#if 0
static char sccsid[] = "@(#)resize.c blymn 2001/08/26";
#else
-__RCSID("$NetBSD: resize.c,v 1.35 2022/04/26 22:40:32 blymn Exp $");
+__RCSID("$NetBSD: resize.c,v 1.36 2022/10/19 06:09:27 blymn Exp $");
#endif
#endif /* not lint */
@@ -350,6 +350,7 @@ __resizewin(WINDOW *win, int nlines, int
lp = win->alines[i];
for (sp = lp->line, j = 0; j < win->maxx; j++, sp++) {
sp->attr = 0;
+ sp->cflags = CA_BACKGROUND;
#ifndef HAVE_WCHAR
sp->ch = win->bch;
#else