aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-core/readline/readline-6.2/readline-only-enable-meta-key-for-a-single-call-read.patch
blob: ccfdb9f8c961aa660f586690b2984ee1f4c5eed2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
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 <mlichvar@redhat.com>

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
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