changeset 3799:1c2303940681

* keyboard.c (read_key_sequence): If we add events to a key sequence that didn't come from the input stream (e.g. `mode-line' prefixing a mouse click, or an expansion from function-key-map), and end up with a sequence that runs off the end of the current maps, return the entire key sequence, not just the initial portion which was bound or unbound.
author Jim Blandy <jimb@redhat.com>
date Thu, 17 Jun 1993 04:59:35 +0000
parents 84536053a592
children 41923469aefa
files src/keyboard.c
diffstat 1 files changed, 15 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/keyboard.c	Thu Jun 17 04:59:01 1993 +0000
+++ b/src/keyboard.c	Thu Jun 17 04:59:35 1993 +0000
@@ -3816,13 +3816,8 @@
 		      if (t + 1 >= bufsize)
 			error ("key sequence too long");
 		      keybuf[t] = posn;
-		      mock_input = t + 1;
-
-		      /* Put the rest on unread_command_events - that
-			 way, if the symbol isn't bound to a prefix map,
-			 then we don't lose the actual mouse event.  */
-		      unread_command_events = 
-			Fcons (key, unread_command_events);
+		      keybuf[t+1] = key;
+		      mock_input = t + 2;
 
 		      /* If we switched buffers while reading the first event,
 			 replay in case we switched keymaps too.  */
@@ -4052,6 +4047,19 @@
  done:
   unread_switch_frame = delayed_switch_frame;
   unbind_to (count, Qnil);
+
+  /* Occasionally we fabricate events, perhaps by expanding something
+     according to function-key-map, or by adding a prefix symbol to a
+     mouse click in the scroll bar or modeline.  In this cases, return
+     the entire generated key sequence, even if we hit an unbound
+     prefix or a definition before the end.  This means that you will
+     be able to push back the event properly, and also means that
+     read-key-sequence will always return a logical unit.
+
+     Better ideas?  */
+  if (mock_input > t)
+    t = mock_input;
+
   return t;
 }