This is a continuation of the patch "7.4.142" I have submitted. Using the console input handle, and monitors the key input buffer. At the time I did not notice it.
It was a small problem with Windows10. Input if a character string in the IME is not completed successfully. To end successfully, I created a patch. I can not be corrected at once, sorry. This patch cooperation of vim-jp. -------- Thanks, Nobuhiro Takasaki -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
diff --git a/src/os_win32.c b/src/os_win32.c index 1e1214b..d782a9d 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -259,6 +259,9 @@ read_console_input( int tail; int i; + if (nLength == -2) + return (s_dwMax > 0) ? TRUE : FALSE; + if (!win8_or_later) { if (nLength == -1) @@ -303,7 +306,7 @@ read_console_input( } *lpBuffer = s_irCache[s_dwIndex]; - if (nLength != -1 && ++s_dwIndex >= s_dwMax) + if (!(nLength == -1 || nLength == -2) && ++s_dwIndex >= s_dwMax) s_dwMax = 0; *lpEvents = 1; return TRUE; @@ -322,6 +325,30 @@ peek_console_input( return read_console_input(hInput, lpBuffer, -1, lpEvents); } + static DWORD +msg_wait_for_multiple_objects( + DWORD nCount, + LPHANDLE pHandles, + BOOL fWaitAll, + DWORD dwMilliseconds, + DWORD dwWakeMask) +{ + if (read_console_input(NULL, NULL, -2, NULL)) + return WAIT_OBJECT_0; + return MsgWaitForMultipleObjects(nCount, pHandles, fWaitAll, + dwMilliseconds, dwWakeMask); +} + + static DWORD +wait_for_single_object( + HANDLE hHandle, + DWORD dwMilliseconds) +{ + if (read_console_input(NULL, NULL, -2, NULL)) + return WAIT_OBJECT_0; + return WaitForSingleObject(hHandle, dwMilliseconds); +} + static void get_exe_name(void) { @@ -1459,10 +1486,10 @@ WaitForChar(long msec) #ifdef FEAT_CLIENTSERVER /* Wait for either an event on the console input or a message in * the client-server window. */ - if (MsgWaitForMultipleObjects(1, &g_hConIn, FALSE, + if (msg_wait_for_multiple_objects(1, &g_hConIn, FALSE, dwWaitTime, QS_SENDMESSAGE) != WAIT_OBJECT_0) #else - if (WaitForSingleObject(g_hConIn, dwWaitTime) != WAIT_OBJECT_0) + if (wait_for_single_object(g_hConIn, dwWaitTime) != WAIT_OBJECT_0) #endif continue; }