From: Rémi Bernon rbernon@codeweavers.com
--- dlls/imm32/imm.c | 2 +- dlls/imm32/tests/imm32.c | 1 - 2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index cc843ce4a8e..94de6c0f6d7 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -3099,7 +3099,7 @@ BOOL WINAPI ImmTranslateMessage( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpar if ((vkey = data->vkey) == VK_PROCESSKEY) return FALSE; data->vkey = VK_PROCESSKEY; GetKeyboardState( state ); - scan = lparam >> 0x10; + scan = (lparam >> 0x10) & 0xffff;
if (ime->info.fdwProperty & IME_PROP_KBD_CHAR_FIRST) { diff --git a/dlls/imm32/tests/imm32.c b/dlls/imm32/tests/imm32.c index 488afbd34a9..ea0154ef4f1 100644 --- a/dlls/imm32/tests/imm32.c +++ b/dlls/imm32/tests/imm32.c @@ -7041,7 +7041,6 @@ static void test_ImmTranslateMessage( BOOL kbd_char_first ) .hkl = expect_ime, .himc = default_himc, .func = IME_TO_ASCII_EX, /* FIXME what happened to kbd_char_first here!? */ .to_ascii_ex = {.vkey = 'Q', .vsc = 0xc010}, - .todo_value = TRUE, }, {0}, };
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/imm32/tests/imm32.c | 41 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+)
diff --git a/dlls/imm32/tests/imm32.c b/dlls/imm32/tests/imm32.c index ea0154ef4f1..cb2e687af05 100644 --- a/dlls/imm32/tests/imm32.c +++ b/dlls/imm32/tests/imm32.c @@ -7084,6 +7084,30 @@ static void test_ImmTranslateMessage( BOOL kbd_char_first ) }, {0}, }; + struct ime_call key_down_seq[] = + { + { + .hkl = expect_ime, .himc = 0/*himc*/, .func = IME_PROCESS_KEY, + .process_key = {.vkey = 'Q', .lparam = MAKELONG(1, 0x10)}, + }, + { + .hkl = expect_ime, .himc = 0/*himc*/, .func = IME_TO_ASCII_EX, + .to_ascii_ex = {.vkey = 'Q', .vsc = 0x10}, + }, + {0}, + }; + struct ime_call key_up_seq[] = + { + { + .hkl = expect_ime, .himc = 0/*himc*/, .func = IME_PROCESS_KEY, + .process_key = {.vkey = 'Q', .lparam = MAKELONG(1, 0xc010)}, + }, + { + .hkl = expect_ime, .himc = 0/*himc*/, .func = IME_TO_ASCII_EX, + .to_ascii_ex = {.vkey = 'Q', .vsc = 0xc010}, + }, + {0}, + }; struct ime_call post_messages[] = { {.hkl = expect_ime, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_STARTCOMPOSITION, .wparam = 1}}, @@ -7166,6 +7190,8 @@ static void test_ImmTranslateMessage( BOOL kbd_char_first ) for (i = 0; i < ARRAY_SIZE(to_ascii_ex_3); i++) to_ascii_ex_3[i].himc = himc; for (i = 0; i < ARRAY_SIZE(post_messages); i++) post_messages[i].himc = himc; for (i = 0; i < ARRAY_SIZE(sent_messages); i++) sent_messages[i].himc = himc; + for (i = 0; i < ARRAY_SIZE(key_down_seq); i++) key_down_seq[i].himc = himc; + for (i = 0; i < ARRAY_SIZE(key_up_seq); i++) key_up_seq[i].himc = himc; memset( ime_calls, 0, sizeof(ime_calls) ); ime_call_count = 0;
@@ -7206,6 +7232,21 @@ static void test_ImmTranslateMessage( BOOL kbd_char_first ) ok_ret( 1, ImmGenerateMessage( himc ) ); ok_seq( empty_sequence );
+ + if (!kbd_char_first) /* kbd_char_first has an additional IME_NOTIFY message */ + { + keybd_event( 'Q', 0x10, 0, 0 ); + flush_events(); + process_messages_( hwnd ); + ok_seq( key_down_seq ); + + keybd_event( 'Q', 0x10, KEYEVENTF_KEYUP, 0 ); + flush_events(); + process_messages_( hwnd ); + todo_wine ok_seq( key_up_seq ); + } + + ok_ret( 1, ImmUnlockIMC( himc ) ); ok_ret( 1, ImmDestroyContext( himc ) );
From: Rémi Bernon rbernon@codeweavers.com
And to ImmTranslateMessage if they have been processed. --- dlls/imm32/tests/imm32.c | 2 +- dlls/win32u/message.c | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/dlls/imm32/tests/imm32.c b/dlls/imm32/tests/imm32.c index cb2e687af05..d9a74740c68 100644 --- a/dlls/imm32/tests/imm32.c +++ b/dlls/imm32/tests/imm32.c @@ -7243,7 +7243,7 @@ static void test_ImmTranslateMessage( BOOL kbd_char_first ) keybd_event( 'Q', 0x10, KEYEVENTF_KEYUP, 0 ); flush_events(); process_messages_( hwnd ); - todo_wine ok_seq( key_up_seq ); + ok_seq( key_up_seq ); }
diff --git a/dlls/win32u/message.c b/dlls/win32u/message.c index 2b6df6cc72c..0c33b713f72 100644 --- a/dlls/win32u/message.c +++ b/dlls/win32u/message.c @@ -2397,7 +2397,7 @@ static BOOL process_keyboard_message( MSG *msg, UINT hw_id, HWND hwnd_filter, } msg->pt = point_phys_to_win_dpi( msg->hwnd, msg->pt );
- if (remove && msg->message == WM_KEYDOWN) + if (remove && (msg->message == WM_KEYDOWN || msg->message == WM_KEYUP)) if (ImmProcessKey( msg->hwnd, NtUserGetKeyboardLayout(0), msg->wParam, msg->lParam, 0 )) msg->wParam = VK_PROCESSKEY;
@@ -4401,7 +4401,9 @@ BOOL WINAPI NtUserTranslateMessage( const MSG *msg, UINT flags ) if (flags) FIXME( "unsupported flags %x\n", flags );
if (msg->message < WM_KEYFIRST || msg->message > WM_KEYLAST) return FALSE; - if (msg->message != WM_KEYDOWN && msg->message != WM_SYSKEYDOWN) return TRUE; + if (msg->message != WM_KEYDOWN && msg->message != WM_SYSKEYDOWN && + msg->message != WM_KEYUP && msg->message != WM_SYSKEYUP) + return TRUE;
TRACE_(key)( "Translating key %s (%04x), scancode %04x\n", debugstr_vkey_name( msg->wParam ), LOWORD(msg->wParam), HIWORD(msg->lParam) );
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/imm32/tests/imm32.c | 290 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 290 insertions(+)
diff --git a/dlls/imm32/tests/imm32.c b/dlls/imm32/tests/imm32.c index d9a74740c68..831374863d9 100644 --- a/dlls/imm32/tests/imm32.c +++ b/dlls/imm32/tests/imm32.c @@ -7403,6 +7403,77 @@ static void test_ga_na_da(void) {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_KEYDOWN, .wparam = 0xd, .lparam = 0x1c0001}}, {0}, }; + struct ime_call cancel_seq[] = + { + /* G */ + {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_STARTCOMPOSITION, .wparam = 0, .lparam = 0}}, + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\u3131", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0x3131, .lparam = GCS_COMPSTR|GCS_COMPATTR|CS_INSERTCHAR|CS_NOMOVECARET}, + }, + /* A */ + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\uac00", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0xac00, .lparam = GCS_COMPSTR|GCS_COMPATTR|CS_INSERTCHAR|CS_NOMOVECARET}, + }, + /* N */ + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\uac04", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0xac04, .lparam = GCS_COMPSTR|GCS_COMPATTR|CS_INSERTCHAR|CS_NOMOVECARET}, + }, + /* A */ + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\ub098", .result = L"\uac00", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0xac00, .lparam = GCS_RESULTSTR}, + }, + {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_CHAR, .wparam = 0xac00, .lparam = 0x1}}, + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\ub098", .result = L"\uac00", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0xb098, .lparam = GCS_COMPSTR|GCS_COMPATTR|CS_INSERTCHAR|CS_NOMOVECARET}, + }, + + /* CPS_CANCEL */ + {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_ENDCOMPOSITION, .wparam = 0, .lparam = 0}}, + {0}, + }; + struct ime_call closed_seq[] = + { + /* G */ + {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_STARTCOMPOSITION, .wparam = 0, .lparam = 0}}, + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\u3131", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0x3131, .lparam = GCS_COMPSTR|GCS_COMPATTR|CS_INSERTCHAR|CS_NOMOVECARET}, + }, + /* A */ + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\uac00", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0xac00, .lparam = GCS_COMPSTR|GCS_COMPATTR|CS_INSERTCHAR|CS_NOMOVECARET}, + }, + /* N */ + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\uac04", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0xac04, .lparam = GCS_COMPSTR|GCS_COMPATTR|CS_INSERTCHAR|CS_NOMOVECARET}, + }, + /* A */ + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\ub098", .result = L"\uac00", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0xac00, .lparam = GCS_RESULTSTR}, + }, + {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_CHAR, .wparam = 0xac00, .lparam = 0x1}}, + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\ub098", .result = L"\uac00", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0xb098, .lparam = GCS_COMPSTR|GCS_COMPATTR|CS_INSERTCHAR|CS_NOMOVECARET}, + }, + + /* CPS_COMPLETE */ + {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_ENDCOMPOSITION, .wparam = 0, .lparam = 0}}, + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"", .result = L"\ub098", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0xb098, .lparam = GCS_RESULTSTR}, + }, + {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_CHAR, .wparam = 0xb098, .lparam = 0x1}}, + {0}, + };
INPUTCONTEXT *ctx; HWND hwnd; @@ -7441,6 +7512,8 @@ static void test_ga_na_da(void) for (i = 0; i < ARRAY_SIZE(partial_d_seq); i++) partial_d_seq[i].himc = himc; for (i = 0; i < ARRAY_SIZE(partial_da_seq); i++) partial_da_seq[i].himc = himc; for (i = 0; i < ARRAY_SIZE(partial_return_seq); i++) partial_return_seq[i].himc = himc; + for (i = 0; i < ARRAY_SIZE(cancel_seq); i++) cancel_seq[i].himc = himc; + for (i = 0; i < ARRAY_SIZE(closed_seq); i++) closed_seq[i].himc = himc;
keybd_event( 'R', 0x13, 0, 0 ); flush_events(); @@ -7528,6 +7601,84 @@ static void test_ga_na_da(void) todo_wine ok_seq( partial_return_seq );
+ ignore_WM_IME_NOTIFY = TRUE; + + /* cancelling clears the composition string */ + + keybd_event( 'R', 0x13, 0, 0 ); + flush_events(); + keybd_event( 'R', 0x13, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'K', 0x25, 0, 0 ); + flush_events(); + keybd_event( 'K', 0x25, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'S', 0x1f, 0, 0 ); + flush_events(); + keybd_event( 'S', 0x1f, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'K', 0x25, 0, 0 ); + flush_events(); + keybd_event( 'K', 0x25, KEYEVENTF_KEYUP, 0 ); + + ok_ret( 1, ImmNotifyIME( himc, NI_COMPOSITIONSTR, CPS_CANCEL, 0 ) ); + + flush_events(); + todo_wine ok_seq( cancel_seq ); + + + /* CPS_COMPLETE and ImmSetOpenStatus( himc, FALSE ) do the same thing */ + + keybd_event( 'R', 0x13, 0, 0 ); + flush_events(); + keybd_event( 'R', 0x13, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'K', 0x25, 0, 0 ); + flush_events(); + keybd_event( 'K', 0x25, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'S', 0x1f, 0, 0 ); + flush_events(); + keybd_event( 'S', 0x1f, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'K', 0x25, 0, 0 ); + flush_events(); + keybd_event( 'K', 0x25, KEYEVENTF_KEYUP, 0 ); + + ok_ret( 1, ImmNotifyIME( himc, NI_COMPOSITIONSTR, CPS_COMPLETE, 0 ) ); + + flush_events(); + todo_wine ok_seq( closed_seq ); + + + keybd_event( 'R', 0x13, 0, 0 ); + flush_events(); + keybd_event( 'R', 0x13, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'K', 0x25, 0, 0 ); + flush_events(); + keybd_event( 'K', 0x25, KEYEVENTF_KEYUP, 0 ); + + /* does nothing, already open */ + ok_ret( 1, ImmSetOpenStatus( himc, TRUE ) ); + + keybd_event( 'S', 0x1f, 0, 0 ); + flush_events(); + keybd_event( 'S', 0x1f, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'K', 0x25, 0, 0 ); + flush_events(); + keybd_event( 'K', 0x25, KEYEVENTF_KEYUP, 0 ); + + ok_ret( 1, ImmSetOpenStatus( himc, FALSE ) ); + + flush_events(); + todo_wine ok_seq( closed_seq ); + + ignore_WM_IME_NOTIFY = FALSE; + + + ok_ret( 1, ImmSetConversionStatus( himc, 0, IME_SMODE_PHRASEPREDICT ) ); ok_ret( 1, ImmSetOpenStatus( himc, FALSE ) );
@@ -7606,6 +7757,61 @@ static void test_nihongo_no(void) {0}, };
+ struct ime_call cancel_seq[] = + { + {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_STARTCOMPOSITION, .wparam = 0, .lparam = 0}}, + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\uff4e", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0xff4e, .lparam = GCS_COMPSTR|GCS_COMPCLAUSE|GCS_COMPATTR|GCS_COMPREADSTR|GCS_DELTASTART|GCS_CURSORPOS}, + }, + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\u306b", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0x306b, .lparam = GCS_COMPSTR|GCS_COMPCLAUSE|GCS_COMPATTR|GCS_COMPREADSTR|GCS_DELTASTART|GCS_CURSORPOS}, + }, + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\u306b\uff48", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0x306b, .lparam = GCS_COMPSTR|GCS_COMPCLAUSE|GCS_COMPATTR|GCS_COMPREADSTR|GCS_DELTASTART|GCS_CURSORPOS}, + }, + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\u306b\u307b", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0x306b, .lparam = GCS_COMPSTR|GCS_COMPCLAUSE|GCS_COMPATTR|GCS_COMPREADSTR|GCS_DELTASTART|GCS_CURSORPOS}, + }, + + /* CPS_CANCEL */ + {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_ENDCOMPOSITION, .wparam = 0, .lparam = 0}}, + {0}, + }; + struct ime_call closed_seq[] = + { + {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_STARTCOMPOSITION, .wparam = 0, .lparam = 0}}, + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\uff4e", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0xff4e, .lparam = GCS_COMPSTR|GCS_COMPCLAUSE|GCS_COMPATTR|GCS_COMPREADSTR|GCS_DELTASTART|GCS_CURSORPOS}, + }, + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\u306b", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0x306b, .lparam = GCS_COMPSTR|GCS_COMPCLAUSE|GCS_COMPATTR|GCS_COMPREADSTR|GCS_DELTASTART|GCS_CURSORPOS}, + }, + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\u306b\uff48", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0x306b, .lparam = GCS_COMPSTR|GCS_COMPCLAUSE|GCS_COMPATTR|GCS_COMPREADSTR|GCS_DELTASTART|GCS_CURSORPOS}, + }, + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"\u306b\u307b", .result = L"", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0x306b, .lparam = GCS_COMPSTR|GCS_COMPCLAUSE|GCS_COMPATTR|GCS_COMPREADSTR|GCS_DELTASTART|GCS_CURSORPOS}, + }, + + /* CPS_COMPLETE */ + { + .hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .comp = L"", .result = L"\u306b\u307b", + .message = {.msg = WM_IME_COMPOSITION, .wparam = 0x306b, .lparam = GCS_RESULTSTR|GCS_RESULTCLAUSE|GCS_RESULTREADSTR|GCS_RESULTREADCLAUSE}, + }, + {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_CHAR, .wparam = 0x306b, .lparam = 1}}, + {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_CHAR, .wparam = 0x307b, .lparam = 1}}, + {.hkl = default_hkl, .himc = 0/*himc*/, .func = MSG_TEST_WIN, .message = {.msg = WM_IME_ENDCOMPOSITION, .wparam = 0, .lparam = 0}}, + {0}, + }; + INPUTCONTEXT *ctx; HWND hwnd; HIMC himc; @@ -7635,6 +7841,8 @@ static void test_nihongo_no(void) ime_call_count = 0;
for (i = 0; i < ARRAY_SIZE(complete_seq); i++) complete_seq[i].himc = himc; + for (i = 0; i < ARRAY_SIZE(cancel_seq); i++) cancel_seq[i].himc = himc; + for (i = 0; i < ARRAY_SIZE(closed_seq); i++) closed_seq[i].himc = himc; ignore_WM_IME_REQUEST = TRUE; ignore_WM_IME_NOTIFY = TRUE;
@@ -7700,6 +7908,88 @@ static void test_nihongo_no(void) ok_seq( empty_sequence );
+ /* changing the open status completes the composition string */ + + ignore_WM_IME_REQUEST = TRUE; + ignore_WM_IME_NOTIFY = TRUE; + + + /* cancelling clears the composition string */ + + keybd_event( 'N', 0x31, 0, 0 ); + flush_events(); + keybd_event( 'N', 0x31, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'I', 0x17, 0, 0 ); + flush_events(); + keybd_event( 'I', 0x17, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'H', 0x23, 0, 0 ); + flush_events(); + keybd_event( 'H', 0x23, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'O', 0x18, 0, 0 ); + flush_events(); + keybd_event( 'O', 0x18, KEYEVENTF_KEYUP, 0 ); + + ok_ret( 1, ImmNotifyIME( himc, NI_COMPOSITIONSTR, CPS_CANCEL, 0 ) ); + + flush_events(); + todo_wine ok_seq( cancel_seq ); + + + /* CPS_COMPLETE and ImmSetOpenStatus( himc, FALSE ) do the same thing */ + + keybd_event( 'N', 0x31, 0, 0 ); + flush_events(); + keybd_event( 'N', 0x31, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'I', 0x17, 0, 0 ); + flush_events(); + keybd_event( 'I', 0x17, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'H', 0x23, 0, 0 ); + flush_events(); + keybd_event( 'H', 0x23, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'O', 0x18, 0, 0 ); + flush_events(); + keybd_event( 'O', 0x18, KEYEVENTF_KEYUP, 0 ); + + ok_ret( 1, ImmNotifyIME( himc, NI_COMPOSITIONSTR, CPS_COMPLETE, 0 ) ); + + flush_events(); + todo_wine ok_seq( closed_seq ); + + + keybd_event( 'N', 0x31, 0, 0 ); + flush_events(); + keybd_event( 'N', 0x31, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'I', 0x17, 0, 0 ); + flush_events(); + keybd_event( 'I', 0x17, KEYEVENTF_KEYUP, 0 ); + + /* does nothing, already open */ + ok_ret( 1, ImmSetOpenStatus( himc, TRUE ) ); + + keybd_event( 'H', 0x23, 0, 0 ); + flush_events(); + keybd_event( 'H', 0x23, KEYEVENTF_KEYUP, 0 ); + + keybd_event( 'O', 0x18, 0, 0 ); + flush_events(); + keybd_event( 'O', 0x18, KEYEVENTF_KEYUP, 0 ); + + ok_ret( 1, ImmSetOpenStatus( himc, FALSE ) ); + + flush_events(); + todo_wine ok_seq( closed_seq ); + + ignore_WM_IME_REQUEST = FALSE; + ignore_WM_IME_NOTIFY = FALSE; + + ok_ret( 1, ImmSetConversionStatus( himc, 0, IME_SMODE_PHRASEPREDICT ) ); ok_ret( 1, ImmSetOpenStatus( himc, FALSE ) );
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/imm32/ime.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/dlls/imm32/ime.c b/dlls/imm32/ime.c index 60672b366ab..24270e89291 100644 --- a/dlls/imm32/ime.c +++ b/dlls/imm32/ime.c @@ -653,11 +653,7 @@ BOOL WINAPI NotifyIME( HIMC himc, DWORD action, DWORD index, DWORD value ) } break; case IMC_SETOPENSTATUS: - if (!ctx->fOpen) - { - input_context_set_comp_str( ctx, NULL, 0 ); - if ((msg = ime_set_composition_status( himc, FALSE ))) ime_send_message( himc, msg, 0, 0 ); - } + if (!ctx->fOpen) ImmNotifyIME( himc, NI_COMPOSITIONSTR, CPS_COMPLETE, 0 ); NtUserNotifyIMEStatus( ctx->hWnd, ctx->fOpen ); break; } @@ -691,12 +687,12 @@ BOOL WINAPI NotifyIME( HIMC himc, DWORD action, DWORD index, DWORD value ) if (flags) ime_send_message( himc, WM_IME_COMPOSITION, wchr, flags ); }
- ImmSetOpenStatus( himc, FALSE ); - break; + /* fallthrough */ } case CPS_CANCEL: input_context_set_comp_str( ctx, NULL, 0 ); - ImmSetOpenStatus( himc, FALSE ); + if ((msg = ime_set_composition_status( himc, FALSE ))) + ime_send_message( himc, msg, 0, 0 ); break; default: FIXME( "himc %p, action %#lx, index %#lx, value %#lx stub!\n", himc, action, index, value );
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=142149
Your paranoid android.
=== w11pro64 (32 bit report) ===
imm32: imm32.c:7206: Test failed: kbd_char_first: 1: got hkl E020047F, himc 000601BB, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x1, lparam 0, comp L"", result L"" imm32.c:7206: Test failed: kbd_char_first: 2 (missing): hkl E020047F, himc 000601BB, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x1, lparam 0, comp L"", result L"" imm32.c:7206: Test failed: kbd_char_first: 3 (missing): hkl E020047F, himc 000601BB, MSG_IME_UI msg WM_IME_ENDCOMPOSITION, wparam 0x1, lparam 0 imm32.c:7208: Test failed: kbd_char_first: 1: got hkl E020047F, himc 000601BB, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x2, lparam 0, comp L"", result L"" imm32.c:7208: Test failed: kbd_char_first: 2 (missing): hkl E020047F, himc 000601BB, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x2, lparam 0, comp L"", result L"" imm32.c:7208: Test failed: kbd_char_first: 3 (missing): hkl E020047F, himc 000601BB, MSG_IME_UI msg WM_IME_ENDCOMPOSITION, wparam 0x2, lparam 0 imm32.c:7219: Test failed: kbd_char_first: 1: got hkl E020047F, himc 000601BB, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x2, lparam 0, comp L"", result L"" imm32.c:7219: Test failed: kbd_char_first: 2 (missing): hkl E020047F, himc 000601BB, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x2, lparam 0, comp L"", result L"" imm32.c:7219: Test failed: kbd_char_first: 3 (missing): hkl E020047F, himc 000601BB, MSG_IME_UI msg WM_IME_ENDCOMPOSITION, wparam 0x2, lparam 0 imm32.c:7231: Test failed: kbd_char_first: 1: got hkl E020047F, himc 000601BB, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x1, lparam 0, comp L"", result L"" imm32.c:7231: Test failed: kbd_char_first: 2 (missing): hkl E020047F, himc 000601BB, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x1, lparam 0, comp L"", result L"" imm32.c:7231: Test failed: kbd_char_first: 3 (missing): hkl E020047F, himc 000601BB, MSG_IME_UI msg WM_IME_ENDCOMPOSITION, wparam 0x1, lparam 0 imm32.c:1326: Test failed: expected WM_IME_SETCONTEXT_ACTIVATE imm32.c:818: Test failed: unexpected call WM_IME_SETCONTEXT_ACTIVATE imm32.c:1405: Test failed: expected WM_IME_SETCONTEXT_ACTIVATE imm32.c:818: Test failed: unexpected call WM_IME_SETCONTEXT_ACTIVATE
=== w7pro64 (64 bit report) ===
imm32: imm32.c:7241: Test failed: default: 2 (spurious): got hkl FFFFFFFFE020047F, himc 0000000000020131, IME_NOTIFY action 0x15, index 0x4, value 0 imm32.c:7241: Test failed: default: 3 (spurious): got hkl FFFFFFFFE020047F, himc 00000000003000E7, IME_NOTIFY action 0x15, index 0x4, value 0 imm32.c:7241: Test failed: default: 4 (spurious): got hkl FFFFFFFFE020047F, himc 00000000003000E7, MSG_TEST_WIN msg WM_IME_NOTIFY, wparam 0x1, lparam 0, comp L"", result L"" imm32.c:7241: Test failed: default: 5 (spurious): got hkl FFFFFFFFE020047F, himc 00000000003000E7, MSG_IME_UI msg WM_IME_NOTIFY, wparam 0x1, lparam 0 imm32.c:7241: Test failed: default: 6 (spurious): got hkl FFFFFFFFE020047F, himc 00000000003000E7, MSG_IME_UI msg WM_IME_SELECT, wparam 0, lparam 0xffffffffe020047f imm32.c:7241: Test failed: default: 7 (spurious): got hkl 0000000004090409, himc 0000000000020131, IME_SELECT select 0 imm32.c:7241: Test failed: default: 8 (spurious): got hkl 0000000004090409, himc 00000000003000E7, MSG_TEST_WIN msg WM_IME_NOTIFY, wparam 0x6, lparam 0, comp L"", result L"" imm32.c:7241: Test failed: default: 9 (spurious): got hkl 0000000004090409, himc 00000000003000E7, MSG_TEST_WIN msg WM_IME_NOTIFY, wparam 0x7, lparam 0, comp L"", result L"" imm32.c:7241: Test failed: default: 10 (spurious): got hkl 0000000004090409, himc 00000000003000E7, MSG_TEST_WIN msg WM_IME_NOTIFY, wparam 0x6, lparam 0, comp L"", result L"" imm32.c:7241: Test failed: default: 11 (spurious): got hkl 0000000004090409, himc 00000000003000E7, MSG_TEST_WIN msg WM_IME_NOTIFY, wparam 0x7, lparam 0, comp L"", result L"" imm32.c:7241: Test failed: default: 12 (spurious): got hkl 0000000004090409, himc 00000000003000E7, IME_SELECT select 0 imm32.c:7241: Test failed: default: 13 (spurious): got hkl 0000000004090409, himc 00000000003000E7, MSG_TEST_WIN msg WM_IME_NOTIFY, wparam 0x2, lparam 0, comp L"", result L"" imm32.c:7241: Test failed: default: 14 (spurious): got hkl 0000000004090409, himc 00000000003000E7, MSG_TEST_WIN msg WM_IME_NOTIFY, wparam 0x8, lparam 0, comp L"", result L"" imm32.c:7241: Test failed: default: 15 (spurious): got hkl 0000000004090409, himc 00000000003000E7, MSG_TEST_WIN msg WM_IME_NOTIFY, wparam 0x6, lparam 0, comp L"", result L"" imm32.c:7241: Test failed: default: 16 (spurious): got hkl 0000000004090409, himc 00000000003000E7, MSG_TEST_WIN msg WM_IME_NOTIFY, wparam 0x7, lparam 0, comp L"", result L"" imm32.c:7246: Test failed: default: 0 (missing): hkl FFFFFFFFE020047F, himc 00000000003000E7, IME_PROCESS_KEY vkey 0x51, lparam 0xffffffffc0100001 imm32.c:7246: Test failed: default: 1 (missing): hkl FFFFFFFFE020047F, himc 00000000003000E7, IME_TO_ASCII_EX vkey 0x51, vsc 0xc010, flags 0
=== w10pro64_zh_CN (64 bit report) ===
imm32: imm32.c:4781: Test failed: got status 0x1 imm32.c:4782: Test failed: got ctx->fOpen 0x1
Report validation errors: imm32:imm32 has unaccounted for failure messages
=== w11pro64_amd (64 bit report) ===
imm32: imm32.c:7206: Test failed: kbd_char_first: 1: got hkl FFFFFFFFE020047F, himc 00000000000C0273, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x1, lparam 0, comp L"", result L"" imm32.c:7206: Test failed: kbd_char_first: 2 (missing): hkl FFFFFFFFE020047F, himc 00000000000C0273, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x1, lparam 0, comp L"", result L"" imm32.c:7206: Test failed: kbd_char_first: 3 (missing): hkl FFFFFFFFE020047F, himc 00000000000C0273, MSG_IME_UI msg WM_IME_ENDCOMPOSITION, wparam 0x1, lparam 0 imm32.c:7208: Test failed: kbd_char_first: 1: got hkl FFFFFFFFE020047F, himc 00000000000C0273, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x2, lparam 0, comp L"", result L"" imm32.c:7208: Test failed: kbd_char_first: 2 (missing): hkl FFFFFFFFE020047F, himc 00000000000C0273, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x2, lparam 0, comp L"", result L"" imm32.c:7208: Test failed: kbd_char_first: 3 (missing): hkl FFFFFFFFE020047F, himc 00000000000C0273, MSG_IME_UI msg WM_IME_ENDCOMPOSITION, wparam 0x2, lparam 0 imm32.c:7219: Test failed: kbd_char_first: 1: got hkl FFFFFFFFE020047F, himc 00000000000C0273, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x2, lparam 0, comp L"", result L"" imm32.c:7219: Test failed: kbd_char_first: 2 (missing): hkl FFFFFFFFE020047F, himc 00000000000C0273, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x2, lparam 0, comp L"", result L"" imm32.c:7219: Test failed: kbd_char_first: 3 (missing): hkl FFFFFFFFE020047F, himc 00000000000C0273, MSG_IME_UI msg WM_IME_ENDCOMPOSITION, wparam 0x2, lparam 0 imm32.c:7231: Test failed: kbd_char_first: 1: got hkl FFFFFFFFE020047F, himc 00000000000C0273, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x1, lparam 0, comp L"", result L"" imm32.c:7231: Test failed: kbd_char_first: 2 (missing): hkl FFFFFFFFE020047F, himc 00000000000C0273, MSG_TEST_WIN msg WM_IME_ENDCOMPOSITION, wparam 0x1, lparam 0, comp L"", result L"" imm32.c:7231: Test failed: kbd_char_first: 3 (missing): hkl FFFFFFFFE020047F, himc 00000000000C0273, MSG_IME_UI msg WM_IME_ENDCOMPOSITION, wparam 0x1, lparam 0 imm32.c:1326: Test failed: expected WM_IME_SETCONTEXT_ACTIVATE imm32.c:818: Test failed: unexpected call WM_IME_SETCONTEXT_ACTIVATE imm32.c:1405: Test failed: expected WM_IME_SETCONTEXT_ACTIVATE imm32.c:818: Test failed: unexpected call WM_IME_SETCONTEXT_ACTIVATE