aboutsummaryrefslogtreecommitdiffstats
path: root/src/keymap.c
diff options
context:
space:
mode:
authorKarl Heuer <[email protected]>1994-03-21 22:48:13 +0000
committerKarl Heuer <[email protected]>1994-03-21 22:48:13 +0000
commitd65a13c594f6643ca5dc80163008429c8c080dda (patch)
tree90e3cd104d0e6296a64743c6f3e176368b9c7bb7 /src/keymap.c
parent9c52bf473cf95c2a00fc551f511db09223d68b47 (diff)
(Fcopy_keymap): Account for menus and equiv-key cache.
Diffstat (limited to 'src/keymap.c')
-rw-r--r--src/keymap.c38
1 files changed, 34 insertions, 4 deletions
diff --git a/src/keymap.c b/src/keymap.c
index dec406d230..1ee65809a7 100644
--- a/src/keymap.c
+++ b/src/keymap.c
@@ -503,10 +503,40 @@ is not copied.")
XVECTOR (elt)->contents[i] =
Fcopy_keymap (XVECTOR (elt)->contents[i]);
}
- else if (CONSP (elt)
- && XTYPE (XCONS (elt)->cdr) != Lisp_Symbol
- && ! NILP (Fkeymapp (XCONS (elt)->cdr)))
- XCONS (elt)->cdr = Fcopy_keymap (XCONS (elt)->cdr);
+ else if (CONSP (elt))
+ {
+ /* Skip the optional menu string. */
+ if (CONSP (XCONS (elt)->cdr)
+ && STRINGP (XCONS (XCONS (elt)->cdr)->car))
+ {
+ Lisp_Object tem;
+
+ /* Copy the cell, since copy-alist didn't go this deep. */
+ XCONS (elt)->cdr = Fcons (XCONS (XCONS (elt)->cdr)->car,
+ XCONS (XCONS (elt)->cdr)->cdr);
+ elt = XCONS (elt)->cdr;
+
+ /* Also skip the optional menu help string. */
+ if (CONSP (XCONS (elt)->cdr)
+ && STRINGP (XCONS (XCONS (elt)->cdr)->car))
+ {
+ XCONS (elt)->cdr = Fcons (XCONS (XCONS (elt)->cdr)->car,
+ XCONS (XCONS (elt)->cdr)->cdr);
+ elt = XCONS (elt)->cdr;
+ }
+ /* There may also be a list that caches key equivalences.
+ Just delete it for the new keymap. */
+ if (CONSP (XCONS (elt)->cdr)
+ && CONSP (XCONS (XCONS (elt)->cdr)->car)
+ && (NILP (tem = XCONS (XCONS (XCONS (elt)->cdr)->car)->car)
+ || VECTORP (tem)))
+ XCONS (elt)->cdr = XCONS (XCONS (elt)->cdr)->cdr;
+ }
+ if (CONSP (elt)
+ && ! SYMBOLP (XCONS (elt)->cdr)
+ && ! NILP (Fkeymapp (XCONS (elt)->cdr)))
+ XCONS (elt)->cdr = Fcopy_keymap (XCONS (elt)->cdr);
+ }
}
return copy;