diff options
author | Karl Heuer <[email protected]> | 1994-03-21 22:48:13 +0000 |
---|---|---|
committer | Karl Heuer <[email protected]> | 1994-03-21 22:48:13 +0000 |
commit | d65a13c594f6643ca5dc80163008429c8c080dda (patch) | |
tree | 90e3cd104d0e6296a64743c6f3e176368b9c7bb7 /src/keymap.c | |
parent | 9c52bf473cf95c2a00fc551f511db09223d68b47 (diff) |
(Fcopy_keymap): Account for menus and equiv-key cache.
Diffstat (limited to 'src/keymap.c')
-rw-r--r-- | src/keymap.c | 38 |
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; |