if ((modifiers & ~(XEMACS_MOD_CONTROL | XEMACS_MOD_META | XEMACS_MOD_SUPER
| XEMACS_MOD_HYPER | XEMACS_MOD_ALT | XEMACS_MOD_SHIFT))
!= 0)
- abort ();
+ ABORT ();
k = XKEYMAP (keymap);
Lisp_Object *prev;
if (UNBOUNDP (keys))
- abort ();
+ ABORT ();
for (prev = &new_keys, tail = new_keys;
;
&& EQ (XCAR (tem), Qautoload)
&& EQ (Fcar (Fcdr (Fcdr (Fcdr (Fcdr (tem))))), Qkeymap))
{
- struct gcpro gcpro1, gcpro2;
- GCPRO2 (tem, object);
+ /* do_autoload GCPROs both arguments */
do_autoload (tem, object);
- UNGCPRO;
}
else if (errorp)
object = wrong_type_argument (Qkeymapp, object);
else
{
new_keys = Qnil;
- abort ();
+ ABORT ();
}
if (EQ (keys, new_keys))
key.modifiers = modifiers;
if (NILP (cmd))
- abort ();
+ ABORT ();
cmd = get_keymap (cmd, 0, 1);
if (!KEYMAPP (cmd))
- abort ();
+ ABORT ();
vec = make_vector (XVECTOR_LENGTH (thisseq) + 1, Qnil);
len = XVECTOR_LENGTH (thisseq);
/* OK, the key is for real */
if (target_buffer)
{
- if (!firstonly) abort ();
+ if (!firstonly) ABORT ();
format_raw_keys (so_far, keys_count + 1, target_buffer);
return make_int (1);
}
struct key_data *new = xnew_array (struct key_data, size);
memcpy ((void *)new, (const void *)c->keys_so_far,
c->keys_so_far_total_size * sizeof (struct key_data));
+ xfree (c->keys_so_far);
+ c->keys_so_far = new;
}
else
XREALLOC_ARRAY (c->keys_so_far, struct key_data, size);
DEFVAR_LISP ("key-translation-map", &Vkey_translation_map /*
Keymap of key translations that can override keymaps.
-This keymap works like `function-key-map', but comes after that,
+
+This keymap works like `function-key-map', but is searched before it,
and applies even for keys that have ordinary bindings.
+
+The `read-key-sequence' function replaces any subsequence bound by
+`key-translation-map' with its binding. More precisely, when the active
+keymaps have no binding for the current key sequence but
+`key-translation-map' binds a suffix of the sequence to a vector or string,
+`read-key-sequence' replaces the matching suffix with its binding, and
+continues with the new sequence. See `key-binding' for details.
+
+The events that come from bindings in `key-translation-map' are not
+themselves looked up in `key-translation-map'.
+
+#### FIXME: stolen from `function-key-map'; need better example.
+#### I guess you could implement a Dvorak keyboard with this?
+For example, suppose `key-translation-map' binds `ESC O P' to [f1].
+Typing `ESC O P' to `read-key-sequence' would return
+\[#<keypress-event f1>]. Typing `C-x ESC O P' would return
+\[#<keypress-event control-X> #<keypress-event f1>]. If [f1]
+were a prefix key, typing `ESC O P x' would return
+\[#<keypress-event f1> #<keypress-event x>].
*/ );
Vkey_translation_map = Qnil;