Aric Stewart : imm32: Implement W/A handling in ImmEscape.

Alexandre Julliard julliard at winehq.org
Tue Dec 9 06:25:19 CST 2008


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Mon Dec  8 10:51:33 2008 -0600

imm32: Implement W/A handling in ImmEscape.

---

 dlls/imm32/imm.c |   46 ++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 38 insertions(+), 8 deletions(-)

diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c
index b03977c..b1ee40f 100644
--- a/dlls/imm32/imm.c
+++ b/dlls/imm32/imm.c
@@ -778,6 +778,16 @@ UINT WINAPI ImmEnumRegisterWordW(
         return 0;
 }
 
+static inline BOOL EscapeRequiresWA(UINT uEscape)
+{
+        if (uEscape == IME_ESC_GET_EUDC_DICTIONARY ||
+            uEscape == IME_ESC_SET_EUDC_DICTIONARY ||
+            uEscape == IME_ESC_IME_NAME ||
+            uEscape == IME_ESC_GETHELPFILENAME)
+        return TRUE;
+    return FALSE;
+}
+
 /***********************************************************************
  *		ImmEscapeA (IMM32.@)
  */
@@ -790,13 +800,23 @@ LRESULT WINAPI ImmEscapeA(
 
     if (immHkl->hIME && immHkl->pImeEscape)
     {
-        if (!is_kbd_ime_unicode(immHkl))
+        if (!EscapeRequiresWA(uEscape) || !is_kbd_ime_unicode(immHkl))
             return immHkl->pImeEscape(hIMC,uEscape,lpData);
         else
         {
-            FIXME("A procedure called with W ime back end\n");
-            SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-            return 0;
+            WCHAR buffer[81]; /* largest required buffer should be 80 */
+            LRESULT rc;
+            if (uEscape == IME_ESC_SET_EUDC_DICTIONARY)
+            {
+                MultiByteToWideChar(CP_ACP,0,(LPSTR)lpData,-1,buffer,81);
+                rc = immHkl->pImeEscape(hIMC,uEscape,buffer);
+            }
+            else
+            {
+                rc = immHkl->pImeEscape(hIMC,uEscape,buffer);
+                WideCharToMultiByte(CP_ACP,0,buffer,-1,(LPSTR)lpData,80, NULL, NULL);
+            }
+            return rc;
         }
     }
     else
@@ -815,13 +835,23 @@ LRESULT WINAPI ImmEscapeW(
 
     if (immHkl->hIME && immHkl->pImeEscape)
     {
-        if (is_kbd_ime_unicode(immHkl))
+        if (!EscapeRequiresWA(uEscape) || is_kbd_ime_unicode(immHkl))
             return immHkl->pImeEscape(hIMC,uEscape,lpData);
         else
         {
-            FIXME("W procedure called with A ime back end\n");
-            SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-            return 0;
+            CHAR buffer[81]; /* largest required buffer should be 80 */
+            LRESULT rc;
+            if (uEscape == IME_ESC_SET_EUDC_DICTIONARY)
+            {
+                WideCharToMultiByte(CP_ACP,0,(LPWSTR)lpData,-1,buffer,81, NULL, NULL);
+                rc = immHkl->pImeEscape(hIMC,uEscape,buffer);
+            }
+            else
+            {
+                rc = immHkl->pImeEscape(hIMC,uEscape,buffer);
+                MultiByteToWideChar(CP_ACP,0,buffer,-1,(LPWSTR)lpData,80);
+            }
+            return rc;
         }
     }
     else




More information about the wine-cvs mailing list