# HG changeset patch # User Richard M. Stallman # Date 753768874 0 # Node ID a928c879b7ea8f6a6ef1af8dc7a3a4cba1ec7ee7 # Parent b724b2f0fbc791dffef1cd55a7f521d8345d1bde (read_key_sequence): If we get a quit, and current buffer has changed, replay it to get proper keymap. (quit_throw_to_read_char): Switch frames to the frame the quit was in. diff -r b724b2f0fbc7 -r a928c879b7ea src/keyboard.c --- a/src/keyboard.c Sat Nov 20 04:05:45 1993 +0000 +++ b/src/keyboard.c Sat Nov 20 04:14:34 1993 +0000 @@ -3790,6 +3790,8 @@ Lisp_Object first_event; #endif + struct buffer *starting_buffer; + int junk; last_nonmenu_event = Qnil; @@ -3838,6 +3840,8 @@ 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 @@ 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 @@ 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 @@ 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); }