Module: wine Branch: master Commit: 3e8a4b671dca2d22596c43157e2ae80fcfe18737 URL: https://gitlab.winehq.org/wine/wine/-/commit/3e8a4b671dca2d22596c43157e2ae80...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Jul 12 13:41:23 2022 +0200
imm32: Store message spy pointer in TEB.
---
dlls/imm32/imm.c | 30 +++++++++++++++++------------- include/ntuser.h | 1 + 2 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index 42cf6a712f9..8bfa6267f16 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -123,8 +123,6 @@ struct coinit_spy } apt_flags; };
-static LONG spy_tls = TLS_OUT_OF_INDEXES; - static struct list ImmHklList = LIST_INIT(ImmHklList); static struct list ImmThreadDataList = LIST_INIT(ImmThreadDataList);
@@ -256,13 +254,18 @@ static DWORD convert_candidatelist_AtoW( return ret; }
+static struct coinit_spy *get_thread_coinit_spy(void) +{ + return NtUserGetThreadInfo()->client_imm; +} + static void imm_couninit_thread(BOOL cleanup) { struct coinit_spy *spy;
TRACE("implicit COM deinitialization\n");
- if (!(spy = TlsGetValue(spy_tls)) || (spy->apt_flags & IMM_APT_BROKEN)) + if (!(spy = get_thread_coinit_spy()) || (spy->apt_flags & IMM_APT_BROKEN)) return;
if (cleanup && spy->cookie.QuadPart) @@ -314,7 +317,11 @@ static ULONG WINAPI InitializeSpy_Release(IInitializeSpy *iface) { struct coinit_spy *spy = impl_from_IInitializeSpy(iface); LONG ref = InterlockedDecrement(&spy->ref); - if (!ref) HeapFree(GetProcessHeap(), 0, spy); + if (!ref) + { + HeapFree(GetProcessHeap(), 0, spy); + NtUserGetThreadInfo()->client_imm = NULL; + } return ref; }
@@ -380,20 +387,15 @@ static void imm_coinit_thread(void)
TRACE("implicit COM initialization\n");
- if (spy_tls == TLS_OUT_OF_INDEXES) - { - DWORD tls = TlsAlloc(); - if (tls == TLS_OUT_OF_INDEXES) return; - if (InterlockedCompareExchange(&spy_tls, tls, TLS_OUT_OF_INDEXES)) TlsFree(tls); - } - if (!(spy = TlsGetValue(spy_tls))) + if (!(spy = get_thread_coinit_spy())) { if (!(spy = HeapAlloc(GetProcessHeap(), 0, sizeof(*spy)))) return; spy->IInitializeSpy_iface.lpVtbl = &InitializeSpyVtbl; spy->ref = 1; spy->cookie.QuadPart = 0; spy->apt_flags = 0; - TlsSetValue(spy_tls, spy); + NtUserGetThreadInfo()->client_imm = spy; + }
if (spy->apt_flags & (IMM_APT_INIT | IMM_APT_BROKEN)) @@ -474,7 +476,8 @@ static void IMM_FreeThreadData(void) } LeaveCriticalSection(&threaddata_cs);
- if ((spy = TlsGetValue(spy_tls))) IInitializeSpy_Release(&spy->IInitializeSpy_iface); + if ((spy = get_thread_coinit_spy())) + IInitializeSpy_Release(&spy->IInitializeSpy_iface); }
static HMODULE load_graphics_driver(void) @@ -754,6 +757,7 @@ BOOL WINAPI ImmSetActiveContext(HWND hwnd, HIMC himc, BOOL activate) SendMessageW(hwnd, WM_IME_SETCONTEXT, activate, ISC_SHOWUIALL); /* TODO: send WM_IME_NOTIFY */ } + SetLastError(0); return TRUE; }
diff --git a/include/ntuser.h b/include/ntuser.h index 713c7d071fc..672e3156536 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -63,6 +63,7 @@ struct ntuser_thread_info ULONG_PTR message_extra; /* value for GetMessageExtraInfo */ HWND top_window; /* desktop window */ HWND msg_window; /* HWND_MESSAGE parent window */ + void *client_imm; /* client IMM thread info */ };
static inline struct ntuser_thread_info *NtUserGetThreadInfo(void)