# HG changeset patch # User Richard M. Stallman # Date 738737364 0 # Node ID 4a10e4c34b11b7ae3881a7a8ec7e5a524768893d # Parent 03e4cad684813c21bc19926cc1ff585b866bb909 (read_key_sequence): Read the first char specially before the main loop. diff -r 03e4cad68481 -r 4a10e4c34b11 src/keyboard.c --- a/src/keyboard.c Sun May 30 04:48:18 1993 +0000 +++ b/src/keyboard.c Sun May 30 04:49:24 1993 +0000 @@ -3597,19 +3597,25 @@ recognized a function key, to avoid searching for the function key's again in Vfunction_key_map. */ int fkey_start = 0, fkey_end = 0; - Lisp_Object fkey_map = Vfunction_key_map; + Lisp_Object fkey_map; /* If we receive a ``switch-frame'' event in the middle of a key sequence, we put it off for later. While we're reading, we keep the event here. */ - Lisp_Object delayed_switch_frame = Qnil; - + Lisp_Object delayed_switch_frame; + + Lisp_Object first_event; + + int junk; + + last_nonmenu_event = Qnil; + + delayed_switch_frame = Qnil; + fkey_map = Vfunction_key_map; /* If there is no function key map, turn off function key scanning. */ if (NILP (Fkeymapp (Vfunction_key_map))) fkey_start = fkey_end = bufsize + 1; - last_nonmenu_event = Qnil; - if (INTERACTIVE) { if (prompt) @@ -3626,6 +3632,11 @@ echo_start = echo_length (); keys_start = this_command_key_count; + /* Read the first char of the sequence specially, before setting + up any keymaps, in case a filter runs and switches buffers on us. */ + first_event = read_char (!prompt, 0, submaps, last_nonmenu_event, + &junk); + /* We jump here when the key sequence has been thoroughly changed, and we need to rescan it starting from the beginning. When we jump here, keybuf[0..mock_input] holds the sequence we should reread. */ @@ -3724,8 +3735,14 @@ { last_real_key_start = t; - key = read_char (!prompt, nmaps, submaps, last_nonmenu_event, - &used_mouse_menu); + if (! NILP (first_event)) + { + key = first_event; + first_event = Qnil; + } + else + key = read_char (!prompt, nmaps, submaps, last_nonmenu_event, + &used_mouse_menu); /* read_char returns -1 at the end of a macro. Emacs 18 handles this by returning immediately with a