imm32: Use INPUTCONTEXT directly in ImmRequestMessage(W|A).

This commit is contained in:
Rémi Bernon 2023-04-30 13:36:07 +02:00 committed by Alexandre Julliard
parent c4187bc46b
commit a117b9b202
2 changed files with 53 additions and 17 deletions

View file

@ -2380,31 +2380,67 @@ BOOL WINAPI ImmReleaseContext(HWND hWnd, HIMC hIMC)
/***********************************************************************
* ImmRequestMessageA(IMM32.@)
*/
LRESULT WINAPI ImmRequestMessageA(HIMC hIMC, WPARAM wParam, LPARAM lParam)
LRESULT WINAPI ImmRequestMessageA( HIMC himc, WPARAM wparam, LPARAM lparam )
{
struct imc *data = get_imc_data( hIMC );
INPUTCONTEXT *ctx;
LRESULT res;
TRACE("%p %Id %Id\n", hIMC, wParam, wParam);
TRACE( "himc %p, wparam %#Ix, lparam %#Ix\n", himc, wparam, lparam );
if (data) return SendMessageA(data->IMC.hWnd, WM_IME_REQUEST, wParam, lParam);
if (NtUserQueryInputContext( himc, NtUserInputContextThreadId ) != GetCurrentThreadId()) return FALSE;
SetLastError(ERROR_INVALID_HANDLE);
return 0;
switch (wparam)
{
case IMR_CANDIDATEWINDOW:
case IMR_COMPOSITIONFONT:
case IMR_COMPOSITIONWINDOW:
case IMR_CONFIRMRECONVERTSTRING:
case IMR_DOCUMENTFEED:
case IMR_QUERYCHARPOSITION:
case IMR_RECONVERTSTRING:
break;
default:
return FALSE;
}
if (!(ctx = ImmLockIMC( himc ))) return FALSE;
res = SendMessageA( ctx->hWnd, WM_IME_REQUEST, wparam, lparam );
ImmUnlockIMC( himc );
return res;
}
/***********************************************************************
* ImmRequestMessageW(IMM32.@)
*/
LRESULT WINAPI ImmRequestMessageW(HIMC hIMC, WPARAM wParam, LPARAM lParam)
LRESULT WINAPI ImmRequestMessageW( HIMC himc, WPARAM wparam, LPARAM lparam )
{
struct imc *data = get_imc_data( hIMC );
INPUTCONTEXT *ctx;
LRESULT res;
TRACE("%p %Id %Id\n", hIMC, wParam, wParam);
TRACE( "himc %p, wparam %#Ix, lparam %#Ix\n", himc, wparam, lparam );
if (data) return SendMessageW(data->IMC.hWnd, WM_IME_REQUEST, wParam, lParam);
if (NtUserQueryInputContext( himc, NtUserInputContextThreadId ) != GetCurrentThreadId()) return FALSE;
SetLastError(ERROR_INVALID_HANDLE);
return 0;
switch (wparam)
{
case IMR_CANDIDATEWINDOW:
case IMR_COMPOSITIONFONT:
case IMR_COMPOSITIONWINDOW:
case IMR_CONFIRMRECONVERTSTRING:
case IMR_DOCUMENTFEED:
case IMR_QUERYCHARPOSITION:
case IMR_RECONVERTSTRING:
break;
default:
return FALSE;
}
if (!(ctx = ImmLockIMC( himc ))) return FALSE;
res = SendMessageW( ctx->hWnd, WM_IME_REQUEST, wparam, lparam );
ImmUnlockIMC( himc );
return res;
}
/***********************************************************************

View file

@ -1582,7 +1582,7 @@ static void test_cross_thread_himc(void)
ok_ret( 0, ImmRequestMessageW( params.himc[1], IMR_COMPOSITIONFONT, (LPARAM)&fontW ) );
ok_ret( 0, ImmRequestMessageA( params.himc[1], IMR_COMPOSITIONFONT, (LPARAM)&fontA ) );
todo_wine ok_seq( empty_sequence );
ok_seq( empty_sequence );
/* ImmSetCompositionString(W|A) should fail with cross thread HIMC */
@ -1638,7 +1638,7 @@ static void test_cross_thread_himc(void)
ok_ret( 0, ImmRequestMessageW( params.himc[1], IMR_CONFIRMRECONVERTSTRING, (LPARAM)&reconv ) );
ok_ret( 0, ImmRequestMessageA( params.himc[1], IMR_CONFIRMRECONVERTSTRING, (LPARAM)&reconv ) );
todo_wine ok_seq( empty_sequence );
ok_seq( empty_sequence );
/* ImmSetCompositionWindow should fail with cross thread HIMC */
@ -1660,7 +1660,7 @@ static void test_cross_thread_himc(void)
ok_ret( 0, ImmRequestMessageW( params.himc[1], IMR_COMPOSITIONWINDOW, (LPARAM)&composition ) );
ok_ret( 0, ImmRequestMessageA( params.himc[1], IMR_COMPOSITIONWINDOW, (LPARAM)&composition ) );
todo_wine ok_seq( empty_sequence );
ok_seq( empty_sequence );
/* ImmSetCandidateWindow should fail with cross thread HIMC */
@ -1687,7 +1687,7 @@ static void test_cross_thread_himc(void)
ok_ret( 0, ImmRequestMessageW( params.himc[1], IMR_CANDIDATEWINDOW, (LPARAM)&candidate ) );
ok_ret( 0, ImmRequestMessageA( params.himc[1], IMR_CANDIDATEWINDOW, (LPARAM)&candidate ) );
todo_wine ok_seq( empty_sequence );
ok_seq( empty_sequence );
/* ImmSetStatusWindowPos should fail with cross thread HIMC */
@ -1709,7 +1709,7 @@ static void test_cross_thread_himc(void)
ok_ret( 0, ImmRequestMessageW( params.himc[1], IMR_QUERYCHARPOSITION, (LPARAM)&char_pos ) );
ok_ret( 0, ImmRequestMessageA( params.himc[1], IMR_QUERYCHARPOSITION, (LPARAM)&char_pos ) );
todo_wine ok_seq( empty_sequence );
ok_seq( empty_sequence );
/* ImmGenerateMessage should fail with cross thread HIMC */