mirror of https://github.com/python/cpython
Issue #23735: Add SIGWINCH handler for Readline 6.3+ support, by Eric Price
This commit is contained in:
parent
acc03195b0
commit
5dbbf1abba
|
@ -1155,6 +1155,7 @@ Florian Preinstorfer
|
|||
Amrit Prem
|
||||
Paul Prescod
|
||||
Donovan Preston
|
||||
Eric Price
|
||||
Paul Price
|
||||
Iuliia Proskurnia
|
||||
Dorian Pula
|
||||
|
|
|
@ -99,6 +99,9 @@ Core and Builtins
|
|||
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
|
||||
large" if there are too many header fields to parse, rather than killing
|
||||
the connection and raising an unhandled exception. Patch by Xiang Zhang.
|
||||
|
|
|
@ -928,6 +928,26 @@ on_completion_display_matches_hook(char **matches,
|
|||
|
||||
#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. */
|
||||
|
||||
static char *
|
||||
|
@ -1033,6 +1053,10 @@ setup_readline(readlinestate *mod_state)
|
|||
/* 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 ('\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 */
|
||||
rl_startup_hook = on_startup_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;
|
||||
if (PyOS_InputHook)
|
||||
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);
|
||||
/* select resets selectset if no input was available */
|
||||
has_input = select(fileno(rl_instream) + 1, &selectset,
|
||||
|
|
|
@ -14929,6 +14929,50 @@ $as_echo "#define HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK 1" >>confdefs.h
|
|||
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
|
||||
{ $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; }
|
||||
|
|
|
@ -4527,6 +4527,11 @@ AC_CHECK_LIB(readline, rl_completion_display_matches_hook,
|
|||
AC_DEFINE(HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK, 1,
|
||||
[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
|
||||
AC_CHECK_LIB(readline, rl_completion_matches,
|
||||
AC_DEFINE(HAVE_RL_COMPLETION_MATCHES, 1,
|
||||
|
|
|
@ -735,6 +735,9 @@
|
|||
/* Define if you have readline 4.0 */
|
||||
#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. */
|
||||
#undef HAVE_ROUND
|
||||
|
||||
|
|
Loading…
Reference in New Issue