Issue #23735: Add SIGWINCH handler for Readline 6.3+ support, by Eric Price

This commit is contained in:
Martin Panter 2016-04-03 02:54:58 +00:00
parent acc03195b0
commit 5dbbf1abba
6 changed files with 87 additions and 0 deletions

View File

@ -1155,6 +1155,7 @@ Florian Preinstorfer
Amrit Prem Amrit Prem
Paul Prescod Paul Prescod
Donovan Preston Donovan Preston
Eric Price
Paul Price Paul Price
Iuliia Proskurnia Iuliia Proskurnia
Dorian Pula Dorian Pula

View File

@ -99,6 +99,9 @@ Core and Builtins
Library Library
------- -------
- Issue #23735: Handle terminal resizing with Readline 6.3+ by installing our
own SIGWINCH handler. Patch by Eric Price.
- Issue #26586: In http.server, respond with "413 Request header fields too - Issue #26586: In http.server, respond with "413 Request header fields too
large" if there are too many header fields to parse, rather than killing large" if there are too many header fields to parse, rather than killing
the connection and raising an unhandled exception. Patch by Xiang Zhang. the connection and raising an unhandled exception. Patch by Xiang Zhang.

View File

@ -928,6 +928,26 @@ on_completion_display_matches_hook(char **matches,
#endif #endif
#ifdef HAVE_RL_RESIZE_TERMINAL
static volatile sig_atomic_t sigwinch_received;
static sighandler_t sigwinch_ohandler;
static void
readline_sigwinch_handler(int signum)
{
sigwinch_received = 1;
if (sigwinch_ohandler &&
sigwinch_ohandler != SIG_IGN && sigwinch_ohandler != SIG_DFL)
sigwinch_ohandler(signum);
#ifndef HAVE_SIGACTION
/* If the handler was installed with signal() rather than sigaction(),
we need to reinstall it. */
PyOS_setsig(SIGWINCH, readline_sigwinch_handler);
#endif
}
#endif
/* C function to call the Python completer. */ /* C function to call the Python completer. */
static char * static char *
@ -1033,6 +1053,10 @@ setup_readline(readlinestate *mod_state)
/* Bind both ESC-TAB and ESC-ESC to the completion function */ /* Bind both ESC-TAB and ESC-ESC to the completion function */
rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\t', rl_complete, emacs_meta_keymap);
rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap); rl_bind_key_in_map ('\033', rl_complete, emacs_meta_keymap);
#ifdef HAVE_RL_RESIZE_TERMINAL
/* Set up signal handler for window resize */
sigwinch_ohandler = PyOS_setsig(SIGWINCH, readline_sigwinch_handler);
#endif
/* Set our hook functions */ /* Set our hook functions */
rl_startup_hook = on_startup_hook; rl_startup_hook = on_startup_hook;
#ifdef HAVE_RL_PRE_INPUT_HOOK #ifdef HAVE_RL_PRE_INPUT_HOOK
@ -1118,6 +1142,13 @@ readline_until_enter_or_signal(const char *prompt, int *signal)
struct timeval *timeoutp = NULL; struct timeval *timeoutp = NULL;
if (PyOS_InputHook) if (PyOS_InputHook)
timeoutp = &timeout; timeoutp = &timeout;
#ifdef HAVE_RL_RESIZE_TERMINAL
/* Update readline's view of the window size after SIGWINCH */
if (sigwinch_received) {
sigwinch_received = 0;
rl_resize_terminal();
}
#endif
FD_SET(fileno(rl_instream), &selectset); FD_SET(fileno(rl_instream), &selectset);
/* select resets selectset if no input was available */ /* select resets selectset if no input was available */
has_input = select(fileno(rl_instream) + 1, &selectset, has_input = select(fileno(rl_instream) + 1, &selectset,

44
configure vendored
View File

@ -14929,6 +14929,50 @@ $as_echo "#define HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK 1" >>confdefs.h
fi fi
# also in 4.0, but not in editline
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_resize_terminal in -lreadline" >&5
$as_echo_n "checking for rl_resize_terminal in -lreadline... " >&6; }
if ${ac_cv_lib_readline_rl_resize_terminal+:} false; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lreadline $READLINE_LIBS $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char rl_resize_terminal ();
int
main ()
{
return rl_resize_terminal ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_readline_rl_resize_terminal=yes
else
ac_cv_lib_readline_rl_resize_terminal=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_readline_rl_resize_terminal" >&5
$as_echo "$ac_cv_lib_readline_rl_resize_terminal" >&6; }
if test "x$ac_cv_lib_readline_rl_resize_terminal" = xyes; then :
$as_echo "#define HAVE_RL_RESIZE_TERMINAL 1" >>confdefs.h
fi
# check for readline 4.2 # check for readline 4.2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5
$as_echo_n "checking for rl_completion_matches in -lreadline... " >&6; } $as_echo_n "checking for rl_completion_matches in -lreadline... " >&6; }

View File

@ -4527,6 +4527,11 @@ AC_CHECK_LIB(readline, rl_completion_display_matches_hook,
AC_DEFINE(HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK, 1, AC_DEFINE(HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK, 1,
[Define if you have readline 4.0]), ,$READLINE_LIBS) [Define if you have readline 4.0]), ,$READLINE_LIBS)
# also in 4.0, but not in editline
AC_CHECK_LIB(readline, rl_resize_terminal,
AC_DEFINE(HAVE_RL_RESIZE_TERMINAL, 1,
[Define if you have readline 4.0]), ,$READLINE_LIBS)
# check for readline 4.2 # check for readline 4.2
AC_CHECK_LIB(readline, rl_completion_matches, AC_CHECK_LIB(readline, rl_completion_matches,
AC_DEFINE(HAVE_RL_COMPLETION_MATCHES, 1, AC_DEFINE(HAVE_RL_COMPLETION_MATCHES, 1,

View File

@ -735,6 +735,9 @@
/* Define if you have readline 4.0 */ /* Define if you have readline 4.0 */
#undef HAVE_RL_PRE_INPUT_HOOK #undef HAVE_RL_PRE_INPUT_HOOK
/* Define if you have readline 4.0 */
#undef HAVE_RL_RESIZE_TERMINAL
/* Define to 1 if you have the `round' function. */ /* Define to 1 if you have the `round' function. */
#undef HAVE_ROUND #undef HAVE_ROUND