From a4d4c07c2f105b3c76874f1850428029c657b7f2 Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Mon, 8 Dec 2008 10:51:33 -0600 Subject: [PATCH] imm32: Implement W/A handling in ImmEscape. --- dlls/imm32/imm.c | 46 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index b03977c4e71..b1ee40f36c8 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