[CRT]
[reactos.git] / reactos / dll / win32 / user32 / misc / imm.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS user32.dll
4 * FILE: dll/win32/user32/misc/imm.c
5 * PURPOSE: User32.dll Imm functions
6 * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
7 * UPDATE HISTORY:
8 * 01/27/2009 Created
9 */
10
11 #include <user32.h>
12
13 #include <wine/debug.h>
14
15 WINE_DEFAULT_DEBUG_CHANNEL(user32);
16
17
18 typedef struct
19 {
20 BOOL (WINAPI* pImmIsIME) (HKL);
21 LRESULT (WINAPI* pImmEscapeA) (HKL, HIMC, UINT, LPVOID);
22 LRESULT (WINAPI* pImmEscapeW) (HKL, HIMC, UINT, LPVOID);
23 LONG (WINAPI* pImmGetCompositionStringA) (HIMC, DWORD, LPVOID, DWORD);
24 LONG (WINAPI* pImmGetCompositionStringW) (HIMC, DWORD, LPVOID, DWORD);
25 BOOL (WINAPI* pImmGetCompositionFontA) (HIMC, LPLOGFONTA);
26 BOOL (WINAPI* pImmGetCompositionFontW) (HIMC, LPLOGFONTW);
27 BOOL (WINAPI* pImmSetCompositionFontA)(HIMC, LPLOGFONTA);
28 BOOL (WINAPI* pImmSetCompositionFontW)(HIMC, LPLOGFONTW);
29 BOOL (WINAPI* pImmGetCompositionWindow) (HIMC, LPCOMPOSITIONFORM);
30 BOOL (WINAPI* pImmSetCompositionWindow) (HIMC, LPCOMPOSITIONFORM);
31 HIMC (WINAPI* pImmAssociateContext) (HWND, HIMC);
32 BOOL (WINAPI* pImmReleaseContext) (HWND, HIMC);
33 HIMC (WINAPI* pImmGetContext) (HWND);
34 HWND (WINAPI* pImmGetDefaultIMEWnd) (HWND);
35 BOOL (WINAPI* pImmNotifyIME) (HIMC, DWORD, DWORD, DWORD);
36 } Imm32ApiTable;
37
38 Imm32ApiTable *pImmApiTable = {0};
39 HINSTANCE hImmInstance = NULL;
40
41
42 static BOOL IsInitialized()
43 {
44 return (hImmInstance != NULL) ? TRUE : FALSE;
45 }
46
47 /*
48 * This function should not be implemented, it is used,
49 * if you can not load function from imm32.dll
50 */
51 BOOL WINAPI IMM_ImmIsIME(HKL hKL) { return 0; }
52 HIMC WINAPI IMM_ImmAssociateContext(HWND hwnd, HIMC himc) { return 0; }
53 BOOL WINAPI IMM_ImmReleaseContext(HWND hwnd, HIMC himc) { return 0; }
54 LRESULT WINAPI IMM_ImmEscapeAW(HKL hkl, HIMC himc, UINT uint, LPVOID lpvoid) { return 0; }
55 LONG WINAPI IMM_ImmGetCompositionStringAW(HIMC himc, DWORD dword1, LPVOID lpvoid, DWORD dword2) { return 0; }
56 BOOL WINAPI IMM_ImmGetCompositionFontA(HIMC himc, LPLOGFONTA lplf) { return 0; }
57 BOOL WINAPI IMM_ImmGetCompositionFontW(HIMC himc, LPLOGFONTW lplf) { return 0; }
58 BOOL WINAPI IMM_ImmSetCompositionFontA(HIMC himc, LPLOGFONTA lplf) { return 0; }
59 BOOL WINAPI IMM_ImmSetCompositionFontW(HIMC himc, LPLOGFONTW lplf) { return 0; }
60 BOOL WINAPI IMM_ImmSetGetCompositionWindow(HIMC himc, LPCOMPOSITIONFORM lpcf) { return 0; }
61 HIMC WINAPI IMM_ImmGetContext(HWND hwnd) { return 0; }
62 HWND WINAPI IMM_ImmGetDefaultIMEWnd(HWND hwnd) { return 0; }
63 BOOL WINAPI IMM_ImmNotifyIME(HIMC himc, DWORD dword1, DWORD dword2, DWORD dword3) { return 0; }
64
65 /*
66 * @unimplemented
67 */
68 BOOL WINAPI User32InitializeImmEntryTable(DWORD dwUnknown)
69 {
70 UNIMPLEMENTED;
71
72 if (dwUnknown != 0x19650412) /* FIXME */
73 return FALSE;
74
75 if (IsInitialized())
76 return TRUE;
77
78 hImmInstance = LoadLibraryW(L"imm32.dll");
79 if (!hImmInstance)
80 return FALSE;
81
82 ZeroMemory(pImmApiTable, sizeof(Imm32ApiTable));
83
84 pImmApiTable->pImmIsIME = (BOOL (WINAPI*)(HKL)) GetProcAddress(hImmInstance, "ImmIsIME");
85 if (!pImmApiTable->pImmIsIME)
86 pImmApiTable->pImmIsIME = IMM_ImmIsIME;
87
88 pImmApiTable->pImmEscapeA = (LRESULT (WINAPI*)(HKL, HIMC, UINT, LPVOID)) GetProcAddress(hImmInstance, "ImmEscapeA");
89 if (!pImmApiTable->pImmEscapeA)
90 pImmApiTable->pImmEscapeA = IMM_ImmEscapeAW;
91
92 pImmApiTable->pImmEscapeW = (LRESULT (WINAPI*)(HKL, HIMC, UINT, LPVOID)) GetProcAddress(hImmInstance, "ImmEscapeW");
93 if (!pImmApiTable->pImmEscapeW)
94 pImmApiTable->pImmEscapeW = IMM_ImmEscapeAW;
95
96 pImmApiTable->pImmGetCompositionStringA = (LONG (WINAPI*)(HIMC, DWORD, LPVOID, DWORD)) GetProcAddress(hImmInstance, "ImmGetCompositionStringA");
97 if (!pImmApiTable->pImmGetCompositionStringA)
98 pImmApiTable->pImmGetCompositionStringA = IMM_ImmGetCompositionStringAW;
99
100 pImmApiTable->pImmGetCompositionStringW = (LONG (WINAPI*)(HIMC, DWORD, LPVOID, DWORD)) GetProcAddress(hImmInstance, "ImmGetCompositionStringW");
101 if (!pImmApiTable->pImmGetCompositionStringW)
102 pImmApiTable->pImmGetCompositionStringW = IMM_ImmGetCompositionStringAW;
103
104 pImmApiTable->pImmGetCompositionFontA = (BOOL (WINAPI*)(HIMC, LPLOGFONTA)) GetProcAddress(hImmInstance, "ImmGetCompositionFontA");
105 if (!pImmApiTable->pImmGetCompositionFontA)
106 pImmApiTable->pImmGetCompositionFontA = IMM_ImmGetCompositionFontA;
107
108 pImmApiTable->pImmGetCompositionFontW = (BOOL (WINAPI*)(HIMC, LPLOGFONTW)) GetProcAddress(hImmInstance, "ImmGetCompositionFontW");
109 if (!pImmApiTable->pImmGetCompositionFontW)
110 pImmApiTable->pImmGetCompositionFontW = IMM_ImmGetCompositionFontW;
111
112 pImmApiTable->pImmSetCompositionFontA = (BOOL (WINAPI*)(HIMC, LPLOGFONTA)) GetProcAddress(hImmInstance, "ImmSetCompositionFontA");
113 if (!pImmApiTable->pImmSetCompositionFontA)
114 pImmApiTable->pImmSetCompositionFontA = IMM_ImmSetCompositionFontA;
115
116 pImmApiTable->pImmSetCompositionFontW = (BOOL (WINAPI*)(HIMC, LPLOGFONTW)) GetProcAddress(hImmInstance, "ImmSetCompositionFontW");
117 if (!pImmApiTable->pImmSetCompositionFontW)
118 pImmApiTable->pImmSetCompositionFontW = IMM_ImmSetCompositionFontW;
119
120 pImmApiTable->pImmGetCompositionWindow = (BOOL (WINAPI*)(HIMC, LPCOMPOSITIONFORM)) GetProcAddress(hImmInstance, "ImmGetCompositionWindow");
121 if (!pImmApiTable->pImmGetCompositionWindow)
122 pImmApiTable->pImmGetCompositionWindow = IMM_ImmSetGetCompositionWindow;
123
124 pImmApiTable->pImmSetCompositionWindow = (BOOL (WINAPI*)(HIMC, LPCOMPOSITIONFORM)) GetProcAddress(hImmInstance, "ImmSetCompositionWindow");
125 if (!pImmApiTable->pImmSetCompositionWindow)
126 pImmApiTable->pImmSetCompositionWindow = IMM_ImmSetGetCompositionWindow;
127
128 pImmApiTable->pImmAssociateContext = (HIMC (WINAPI*)(HWND, HIMC)) GetProcAddress(hImmInstance, "ImmAssociateContext");
129 if (!pImmApiTable->pImmAssociateContext)
130 pImmApiTable->pImmAssociateContext = IMM_ImmAssociateContext;
131
132 pImmApiTable->pImmReleaseContext = (BOOL (WINAPI*)(HWND, HIMC)) GetProcAddress(hImmInstance, "ImmReleaseContext");
133 if (!pImmApiTable->pImmReleaseContext)
134 pImmApiTable->pImmReleaseContext = IMM_ImmReleaseContext;
135
136 pImmApiTable->pImmGetContext = (HIMC (WINAPI*)(HWND)) GetProcAddress(hImmInstance, "ImmGetContext");
137 if (!pImmApiTable->pImmGetContext)
138 pImmApiTable->pImmGetContext = IMM_ImmGetContext;
139
140 pImmApiTable->pImmGetDefaultIMEWnd = (HWND (WINAPI*)(HWND)) GetProcAddress(hImmInstance, "ImmGetDefaultIMEWnd");
141 if (!pImmApiTable->pImmGetDefaultIMEWnd)
142 pImmApiTable->pImmGetDefaultIMEWnd = IMM_ImmGetDefaultIMEWnd;
143
144 pImmApiTable->pImmNotifyIME = (BOOL (WINAPI*)(HIMC, DWORD, DWORD, DWORD)) GetProcAddress(hImmInstance, "ImmNotifyIME");
145 if (!pImmApiTable->pImmNotifyIME)
146 pImmApiTable->pImmNotifyIME = IMM_ImmNotifyIME;
147
148 /*
149 * TODO: Load more functions from imm32.dll
150 * Function like IMPSetIMEW, IMPQueryIMEW etc. call functions
151 * from imm32.dll through pointers in the structure pImmApiTable.
152 * I do not know whether it is necessary to initialize a table
153 * of functions to load user32 (DLL_PROCESS_ATTACH)
154 */
155
156 return TRUE;
157 }
158
159 /*
160 * @unimplemented
161 */
162 BOOL
163 WINAPI
164 IMPSetIMEW(HWND hwnd, LPIMEPROW ime)
165 {
166 UNIMPLEMENTED;
167 return FALSE;
168 }
169
170 /*
171 * @unimplemented
172 */
173 BOOL
174 WINAPI
175 IMPQueryIMEW(LPIMEPROW ime)
176 {
177 UNIMPLEMENTED;
178 return FALSE;
179 }
180
181 /*
182 * @unimplemented
183 */
184 BOOL
185 WINAPI
186 IMPGetIMEW(HWND hwnd, LPIMEPROW ime)
187 {
188 UNIMPLEMENTED;
189 return FALSE;
190 }
191
192 /*
193 * @unimplemented
194 */
195 BOOL
196 WINAPI
197 IMPSetIMEA(HWND hwnd, LPIMEPROA ime)
198 {
199 UNIMPLEMENTED;
200 return FALSE;
201 }
202
203 /*
204 * @unimplemented
205 */
206 BOOL
207 WINAPI
208 IMPQueryIMEA(LPIMEPROA ime)
209 {
210 UNIMPLEMENTED;
211 return FALSE;
212 }
213
214 /*
215 * @unimplemented
216 */
217 BOOL
218 WINAPI
219 IMPGetIMEA(HWND hwnd, LPIMEPROA ime)
220 {
221 UNIMPLEMENTED;
222 return FALSE;
223 }
224
225 /*
226 * @unimplemented
227 */
228 LRESULT
229 WINAPI
230 SendIMEMessageExW(HWND hwnd, LPARAM lparam)
231 {
232 UNIMPLEMENTED;
233 return FALSE;
234 }
235
236 /*
237 * @unimplemented
238 */
239 LRESULT
240 WINAPI
241 SendIMEMessageExA(HWND hwnd, LPARAM lparam)
242 {
243 UNIMPLEMENTED;
244 return FALSE;
245 }
246
247 /*
248 * @unimplemented
249 */
250 BOOL
251 WINAPI
252 WINNLSEnableIME(HWND hwnd, BOOL enable)
253 {
254 UNIMPLEMENTED;
255 return FALSE;
256 }
257
258 /*
259 * @unimplemented
260 */
261 BOOL
262 WINAPI
263 WINNLSGetEnableStatus(HWND hwnd)
264 {
265 UNIMPLEMENTED;
266 return FALSE;
267 }
268
269 /*
270 * @unimplemented
271 */
272 UINT
273 WINAPI
274 WINNLSGetIMEHotkey(HWND hwnd)
275 {
276 UNIMPLEMENTED;
277 return FALSE;
278 }