user32: Send WM_IME_CHAR messages from DefWindowProc.
Signed-off-by: Akihiro Sagawa <sagawa.aki@gmail.com> Signed-off-by: Aric Stewart <aric@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
4f14f706a6
commit
4adfb1be29
|
@ -385,7 +385,7 @@ static LRESULT WINAPI test_ime_wnd_proc(HWND hWnd, UINT msg, WPARAM wParam, LPAR
|
||||||
|
|
||||||
ime_composition_test.catch_ime_char = FALSE;
|
ime_composition_test.catch_ime_char = FALSE;
|
||||||
SendMessageA(hwndIme, msg, wParam, lParam);
|
SendMessageA(hwndIme, msg, wParam, lParam);
|
||||||
todo_wine ok(!ime_composition_test.catch_ime_char, "WM_IME_CHAR is sent\n");
|
ok(!ime_composition_test.catch_ime_char, "WM_IME_CHAR is sent\n");
|
||||||
|
|
||||||
imc = ImmGetContext(hWnd);
|
imc = ImmGetContext(hWnd);
|
||||||
size = ImmGetCompositionStringW(imc, GCS_RESULTSTR,
|
size = ImmGetCompositionStringW(imc, GCS_RESULTSTR,
|
||||||
|
@ -513,12 +513,6 @@ static void test_ImmGetCompositionString(void)
|
||||||
|
|
||||||
SetFocus(hwndChild);
|
SetFocus(hwndChild);
|
||||||
|
|
||||||
/* FIXME: In wine, IME UI window is created in ImmSetOpenStatus().
|
|
||||||
So, we prepare it here to generate WM_IME_CHAR messages. */
|
|
||||||
imc = ImmGetContext(hwndChild);
|
|
||||||
ImmSetOpenStatus(imc, FALSE);
|
|
||||||
ImmReleaseContext(hwndChild, imc);
|
|
||||||
|
|
||||||
ime_composition_test.timer_id = MY_TIMER;
|
ime_composition_test.timer_id = MY_TIMER;
|
||||||
ime_composition_test.start = GetTickCount();
|
ime_composition_test.start = GetTickCount();
|
||||||
SetTimer(hwndChild, ime_composition_test.timer_id, 100, NULL);
|
SetTimer(hwndChild, ime_composition_test.timer_id, 100, NULL);
|
||||||
|
|
|
@ -854,8 +854,44 @@ LRESULT WINAPI DefWindowProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam
|
||||||
result = PostMessageA( hwnd, WM_KEYUP, wParam, lParam );
|
result = PostMessageA( hwnd, WM_KEYUP, wParam, lParam );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_IME_STARTCOMPOSITION:
|
|
||||||
case WM_IME_COMPOSITION:
|
case WM_IME_COMPOSITION:
|
||||||
|
if (lParam & GCS_RESULTSTR)
|
||||||
|
{
|
||||||
|
LONG size, i;
|
||||||
|
unsigned char lead = 0;
|
||||||
|
char *buf = NULL;
|
||||||
|
HIMC himc = ImmGetContext( hwnd );
|
||||||
|
|
||||||
|
if (himc)
|
||||||
|
{
|
||||||
|
if ((size = ImmGetCompositionStringA( himc, GCS_RESULTSTR, NULL, 0 )))
|
||||||
|
{
|
||||||
|
if (!(buf = HeapAlloc( GetProcessHeap(), 0, size ))) size = 0;
|
||||||
|
else size = ImmGetCompositionStringA( himc, GCS_RESULTSTR, buf, size );
|
||||||
|
}
|
||||||
|
ImmReleaseContext( hwnd, himc );
|
||||||
|
|
||||||
|
for (i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
unsigned char c = buf[i];
|
||||||
|
if (!lead)
|
||||||
|
{
|
||||||
|
if (IsDBCSLeadByte( c ))
|
||||||
|
lead = c;
|
||||||
|
else
|
||||||
|
SendMessageA( hwnd, WM_IME_CHAR, c, 1 );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SendMessageA( hwnd, WM_IME_CHAR, MAKEWORD(c, lead), 1 );
|
||||||
|
lead = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HeapFree( GetProcessHeap(), 0, buf );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* fall through */
|
||||||
|
case WM_IME_STARTCOMPOSITION:
|
||||||
case WM_IME_ENDCOMPOSITION:
|
case WM_IME_ENDCOMPOSITION:
|
||||||
case WM_IME_SELECT:
|
case WM_IME_SELECT:
|
||||||
case WM_IME_NOTIFY:
|
case WM_IME_NOTIFY:
|
||||||
|
@ -1006,8 +1042,29 @@ LRESULT WINAPI DefWindowProcW(
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_IME_STARTCOMPOSITION:
|
|
||||||
case WM_IME_COMPOSITION:
|
case WM_IME_COMPOSITION:
|
||||||
|
if (lParam & GCS_RESULTSTR)
|
||||||
|
{
|
||||||
|
LONG size, i;
|
||||||
|
WCHAR *buf = NULL;
|
||||||
|
HIMC himc = ImmGetContext( hwnd );
|
||||||
|
|
||||||
|
if (himc)
|
||||||
|
{
|
||||||
|
if ((size = ImmGetCompositionStringW( himc, GCS_RESULTSTR, NULL, 0 )))
|
||||||
|
{
|
||||||
|
if (!(buf = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) ))) size = 0;
|
||||||
|
else size = ImmGetCompositionStringW( himc, GCS_RESULTSTR, buf, size * sizeof(WCHAR) );
|
||||||
|
}
|
||||||
|
ImmReleaseContext( hwnd, himc );
|
||||||
|
|
||||||
|
for (i = 0; i < size / sizeof(WCHAR); i++)
|
||||||
|
SendMessageW( hwnd, WM_IME_CHAR, buf[i], 1 );
|
||||||
|
HeapFree( GetProcessHeap(), 0, buf );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* fall through */
|
||||||
|
case WM_IME_STARTCOMPOSITION:
|
||||||
case WM_IME_ENDCOMPOSITION:
|
case WM_IME_ENDCOMPOSITION:
|
||||||
case WM_IME_SELECT:
|
case WM_IME_SELECT:
|
||||||
case WM_IME_NOTIFY:
|
case WM_IME_NOTIFY:
|
||||||
|
|
|
@ -459,43 +459,6 @@ static void GenerateIMEMessage(HIMC hIMC, UINT msg, WPARAM wParam, LPARAM lParam
|
||||||
UnlockRealIMC(hIMC);
|
UnlockRealIMC(hIMC);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GenerateIMECHARMessages(HIMC hIMC, LPWSTR String, DWORD length)
|
|
||||||
{
|
|
||||||
LPINPUTCONTEXT lpIMC;
|
|
||||||
LPTRANSMSG lpTransMsg;
|
|
||||||
DWORD i;
|
|
||||||
|
|
||||||
if (length <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
lpIMC = LockRealIMC(hIMC);
|
|
||||||
if (lpIMC == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
lpIMC->hMsgBuf = ImmReSizeIMCC(lpIMC->hMsgBuf, (lpIMC->dwNumMsgBuf + length) * sizeof(TRANSMSG));
|
|
||||||
if (!lpIMC->hMsgBuf)
|
|
||||||
return;
|
|
||||||
|
|
||||||
lpTransMsg = ImmLockIMCC(lpIMC->hMsgBuf);
|
|
||||||
if (!lpTransMsg)
|
|
||||||
return;
|
|
||||||
|
|
||||||
lpTransMsg += lpIMC->dwNumMsgBuf;
|
|
||||||
for (i = 0; i < length; i++)
|
|
||||||
{
|
|
||||||
lpTransMsg->message = WM_IME_CHAR;
|
|
||||||
lpTransMsg->wParam = String[i];
|
|
||||||
lpTransMsg->lParam = 1;
|
|
||||||
lpTransMsg++;
|
|
||||||
}
|
|
||||||
|
|
||||||
ImmUnlockIMCC(lpIMC->hMsgBuf);
|
|
||||||
lpIMC->dwNumMsgBuf += length;
|
|
||||||
|
|
||||||
ImmGenerateMessage(RealIMC(hIMC));
|
|
||||||
UnlockRealIMC(hIMC);
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL GenerateMessageToTransKey(LPDWORD lpTransBuf, UINT *uNumTranMsgs,
|
static BOOL GenerateMessageToTransKey(LPDWORD lpTransBuf, UINT *uNumTranMsgs,
|
||||||
UINT msg, WPARAM wParam, LPARAM lParam)
|
UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
|
@ -1166,26 +1129,7 @@ static void PaintDefaultIMEWnd(HIMC hIMC, HWND hwnd)
|
||||||
static void DefaultIMEComposition(HIMC hIMC, HWND hwnd, LPARAM lParam)
|
static void DefaultIMEComposition(HIMC hIMC, HWND hwnd, LPARAM lParam)
|
||||||
{
|
{
|
||||||
TRACE("IME message WM_IME_COMPOSITION 0x%lx\n", lParam);
|
TRACE("IME message WM_IME_COMPOSITION 0x%lx\n", lParam);
|
||||||
if (lParam & GCS_RESULTSTR)
|
if (!(lParam & GCS_RESULTSTR))
|
||||||
{
|
|
||||||
LPCOMPOSITIONSTRING compstr;
|
|
||||||
LPBYTE compdata;
|
|
||||||
LPWSTR ResultStr;
|
|
||||||
LPINPUTCONTEXT lpIMC;
|
|
||||||
|
|
||||||
lpIMC = LockRealIMC(hIMC);
|
|
||||||
if (lpIMC == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
TRACE("Posting result as IME_CHAR\n");
|
|
||||||
compdata = ImmLockIMCC(lpIMC->hCompStr);
|
|
||||||
compstr = (LPCOMPOSITIONSTRING)compdata;
|
|
||||||
ResultStr = (LPWSTR)(compdata + compstr->dwResultStrOffset);
|
|
||||||
GenerateIMECHARMessages(hIMC, ResultStr, compstr->dwResultStrLen);
|
|
||||||
ImmUnlockIMCC(lpIMC->hCompStr);
|
|
||||||
UnlockRealIMC(hIMC);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
UpdateDataInDefaultIMEWindow(hIMC, hwnd, TRUE);
|
UpdateDataInDefaultIMEWindow(hIMC, hwnd, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -496,45 +496,6 @@ static void GenerateIMEMessage(HIMC hIMC, UINT msg, WPARAM wParam,
|
||||||
UnlockRealIMC(hIMC);
|
UnlockRealIMC(hIMC);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GenerateIMECHARMessages(HIMC hIMC, LPWSTR String, DWORD length)
|
|
||||||
{
|
|
||||||
LPINPUTCONTEXT lpIMC;
|
|
||||||
LPTRANSMSG lpTransMsg;
|
|
||||||
DWORD i;
|
|
||||||
|
|
||||||
if (length <= 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
lpIMC = LockRealIMC(hIMC);
|
|
||||||
if (lpIMC == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
lpIMC->hMsgBuf = ImmReSizeIMCC(lpIMC->hMsgBuf,
|
|
||||||
(lpIMC->dwNumMsgBuf + length) *
|
|
||||||
sizeof(TRANSMSG));
|
|
||||||
if (!lpIMC->hMsgBuf)
|
|
||||||
return;
|
|
||||||
|
|
||||||
lpTransMsg = ImmLockIMCC(lpIMC->hMsgBuf);
|
|
||||||
if (!lpTransMsg)
|
|
||||||
return;
|
|
||||||
|
|
||||||
lpTransMsg += lpIMC->dwNumMsgBuf;
|
|
||||||
for (i = 0; i < length; i++)
|
|
||||||
{
|
|
||||||
lpTransMsg->message = WM_IME_CHAR;
|
|
||||||
lpTransMsg->wParam = String[i];
|
|
||||||
lpTransMsg->lParam = 1;
|
|
||||||
lpTransMsg ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
ImmUnlockIMCC(lpIMC->hMsgBuf);
|
|
||||||
lpIMC->dwNumMsgBuf+=length;
|
|
||||||
|
|
||||||
ImmGenerateMessage(RealIMC(hIMC));
|
|
||||||
UnlockRealIMC(hIMC);
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL IME_RemoveFromSelected(HIMC hIMC)
|
static BOOL IME_RemoveFromSelected(HIMC hIMC)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -1256,26 +1217,7 @@ static void UpdateDefaultIMEWindow(HIMC hIMC, HWND hwnd)
|
||||||
static void DefaultIMEComposition(HIMC hIMC, HWND hwnd, LPARAM lParam)
|
static void DefaultIMEComposition(HIMC hIMC, HWND hwnd, LPARAM lParam)
|
||||||
{
|
{
|
||||||
TRACE("IME message WM_IME_COMPOSITION 0x%lx\n", lParam);
|
TRACE("IME message WM_IME_COMPOSITION 0x%lx\n", lParam);
|
||||||
if (lParam & GCS_RESULTSTR)
|
if (!(lParam & GCS_RESULTSTR))
|
||||||
{
|
|
||||||
LPCOMPOSITIONSTRING compstr;
|
|
||||||
LPBYTE compdata;
|
|
||||||
LPWSTR ResultStr;
|
|
||||||
LPINPUTCONTEXT lpIMC;
|
|
||||||
|
|
||||||
lpIMC = LockRealIMC(hIMC);
|
|
||||||
if (lpIMC == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
TRACE("Posting result as IME_CHAR\n");
|
|
||||||
compdata = ImmLockIMCC(lpIMC->hCompStr);
|
|
||||||
compstr = (LPCOMPOSITIONSTRING)compdata;
|
|
||||||
ResultStr = (LPWSTR)(compdata + compstr->dwResultStrOffset);
|
|
||||||
GenerateIMECHARMessages(hIMC, ResultStr, compstr->dwResultStrLen);
|
|
||||||
ImmUnlockIMCC(lpIMC->hCompStr);
|
|
||||||
UnlockRealIMC(hIMC);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
UpdateDefaultIMEWindow(hIMC, hwnd);
|
UpdateDefaultIMEWindow(hIMC, hwnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue