# HG changeset patch # User Richard M. Stallman # Date 1033146226 0 # Node ID e6806bc4402efbf30f1f74e24f3bf8df19f27eea # Parent 0fc00c55911ad4210066418295de8741c6dda9ba (STOP_POLLING, RESUME_POLLING): New macros. (read_char): Use them. Do all exits thru the end of the function. diff -r 0fc00c55911a -r e6806bc4402e src/keyboard.c --- a/src/keyboard.c Fri Sep 27 04:55:22 2002 +0000 +++ b/src/keyboard.c Fri Sep 27 17:03:46 2002 +0000 @@ -2144,6 +2144,14 @@ static jmp_buf wrong_kboard_jmpbuf; #endif +#define STOP_POLLING \ +do { if (! polling_stopped_here) stop_polling (); \ + polling_stopped_here = 1; } while (0) + +#define RESUME_POLLING \ +do { if (polling_stopped_here) start_polling (); \ + polling_stopped_here = 0; } while (0) + /* read a character from the keyboard; call the redisplay if needed */ /* commandflag 0 means do not do auto-saving, but do do redisplay. -1 means do not do redisplay, but do do autosaving. @@ -2183,6 +2191,7 @@ volatile int reread; struct gcpro gcpro1, gcpro2; EMACS_TIME last_idle_start; + int polling_stopped_here = 0; also_record = Qnil; @@ -2284,7 +2293,7 @@ || executing_macro_index >= XFASTINT (Flength (Vexecuting_macro))) { XSETINT (c, -1); - RETURN_UNGCPRO (c); + goto exit; } c = Faref (Vexecuting_macro, make_number (executing_macro_index)); @@ -2516,7 +2525,7 @@ /* Now that we have read an event, Emacs is not idle. */ timer_stop_idle (); - RETURN_UNGCPRO (c); + goto exit; } /* Maybe autosave and/or garbage collect due to idleness. */ @@ -2623,7 +2632,7 @@ wrong_kboard: - stop_polling (); + STOP_POLLING; /* Finally, we read from the main queue, and if that gives us something we can't use yet, we put it on the @@ -2692,7 +2701,7 @@ should the next event read be a help-echo. */ last_idle_start = timer_idleness_start_time; timer_stop_idle (); - start_polling (); + RESUME_POLLING; if (NILP (c)) { @@ -2709,7 +2718,7 @@ so don't show them to the user. Also, don't record a key if we already did. */ if (BUFFERP (c) || key_already_recorded) - RETURN_UNGCPRO (c); + goto exit; /* Process special events within read_char and loop around to read another event. */ @@ -2744,7 +2753,7 @@ { /* If kbd_buffer_get_event gave us an EOF, return that. */ if (XINT (c) == -1) - RETURN_UNGCPRO (c); + goto exit; if ((STRINGP (Vkeyboard_translate_table) && SCHARS (Vkeyboard_translate_table) > (unsigned) XFASTINT (c)) @@ -2986,6 +2995,8 @@ } } + exit: + RESUME_POLLING; RETURN_UNGCPRO (c); }