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
|
Amrit Prem
|
||||||
Paul Prescod
|
Paul Prescod
|
||||||
Donovan Preston
|
Donovan Preston
|
||||||
|
Eric Price
|
||||||
Paul Price
|
Paul Price
|
||||||
Iuliia Proskurnia
|
Iuliia Proskurnia
|
||||||
Dorian Pula
|
Dorian Pula
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue