This is a backport of the ncurses 5.9 20120707 patch.
https://github.com/mirror/ncurses/commit/471bc007361fd4bc8d2fae060c7d5b09828ed541

Previously, getch() would return ERR if SIGWINCH was received but
the window didn't actually change size.  This can happen, for
example, when the xterm font is changed.

Fixes another canfield issue found by pjanzen@ where changing the
font causes canfield to exit due to getch() returning an error.

 - todd

Index: lib/libcurses/curs_getch.3
===================================================================
RCS file: /cvs/src/lib/libcurses/curs_getch.3,v
retrieving revision 1.4
diff -u -p -u -r1.4 curs_getch.3
--- lib/libcurses/curs_getch.3  13 Feb 2019 07:18:57 -0000      1.4
+++ lib/libcurses/curs_getch.3  21 Jan 2021 15:12:58 -0000
@@ -236,14 +236,14 @@ See \fBresizeterm\fR(3) for more details
 All routines return the integer \fBERR\fR upon failure and an integer value
 other than \fBERR\fR (\fBOK\fR in the case of ungetch()) upon successful
 completion.
-.RS
+.RS 3
 .TP 5
 \fBungetch\fP
-returns an error
+returns ERR
 if there is no more room in the FIFO.
-.TP 5
+.TP
 \fBwgetch\fP
-returns an error
+returns ERR
 if the window pointer is null, or
 if its timeout expires without having any data.
 .RE
Index: lib/libcurses/curses.priv.h
===================================================================
RCS file: /cvs/src/lib/libcurses/curses.priv.h,v
retrieving revision 1.34
diff -u -p -u -r1.34 curses.priv.h
--- lib/libcurses/curses.priv.h 6 Sep 2010 17:26:17 -0000       1.34
+++ lib/libcurses/curses.priv.h 21 Jan 2021 15:34:57 -0000
@@ -895,6 +895,7 @@ struct screen {
         */
 #if USE_SIZECHANGE
        int             (*_resize)(int,int);
+       int             (*_ungetch)(SCREEN *, int);
 #endif
 
        /*
Index: lib/libcurses/resizeterm.3
===================================================================
RCS file: /cvs/src/lib/libcurses/resizeterm.3,v
retrieving revision 1.5
diff -u -p -u -r1.5 resizeterm.3
--- lib/libcurses/resizeterm.3  12 Jan 2010 23:21:59 -0000      1.5
+++ lib/libcurses/resizeterm.3  21 Jan 2021 15:13:09 -0000
@@ -88,8 +88,6 @@ this overrides the library's use of the 
 the operating system.
 Thus, even if a SIGWINCH is received,
 no screen size change may be recorded.
-In that case, no \fBKEY_RESIZE\fP is queued for the next call to \fBgetch\fP;
-an \fBERR\fP will be returned instead.
 .SH SEE ALSO
 \fBwresize\fR(3).
 .SH AUTHOR
Index: lib/libcurses/base/lib_set_term.c
===================================================================
RCS file: /cvs/src/lib/libcurses/base/lib_set_term.c,v
retrieving revision 1.13
diff -u -p -u -r1.13 lib_set_term.c
--- lib/libcurses/base/lib_set_term.c   12 Jan 2010 23:22:06 -0000      1.13
+++ lib/libcurses/base/lib_set_term.c   21 Jan 2021 15:39:59 -0000
@@ -549,6 +549,7 @@ _nc_setupscreen(int slines GCC_UNUSED,
 #endif
 #if USE_SIZECHANGE
     SP->_resize = resizeterm;
+    SP->_ungetch = _nc_ungetch;
 #endif
 
     newscr->_clear = TRUE;
Index: lib/libcurses/base/resizeterm.c
===================================================================
RCS file: /cvs/src/lib/libcurses/base/resizeterm.c,v
retrieving revision 1.3
diff -u -p -u -r1.3 resizeterm.c
--- lib/libcurses/base/resizeterm.c     12 Jan 2010 23:22:06 -0000      1.3
+++ lib/libcurses/base/resizeterm.c     21 Jan 2021 15:40:07 -0000
@@ -420,7 +420,6 @@ resizeterm(int ToLines, int ToCols)
            result = resize_term(ToLines, ToCols);
 
 #if USE_SIGWINCH
-           _nc_ungetch(SP, KEY_RESIZE);        /* so application can know this 
*/
            clearok(curscr, TRUE);      /* screen contents are unknown */
 
            /* ripped-off lines are a special case: if we did not lengthen
@@ -451,6 +450,9 @@ resizeterm(int ToLines, int ToCols)
            }
 #endif
        }
+#if USE_SIGWINCH
+       _nc_ungetch(SP, KEY_RESIZE);    /* so application can know this */
+#endif
     }
 
     returnCode(result);
Index: lib/libcurses/tinfo/lib_setup.c
===================================================================
RCS file: /cvs/src/lib/libcurses/tinfo/lib_setup.c,v
retrieving revision 1.12
diff -u -p -u -r1.12 lib_setup.c
--- lib/libcurses/tinfo/lib_setup.c     12 Jan 2010 23:22:06 -0000      1.12
+++ lib/libcurses/tinfo/lib_setup.c     21 Jan 2021 15:39:10 -0000
@@ -321,8 +321,11 @@ _nc_update_screensize(SCREEN *sp)
      */
     if (sp != 0
        && sp->_resize != 0) {
-       if ((new_lines != old_lines) || (new_cols != old_cols))
+       if ((new_lines != old_lines) || (new_cols != old_cols)) {
            sp->_resize(new_lines, new_cols);
+       } else if (sp->_sig_winch && (sp->_ungetch != 0)) {
+           sp->_ungetch(SP, KEY_RESIZE);       /* so application can know this 
*/
+       }
        sp->_sig_winch = FALSE;
     }
 }

Reply via email to