# HG changeset patch # User Stefan Monnier # Date 1264387923 18000 # Node ID ffa16c09e01d869edb5881920fe1acb3df5ddd0c # Parent 62f86ca36527c880663f888e71fd32411df4d2a7# Parent d026329addd987344d6ed2e0b1e84e6427fd772c Try and fix bug#788, hopefully for real this time. diff -r 62f86ca36527 -r ffa16c09e01d .bzrignore --- a/.bzrignore Sun Jan 24 18:03:13 2010 -0500 +++ b/.bzrignore Sun Jan 24 21:52:03 2010 -0500 @@ -61,3 +61,4 @@ src/stamp-oldxmenu src/temacs src/deps +configure.lineno diff -r 62f86ca36527 -r ffa16c09e01d src/ChangeLog --- a/src/ChangeLog Sun Jan 24 18:03:13 2010 -0500 +++ b/src/ChangeLog Sun Jan 24 21:52:03 2010 -0500 @@ -1,3 +1,12 @@ +2010-01-24 Stefan Monnier + + Try and fix bug#788, hopefully for real this time. + * keymap.c (shadow_lookup): Add `remap' arg. + (describe_map, describe_vector): Update calls to shadow_lookup. + (Fwhere_is_internal): Fix up handling of `remapped_sequences' and + `remapped' so this flag is applicable to `sequence'. Be careful to + perform remapping during shadow_lookup check of remapped_sequences. + 2010-01-24 Eric BĂ©langer (tiny change) * image.c (png_load): Use png_sig_cmp instead of the obsolete diff -r 62f86ca36527 -r ffa16c09e01d src/keymap.c --- a/src/keymap.c Sun Jan 24 18:03:13 2010 -0500 +++ b/src/keymap.c Sun Jan 24 21:52:03 2010 -0500 @@ -2650,11 +2650,13 @@ Lisp_Object args, void *data)); /* Like Flookup_key, but uses a list of keymaps SHADOW instead of a single map. - Returns the first non-nil binding found in any of those maps. */ + Returns the first non-nil binding found in any of those maps. + If REMAP is true, pass the result of the lookup through command + remapping before returning it. */ static Lisp_Object -shadow_lookup (shadow, key, flag) - Lisp_Object shadow, key, flag; +shadow_lookup (Lisp_Object shadow, Lisp_Object key, Lisp_Object flag, + int remap) { Lisp_Object tail, value; @@ -2669,7 +2671,15 @@ return Qnil; } else if (!NILP (value)) - return value; + { + Lisp_Object remapping; + if (remap && SYMBOLP (value) + && (remapping = Fcommand_remapping (value, Qnil, shadow), + !NILP (remapping))) + return remapping; + else + return value; + } } return Qnil; } @@ -2860,30 +2870,30 @@ { /* We have a list of advertized bindings. */ while (CONSP (tem)) - if (EQ (shadow_lookup (keymaps, XCAR (tem), Qnil), definition)) + if (EQ (shadow_lookup (keymaps, XCAR (tem), Qnil, 0), definition)) return XCAR (tem); else tem = XCDR (tem); - if (EQ (shadow_lookup (keymaps, tem, Qnil), definition)) + if (EQ (shadow_lookup (keymaps, tem, Qnil, 0), definition)) return tem; } sequences = Freverse (where_is_internal (definition, keymaps, !NILP (noindirect), nomenus)); - while (CONSP (sequences)) + while (CONSP (sequences) + /* If we're at the end of the `sequences' list and we haven't + considered remapped sequences yet, copy them over and + process them. */ + || (!remapped && (sequences = remapped_sequences, + remapped = 1), + CONSP (sequences))) { Lisp_Object sequence, function; sequence = XCAR (sequences); sequences = XCDR (sequences); - if (NILP (sequences) && !remapped) - { - sequences = remapped_sequences; - remapped = 1; - } - /* Verify that this key binding is not shadowed by another binding for the same key, before we say it exists. @@ -2893,7 +2903,8 @@ Either nil or number as value from Flookup_key means undefined. */ - if (!EQ (shadow_lookup (keymaps, sequence, Qnil), definition)) + if (!EQ (shadow_lookup (keymaps, sequence, Qnil, remapped), + definition)) continue; /* If the current sequence is a command remapping with @@ -3506,7 +3517,7 @@ ASET (kludge, 0, event); if (!NILP (shadow)) { - tem = shadow_lookup (shadow, kludge, Qt); + tem = shadow_lookup (shadow, kludge, Qt, 0); if (!NILP (tem)) { /* If both bindings are keymaps, this key is a prefix key, @@ -3776,7 +3787,7 @@ { Lisp_Object tem; - tem = shadow_lookup (shadow, kludge, Qt); + tem = shadow_lookup (shadow, kludge, Qt, 0); if (!NILP (tem)) {