Module Name: src Committed By: martin Date: Thu Sep 27 15:12:15 UTC 2018
Modified Files: src/lib/libcurses [netbsd-8]: curses_private.h get_wch.c getch.c Log Message: Pull up following revision(s) (requested by roy in ticket #1042): lib/libcurses/getch.c: revision 1.68 lib/libcurses/getch.c: revision 1.69 lib/libcurses/get_wch.c: revision 1.17 lib/libcurses/get_wch.c: revision 1.18 lib/libcurses/curses_private.h: revision 1.63 curses: unify resize handling in getch Instead of testing each fgetc call for resize event, add the wrapper __fgetc_resize to simplify the logic. While here, ensure that get_wch uses the correct input stream which may or may not be stdin. curses: call resizeterm if getch issues KEY_RESIZE This fixes PR #53633. To generate a diff of this commit: cvs rdiff -u -r1.62 -r1.62.4.1 src/lib/libcurses/curses_private.h cvs rdiff -u -r1.14.4.1 -r1.14.4.2 src/lib/libcurses/get_wch.c cvs rdiff -u -r1.65.4.1 -r1.65.4.2 src/lib/libcurses/getch.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/curses_private.h diff -u src/lib/libcurses/curses_private.h:1.62 src/lib/libcurses/curses_private.h:1.62.4.1 --- src/lib/libcurses/curses_private.h:1.62 Tue Jan 31 09:17:53 2017 +++ src/lib/libcurses/curses_private.h Thu Sep 27 15:12:15 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: curses_private.h,v 1.62 2017/01/31 09:17:53 roy Exp $ */ +/* $NetBSD: curses_private.h,v 1.62.4.1 2018/09/27 15:12:15 martin Exp $ */ /*- * Copyright (c) 1998-2000 Brett Lymn @@ -365,6 +365,7 @@ void __cursesi_win_free_nsp(WINDOW *); void __cursesi_putnsp(nschar_t *, const int, const int); void __cursesi_chtype_to_cchar(chtype, cchar_t *); #endif /* HAVE_WCHAR */ +int __fgetc_resize(FILE *); int __unget(wint_t); int __mvcur(int, int, int, int, int); WINDOW *__newwin(SCREEN *, int, int, int, int, int); Index: src/lib/libcurses/get_wch.c diff -u src/lib/libcurses/get_wch.c:1.14.4.1 src/lib/libcurses/get_wch.c:1.14.4.2 --- src/lib/libcurses/get_wch.c:1.14.4.1 Thu Sep 27 14:59:28 2018 +++ src/lib/libcurses/get_wch.c Thu Sep 27 15:12:15 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: get_wch.c,v 1.14.4.1 2018/09/27 14:59:28 martin Exp $ */ +/* $NetBSD: get_wch.c,v 1.14.4.2 2018/09/27 15:12:15 martin Exp $ */ /* * Copyright (c) 2005 The NetBSD Foundation Inc. @@ -36,7 +36,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: get_wch.c,v 1.14.4.1 2018/09/27 14:59:28 martin Exp $"); +__RCSID("$NetBSD: get_wch.c,v 1.14.4.2 2018/09/27 15:12:15 martin Exp $"); #endif /* not lint */ #include <errno.h> @@ -56,6 +56,7 @@ extern short state; /* storage declared /* prototypes for private functions */ #ifdef HAVE_WCHAR static int inkey(wchar_t *wc, int to, int delay); +static wint_t __fgetwc_resize(FILE *infd, bool *resized); #endif /* HAVE_WCHAR */ #ifdef HAVE_WCHAR @@ -100,14 +101,10 @@ inkey(wchar_t *wc, int to, int delay) if (wstate == INKEY_NORM) { if (delay && __timeout(delay) == ERR) return ERR; - c = fgetc(infd); - if (c == WEOF) { + c = __fgetc_resize(infd); + if (c == ERR || c == KEY_RESIZE) { clearerr(infd); - if (errno == EINTR && _cursesi_screen->resized) { - _cursesi_screen->resized = 0; - return KEY_RESIZE; - } else - return ERR; + return c; } if (delay && (__notimeout() == ERR)) @@ -152,14 +149,10 @@ inkey(wchar_t *wc, int to, int delay) return ERR; } - c = fgetc(infd); + c = __fgetc_resize(infd); if (ferror(infd)) { clearerr(infd); - if (errno == EINTR && _cursesi_screen->resized) { - _cursesi_screen->resized = 0; - return KEY_RESIZE; - } else - return ERR; + return c; } if ((to || delay) && (__notimeout() == ERR)) @@ -206,10 +199,10 @@ inkey(wchar_t *wc, int to, int delay) return ERR; } - c = fgetc(infd); + c = __fgetc_resize(infd); if (ferror(infd)) { clearerr(infd); - return ERR; + return c; } if ((to || delay) && (__notimeout() == ERR)) @@ -538,6 +531,7 @@ wget_wch(WINDOW *win, wint_t *ch) #endif if (_cursesi_screen->resized) { _cursesi_screen->resized = 0; + resizeterm(LINES, COLS); *ch = KEY_RESIZE; return KEY_CODE_YES; } @@ -583,6 +577,8 @@ wget_wch(WINDOW *win, wint_t *ch) if ( ret == ERR ) return ERR; } else { + bool resized; + switch (win->delay) { case -1: break; @@ -596,17 +592,11 @@ wget_wch(WINDOW *win, wint_t *ch) break; } - c = getwchar(); - if (feof(infd)) { + c = __fgetwc_resize(infd, &resized); + if (c == WEOF) { clearerr(infd); __restore_termios(); - return ERR; /* we have timed out */ - } - - if (ferror(infd)) { - clearerr(infd); - if (errno == EINTR && _cursesi_screen->resized) { - _cursesi_screen->resized = 0; + if (resized) { *ch = KEY_RESIZE; return KEY_CODE_YES; } else @@ -674,3 +664,29 @@ unget_wch(const wchar_t c) { return __unget((wint_t)c); } + +#ifdef HAVE_WCHAR +/* + * __fgetwc_resize -- + * Any call to fgetwc(3) should use this function instead. + */ +static wint_t +__fgetwc_resize(FILE *infd, bool *resized) +{ + wint_t c; + + c = fgetwc(infd); + if (c != WEOF) + return c; + + if (!ferror(infd) || errno != EINTR || !_cursesi_screen->resized) + return ERR; +#ifdef DEBUG + __CTRACE(__CTRACE_INPUT, "__fgetwc_resize returning KEY_RESIZE\n"); +#endif + _cursesi_screen->resized = 0; + resizeterm(LINES, COLS); + *resized = true; + return c; +} +#endif Index: src/lib/libcurses/getch.c diff -u src/lib/libcurses/getch.c:1.65.4.1 src/lib/libcurses/getch.c:1.65.4.2 --- src/lib/libcurses/getch.c:1.65.4.1 Thu Sep 27 14:59:28 2018 +++ src/lib/libcurses/getch.c Thu Sep 27 15:12:15 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: getch.c,v 1.65.4.1 2018/09/27 14:59:28 martin Exp $ */ +/* $NetBSD: getch.c,v 1.65.4.2 2018/09/27 15:12:15 martin Exp $ */ /* * Copyright (c) 1981, 1993, 1994 @@ -34,7 +34,7 @@ #if 0 static char sccsid[] = "@(#)getch.c 8.2 (Berkeley) 5/4/94"; #else -__RCSID("$NetBSD: getch.c,v 1.65.4.1 2018/09/27 14:59:28 martin Exp $"); +__RCSID("$NetBSD: getch.c,v 1.65.4.2 2018/09/27 15:12:15 martin Exp $"); #endif #endif /* not lint */ @@ -560,14 +560,10 @@ reread: if (state == INKEY_NORM) { if (delay && __timeout(delay) == ERR) return ERR; - c = fgetc(infd); - if (c == EOF) { + c = __fgetc_resize(infd); + if (c == ERR || c == KEY_RESIZE) { clearerr(infd); - if (errno == EINTR && _cursesi_screen->resized) { - _cursesi_screen->resized = 0; - return KEY_RESIZE; - } else - return ERR; + return c; } if (delay && (__notimeout() == ERR)) @@ -606,14 +602,10 @@ reread: return ERR; } - c = fgetc(infd); + c = __fgetc_resize(infd); if (ferror(infd)) { clearerr(infd); - if (errno == EINTR && _cursesi_screen->resized) { - _cursesi_screen->resized = 0; - return KEY_RESIZE; - } else - return ERR; + return c; } if ((to || delay) && (__notimeout() == ERR)) @@ -833,6 +825,7 @@ wgetch(WINDOW *win) #endif if (_cursesi_screen->resized) { _cursesi_screen->resized = 0; + resizeterm(LINES, COLS); #ifdef DEBUG __CTRACE(__CTRACE_INPUT, "wgetch returning KEY_RESIZE\n"); #endif @@ -889,22 +882,11 @@ wgetch(WINDOW *win) break; } - c = fgetc(infd); - if (feof(infd)) { + inp = __fgetc_resize(infd); + if (inp == ERR || inp == KEY_RESIZE) { clearerr(infd); __restore_termios(); - return ERR; /* we have timed out */ - } - - if (ferror(infd)) { - clearerr(infd); - if (errno == EINTR && _cursesi_screen->resized) { - _cursesi_screen->resized = 0; - inp = KEY_RESIZE; - } else - inp = ERR; - } else { - inp = c; + return inp; } } #ifdef DEBUG @@ -1011,3 +993,27 @@ set_escdelay(int escdelay) ESCDELAY = escdelay; return OK; } + +/* + * __fgetc_resize -- + * Any call to fgetc(3) should use this function instead + * and test for the return value of KEY_RESIZE as well as ERR. + */ +int +__fgetc_resize(FILE *infd) +{ + int c; + + c = fgetc(infd); + if (c != EOF) + return c; + + if (!ferror(infd) || errno != EINTR || !_cursesi_screen->resized) + return ERR; +#ifdef DEBUG + __CTRACE(__CTRACE_INPUT, "__fgetc_resize returning KEY_RESIZE\n"); +#endif + _cursesi_screen->resized = 0; + resizeterm(LINES, COLS); + return KEY_RESIZE; +}