diff options
author | Martin Panter <vadmium+py@gmail.com> | 2016-04-03 02:54:58 (GMT) |
---|---|---|
committer | Martin Panter <vadmium+py@gmail.com> | 2016-04-03 02:54:58 (GMT) |
commit | a70c3239a728ca5c95bd78cd3edfe566e163dfe2 (patch) | |
tree | fea8676a5eec21056ae741559cefc5d582c51584 | |
parent | ce9f8e249205e4844e9ae45c635e9707b55644de (diff) | |
download | cpython-a70c3239a728ca5c95bd78cd3edfe566e163dfe2.zip cpython-a70c3239a728ca5c95bd78cd3edfe566e163dfe2.tar.gz cpython-a70c3239a728ca5c95bd78cd3edfe566e163dfe2.tar.bz2 |
Issue #23735: Add SIGWINCH handler for Readline 6.3+ support, by Eric Price
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/readline.c | 31 | ||||
-rwxr-xr-x | configure | 44 | ||||
-rw-r--r-- | configure.ac | 5 | ||||
-rw-r--r-- | pyconfig.h.in | 3 |
6 files changed, 87 insertions, 0 deletions
@@ -1099,6 +1099,7 @@ Florian Preinstorfer Amrit Prem Paul Prescod Donovan Preston +Eric Price Paul Price Iuliia Proskurnia Dorian Pula @@ -65,6 +65,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 #26644: Raise ValueError rather than SystemError when a negative length is passed to SSLSocket.recv() or read(). diff --git a/Modules/readline.c b/Modules/readline.c index 4aef879..50b138d 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -817,6 +817,26 @@ on_completion_display_matches_hook(char **matches, } +#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 * @@ -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 *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, @@ -13925,6 +13925,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; } diff --git a/configure.ac b/configure.ac index 864b1b9..3783b1e 100644 --- a/configure.ac +++ b/configure.ac @@ -4199,6 +4199,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, diff --git a/pyconfig.h.in b/pyconfig.h.in index 7f1b689..7a62abf 100644 --- 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 |