diff src/ui.c @ 15665:31367ce5aac7 v8.1.0840

patch 8.1.0840: getchar(0) never returns a character in the terminal commit https://github.com/vim/vim/commit/12dfc9eef14fe74c46145aa9e6cba9666f1bcd40 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Jan 28 22:32:58 2019 +0100 patch 8.1.0840: getchar(0) never returns a character in the terminal Problem: getchar(0) never returns a character in the terminal. Solution: Call wait_func() at least once.
author Bram Moolenaar <Bram@vim.org>
date Mon, 28 Jan 2019 22:45:05 +0100
parents 2202ab00e9f9
children 7fad90423bd2
line wrap: on
line diff
--- a/src/ui.c
+++ b/src/ui.c
@@ -272,6 +272,7 @@ inchar_loop(
 {
     int		len;
     int		interrupted = FALSE;
+    int		did_call_wait_func = FALSE;
     int		did_start_blocking = FALSE;
     long	wait_time;
     long	elapsed_time = 0;
@@ -313,7 +314,11 @@ inchar_loop(
 	    elapsed_time = ELAPSED_FUNC(start_tv);
 #endif
 	    wait_time -= elapsed_time;
-	    if (wait_time <= 0)
+
+	    // If the waiting time is now zero or less, we timed out.  However,
+	    // loop at least once to check for characters and events.  Matters
+	    // when "wtime" is zero.
+	    if (wait_time <= 0 && did_call_wait_func)
 	    {
 		if (wtime >= 0)
 		    // no character available within "wtime"
@@ -374,6 +379,7 @@ inchar_loop(
 
 	// Wait for a character to be typed or another event, such as the winch
 	// signal or an event on the monitored file descriptors.
+	did_call_wait_func = TRUE;
 	if (wait_func(wait_time, &interrupted, FALSE))
 	{
 	    // If input was put directly in typeahead buffer bail out here.