Aric Stewart : imm32: Implement ImmConfigureIME using the loaded IME.

Alexandre Julliard julliard at winehq.org
Mon Apr 7 14:46:50 CDT 2008


Module: wine
Branch: master
Commit: 467ab8a0650486346ef21adb2d6c254a645ee752
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=467ab8a0650486346ef21adb2d6c254a645ee752

Author: Aric Stewart <aric at codeweavers.com>
Date:   Wed Apr  2 13:46:45 2008 -0500

imm32: Implement ImmConfigureIME using the loaded IME.

---

 dlls/imm32/imm.c |   84 +++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 74 insertions(+), 10 deletions(-)

diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
index 4ba1d63..ba8dbfc 100644
--- a/dlls/imm32/imm.c
+++ b/dlls/imm32/imm.c
@@ -121,6 +121,32 @@ static void ImmInternalPostIMEMessage(InputContextData*, UINT, WPARAM, LPARAM);
 static void ImmInternalSetOpenStatus(BOOL fOpen);
 static HIMCC updateResultStr(HIMCC old, LPWSTR resultstr, DWORD len);
 
+#define is_kbd_ime_unicode(p)  (p->imeInfo.fdwProperty & IME_PROP_UNICODE)
+
+static inline WCHAR *strdupAtoW( const char *str )
+{
+    WCHAR *ret = NULL;
+    if (str)
+    {
+        DWORD len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 );
+        if ((ret = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
+            MultiByteToWideChar( CP_ACP, 0, str, -1, ret, len );
+    }
+    return ret;
+}
+
+static inline CHAR *strdupWtoA( const WCHAR *str )
+{
+    CHAR *ret = NULL;
+    if (str)
+    {
+        DWORD len = WideCharToMultiByte( CP_ACP, 0, str, -1, NULL, 0, NULL, NULL );
+        if ((ret = HeapAlloc( GetProcessHeap(), 0, len )))
+            WideCharToMultiByte( CP_ACP, 0, str, -1, ret, len, NULL, NULL );
+    }
+    return ret;
+}
+
 /* ImmHkl loading and freeing */
 #define LOAD_FUNCPTR(f) if((ptr->p##f = (LPVOID)GetProcAddress(ptr->hIME, #f)) == NULL){WARN("Can't find function %s in ime\n", #f);}
 static ImmHkl *IMM_GetImmHkl(HKL hkl)
@@ -702,11 +728,30 @@ BOOL WINAPI ImmAssociateContextEx(HWND hWnd, HIMC hIMC, DWORD dwFlags)
 BOOL WINAPI ImmConfigureIMEA(
   HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
 {
-  FIXME("(%p, %p, %d, %p): stub\n",
-    hKL, hWnd, dwMode, lpData
-  );
-  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-  return FALSE;
+    ImmHkl *immHkl = IMM_GetImmHkl(hKL);
+
+    TRACE("(%p, %p, %d, %p):\n", hKL, hWnd, dwMode, lpData);
+
+    if (immHkl->hIME && immHkl->pImeConfigure)
+    {
+        if (dwMode != IME_CONFIG_REGISTERWORD || !is_kbd_ime_unicode(immHkl))
+            return immHkl->pImeConfigure(hKL,hWnd,dwMode,lpData);
+        else
+        {
+            REGISTERWORDW rww;
+            REGISTERWORDA *rwa = (REGISTERWORDA*)lpData;
+            BOOL rc;
+
+            rww.lpReading = strdupAtoW(rwa->lpReading);
+            rww.lpWord = strdupAtoW(rwa->lpWord);
+            rc = immHkl->pImeConfigure(hKL,hWnd,dwMode,&rww);
+            HeapFree(GetProcessHeap(),0,rww.lpReading);
+            HeapFree(GetProcessHeap(),0,rww.lpWord);
+            return rc;
+        }
+    }
+    else
+        return FALSE;
 }
 
 /***********************************************************************
@@ -715,11 +760,30 @@ BOOL WINAPI ImmConfigureIMEA(
 BOOL WINAPI ImmConfigureIMEW(
   HKL hKL, HWND hWnd, DWORD dwMode, LPVOID lpData)
 {
-  FIXME("(%p, %p, %d, %p): stub\n",
-    hKL, hWnd, dwMode, lpData
-  );
-  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-  return FALSE;
+    ImmHkl *immHkl = IMM_GetImmHkl(hKL);
+
+    TRACE("(%p, %p, %d, %p):\n", hKL, hWnd, dwMode, lpData);
+
+    if (immHkl->hIME && immHkl->pImeConfigure)
+    {
+        if (dwMode != IME_CONFIG_REGISTERWORD || is_kbd_ime_unicode(immHkl))
+            return immHkl->pImeConfigure(hKL,hWnd,dwMode,lpData);
+        else
+        {
+            REGISTERWORDW *rww = (REGISTERWORDW*)lpData;
+            REGISTERWORDA rwa;
+            BOOL rc;
+
+            rwa.lpReading = strdupWtoA(rww->lpReading);
+            rwa.lpWord = strdupWtoA(rww->lpWord);
+            rc = immHkl->pImeConfigure(hKL,hWnd,dwMode,&rwa);
+            HeapFree(GetProcessHeap(),0,rwa.lpReading);
+            HeapFree(GetProcessHeap(),0,rwa.lpWord);
+            return rc;
+        }
+    }
+    else
+        return FALSE;
 }
 
 /***********************************************************************




More information about the wine-cvs mailing list