X-Git-Url: http://git.chise.org/gitweb/?p=chise%2Fxemacs-chise.git.1;a=blobdiff_plain;f=src%2Fkeymap.c;h=cc18a847b9708afe27a6396805f0cc6d2a8730f9;hp=4aa26f761e963e9e37dd59428824c02440dafac2;hb=d8654f7c5ad0c04060008c6fbbd90add1f4537e3;hpb=40402600969429d5253e62c6314a3eebbb21f027 diff --git a/src/keymap.c b/src/keymap.c index 4aa26f7..cc18a84 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -1649,7 +1649,7 @@ define_key_alternate_name (struct key_data *key, returned_value->modifiers = 0; if (modifiers_sans_meta == XEMACS_MOD_CONTROL) { - if EQ (keysym, QKspace) + if (EQ (keysym, QKspace)) MACROLET (make_char ('@'), modifiers); else if (!CHARP (keysym)) return; @@ -2990,7 +2990,8 @@ faster. (function, keymap, sort_first)) { /* This function can GC */ - struct gcpro gcpro1, gcpro2; + struct gcpro gcpro1, gcpro2, gcpro3; + Lisp_Object table = Qnil; /* tolerate obviously transposed args */ if (!NILP (Fkeymapp (function))) @@ -2999,9 +3000,17 @@ faster. function = keymap; keymap = tmp; } - GCPRO2 (function, keymap); + + GCPRO3 (function, keymap, table); keymap = get_keymap (keymap, 1, 1); - map_keymap (XKEYMAP (keymap)->table, !NILP (sort_first), + + /* elisp_maphash does not allow mapping functions to modify the hash + table being mapped over. Since map-keymap explicitly allows a + mapping function to modify KEYMAP, we map over a copy of the hash + table instead. */ + table = Fcopy_hash_table (XKEYMAP (keymap)->table); + + map_keymap (table, !NILP (sort_first), map_keymap_mapper, LISP_TO_VOID (function)); UNGCPRO; return Qnil;