readline: only enable meta key for a single call readline(). terminal.c - change _rl_enable_meta_key to set a flag indicating that it sent the enable-meta sequence - _rl_disable_meta_key: new function to turn off meta mode after we turned it on with _rl_enable_meta_key rlprivate.h - extern declaration for _rl_disable_meta_key readline.c - _rl_internal_teardown: add call to _rl_disable_meta_key to make the meta key active only for the duration of the call to readline() - _rl_internal_setup: move call to _rl_enable_meta_key here from readline_initialize_everything so the meta key is active only for the duration of the call to readline(). Suggestion from Miroslav Lichvar Signed-off-by: Hongxu Jia Upstream-Status: backport Imported patch from: http://git.savannah.gnu.org/cgit/bash.git/tag/?id=bash-4.3-alpha --- readline.c | 12 ++++++++---- rlprivate.h | 1 + terminal.c | 19 ++++++++++++++++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/readline.c b/readline.c --- a/readline.c +++ b/readline.c @@ -369,6 +369,11 @@ readline_internal_setup () _rl_in_stream = rl_instream; _rl_out_stream = rl_outstream; + /* Enable the meta key only for the duration of readline(), if this + terminal has one. */ + if (_rl_enable_meta) + _rl_enable_meta_key (); + if (rl_startup_hook) (*rl_startup_hook) (); @@ -437,6 +442,9 @@ readline_internal_teardown (eof) if (rl_undo_list) rl_free_undo_list (); + /* Disable the meta key, if this terminal has one. */ + _rl_disable_meta_key (); + /* Restore normal cursor, if available. */ _rl_set_insert_mode (RL_IM_INSERT, 0); @@ -1091,10 +1099,6 @@ readline_initialize_everything () /* Try to bind a common arrow key prefix, if not already bound. */ bind_arrow_keys (); - /* Enable the meta key, if this terminal has one. */ - if (_rl_enable_meta) - _rl_enable_meta_key (); - /* If the completion parser's default word break characters haven't been set yet, then do so now. */ if (rl_completer_word_break_characters == (char *)NULL) diff --git a/rlprivate.h b/rlprivate.h index 384ff67..be2c2c6 100644 --- a/rlprivate.h +++ b/rlprivate.h @@ -339,6 +339,7 @@ extern int _rl_output_character_function PARAMS((int)); extern void _rl_output_some_chars PARAMS((const char *, int)); extern int _rl_backspace PARAMS((int)); extern void _rl_enable_meta_key PARAMS((void)); +extern void _rl_disable_meta_key PARAMS((void)); extern void _rl_control_keypad PARAMS((int)); extern void _rl_set_cursor PARAMS((int, int)); diff --git a/terminal.c b/terminal.c index f8c2f6e..21ee031 100644 --- a/terminal.c +++ b/terminal.c @@ -683,12 +683,29 @@ rl_ding () /* */ /* **************************************************************** */ +static int enabled_meta = 0; /* flag indicating we enabled meta mode */ + void _rl_enable_meta_key () { #if !defined (__DJGPP__) if (term_has_meta && _rl_term_mm) - tputs (_rl_term_mm, 1, _rl_output_character_function); + { + tputs (_rl_term_mm, 1, _rl_output_character_function); + enabled_meta = 1; + } +#endif +} + +void +_rl_disable_meta_key () +{ +#if !defined (__DJGPP__) + if (term_has_meta && _rl_term_mo && enabled_meta) + { + tputs (_rl_term_mo, 1, _rl_output_character_function); + enabled_meta = 0; + } #endif } -- 1.8.1.2