2 * PROJECT: ReactOS IMM32
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Implementing IMM32
5 * COPYRIGHT: Copyright 1998 Patrik Stridvall
6 * Copyright 2002, 2003, 2007 CodeWeavers, Aric Stewart
7 * Copyright 2017 James Tabor <james.tabor@reactos.org>
8 * Copyright 2018 Amine Khaldi <amine.khaldi@reactos.org>
9 * Copyright 2020 Oleg Dubinskiy <oleg.dubinskij2013@yandex.ua>
10 * Copyright 2020-2021 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
18 /* PSDK/NDK Headers */
19 #define WIN32_NO_STATUS
31 #define NTOS_MODE_USER
32 #include <ndk/umtypes.h>
33 #include <ndk/pstypes.h>
34 #include <ndk/rtlfuncs.h>
36 /* Public Win32K Headers */
40 /* Undocumented user definitions */
41 #include <undocuser.h>
42 #include <imm32_undoc.h>
46 #include <wine/debug.h>
47 #include <wine/list.h>
49 #define IMM_INIT_MAGIC 0x19650412
50 #define IMM_INVALID_CANDFORM ULONG_MAX
51 #define INVALID_HOTKEY_ID 0xFFFFFFFF
52 #define MAX_CANDIDATEFORM 4
53 #define MAX_IMM_FILENAME 80
55 #define LANGID_CHINESE_SIMPLIFIED MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)
56 #define LANGID_CHINESE_TRADITIONAL MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL)
57 #define LANGID_JAPANESE MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT)
59 #define REGKEY_KEYBOARD_LAYOUTS L"System\\CurrentControlSet\\Control\\Keyboard Layouts"
60 #define REGKEY_IMM L"Software\\Microsoft\\Windows NT\\CurrentVersion\\IMM"
62 #define ROUNDUP4(n) (((n) + 3) & ~3) /* DWORD alignment */
64 extern HMODULE g_hImm32Inst
;
65 extern RTL_CRITICAL_SECTION g_csImeDpi
;
66 extern PIMEDPI g_pImeDpiList
;
67 extern PSERVERINFO g_psi
;
68 extern SHAREDINFO g_SharedInfo
;
69 extern BYTE g_bClientRegd
;
70 extern HANDLE g_hImm32Heap
;
72 BOOL
Imm32GetSystemLibraryPath(LPWSTR pszPath
, DWORD cchPath
, LPCWSTR pszFileName
);
73 VOID APIENTRY
LogFontAnsiToWide(const LOGFONTA
*plfA
, LPLOGFONTW plfW
);
74 VOID APIENTRY
LogFontWideToAnsi(const LOGFONTW
*plfW
, LPLOGFONTA plfA
);
75 PWND FASTCALL
ValidateHwndNoErr(HWND hwnd
);
76 LPVOID FASTCALL
ValidateHandleNoErr(HANDLE hObject
, UINT uType
);
77 BOOL APIENTRY
Imm32CheckImcProcess(PIMC pIMC
);
79 LPVOID APIENTRY
Imm32HeapAlloc(DWORD dwFlags
, DWORD dwBytes
);
80 #define Imm32HeapFree(lpData) HeapFree(g_hImm32Heap, 0, (lpData))
82 LPWSTR APIENTRY
Imm32WideFromAnsi(LPCSTR pszA
);
83 LPSTR APIENTRY
Imm32AnsiFromWide(LPCWSTR pszW
);
84 DWORD APIENTRY
IchWideFromAnsi(DWORD cchAnsi
, LPCSTR pchAnsi
, UINT uCodePage
);
85 DWORD APIENTRY
IchAnsiFromWide(DWORD cchWide
, LPCWSTR pchWide
, UINT uCodePage
);
86 PIMEDPI APIENTRY
ImmLockOrLoadImeDpi(HKL hKL
);
87 LPINPUTCONTEXT APIENTRY
Imm32LockIMCEx(HIMC hIMC
, BOOL fSelect
);
88 BOOL APIENTRY
Imm32ReleaseIME(HKL hKL
);
90 static inline BOOL
Imm32IsCrossThreadAccess(HIMC hIMC
)
92 DWORD dwImeThreadId
= NtUserQueryInputContext(hIMC
, 1);
93 DWORD dwThreadId
= GetCurrentThreadId();
94 return (dwImeThreadId
!= dwThreadId
);
97 static inline BOOL
Imm32IsCrossProcessAccess(HWND hWnd
)
99 return (NtUserQueryWindow(hWnd
, QUERY_WINDOW_UNIQUE_PROCESS_ID
) !=
100 (DWORD_PTR
)NtCurrentTeb()->ClientId
.UniqueProcess
);
103 BOOL WINAPI
Imm32IsImcAnsi(HIMC hIMC
);
105 #define ImeDpi_IsUnicode(pImeDpi) ((pImeDpi)->ImeInfo.fdwProperty & IME_PROP_UNICODE)
106 #define Imm32IsImmMode() (g_psi && (g_psi->dwSRVIFlags & SRVINFO_IMM32))
107 #define Imm32IsCiceroMode() (g_psi && (g_psi->dwSRVIFlags & SRVINFO_CICERO_ENABLED))
108 #define Imm32Is16BitMode() (GetWin32ClientInfo()->dwTIFlags & TIF_16BIT)
111 CandidateListWideToAnsi(const CANDIDATELIST
*pWideCL
, LPCANDIDATELIST pAnsiCL
, DWORD dwBufLen
,
114 CandidateListAnsiToWide(const CANDIDATELIST
*pAnsiCL
, LPCANDIDATELIST pWideCL
, DWORD dwBufLen
,
118 Imm32NotifyAction(HIMC hIMC
, HWND hwnd
, DWORD dwAction
, DWORD_PTR dwIndex
, DWORD_PTR dwValue
,
119 DWORD_PTR dwCommand
, DWORD_PTR dwData
);
121 DWORD APIENTRY
Imm32AllocAndBuildHimcList(DWORD dwThreadId
, HIMC
**pphList
);
124 Imm32ImeMenuAnsiToWide(const IMEMENUITEMINFOA
*pItemA
, LPIMEMENUITEMINFOW pItemW
,
125 UINT uCodePage
, BOOL bBitmap
);
127 Imm32ImeMenuWideToAnsi(const IMEMENUITEMINFOW
*pItemW
, LPIMEMENUITEMINFOA pItemA
,
130 PIME_STATE APIENTRY
Imm32FetchImeState(LPINPUTCONTEXTDX pIC
, HKL hKL
);
131 PIME_SUBSTATE APIENTRY
Imm32FetchImeSubState(PIME_STATE pState
, HKL hKL
);
134 Imm32LoadImeStateSentence(LPINPUTCONTEXTDX pIC
, PIME_STATE pState
, HKL hKL
);
136 Imm32SaveImeStateSentence(LPINPUTCONTEXTDX pIC
, PIME_STATE pState
, HKL hKL
);