From: Jacek Caban jacek@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53348 --- dlls/imm32/imm.c | 55 ++++++++++++++++++++++-------------------------- 1 file changed, 25 insertions(+), 30 deletions(-)
diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index 89541612ea2..bfbf3b2ad78 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -806,7 +806,7 @@ BOOL WINAPI ImmConfigureIMEW( return FALSE; }
-static InputContextData *alloc_input_context_data(void) +static InputContextData *create_input_context(HIMC default_imc) { InputContextData *new_context; LPGUIDELINE gl; @@ -816,6 +816,7 @@ static InputContextData *alloc_input_context_data(void) new_context = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(InputContextData));
/* Load the IME */ + new_context->threadDefault = !!default_imc; new_context->immKbd = IMM_GetImmHkl(GetKeyboardLayout(0));
if (!new_context->immKbd->hIME) @@ -848,6 +849,27 @@ static InputContextData *alloc_input_context_data(void) new_context->IMC.fdwConversion = new_context->immKbd->imeInfo.fdwConversionCaps; new_context->IMC.fdwSentence = new_context->immKbd->imeInfo.fdwSentenceCaps;
+ if (!default_imc) + new_context->handle = NtUserCreateInputContext((UINT_PTR)new_context); + else if (NtUserUpdateInputContext(default_imc, NtUserInputContextClientPtr, (UINT_PTR)new_context)) + new_context->handle = default_imc; + if (!new_context->handle) + { + free_input_context_data(new_context); + return 0; + } + + if (!new_context->immKbd->pImeSelect(new_context->handle, TRUE)) + { + TRACE("Selection of IME failed\n"); + IMM_DestroyContext(new_context); + return 0; + } + new_context->threadID = GetCurrentThreadId(); + SendMessageW(GetFocus(), WM_IME_SELECT, TRUE, (LPARAM)new_context->immKbd); + + new_context->immKbd->uSelected++; + TRACE("Created context %p\n", new_context); return new_context; }
@@ -856,16 +878,7 @@ static InputContextData* get_imc_data(HIMC handle) InputContextData *ret;
if ((ret = query_imc_data(handle)) || !handle) return ret; - if (!(ret = alloc_input_context_data())) return NULL; - ret->threadID = NtUserQueryInputContext(handle, NtUserInputContextThreadId); - ret->handle = handle; - ret->threadDefault = TRUE; - if (!NtUserUpdateInputContext(handle, NtUserInputContextClientPtr, (UINT_PTR)ret)) - { - free_input_context_data(ret); - return NULL; - } - return ret; + return create_input_context(handle); }
/*********************************************************************** @@ -875,25 +888,7 @@ HIMC WINAPI ImmCreateContext(void) { InputContextData *new_context;
- if (!(new_context = alloc_input_context_data())) return 0; - if (!(new_context->handle = NtUserCreateInputContext((UINT_PTR)new_context))) - { - free_input_context_data(new_context); - return 0; - } - - if (!new_context->immKbd->pImeSelect(new_context->handle, TRUE)) - { - TRACE("Selection of IME failed\n"); - IMM_DestroyContext(new_context); - return 0; - } - new_context->threadID = GetCurrentThreadId(); - SendMessageW(GetFocus(), WM_IME_SELECT, TRUE, (LPARAM)new_context->immKbd); - - new_context->immKbd->uSelected++; - TRACE("Created context %p\n",new_context); - + if (!(new_context = create_input_context(0))) return 0; return new_context->handle; }
From: Jacek Caban jacek@codeweavers.com
--- dlls/user32/defwnd.c | 35 ----------------------------------- dlls/win32u/defwnd.c | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 35 deletions(-)
diff --git a/dlls/user32/defwnd.c b/dlls/user32/defwnd.c index 70d62c4f718..9e258e5d3c0 100644 --- a/dlls/user32/defwnd.c +++ b/dlls/user32/defwnd.c @@ -147,23 +147,6 @@ LRESULT WINAPI DefWindowProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam } } /* fall through */ - case WM_IME_STARTCOMPOSITION: - case WM_IME_ENDCOMPOSITION: - case WM_IME_SELECT: - case WM_IME_NOTIFY: - case WM_IME_CONTROL: - { - HWND hwndIME = ImmGetDefaultIMEWnd( hwnd ); - if (hwndIME) - result = SendMessageA( hwndIME, msg, wParam, lParam ); - } - break; - case WM_IME_SETCONTEXT: - { - HWND hwndIME = ImmGetDefaultIMEWnd( hwnd ); - if (hwndIME) result = ImmIsUIMessageA( hwndIME, msg, wParam, lParam ); - } - break;
default: result = NtUserMessageCall( hwnd, msg, wParam, lParam, 0, NtUserDefWindowProc, TRUE ); @@ -220,13 +203,6 @@ LRESULT WINAPI DefWindowProcW( result = PostMessageW( hwnd, WM_KEYUP, wParam, lParam ); break;
- case WM_IME_SETCONTEXT: - { - HWND hwndIME = ImmGetDefaultIMEWnd( hwnd ); - if (hwndIME) result = ImmIsUIMessageW( hwndIME, msg, wParam, lParam ); - } - break; - case WM_IME_COMPOSITION: if (lParam & GCS_RESULTSTR) { @@ -249,17 +225,6 @@ LRESULT WINAPI DefWindowProcW( } } /* fall through */ - case WM_IME_STARTCOMPOSITION: - case WM_IME_ENDCOMPOSITION: - case WM_IME_SELECT: - case WM_IME_NOTIFY: - case WM_IME_CONTROL: - { - HWND hwndIME = ImmGetDefaultIMEWnd( hwnd ); - if (hwndIME) - result = SendMessageW( hwndIME, msg, wParam, lParam ); - } - break;
default: result = NtUserMessageCall( hwnd, msg, wParam, lParam, 0, NtUserDefWindowProc, FALSE ); diff --git a/dlls/win32u/defwnd.c b/dlls/win32u/defwnd.c index 3e42e3b1e22..d271b5b9670 100644 --- a/dlls/win32u/defwnd.c +++ b/dlls/win32u/defwnd.c @@ -2901,6 +2901,21 @@ LRESULT default_window_proc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, free( win_array ); break; } + + case WM_IME_SETCONTEXT: + case WM_IME_COMPOSITION: + case WM_IME_STARTCOMPOSITION: + case WM_IME_ENDCOMPOSITION: + case WM_IME_SELECT: + case WM_IME_NOTIFY: + case WM_IME_CONTROL: + { + HWND ime_hwnd = get_default_ime_window( hwnd ); + if (ime_hwnd) + result = NtUserMessageCall( ime_hwnd, msg, wparam, lparam, + 0, NtUserSendMessage, ansi ); + } + break; }
return result;
This merge request was approved by Huw Davies.