* PROJECT: ReactOS user32.dll
* FILE: win32ss/user/user32/misc/imm.c
* PURPOSE: User32.dll Imm functions
- * PROGRAMMER: Dmitry Chapyshev (dmitry@reactos.org)
+ * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
+ * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
* UPDATE HISTORY:
* 01/27/2009 Created
*/
#include <user32.h>
-
-#include <winnls32.h>
#include <strsafe.h>
WINE_DEFAULT_DEBUG_CHANNEL(user32);
#define IMM_INIT_MAGIC 0x19650412
-
-Imm32ApiTable gImmApiEntries = {0};
HINSTANCE ghImm32 = NULL;
BOOL bImmInitializing = FALSE;
-BOOL ImmApiTableZero = TRUE;
+/* define stub functions */
+#undef DEFINE_IMM_ENTRY
+#define DEFINE_IMM_ENTRY(type, name, params, retval, retkind) \
+ static type WINAPI IMMSTUB_##name params { IMM_RETURN_##retkind((type)retval); }
+#include "immtable.h"
-/*
- * This function should not be implemented, it is used,
- * if you can not load function from imm32.dll
- */
-BOOL WINAPI IMM_ImmIsIME(HKL hKL) { return 0; }
-HIMC WINAPI IMM_ImmAssociateContext(HWND hwnd, HIMC himc) { return 0; }
-BOOL WINAPI IMM_ImmReleaseContext(HWND hwnd, HIMC himc) { return 0; }
-LRESULT WINAPI IMM_ImmEscapeAW(HKL hkl, HIMC himc, UINT uint, LPVOID lpvoid) { return 0; }
-LONG WINAPI IMM_ImmGetCompositionStringAW(HIMC himc, DWORD dword1, LPVOID lpvoid, DWORD dword2) { return 0; }
-BOOL WINAPI IMM_ImmGetCompositionFontA(HIMC himc, LPLOGFONTA lplf) { return 0; }
-BOOL WINAPI IMM_ImmGetCompositionFontW(HIMC himc, LPLOGFONTW lplf) { return 0; }
-BOOL WINAPI IMM_ImmSetCompositionFontA(HIMC himc, LPLOGFONTA lplf) { return 0; }
-BOOL WINAPI IMM_ImmSetCompositionFontW(HIMC himc, LPLOGFONTW lplf) { return 0; }
-BOOL WINAPI IMM_ImmSetGetCompositionWindow(HIMC himc, LPCOMPOSITIONFORM lpcf) { return 0; }
-HIMC WINAPI IMM_ImmGetContext(HWND hwnd) { return 0; }
-HWND WINAPI IMM_ImmGetDefaultIMEWnd(HWND hwnd) { return 0; }
-BOOL WINAPI IMM_ImmNotifyIME(HIMC himc, DWORD dword1, DWORD dword2, DWORD dword3) { return 0; }
-BOOL WINAPI IMM_ImmRegisterClient(PVOID ptr, HINSTANCE hMod) { return 0; }
-UINT WINAPI IMM_ImmProcessKey(HWND hwnd, HKL hkl, UINT Vk, LPARAM lParam, DWORD HotKey) { return 0; }
+Imm32ApiTable gImmApiEntries = {
+/* initialize by stubs */
+#undef DEFINE_IMM_ENTRY
+#define DEFINE_IMM_ENTRY(type, name, params, retval, retkind) \
+ IMMSTUB_##name,
+#include "immtable.h"
+};
HRESULT WINAPI GetImmFileName(PWSTR lpBuffer, UINT uSize)
{
WCHAR ImmFile[MAX_PATH];
HMODULE imm32 = ghImm32;
- if (gImmApiEntries.pImmIsIME != 0)
- {
- ERR("Imm Api Table Init 1\n");
- return TRUE;
- }
+ if (IMM_FN(ImmWINNLSEnableIME) != IMMSTUB_ImmWINNLSEnableIME)
+ return TRUE;
GetImmFileName(ImmFile, sizeof(ImmFile));
TRACE("File %ws\n",ImmFile);
return TRUE;
}
- if (ImmApiTableZero)
- {
- ImmApiTableZero = FALSE;
- ZeroMemory(&gImmApiEntries, sizeof(Imm32ApiTable));
- }
-
- gImmApiEntries.pImmIsIME = (BOOL (WINAPI*)(HKL)) GetProcAddress(imm32, "ImmIsIME");
- if (!gImmApiEntries.pImmIsIME)
- gImmApiEntries.pImmIsIME = IMM_ImmIsIME;
-
- gImmApiEntries.pImmEscapeA = (LRESULT (WINAPI*)(HKL, HIMC, UINT, LPVOID)) GetProcAddress(imm32, "ImmEscapeA");
- if (!gImmApiEntries.pImmEscapeA)
- gImmApiEntries.pImmEscapeA = IMM_ImmEscapeAW;
-
- gImmApiEntries.pImmEscapeW = (LRESULT (WINAPI*)(HKL, HIMC, UINT, LPVOID)) GetProcAddress(imm32, "ImmEscapeW");
- if (!gImmApiEntries.pImmEscapeW)
- gImmApiEntries.pImmEscapeW = IMM_ImmEscapeAW;
-
- gImmApiEntries.pImmGetCompositionStringA = (LONG (WINAPI*)(HIMC, DWORD, LPVOID, DWORD)) GetProcAddress(imm32, "ImmGetCompositionStringA");
- if (!gImmApiEntries.pImmGetCompositionStringA)
- gImmApiEntries.pImmGetCompositionStringA = IMM_ImmGetCompositionStringAW;
-
- gImmApiEntries.pImmGetCompositionStringW = (LONG (WINAPI*)(HIMC, DWORD, LPVOID, DWORD)) GetProcAddress(imm32, "ImmGetCompositionStringW");
- if (!gImmApiEntries.pImmGetCompositionStringW)
- gImmApiEntries.pImmGetCompositionStringW = IMM_ImmGetCompositionStringAW;
-
- gImmApiEntries.pImmGetCompositionFontA = (BOOL (WINAPI*)(HIMC, LPLOGFONTA)) GetProcAddress(imm32, "ImmGetCompositionFontA");
- if (!gImmApiEntries.pImmGetCompositionFontA)
- gImmApiEntries.pImmGetCompositionFontA = IMM_ImmGetCompositionFontA;
-
- gImmApiEntries.pImmGetCompositionFontW = (BOOL (WINAPI*)(HIMC, LPLOGFONTW)) GetProcAddress(imm32, "ImmGetCompositionFontW");
- if (!gImmApiEntries.pImmGetCompositionFontW)
- gImmApiEntries.pImmGetCompositionFontW = IMM_ImmGetCompositionFontW;
-
- gImmApiEntries.pImmSetCompositionFontA = (BOOL (WINAPI*)(HIMC, LPLOGFONTA)) GetProcAddress(imm32, "ImmSetCompositionFontA");
- if (!gImmApiEntries.pImmSetCompositionFontA)
- gImmApiEntries.pImmSetCompositionFontA = IMM_ImmSetCompositionFontA;
-
- gImmApiEntries.pImmSetCompositionFontW = (BOOL (WINAPI*)(HIMC, LPLOGFONTW)) GetProcAddress(imm32, "ImmSetCompositionFontW");
- if (!gImmApiEntries.pImmSetCompositionFontW)
- gImmApiEntries.pImmSetCompositionFontW = IMM_ImmSetCompositionFontW;
-
- gImmApiEntries.pImmGetCompositionWindow = (BOOL (WINAPI*)(HIMC, LPCOMPOSITIONFORM)) GetProcAddress(imm32, "ImmGetCompositionWindow");
- if (!gImmApiEntries.pImmGetCompositionWindow)
- gImmApiEntries.pImmGetCompositionWindow = IMM_ImmSetGetCompositionWindow;
-
- gImmApiEntries.pImmSetCompositionWindow = (BOOL (WINAPI*)(HIMC, LPCOMPOSITIONFORM)) GetProcAddress(imm32, "ImmSetCompositionWindow");
- if (!gImmApiEntries.pImmSetCompositionWindow)
- gImmApiEntries.pImmSetCompositionWindow = IMM_ImmSetGetCompositionWindow;
-
- gImmApiEntries.pImmAssociateContext = (HIMC (WINAPI*)(HWND, HIMC)) GetProcAddress(imm32, "ImmAssociateContext");
- if (!gImmApiEntries.pImmAssociateContext)
- gImmApiEntries.pImmAssociateContext = IMM_ImmAssociateContext;
-
- gImmApiEntries.pImmReleaseContext = (BOOL (WINAPI*)(HWND, HIMC)) GetProcAddress(imm32, "ImmReleaseContext");
- if (!gImmApiEntries.pImmReleaseContext)
- gImmApiEntries.pImmReleaseContext = IMM_ImmReleaseContext;
-
- gImmApiEntries.pImmGetContext = (HIMC (WINAPI*)(HWND)) GetProcAddress(imm32, "ImmGetContext");
- if (!gImmApiEntries.pImmGetContext)
- gImmApiEntries.pImmGetContext = IMM_ImmGetContext;
-
- gImmApiEntries.pImmGetDefaultIMEWnd = (HWND (WINAPI*)(HWND)) GetProcAddress(imm32, "ImmGetDefaultIMEWnd");
- if (!gImmApiEntries.pImmGetDefaultIMEWnd)
- gImmApiEntries.pImmGetDefaultIMEWnd = IMM_ImmGetDefaultIMEWnd;
-
- gImmApiEntries.pImmNotifyIME = (BOOL (WINAPI*)(HIMC, DWORD, DWORD, DWORD)) GetProcAddress(imm32, "ImmNotifyIME");
- if (!gImmApiEntries.pImmNotifyIME)
- gImmApiEntries.pImmNotifyIME = IMM_ImmNotifyIME;
-
- /*
- * TODO: Load more functions from imm32.dll
- * Function like IMPSetIMEW, IMPQueryIMEW etc. call functions
- * from imm32.dll through pointers in the structure gImmApiEntries.
- * I do not know whether it is necessary to initialize a table
- * of functions to load user32 (DLL_PROCESS_ATTACH)
- */
-
- gImmApiEntries.pImmRegisterClient = (BOOL (WINAPI*)(PVOID, HINSTANCE)) GetProcAddress(imm32, "ImmRegisterClient");
- if (!gImmApiEntries.pImmRegisterClient)
- gImmApiEntries.pImmRegisterClient = IMM_ImmRegisterClient;
-
- gImmApiEntries.pImmProcessKey = (UINT (WINAPI*)(HWND, HKL, UINT, LPARAM, DWORD)) GetProcAddress(imm32, "ImmProcessKey");
- if (!gImmApiEntries.pImmProcessKey)
- gImmApiEntries.pImmProcessKey = IMM_ImmProcessKey;
+/* load imm procedures */
+#undef DEFINE_IMM_ENTRY
+#define DEFINE_IMM_ENTRY(type, name, params, retval, retkind) \
+ do { \
+ FN_##name proc = (FN_##name)GetProcAddress(imm32, #name); \
+ if (proc) { \
+ IMM_FN(name) = proc; \
+ } \
+ } while (0);
+#include "immtable.h"
return TRUE;
}
return FALSE;
}
}
-#if 0 // For real Imm32.dll testing!!!!
- if (ghImm32 && !gImmApiEntries.pImmRegisterClient(&gSharedInfo, ghImm32))
- {
- ERR("Wine is stubed!\n");
- }
-#endif
+
return TRUE;
}
}
/*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
IMPSetIMEW(HWND hwnd, LPIMEPROW ime)
{
- UNIMPLEMENTED;
- return FALSE;
+ return IMM_FN(ImmIMPSetIMEW)(hwnd, ime);
}
/*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
IMPQueryIMEW(LPIMEPROW ime)
{
- UNIMPLEMENTED;
- return FALSE;
+ return IMM_FN(ImmIMPQueryIMEW)(ime);
}
/*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
IMPGetIMEW(HWND hwnd, LPIMEPROW ime)
{
- UNIMPLEMENTED;
- return FALSE;
+ return IMM_FN(ImmIMPGetIMEW)(hwnd, ime);
}
/*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
IMPSetIMEA(HWND hwnd, LPIMEPROA ime)
{
- UNIMPLEMENTED;
- return FALSE;
+ return IMM_FN(ImmIMPSetIMEA)(hwnd, ime);
}
/*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
IMPQueryIMEA(LPIMEPROA ime)
{
- UNIMPLEMENTED;
- return FALSE;
+ return IMM_FN(ImmIMPQueryIMEA)(ime);
}
/*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
IMPGetIMEA(HWND hwnd, LPIMEPROA ime)
{
- UNIMPLEMENTED;
- return FALSE;
+ return IMM_FN(ImmIMPGetIMEA)(hwnd, ime);
}
/*
- * @unimplemented
+ * @implemented
*/
LRESULT
WINAPI
-SendIMEMessageExW(HWND hwnd, LPARAM lparam)
+SendIMEMessageExW(HWND hwnd, LPARAM lParam)
{
- UNIMPLEMENTED;
- return FALSE;
+ return IMM_FN(ImmSendIMEMessageExW)(hwnd, lParam);
}
/*
- * @unimplemented
+ * @implemented
*/
LRESULT
WINAPI
-SendIMEMessageExA(HWND hwnd, LPARAM lparam)
+SendIMEMessageExA(HWND hwnd, LPARAM lParam)
{
- UNIMPLEMENTED;
- return FALSE;
+ return IMM_FN(ImmSendIMEMessageExA)(hwnd, lParam);
}
/*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
WINNLSEnableIME(HWND hwnd, BOOL enable)
{
- UNIMPLEMENTED;
- return FALSE;
+ return IMM_FN(ImmWINNLSEnableIME)(hwnd, enable);
}
/*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
WINNLSGetEnableStatus(HWND hwnd)
{
- UNIMPLEMENTED;
- return FALSE;
+ return IMM_FN(ImmWINNLSGetEnableStatus)(hwnd);
}
/*