]> git.eshelyaron.com Git - emacs.git/commitdiff
(read_key_sequence): If we get a quit, and current buffer
authorRichard M. Stallman <rms@gnu.org>
Sat, 20 Nov 1993 04:14:34 +0000 (04:14 +0000)
committerRichard M. Stallman <rms@gnu.org>
Sat, 20 Nov 1993 04:14:34 +0000 (04:14 +0000)
has changed, replay it to get proper keymap.
(quit_throw_to_read_char): Switch frames to the frame the quit was in.

src/keyboard.c

index 7a0e2fa1f17b35ae4e3eb0b2bd3aabd3fa06718d..e79c64bfd552c5a2eb0adc290e65f0c913bd6131 100644 (file)
@@ -3790,6 +3790,8 @@ read_key_sequence (keybuf, bufsize, prompt)
   Lisp_Object first_event;
 #endif
 
+  struct buffer *starting_buffer;
+
   int junk;
 
   last_nonmenu_event = Qnil;
@@ -3838,6 +3840,8 @@ read_key_sequence (keybuf, bufsize, prompt)
      keybuf[0..mock_input] holds the sequence we should reread.  */
  replay_sequence:
 
+  starting_buffer = current_buffer;
+
   /* Build our list of keymaps.
      If we recognize a function key and replace its escape sequence in
      keybuf with its symbol, or if the sequence starts with a mouse
@@ -3867,9 +3871,7 @@ read_key_sequence (keybuf, bufsize, prompt)
     if (! NILP (submaps[first_binding]))
       break;
 
-  /* We jump here when a function key substitution has forced us to
-     reprocess the current key sequence.  keybuf[0..mock_input] is the
-     sequence we want to reread.  */
+  /* Start from the beginning in keybuf.  */
   t = 0;
 
   /* These are no-ops the first time through, but if we restart, they
@@ -3958,6 +3960,17 @@ read_key_sequence (keybuf, bufsize, prompt)
              goto done;
            }
          
+         /* If we have a quit that was typed in another frame, and
+            quit_throw_to_read_char switched buffers,
+            replay to get the right keymap.  */
+         if (EQ (key, quit_char) && current_buffer != starting_buffer)
+           {
+             keybuf[t++] = key;
+             mock_input = t;
+             Vquit_flag = Qnil;
+             goto replay_sequence;
+           }
+           
          Vquit_flag = Qnil;
        }
 
@@ -4994,6 +5007,8 @@ quit_throw_to_read_char ()
   if (poll_suppress_count == 0)
     abort ();
 #endif
+  if (XFRAME (internal_last_event_frame) != selected_frame)
+    Fhandle_switch_frame (make_lispy_switch_frame (internal_last_event_frame));
 
   _longjmp (getcjmp, 1);
 }