66 * Copyright 2002, 2003, 2007 CodeWeavers, Aric Stewart
77 * Copyright 2017 James Tabor <[email protected] > 88 * Copyright 2018 Amine Khaldi <[email protected] > 9- * Copyright 2020-2022 Katayama Hirofumi MZ <[email protected] > 9+ * Copyright 2020-2025 Katayama Hirofumi MZ <[email protected] > 1010 */
1111
1212#include "precomp.h"
@@ -194,7 +194,6 @@ BOOL APIENTRY Imm32InquireIme(PIMEDPI pImeDpi)
194194#include <imetable.h>
195195#undef DEFINE_IME_ENTRY
196196
197- // Win: LoadIME
198197BOOL APIENTRY Imm32LoadIME (PIMEINFOEX pImeInfoEx , PIMEDPI pImeDpi )
199198{
200199 WCHAR szPath [MAX_PATH ];
@@ -230,6 +229,23 @@ BOOL APIENTRY Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
230229#include <imetable.h>
231230#undef DEFINE_IME_ENTRY
232231
232+ /* Check for Cicero IMEs */
233+ if (!IS_IME_HKL (pImeDpi -> hKL ) && IS_CICERO_MODE () && !IS_CICERO_COMPAT_DISABLED ())
234+ {
235+ #define CHECK_IME_FN (name ) do { \
236+ if (!pImeDpi->name) { \
237+ ERR("'%s' not found in Cicero IME module '%S'.\n", #name, szPath); \
238+ goto Failed; \
239+ } \
240+ } while(0)
241+ CHECK_IME_FN (CtfImeInquireExW );
242+ CHECK_IME_FN (CtfImeSelectEx );
243+ CHECK_IME_FN (CtfImeEscapeEx );
244+ CHECK_IME_FN (CtfImeGetGuidAtom );
245+ CHECK_IME_FN (CtfImeIsGuidMapEnable );
246+ #undef CHECK_IME_FN
247+ }
248+
233249 if (Imm32InquireIme (pImeDpi ))
234250 {
235251 ret = TRUE;
@@ -263,7 +279,6 @@ BOOL APIENTRY Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
263279 return ret ;
264280}
265281
266- // Win: LoadImeDpi
267282PIMEDPI APIENTRY Imm32LoadImeDpi (HKL hKL , BOOL bLock )
268283{
269284 IMEINFOEX ImeInfoEx ;
@@ -272,12 +287,6 @@ PIMEDPI APIENTRY Imm32LoadImeDpi(HKL hKL, BOOL bLock)
272287 UINT uCodePage ;
273288 LCID lcid ;
274289
275- if (!IS_IME_HKL (hKL ))
276- {
277- TRACE ("\n" );
278- return NULL ;
279- }
280-
281290 if (!ImmGetImeInfoEx (& ImeInfoEx , ImeInfoExKeyboardLayout , & hKL ))
282291 {
283292 ERR ("\n" );
@@ -608,45 +617,38 @@ BOOL WINAPI ImmNotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD_PTR dwV
608617BOOL WINAPI
609618ImmGetImeInfoEx (PIMEINFOEX pImeInfoEx , IMEINFOEXCLASS SearchType , PVOID pvSearchKey )
610619{
611- HKL hKL ;
612- if (SearchType == ImeInfoExKeyboardLayout || SearchType == ImeInfoExKeyboardLayoutTFS )
620+ BOOL bTextServiceDisabled = FALSE;
621+
622+ if (SearchType == ImeInfoExKeyboardLayoutTFS )
613623 {
614- hKL = * (HKL * )pvSearchKey ;
615- pImeInfoEx -> hkl = hKL ;
624+ SearchType = ImeInfoExKeyboardLayout ;
625+ bTextServiceDisabled = CtfImmIsTextFrameServiceDisabled ();
626+ }
616627
617- if (SearchType == ImeInfoExKeyboardLayoutTFS )
618- {
619- if (!IS_IME_HKL (hKL ))
620- {
621- if (CtfImmIsTextFrameServiceDisabled () || !IS_CICERO_MODE () || IS_16BIT_MODE ())
622- {
623- TRACE ("\n" );
624- return FALSE;
625- }
626- }
628+ if (SearchType == ImeInfoExKeyboardLayout )
629+ {
630+ HKL hKL = * (HKL * )pvSearchKey ;
631+ pImeInfoEx -> hkl = hKL ;
627632
628- SearchType = ImeInfoExKeyboardLayout ;
629- }
630- else
633+ if (!IS_IME_HKL (hKL ) &&
634+ (!IS_CICERO_MODE () || IS_CICERO_COMPAT_DISABLED () || bTextServiceDisabled ))
631635 {
632- if (!IS_IME_HKL (hKL ))
633- {
634- TRACE ("\n" );
635- return FALSE;
636- }
636+ TRACE ("IME is disabled\n" );
637+ return FALSE;
637638 }
639+
640+ return NtUserGetImeInfoEx (pImeInfoEx , SearchType );
638641 }
639- else if (SearchType == ImeInfoExImeFileName )
640- {
641- StringCchCopyW (pImeInfoEx -> wszImeFile , _countof (pImeInfoEx -> wszImeFile ),
642- pvSearchKey );
643- }
644- else
642+
643+ if (SearchType == ImeInfoExImeFileName )
645644 {
646- return FALSE;
645+ StringCchCopyW (pImeInfoEx -> wszImeFile , _countof (pImeInfoEx -> wszImeFile ), pvSearchKey );
646+ return NtUserGetImeInfoEx (pImeInfoEx , SearchType );
647647 }
648648
649- return NtUserGetImeInfoEx (pImeInfoEx , SearchType );
649+ /* NOTE: ImeInfoExImeWindow is ignored */
650+ ERR ("SearchType: %d\n" , SearchType );
651+ return FALSE;
650652}
651653
652654/***********************************************************************
@@ -763,12 +765,6 @@ UINT WINAPI ImmGetDescriptionA(HKL hKL, LPSTR lpszDescription, UINT uBufLen)
763765
764766 TRACE ("(%p,%p,%d)\n" , hKL , lpszDescription , uBufLen );
765767
766- if (!IS_IME_HKL (hKL ))
767- {
768- TRACE ("\n" );
769- return 0 ;
770- }
771-
772768 if (!ImmGetImeInfoEx (& info , ImeInfoExKeyboardLayout , & hKL ))
773769 {
774770 ERR ("\n" );
@@ -793,12 +789,6 @@ UINT WINAPI ImmGetDescriptionW(HKL hKL, LPWSTR lpszDescription, UINT uBufLen)
793789
794790 TRACE ("(%p, %p, %d)\n" , hKL , lpszDescription , uBufLen );
795791
796- if (!IS_IME_HKL (hKL ))
797- {
798- TRACE ("\n" );
799- return 0 ;
800- }
801-
802792 if (!ImmGetImeInfoEx (& info , ImeInfoExKeyboardLayout , & hKL ))
803793 {
804794 ERR ("\n" );
@@ -823,14 +813,6 @@ UINT WINAPI ImmGetIMEFileNameA( HKL hKL, LPSTR lpszFileName, UINT uBufLen)
823813
824814 TRACE ("(%p, %p, %u)\n" , hKL , lpszFileName , uBufLen );
825815
826- if (!IS_IME_HKL (hKL ))
827- {
828- TRACE ("\n" );
829- if (uBufLen > 0 )
830- lpszFileName [0 ] = 0 ;
831- return 0 ;
832- }
833-
834816 if (!ImmGetImeInfoEx (& info , ImeInfoExKeyboardLayout , & hKL ))
835817 {
836818 ERR ("\n" );
@@ -863,14 +845,6 @@ UINT WINAPI ImmGetIMEFileNameW(HKL hKL, LPWSTR lpszFileName, UINT uBufLen)
863845
864846 TRACE ("(%p, %p, %u)\n" , hKL , lpszFileName , uBufLen );
865847
866- if (!IS_IME_HKL (hKL ))
867- {
868- TRACE ("\n" );
869- if (uBufLen > 0 )
870- lpszFileName [0 ] = 0 ;
871- return 0 ;
872- }
873-
874848 if (!ImmGetImeInfoEx (& info , ImeInfoExKeyboardLayout , & hKL ))
875849 {
876850 ERR ("\n" );
@@ -904,12 +878,6 @@ DWORD WINAPI ImmGetProperty(HKL hKL, DWORD fdwIndex)
904878
905879 TRACE ("(%p, %lu)\n" , hKL , fdwIndex );
906880
907- if (!IS_IME_HKL (hKL ))
908- {
909- TRACE ("\n" );
910- return FALSE;
911- }
912-
913881 if (!ImmGetImeInfoEx (& ImeInfoEx , ImeInfoExKeyboardLayout , & hKL ))
914882 {
915883 ERR ("\n" );
0 commit comments