cpython: 9f237e81cd15 (original) (raw)
Mercurial > cpython
changeset 100842:9f237e81cd15 2.7
Issue #23735: Add SIGWINCH handler for Readline 6.3+ support, by Eric Price [#23735]
Martin Panter vadmium+py@gmail.com | |
---|---|
date | Sun, 03 Apr 2016 02:54:58 +0000 |
parents | 4cad272cec82 |
children | 596946c06a31 |
files | Misc/ACKS Misc/NEWS Modules/readline.c configure configure.ac pyconfig.h.in |
diffstat | 6 files changed, 87 insertions(+), 0 deletions(-)[+] [-] Misc/ACKS 1 Misc/NEWS 3 Modules/readline.c 31 configure 44 configure.ac 5 pyconfig.h.in 3 |
line wrap: on
line diff
--- a/Misc/ACKS +++ b/Misc/ACKS @@ -1099,6 +1099,7 @@ Florian Preinstorfer Amrit Prem Paul Prescod Donovan Preston +Eric Price Paul Price Iuliia Proskurnia Dorian Pula
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -65,6 +65,9 @@ Core and Builtins Library ------- +- Issue #23735: Handle terminal resizing with Readline 6.3+ by installing our
- Issue #26644: Raise ValueError rather than SystemError when a negative length is passed to SSLSocket.recv() or read().
--- a/Modules/readline.c +++ b/Modules/readline.c @@ -817,6 +817,26 @@ on_completion_display_matches_hook(char } +#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)[](#l3.16)
sigwinch_ohandler(signum);[](#l3.17)
- /* 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 @@ -918,6 +938,10 @@ setup_readline(void) / 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 @@ -1003,6 +1027,13 @@ readline_until_enter_or_signal(char *pro struct timeval *timeoutp = NULL; if (PyOS_InputHook) timeoutp = &timeout; +#ifdef HAVE_RL_RESIZE_TERMINAL
/* Update readline's view of the window size after SIGWINCH */[](#l3.46)
if (sigwinch_received) {[](#l3.47)
sigwinch_received = 0;[](#l3.48)
rl_resize_terminal();[](#l3.49)
}[](#l3.50)
+#endif FD_SET(fileno(rl_instream), &selectset); /* select resets selectset if no input was available */ has_input = select(fileno(rl_instream) + 1, &selectset,
--- a/configure +++ b/configure @@ -13925,6 +13925,50 @@ if test "x$ac_cv_lib_readline_rl_complet fi +# also in 4.0, but not in editline +{ asecho"as_echo "asecho"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 READLINELIBSREADLINE_LIBS READLINELIBSLIBS" +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 [](#l4.38)
- conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS +fi +{ asecho"as_echo "asecho"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
{ asecho"as_echo "asecho"as_me:${as_lineno-$LINENO}: checking for rl_completion_matches in -lreadline" >&5 $as_echo_n "checking for rl_completion_matches in -lreadline... " >&6; }
--- a/configure.ac +++ b/configure.ac @@ -4199,6 +4199,11 @@ AC_CHECK_LIB(readline, rl_completion_dis 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)[](#l5.10)
check for readline 4.2
AC_CHECK_LIB(readline, rl_completion_matches, AC_DEFINE(HAVE_RL_COMPLETION_MATCHES, 1,
--- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -580,6 +580,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