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)
13 #include <wine/debug.h>
15 WINE_DEFAULT_DEBUG_CHANNEL(user32
);
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
);
38 Imm32ApiTable
*pImmApiTable
= {0};
39 HINSTANCE hImmInstance
= NULL
;
42 static BOOL
IsInitialized()
44 return (hImmInstance
!= NULL
) ? TRUE
: FALSE
;
48 * This function should not be implemented, it is used,
49 * if you can not load function from imm32.dll
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; }
68 BOOL WINAPI
User32InitializeImmEntryTable(DWORD dwUnknown
)
72 if (dwUnknown
!= 0x19650412) /* FIXME */
78 hImmInstance
= LoadLibraryW(L
"imm32.dll");
82 ZeroMemory(pImmApiTable
, sizeof(Imm32ApiTable
));
84 pImmApiTable
->pImmIsIME
= (BOOL (WINAPI
*)(HKL
)) GetProcAddress(hImmInstance
, "ImmIsIME");
85 if (!pImmApiTable
->pImmIsIME
)
86 pImmApiTable
->pImmIsIME
= IMM_ImmIsIME
;
88 pImmApiTable
->pImmEscapeA
= (LRESULT (WINAPI
*)(HKL
, HIMC
, UINT
, LPVOID
)) GetProcAddress(hImmInstance
, "ImmEscapeA");
89 if (!pImmApiTable
->pImmEscapeA
)
90 pImmApiTable
->pImmEscapeA
= IMM_ImmEscapeAW
;
92 pImmApiTable
->pImmEscapeW
= (LRESULT (WINAPI
*)(HKL
, HIMC
, UINT
, LPVOID
)) GetProcAddress(hImmInstance
, "ImmEscapeW");
93 if (!pImmApiTable
->pImmEscapeW
)
94 pImmApiTable
->pImmEscapeW
= IMM_ImmEscapeAW
;
96 pImmApiTable
->pImmGetCompositionStringA
= (LONG (WINAPI
*)(HIMC
, DWORD
, LPVOID
, DWORD
)) GetProcAddress(hImmInstance
, "ImmGetCompositionStringA");
97 if (!pImmApiTable
->pImmGetCompositionStringA
)
98 pImmApiTable
->pImmGetCompositionStringA
= IMM_ImmGetCompositionStringAW
;
100 pImmApiTable
->pImmGetCompositionStringW
= (LONG (WINAPI
*)(HIMC
, DWORD
, LPVOID
, DWORD
)) GetProcAddress(hImmInstance
, "ImmGetCompositionStringW");
101 if (!pImmApiTable
->pImmGetCompositionStringW
)
102 pImmApiTable
->pImmGetCompositionStringW
= IMM_ImmGetCompositionStringAW
;
104 pImmApiTable
->pImmGetCompositionFontA
= (BOOL (WINAPI
*)(HIMC
, LPLOGFONTA
)) GetProcAddress(hImmInstance
, "ImmGetCompositionFontA");
105 if (!pImmApiTable
->pImmGetCompositionFontA
)
106 pImmApiTable
->pImmGetCompositionFontA
= IMM_ImmGetCompositionFontA
;
108 pImmApiTable
->pImmGetCompositionFontW
= (BOOL (WINAPI
*)(HIMC
, LPLOGFONTW
)) GetProcAddress(hImmInstance
, "ImmGetCompositionFontW");
109 if (!pImmApiTable
->pImmGetCompositionFontW
)
110 pImmApiTable
->pImmGetCompositionFontW
= IMM_ImmGetCompositionFontW
;
112 pImmApiTable
->pImmSetCompositionFontA
= (BOOL (WINAPI
*)(HIMC
, LPLOGFONTA
)) GetProcAddress(hImmInstance
, "ImmSetCompositionFontA");
113 if (!pImmApiTable
->pImmSetCompositionFontA
)
114 pImmApiTable
->pImmSetCompositionFontA
= IMM_ImmSetCompositionFontA
;
116 pImmApiTable
->pImmSetCompositionFontW
= (BOOL (WINAPI
*)(HIMC
, LPLOGFONTW
)) GetProcAddress(hImmInstance
, "ImmSetCompositionFontW");
117 if (!pImmApiTable
->pImmSetCompositionFontW
)
118 pImmApiTable
->pImmSetCompositionFontW
= IMM_ImmSetCompositionFontW
;
120 pImmApiTable
->pImmGetCompositionWindow
= (BOOL (WINAPI
*)(HIMC
, LPCOMPOSITIONFORM
)) GetProcAddress(hImmInstance
, "ImmGetCompositionWindow");
121 if (!pImmApiTable
->pImmGetCompositionWindow
)
122 pImmApiTable
->pImmGetCompositionWindow
= IMM_ImmSetGetCompositionWindow
;
124 pImmApiTable
->pImmSetCompositionWindow
= (BOOL (WINAPI
*)(HIMC
, LPCOMPOSITIONFORM
)) GetProcAddress(hImmInstance
, "ImmSetCompositionWindow");
125 if (!pImmApiTable
->pImmSetCompositionWindow
)
126 pImmApiTable
->pImmSetCompositionWindow
= IMM_ImmSetGetCompositionWindow
;
128 pImmApiTable
->pImmAssociateContext
= (HIMC (WINAPI
*)(HWND
, HIMC
)) GetProcAddress(hImmInstance
, "ImmAssociateContext");
129 if (!pImmApiTable
->pImmAssociateContext
)
130 pImmApiTable
->pImmAssociateContext
= IMM_ImmAssociateContext
;
132 pImmApiTable
->pImmReleaseContext
= (BOOL (WINAPI
*)(HWND
, HIMC
)) GetProcAddress(hImmInstance
, "ImmReleaseContext");
133 if (!pImmApiTable
->pImmReleaseContext
)
134 pImmApiTable
->pImmReleaseContext
= IMM_ImmReleaseContext
;
136 pImmApiTable
->pImmGetContext
= (HIMC (WINAPI
*)(HWND
)) GetProcAddress(hImmInstance
, "ImmGetContext");
137 if (!pImmApiTable
->pImmGetContext
)
138 pImmApiTable
->pImmGetContext
= IMM_ImmGetContext
;
140 pImmApiTable
->pImmGetDefaultIMEWnd
= (HWND (WINAPI
*)(HWND
)) GetProcAddress(hImmInstance
, "ImmGetDefaultIMEWnd");
141 if (!pImmApiTable
->pImmGetDefaultIMEWnd
)
142 pImmApiTable
->pImmGetDefaultIMEWnd
= IMM_ImmGetDefaultIMEWnd
;
144 pImmApiTable
->pImmNotifyIME
= (BOOL (WINAPI
*)(HIMC
, DWORD
, DWORD
, DWORD
)) GetProcAddress(hImmInstance
, "ImmNotifyIME");
145 if (!pImmApiTable
->pImmNotifyIME
)
146 pImmApiTable
->pImmNotifyIME
= IMM_ImmNotifyIME
;
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)
164 IMPSetIMEW(HWND hwnd
, LPIMEPROW ime
)
175 IMPQueryIMEW(LPIMEPROW ime
)
186 IMPGetIMEW(HWND hwnd
, LPIMEPROW ime
)
197 IMPSetIMEA(HWND hwnd
, LPIMEPROA ime
)
208 IMPQueryIMEA(LPIMEPROA ime
)
219 IMPGetIMEA(HWND hwnd
, LPIMEPROA ime
)
230 SendIMEMessageExW(HWND hwnd
, LPARAM lparam
)
241 SendIMEMessageExA(HWND hwnd
, LPARAM lparam
)
252 WINNLSEnableIME(HWND hwnd
, BOOL enable
)
263 WINNLSGetEnableStatus(HWND hwnd
)
274 WINNLSGetIMEHotkey(HWND hwnd
)