17f46493c88f922943ba65ceb3d18551bc4594f8
[reactos.git] / dll / win32 / imm32 / precomp.h
1 /*
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>
11 */
12
13 #pragma once
14
15 #include <stdio.h>
16 #include <stdlib.h>
17
18 /* PSDK/NDK Headers */
19 #define WIN32_NO_STATUS
20 #include <windef.h>
21 #include <winbase.h>
22 #include <wingdi.h>
23 #include <winuser.h>
24 #include <winnls.h>
25 #include <winreg.h>
26 #include <winnls32.h>
27
28 #include <imm.h>
29 #include <ddk/imm.h>
30
31 #define NTOS_MODE_USER
32 #include <ndk/umtypes.h>
33 #include <ndk/pstypes.h>
34 #include <ndk/rtlfuncs.h>
35
36 /* Public Win32K Headers */
37 #include "ntuser.h"
38 #include "ntwin32.h"
39
40 /* Undocumented user definitions */
41 #include <undocuser.h>
42 #include <imm32_undoc.h>
43
44 #include <strsafe.h>
45
46 #include <wine/debug.h>
47 #include <wine/list.h>
48
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
54
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)
58
59 #define REGKEY_KEYBOARD_LAYOUTS L"System\\CurrentControlSet\\Control\\Keyboard Layouts"
60 #define REGKEY_IMM L"Software\\Microsoft\\Windows NT\\CurrentVersion\\IMM"
61
62 #define ROUNDUP4(n) (((n) + 3) & ~3) /* DWORD alignment */
63
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;
71
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);
78
79 LPVOID APIENTRY Imm32HeapAlloc(DWORD dwFlags, DWORD dwBytes);
80 #define Imm32HeapFree(lpData) HeapFree(g_hImm32Heap, 0, (lpData))
81
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);
89
90 static inline BOOL Imm32IsCrossThreadAccess(HIMC hIMC)
91 {
92 DWORD dwImeThreadId = NtUserQueryInputContext(hIMC, 1);
93 DWORD dwThreadId = GetCurrentThreadId();
94 return (dwImeThreadId != dwThreadId);
95 }
96
97 static inline BOOL Imm32IsCrossProcessAccess(HWND hWnd)
98 {
99 return (NtUserQueryWindow(hWnd, QUERY_WINDOW_UNIQUE_PROCESS_ID) !=
100 (DWORD_PTR)NtCurrentTeb()->ClientId.UniqueProcess);
101 }
102
103 BOOL WINAPI Imm32IsImcAnsi(HIMC hIMC);
104
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)
109
110 DWORD APIENTRY
111 CandidateListWideToAnsi(const CANDIDATELIST *pWideCL, LPCANDIDATELIST pAnsiCL, DWORD dwBufLen,
112 UINT uCodePage);
113 DWORD APIENTRY
114 CandidateListAnsiToWide(const CANDIDATELIST *pAnsiCL, LPCANDIDATELIST pWideCL, DWORD dwBufLen,
115 UINT uCodePage);
116
117 BOOL APIENTRY
118 Imm32NotifyAction(HIMC hIMC, HWND hwnd, DWORD dwAction, DWORD_PTR dwIndex, DWORD_PTR dwValue,
119 DWORD_PTR dwCommand, DWORD_PTR dwData);
120
121 DWORD APIENTRY Imm32AllocAndBuildHimcList(DWORD dwThreadId, HIMC **pphList);
122
123 INT APIENTRY
124 Imm32ImeMenuAnsiToWide(const IMEMENUITEMINFOA *pItemA, LPIMEMENUITEMINFOW pItemW,
125 UINT uCodePage, BOOL bBitmap);
126 INT APIENTRY
127 Imm32ImeMenuWideToAnsi(const IMEMENUITEMINFOW *pItemW, LPIMEMENUITEMINFOA pItemA,
128 UINT uCodePage);
129
130 PIME_STATE APIENTRY Imm32FetchImeState(LPINPUTCONTEXTDX pIC, HKL hKL);
131 PIME_SUBSTATE APIENTRY Imm32FetchImeSubState(PIME_STATE pState, HKL hKL);
132
133 BOOL APIENTRY
134 Imm32LoadImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL);
135 BOOL APIENTRY
136 Imm32SaveImeStateSentence(LPINPUTCONTEXTDX pIC, PIME_STATE pState, HKL hKL);