summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <bram@vim.org>2015-08-04 19:27:05 +0200
committerBram Moolenaar <bram@vim.org>2015-08-04 19:27:05 +0200
commit8f6036b759f215ed9b5a704513d337598e032318 (patch)
tree1fc1efac965a54145e5b6b36b572ef1e3039330d /src
parente9f38820641e2e6920aa133883aacbc76c7cc662 (diff)
downloadvim-8f6036b759f215ed9b5a704513d337598e032318.tar.gz
patch 7.4.808v7.4.808v7-4-808
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.c33
-rw-r--r--src/version.c2
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,