aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard M. Stallman <[email protected]>1994-10-11 09:22:44 +0000
committerRichard M. Stallman <[email protected]>1994-10-11 09:22:44 +0000
commit00a78037a87c5c5a6c25a3a1509d9361524d829f (patch)
treee7372038b297bee1dc3a1479ed876bf20afc240d /src
parent2df1ee235231d56a60be2c2989969c08f58e8bc5 (diff)
(read_key_sequence): The output of function-key-map
goes to key-translation-map, but not vice versa. Don't exit if either of them is a possibility.
Diffstat (limited to 'src')
-rw-r--r--src/keyboard.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/src/keyboard.c b/src/keyboard.c
index 7ddb01741a..ddaf475238 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -4443,6 +4443,7 @@ read_key_sequence (keybuf, bufsize, prompt)
/* Nonzero if we seem to have got the beginning of a binding
in function_key_map. */
int function_key_possible = 0;
+ int key_translation_possible = 0;
int junk;
@@ -4494,6 +4495,7 @@ read_key_sequence (keybuf, bufsize, prompt)
starting_buffer = current_buffer;
function_key_possible = 0;
+ key_translation_possible = 0;
/* Build our list of keymaps.
If we recognize a function key and replace its escape sequence in
@@ -4555,10 +4557,7 @@ read_key_sequence (keybuf, bufsize, prompt)
&& fkey_start < t
/* mock input is never part of a function key's sequence. */
&& mock_input <= fkey_start)
- || (first_binding >= nmaps
- && keytran_start < t
- /* mock input is never part of a function key's sequence. */
- && mock_input <= keytran_start)
+ || (keytran_start < t && key_translation_possible)
/* Don't return in the middle of a possible function key sequence,
if the only bindings we found were via case conversion.
Thus, if ESC O a has a function-key-map translation
@@ -5014,6 +5013,10 @@ read_key_sequence (keybuf, bufsize, prompt)
fkey_start = fkey_end = t;
fkey_map = Vfunction_key_map;
+ /* Do pass the results through key-translation-map. */
+ keytran_start = keytran_end = 0;
+ keytran_map = Vkey_translation_map;
+
goto replay_sequence;
}
@@ -5078,6 +5081,8 @@ read_key_sequence (keybuf, bufsize, prompt)
error ("Function in key-translation-map returns invalid key sequence");
}
+ key_translation_possible = ! NILP (keytran_next);
+
/* If keybuf[keytran_start..keytran_end] is bound in the
key translation map and it's a suffix of the current
sequence (i.e. keytran_end == t), replace it with
@@ -5108,6 +5113,11 @@ read_key_sequence (keybuf, bufsize, prompt)
keytran_start = keytran_end = t;
keytran_map = Vkey_translation_map;
+ /* Don't pass the results of key-translation-map
+ through function-key-map. */
+ fkey_start = fkey_end = t;
+ fkey_map = Vkey_translation_map;
+
goto replay_sequence;
}
@@ -5119,6 +5129,7 @@ read_key_sequence (keybuf, bufsize, prompt)
{
keytran_end = ++keytran_start;
keytran_map = Vkey_translation_map;
+ key_translation_possible = 0;
}
}
}
@@ -5128,6 +5139,7 @@ read_key_sequence (keybuf, bufsize, prompt)
and is an upper case letter
use the corresponding lower-case letter instead. */
if (first_binding == nmaps && ! function_key_possible
+ && ! key_translation_possible
&& INTEGERP (key)
&& ((((XINT (key) & 0x3ffff)
< XSTRING (current_buffer->downcase_table)->size)