Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libcurses Rework the fix for lib/56224.



details:   https://anonhg.NetBSD.org/src/rev/20edce4df94d
branches:  trunk
changeset: 984127:20edce4df94d
user:      blymn <blymn%NetBSD.org@localhost>
date:      Tue Jun 22 07:49:09 2021 +0000

description:
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.

diffstat:

 lib/libcurses/addbytes.c |  50 ++++++++++++++++++++++++-----------------------
 1 files changed, 26 insertions(+), 24 deletions(-)

diffs (118 lines):

diff -r f23721219cdb -r 20edce4df94d lib/libcurses/addbytes.c
--- a/lib/libcurses/addbytes.c  Tue Jun 22 07:29:16 2021 +0000
+++ b/lib/libcurses/addbytes.c  Tue Jun 22 07:49:09 2021 +0000
@@ -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 @@
                        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 @@
                        *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 @@
                        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: 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 @@
                        *(*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 @@
 #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];



Home | Main Index | Thread Index | Old Index