diff options
author | Bram Moolenaar <bram@vim.org> | 2015-08-04 19:27:05 +0200 |
---|---|---|
committer | Bram Moolenaar <bram@vim.org> | 2015-08-04 19:27:05 +0200 |
commit | 8f6036b759f215ed9b5a704513d337598e032318 (patch) | |
tree | 1fc1efac965a54145e5b6b36b572ef1e3039330d /src | |
parent | e9f38820641e2e6920aa133883aacbc76c7cc662 (diff) | |
download | vim-8f6036b759f215ed9b5a704513d337598e032318.tar.gz |
Problem: On MS-Windows 8 IME input doen't work correctly.
Solution: Read console input before calling MsgWaitForMultipleObjects().
(vim-jp, Nobuhiro Takasaki)
Diffstat (limited to 'src')
-rw-r--r-- | src/os_win32.c | 33 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 32 insertions, 3 deletions
diff --git a/src/os_win32.c b/src/os_win32.c index 1e1214b6..d782a9d6 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; } diff --git a/src/version.c b/src/version.c index 996355f1..86eda157 100644 --- a/src/version.c +++ b/src/version.c @@ -742,6 +742,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 808, +/**/ 807, /**/ 806, |