Module Name: src
Committed By: blymn
Date: Tue Jun 22 07:49:09 UTC 2021
Modified Files:
src/lib/libcurses: addbytes.c
Log Message:
Rework the fix for lib/56224.
Move the scroll check to _cursesi_addwchar
Perform the scroll check before updating the cursor location when
processing \n.
To generate a diff of this commit:
cvs rdiff -u -r1.56 -r1.57 src/lib/libcurses/addbytes.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/addbytes.c
diff -u src/lib/libcurses/addbytes.c:1.56 src/lib/libcurses/addbytes.c:1.57
--- src/lib/libcurses/addbytes.c:1.56 Tue Jun 15 22:18:55 2021
+++ src/lib/libcurses/addbytes.c Tue Jun 22 07:49:09 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: addbytes.c,v 1.56 2021/06/15 22:18:55 blymn Exp $ */
+/* $NetBSD: addbytes.c,v 1.57 2021/06/22 07:49:09 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.56 2021/06/15 22:18:55 blymn Exp $");
+__RCSID("$NetBSD: addbytes.c,v 1.57 2021/06/22 07:49:09 blymn Exp $");
#endif
#endif /* not lint */
@@ -171,14 +171,6 @@ _cursesi_waddbytes(WINDOW *win, const ch
break;
}
- /* if scrollok is false and we are at the bottom of
- * screen and this character would take us past the
- * end of the line then we are done.
- */
- if ((win->curx + wcwidth(wc) >= win->maxx) &&
- (!(win->flags & __SCROLLOK)) &&
- (win->cury == win->scr_b))
- break;
#ifdef DEBUG
__CTRACE(__CTRACE_INPUT,
"ADDBYTES WIDE(0x%x [%s], %x) at (%d, %d), ate %d bytes\n",
@@ -371,16 +363,17 @@ _cursesi_addwchar(WINDOW *win, __LINE **
*x = 0;
return OK;
case L'\n':
- wclrtoeol(win);
- *x = 0;
- (*lnp)->flags &= ~__ISPASTEOL;
if (*y == win->scr_b) {
if (!(win->flags & __SCROLLOK))
return ERR;
+ wclrtoeol(win);
scroll(win);
} else {
+ wclrtoeol(win);
(*y)++;
}
+ *x = 0;
+ (*lnp)->flags &= ~__ISPASTEOL;
return OK;
case L'\t':
cc.vals[0] = L' ';
@@ -395,7 +388,7 @@ _cursesi_addwchar(WINDOW *win, __LINE **
if ((*y == win->scr_b) &&
!(win->flags & __SCROLLOK)) {
if ((*lnp)->flags & __ISPASTEOL) {
- return OK;
+ return ERR;
}
if (*x + newx > win->maxx - 1)
@@ -489,6 +482,12 @@ _cursesi_addwchar(WINDOW *win, __LINE **
"_cursesi_addwchar: clear EOL (%d,%d)\n",
*y, *x);
#endif /* DEBUG */
+ if (*y == win->scr_b) {
+ if (!(win->flags & __SCROLLOK))
+ return ERR;
+ scroll(win);
+ }
+
(*lnp)->flags |= __ISDIRTY;
newx = *x + win->ch_off;
if (newx < *(*lnp)->firstchp)
@@ -505,11 +504,7 @@ _cursesi_addwchar(WINDOW *win, __LINE **
*(*lnp)->lastchp = newx;
__touchline(win, *y, sx, (int) win->maxx - 1);
sx = *x = 0;
- if (*y == win->scr_b) {
- if (!(win->flags & __SCROLLOK))
- return ERR;
- scroll(win);
- } else {
+ if (*y != win->scr_b) {
(*y)++;
}
lp = &win->alines[*y]->line[0];
@@ -588,16 +583,23 @@ _cursesi_addwchar(WINDOW *win, __LINE **
#ifdef DEBUG
__CTRACE(__CTRACE_INPUT, "_cursesi_addwchar: do line wrap\n");
#endif /* DEBUG */
+ if (*y == win->scr_b) {
+#ifdef DEBUG
+ __CTRACE(__CTRACE_INPUT, "_cursesi_addwchar: at bottom of screen\n");
+#endif /* DEBUG */
+ if (!(win->flags & __SCROLLOK))
+ return ERR;
+#ifdef DEBUG
+ __CTRACE(__CTRACE_INPUT, "_cursesi_addwchar: do a scroll\n");
+#endif /* DEBUG */
+ scroll(win);
+ }
newx = win->maxx - 1 + win->ch_off;
if (newx > *(*lnp)->lastchp)
*(*lnp)->lastchp = newx;
__touchline(win, *y, sx, (int) win->maxx - 1);
*x = sx = 0;
- if (*y == win->scr_b) {
- if (!(win->flags & __SCROLLOK))
- return ERR;
- scroll(win);
- } else {
+ if (*y != win->scr_b) {
(*y)++;
}
lp = &win->alines[*y]->line[0];