From d65a13c594f6643ca5dc80163008429c8c080dda Mon Sep 17 00:00:00 2001 From: Karl Heuer Date: Mon, 21 Mar 1994 22:48:13 +0000 Subject: [PATCH] (Fcopy_keymap): Account for menus and equiv-key cache. --- src/keymap.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/keymap.c b/src/keymap.c index dec406d2303..1ee65809a74 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; -- 2.39.5