[USER32] Load IMM table (#3215)
[reactos.git] / win32ss / user / user32 / misc / imm.c
index b06bb5d..03e0402 100644 (file)
@@ -3,46 +3,35 @@
  * 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)
 {
@@ -66,11 +55,8 @@ BOOL WINAPI IntInitializeImmEntryTable(VOID)
     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);
@@ -91,91 +77,16 @@ BOOL WINAPI IntInitializeImmEntryTable(VOID)
         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;
 }
@@ -212,12 +123,7 @@ BOOL WINAPI User32InitializeImmEntryTable(DWORD magic)
           return FALSE;
        } 
     }
-#if 0 // For real Imm32.dll testing!!!!
-    if (ghImm32 && !gImmApiEntries.pImmRegisterClient(&gSharedInfo, ghImm32))
-    {
-       ERR("Wine is stubed!\n");
-    }
-#endif
+
     return TRUE;
 }
 
@@ -349,113 +255,103 @@ BOOL WINAPI CliImmSetHotKey(DWORD dwID, UINT uModifiers, UINT uVirtualKey, HKL h
 }
 
 /*
- * @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);
 }
 
 /*