Mercurial > vim
changeset 6981:f77d1f32c357 v7.4.808
patch 7.4.808
Problem: On MS-Windows 8 IME input doen't work correctly.
Solution: Read console input before calling MsgWaitForMultipleObjects().
(vim-jp, Nobuhiro Takasaki)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Tue, 04 Aug 2015 19:27:05 +0200 |
parents | 823ecdaddf1d |
children | f89f15d4f6ed |
files | src/os_win32.c src/version.c |
diffstat | 2 files changed, 32 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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; }