[MSCTFIME][SDK] Improve human readability (#6240)

Improve code quality.
JIRA issue: CORE-19360
- Add some SAL annotations.
- Add readable comments more.
- Rename some member variables.
This commit is contained in:
Katayama Hirofumi MZ 2024-01-01 11:05:49 +09:00 committed by GitHub
parent d6c70f0864
commit e5548aa501
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 172 additions and 116 deletions

View file

@ -37,7 +37,7 @@ UINT WM_MSIME_KEYMAP = 0;
/** /**
* @implemented * @implemented
*/ */
BOOL IsMsImeMessage(UINT uMsg) BOOL IsMsImeMessage(_In_ UINT uMsg)
{ {
return (uMsg == WM_MSIME_SERVICE || return (uMsg == WM_MSIME_SERVICE ||
uMsg == WM_MSIME_UIREADY || uMsg == WM_MSIME_UIREADY ||
@ -82,6 +82,9 @@ BOOL RegisterMSIMEMessage(VOID)
typedef BOOLEAN (WINAPI *FN_DllShutDownInProgress)(VOID); typedef BOOLEAN (WINAPI *FN_DllShutDownInProgress)(VOID);
/** /**
* This function calls ntdll!RtlDllShutdownInProgress.
* It can detect the system is shutting down or not.
*
* @implemented * @implemented
*/ */
EXTERN_C BOOLEAN WINAPI EXTERN_C BOOLEAN WINAPI
@ -103,6 +106,8 @@ DllShutDownInProgress(VOID)
} }
/** /**
* This function checks if the current user logon session is interactive.
*
* @implemented * @implemented
*/ */
static BOOL static BOOL
@ -160,9 +165,11 @@ HRESULT UninitDisplayAttrbuteLib(PCIC_LIBTHREAD pLibThread)
} }
/** /**
* Gets the charset from a language ID.
*
* @implemented * @implemented
*/ */
BYTE GetCharsetFromLangId(DWORD dwValue) BYTE GetCharsetFromLangId(_In_ DWORD dwValue)
{ {
CHARSETINFO info; CHARSETINFO info;
if (!::TranslateCharsetInfo((DWORD*)(DWORD_PTR)dwValue, &info, TCI_SRCLOCALE)) if (!::TranslateCharsetInfo((DWORD*)(DWORD_PTR)dwValue, &info, TCI_SRCLOCALE))
@ -171,10 +178,15 @@ BYTE GetCharsetFromLangId(DWORD dwValue)
} }
/** /**
* Selects or unselects the input context.
*
* @implemented * @implemented
*/ */
HRESULT HRESULT
InternalSelectEx(HIMC hIMC, BOOL fSelect, LANGID LangID) InternalSelectEx(
_In_ HIMC hIMC,
_In_ BOOL fSelect,
_In_ LANGID LangID)
{ {
CicIMCLock imcLock(hIMC); CicIMCLock imcLock(hIMC);
if (!imcLock) if (!imcLock)
@ -574,45 +586,49 @@ HRESULT CCompartmentEventSink::_Unadvise()
return S_OK; return S_OK;
} }
/***********************************************************************
* CicInputContext
*/
class CInputContextOwnerCallBack; class CInputContextOwnerCallBack;
/* FIXME */ /***********************************************************************
* CicInputContext
*
* The msctfime.ime's input context.
*/
class CicInputContext class CicInputContext
: public ITfCleanupContextSink : public ITfCleanupContextSink
, public ITfContextOwnerCompositionSink , public ITfContextOwnerCompositionSink
, public ITfCompositionSink , public ITfCompositionSink
{ {
public: public:
DWORD m_dw[2]; ITfContextOwnerCompositionSink *m_pContextOwnerCompositionSink;
DWORD m_dwUnknown0;
LONG m_cRefs; LONG m_cRefs;
HIMC m_hIMC; HIMC m_hIMC;
ITfDocumentMgr *m_pDocumentMgr; ITfDocumentMgr *m_pDocumentMgr;
ITfContext *m_pContext; ITfContext *m_pContext;
DWORD m_dw0_0[1]; DWORD m_dwUnknown1;
CInputContextOwnerCallBack *m_pICOwnerCallback; CInputContextOwnerCallBack *m_pICOwnerCallback;
DWORD m_dw0; LPVOID m_pTextEventSink;
CCompartmentEventSink *m_pCompEventSink1; CCompartmentEventSink *m_pCompEventSink1;
CCompartmentEventSink *m_pCompEventSink2; CCompartmentEventSink *m_pCompEventSink2;
DWORD m_dw0_5[4]; DWORD m_dwUnknown3[4];
DWORD m_dw1[2]; DWORD m_dwUnknown4[2];
DWORD m_dwQueryPos; DWORD m_dwQueryPos;
DWORD m_dw1_5[1]; DWORD m_dwUnknown5;
GUID m_guid; GUID m_guid;
DWORD m_dw2[19]; DWORD m_dwUnknown6[11];
BOOL m_bSelecting;
DWORD m_dwUnknown7[7];
WORD m_cGuidAtoms; WORD m_cGuidAtoms;
WORD m_padding; WORD m_padding;
DWORD m_adwGuidAtoms[256]; DWORD m_adwGuidAtoms[256];
DWORD m_dw3[19]; DWORD m_dwUnknown8[19];
public: public:
CicInputContext(TfClientId cliendId, PCIC_LIBTHREAD pLibThread, HIMC hIMC); CicInputContext(
virtual ~CicInputContext() _In_ TfClientId cliendId,
{ _Inout_ PCIC_LIBTHREAD pLibThread,
} _In_ HIMC hIMC);
virtual ~CicInputContext() { }
// IUnknown interface // IUnknown interface
STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppvObj) override; STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppvObj) override;
@ -620,7 +636,7 @@ public:
STDMETHODIMP_(ULONG) Release() override; STDMETHODIMP_(ULONG) Release() override;
// ITfCleanupContextSink interface // ITfCleanupContextSink interface
STDMETHODIMP OnCleanupContext(TfEditCookie ecWrite, ITfContext *pic) override; STDMETHODIMP OnCleanupContext(_In_ TfEditCookie ecWrite, _Inout_ ITfContext *pic) override;
// ITfContextOwnerCompositionSink interface // ITfContextOwnerCompositionSink interface
STDMETHODIMP OnStartComposition(ITfCompositionView *pComposition, BOOL *pfOk) override; STDMETHODIMP OnStartComposition(ITfCompositionView *pComposition, BOOL *pfOk) override;
@ -636,14 +652,17 @@ public:
_In_ BYTE iAtom, _In_ BYTE iAtom,
_Out_opt_ LPDWORD pdwGuidAtom); _Out_opt_ LPDWORD pdwGuidAtom);
HRESULT CreateInputContext(ITfThreadMgr *pThreadMgr, CicIMCLock& imcLock); HRESULT CreateInputContext(_Inout_ ITfThreadMgr *pThreadMgr, _Inout_ CicIMCLock& imcLock);
HRESULT DestroyInputContext(); HRESULT DestroyInputContext();
}; };
/** /**
* @unimplemented * @unimplemented
*/ */
CicInputContext::CicInputContext(TfClientId cliendId, PCIC_LIBTHREAD pLibThread, HIMC hIMC) CicInputContext::CicInputContext(
_In_ TfClientId cliendId,
_Inout_ PCIC_LIBTHREAD pLibThread,
_In_ HIMC hIMC)
{ {
m_hIMC = hIMC; m_hIMC = hIMC;
m_guid = GUID_NULL; m_guid = GUID_NULL;
@ -757,7 +776,9 @@ CicInputContext::GetGuidAtom(
* @unimplemented * @unimplemented
*/ */
HRESULT HRESULT
CicInputContext::CreateInputContext(ITfThreadMgr *pThreadMgr, CicIMCLock& imcLock) CicInputContext::CreateInputContext(
_Inout_ ITfThreadMgr *pThreadMgr,
_Inout_ CicIMCLock& imcLock)
{ {
//FIXME //FIXME
return E_NOTIMPL; return E_NOTIMPL;
@ -783,6 +804,8 @@ CicInputContext::OnCompositionTerminated(TfEditCookie ecWrite, ITfComposition *p
} }
/** /**
* Retrieves the IME information.
*
* @implemented * @implemented
*/ */
HRESULT HRESULT
@ -872,12 +895,12 @@ protected:
public: public:
CThreadMgrEventSink( CThreadMgrEventSink(
FN_INITDOCMGR fnInit, _In_ FN_INITDOCMGR fnInit,
FN_PUSHPOP fnPushPop = NULL, _In_ FN_PUSHPOP fnPushPop = NULL,
LPVOID pvCallbackPV = NULL); _Inout_ LPVOID pvCallbackPV = NULL);
virtual ~CThreadMgrEventSink() { } virtual ~CThreadMgrEventSink() { }
void SetCallbackPV(LPVOID pv); void SetCallbackPV(_Inout_ LPVOID pv);
HRESULT _Advise(ITfThreadMgr *pThreadMgr); HRESULT _Advise(ITfThreadMgr *pThreadMgr);
HRESULT _Unadvise(); HRESULT _Unadvise();
@ -904,9 +927,9 @@ public:
* @implemented * @implemented
*/ */
CThreadMgrEventSink::CThreadMgrEventSink( CThreadMgrEventSink::CThreadMgrEventSink(
FN_INITDOCMGR fnInit, _In_ FN_INITDOCMGR fnInit,
FN_PUSHPOP fnPushPop, _In_ FN_PUSHPOP fnPushPop,
LPVOID pvCallbackPV) _Inout_ LPVOID pvCallbackPV)
{ {
m_fnInit = fnInit; m_fnInit = fnInit;
m_fnPushPop = fnPushPop; m_fnPushPop = fnPushPop;
@ -996,7 +1019,7 @@ STDMETHODIMP CThreadMgrEventSink::OnPopContext(ITfContext *pic)
return m_fnPushPop(4, pic, m_pCallbackPV); return m_fnPushPop(4, pic, m_pCallbackPV);
} }
void CThreadMgrEventSink::SetCallbackPV(LPVOID pv) void CThreadMgrEventSink::SetCallbackPV(_Inout_ LPVOID pv)
{ {
if (!m_pCallbackPV) if (!m_pCallbackPV)
m_pCallbackPV = pv; m_pCallbackPV = pv;
@ -1052,7 +1075,7 @@ HRESULT CThreadMgrEventSink::_Unadvise()
class CFunctionProvider : public IUnknown class CFunctionProvider : public IUnknown
{ {
public: public:
CFunctionProvider(TfClientId clientId) CFunctionProvider(_In_ TfClientId clientId)
{ {
} }
@ -1091,8 +1114,8 @@ class CicBridge : public ITfSysHookSink
{ {
protected: protected:
LONG m_cRefs; LONG m_cRefs;
DWORD m_dwImmxInit; BOOL m_bImmxInited;
DWORD m_dw[1]; BOOL m_bUnknown1;
BOOL m_bDeactivating; BOOL m_bDeactivating;
DWORD m_cActivateLocks; DWORD m_cActivateLocks;
ITfKeystrokeMgr *m_pKeystrokeMgr; ITfKeystrokeMgr *m_pKeystrokeMgr;
@ -1100,7 +1123,7 @@ protected:
CThreadMgrEventSink *m_pThreadMgrEventSink; CThreadMgrEventSink *m_pThreadMgrEventSink;
TfClientId m_cliendId; TfClientId m_cliendId;
CIC_LIBTHREAD m_LibThread; CIC_LIBTHREAD m_LibThread;
DWORD m_dw21; BOOL m_bUnknown2;
static BOOL CALLBACK EnumCreateInputContextCallback(HIMC hIMC, LPARAM lParam); static BOOL CALLBACK EnumCreateInputContextCallback(HIMC hIMC, LPARAM lParam);
static BOOL CALLBACK EnumDestroyInputContextCallback(HIMC hIMC, LPARAM lParam); static BOOL CALLBACK EnumDestroyInputContextCallback(HIMC hIMC, LPARAM lParam);
@ -1119,32 +1142,41 @@ public:
STDMETHODIMP OnSysKeyboardProc(UINT, LONG) override; STDMETHODIMP OnSysKeyboardProc(UINT, LONG) override;
STDMETHODIMP OnSysShellProc(INT, UINT, LONG) override; STDMETHODIMP OnSysShellProc(INT, UINT, LONG) override;
HRESULT InitIMMX(TLS *pTLS); HRESULT InitIMMX(_Inout_ TLS *pTLS);
BOOL UnInitIMMX(TLS *pTLS); BOOL UnInitIMMX(_Inout_ TLS *pTLS);
HRESULT ActivateIMMX(TLS *pTLS, ITfThreadMgr_P *pThreadMgr); HRESULT ActivateIMMX(_Inout_ TLS *pTLS, _Inout_ ITfThreadMgr_P *pThreadMgr);
HRESULT DeactivateIMMX(TLS *pTLS, ITfThreadMgr_P *pThreadMgr); HRESULT DeactivateIMMX(_Inout_ TLS *pTLS, _Inout_ ITfThreadMgr_P *pThreadMgr);
HRESULT CreateInputContext(TLS *pTLS, HIMC hIMC); HRESULT CreateInputContext(TLS *pTLS, HIMC hIMC);
HRESULT DestroyInputContext(TLS *pTLS, HIMC hIMC); HRESULT DestroyInputContext(TLS *pTLS, HIMC hIMC);
ITfContext *GetInputContext(CicIMCCLock<CTFIMECONTEXT>& imeContext); ITfContext *GetInputContext(CicIMCCLock<CTFIMECONTEXT>& imeContext);
HRESULT SelectEx( HRESULT SelectEx(
TLS *pTLS, _Inout_ TLS *pTLS,
ITfThreadMgr_P *pThreadMgr, _Inout_ ITfThreadMgr_P *pThreadMgr,
HIMC hIMC, _In_ HIMC hIMC,
BOOL fSelect, _In_ BOOL fSelect,
HKL hKL); _In_ HKL hKL);
HRESULT OnSetOpenStatus( HRESULT OnSetOpenStatus(
TLS *pTLS, TLS *pTLS,
ITfThreadMgr_P *pThreadMgr, ITfThreadMgr_P *pThreadMgr,
CicIMCLock& imcLock, CicIMCLock& imcLock,
CicInputContext *pCicIC); CicInputContext *pCicIC);
void PostTransMsg(HWND hWnd, INT cTransMsgs, LPTRANSMSG pTransMsgs); void PostTransMsg(_In_ HWND hWnd, _In_ INT cTransMsgs, _In_ const TRANSMSG *pTransMsgs);
void GetDocumentManager(CicIMCCLock<CTFIMECONTEXT>& imeContext); void GetDocumentManager(_Inout_ CicIMCCLock<CTFIMECONTEXT>& imeContext);
HRESULT ConfigureGeneral(TLS* pTLS, ITfThreadMgr *pThreadMgr, HKL hKL, HWND hWnd); HRESULT
HRESULT ConfigureRegisterWord(TLS* pTLS, ITfThreadMgr *pThreadMgr, HKL hKL, HWND hWnd, LPVOID lpData); ConfigureGeneral(_Inout_ TLS* pTLS,
_In_ ITfThreadMgr *pThreadMgr,
_In_ HKL hKL,
_In_ HWND hWnd);
HRESULT ConfigureRegisterWord(
_Inout_ TLS* pTLS,
_In_ ITfThreadMgr *pThreadMgr,
_In_ HKL hKL,
_In_ HWND hWnd,
_Inout_opt_ LPVOID lpData);
}; };
class CActiveLanguageProfileNotifySink : public ITfActiveLanguageProfileNotifySink class CActiveLanguageProfileNotifySink : public ITfActiveLanguageProfileNotifySink
@ -1158,7 +1190,7 @@ protected:
LPVOID m_pUserData; LPVOID m_pUserData;
public: public:
CActiveLanguageProfileNotifySink(FN_COMPARE fnCompare, void *pUserData); CActiveLanguageProfileNotifySink(_In_ FN_COMPARE fnCompare, _Inout_opt_ void *pUserData);
virtual ~CActiveLanguageProfileNotifySink(); virtual ~CActiveLanguageProfileNotifySink();
HRESULT _Advise(ITfThreadMgr *pThreadMgr); HRESULT _Advise(ITfThreadMgr *pThreadMgr);
@ -1181,8 +1213,8 @@ public:
* @implemented * @implemented
*/ */
CActiveLanguageProfileNotifySink::CActiveLanguageProfileNotifySink( CActiveLanguageProfileNotifySink::CActiveLanguageProfileNotifySink(
FN_COMPARE fnCompare, _In_ FN_COMPARE fnCompare,
void *pUserData) _Inout_opt_ void *pUserData)
{ {
m_dwConnection = (DWORD)-1; m_dwConnection = (DWORD)-1;
m_fnCompare = fnCompare; m_fnCompare = fnCompare;
@ -1322,7 +1354,7 @@ protected:
UINT m_nCodePage; UINT m_nCodePage;
LANGID m_LangID2; LANGID m_LangID2;
WORD m_padding2; WORD m_padding2;
DWORD m_dw3[1]; DWORD m_dwUnknown1;
LONG m_cRefs; LONG m_cRefs;
static INT CALLBACK static INT CALLBACK
@ -1341,11 +1373,15 @@ public:
STDMETHODIMP_(ULONG) AddRef() override; STDMETHODIMP_(ULONG) AddRef() override;
STDMETHODIMP_(ULONG) Release() override; STDMETHODIMP_(ULONG) Release() override;
HRESULT GetActiveLanguageProfile(HKL hKL, REFGUID rguid, TF_LANGUAGEPROFILE *pProfile); HRESULT
HRESULT GetLangId(LANGID *pLangID); GetActiveLanguageProfile(
HRESULT GetCodePageA(UINT *puCodePage); _In_ HKL hKL,
_In_ REFGUID rguid,
_Out_ TF_LANGUAGEPROFILE *pProfile);
HRESULT GetLangId(_Out_ LANGID *pLangID);
HRESULT GetCodePageA(_Out_ UINT *puCodePage);
HRESULT InitProfileInstance(TLS *pTLS); HRESULT InitProfileInstance(_Inout_ TLS *pTLS);
}; };
/** /**
@ -1360,7 +1396,7 @@ CicProfile::CicProfile()
m_LangID1 = 0; m_LangID1 = 0;
m_nCodePage = CP_ACP; m_nCodePage = CP_ACP;
m_LangID2 = 0; m_LangID2 = 0;
m_dw3[0] = 0; m_dwUnknown1 = 0;
} }
/** /**
@ -1433,7 +1469,7 @@ CicProfile::ActiveLanguageProfileNotifySinkCallback(
/** /**
* @implemented * @implemented
*/ */
HRESULT CicProfile::GetCodePageA(UINT *puCodePage) HRESULT CicProfile::GetCodePageA(_Out_ UINT *puCodePage)
{ {
if (!puCodePage) if (!puCodePage)
return E_INVALIDARG; return E_INVALIDARG;
@ -1466,7 +1502,7 @@ HRESULT CicProfile::GetCodePageA(UINT *puCodePage)
/** /**
* @implemented * @implemented
*/ */
HRESULT CicProfile::GetLangId(LANGID *pLangID) HRESULT CicProfile::GetLangId(_Out_ LANGID *pLangID)
{ {
*pLangID = 0; *pLangID = 0;
@ -1500,7 +1536,8 @@ public:
ITfThreadMgr_P *m_pThreadMgr; ITfThreadMgr_P *m_pThreadMgr;
DWORD m_dwFlags1; DWORD m_dwFlags1;
DWORD m_dwFlags2; DWORD m_dwFlags2;
DWORD m_dwUnknown2[2]; DWORD m_dwUnknown2;
BOOL m_bDestroyed;
DWORD m_dwNowOpening; DWORD m_dwNowOpening;
DWORD m_NonEAComposition; DWORD m_NonEAComposition;
DWORD m_cWnds; DWORD m_cWnds;
@ -1574,8 +1611,8 @@ TLS* TLS::InternalAllocateTLS()
return NULL; return NULL;
} }
pTLS->m_dwUnknown2[0] |= 1; pTLS->m_dwFlags1 |= 1;
pTLS->m_dwUnknown2[2] |= 1; pTLS->m_dwUnknown2 |= 1;
return pTLS; return pTLS;
} }
@ -1604,7 +1641,7 @@ BOOL TLS::InternalDestroyTLS()
* @implemented * @implemented
*/ */
HRESULT HRESULT
CicProfile::InitProfileInstance(TLS *pTLS) CicProfile::InitProfileInstance(_Inout_ TLS *pTLS)
{ {
HRESULT hr = TF_CreateInputProcessorProfiles(&m_pIPProfiles); HRESULT hr = TF_CreateInputProcessorProfiles(&m_pIPProfiles);
if (FAILED(hr)) if (FAILED(hr))
@ -1633,7 +1670,10 @@ CicProfile::InitProfileInstance(TLS *pTLS)
/** /**
* @implemented * @implemented
*/ */
STDMETHODIMP CicInputContext::OnCleanupContext(TfEditCookie ecWrite, ITfContext *pic) STDMETHODIMP
CicInputContext::OnCleanupContext(
_In_ TfEditCookie ecWrite,
_Inout_ ITfContext *pic)
{ {
TLS *pTLS = TLS::PeekTLS(); TLS *pTLS = TLS::PeekTLS();
if (!pTLS || !pTLS->m_pProfile) if (!pTLS || !pTLS->m_pProfile)
@ -1686,10 +1726,10 @@ STDMETHODIMP CicInputContext::OnCleanupContext(TfEditCookie ecWrite, ITfContext
CicBridge::CicBridge() CicBridge::CicBridge()
{ {
m_dwImmxInit &= ~1; m_bImmxInited = FALSE;
m_dw[0] &= ~1; m_bUnknown1 = FALSE;
m_bDeactivating = FALSE; m_bDeactivating = FALSE;
m_dw21 &= ~1; m_bUnknown2 = FALSE;
m_pKeystrokeMgr = NULL; m_pKeystrokeMgr = NULL;
m_pDocMgr = NULL; m_pDocMgr = NULL;
m_pThreadMgrEventSink = NULL; m_pThreadMgrEventSink = NULL;
@ -1747,7 +1787,7 @@ CicBridge::~CicBridge()
UnInitIMMX(pTLS); UnInitIMMX(pTLS);
} }
void CicBridge::GetDocumentManager(CicIMCCLock<CTFIMECONTEXT>& imeContext) void CicBridge::GetDocumentManager(_Inout_ CicIMCCLock<CTFIMECONTEXT>& imeContext)
{ {
CicInputContext *pCicIC = imeContext.get().m_pCicIC; CicInputContext *pCicIC = imeContext.get().m_pCicIC;
if (pCicIC) if (pCicIC)
@ -1765,7 +1805,10 @@ void CicBridge::GetDocumentManager(CicIMCCLock<CTFIMECONTEXT>& imeContext)
/** /**
* @unimplemented * @unimplemented
*/ */
HRESULT CicBridge::CreateInputContext(TLS *pTLS, HIMC hIMC) HRESULT
CicBridge::CreateInputContext(
_Inout_ TLS *pTLS,
_In_ HIMC hIMC)
{ {
CicIMCLock imcLock(hIMC); CicIMCLock imcLock(hIMC);
HRESULT hr = imcLock.m_hr; HRESULT hr = imcLock.m_hr;
@ -1888,15 +1931,16 @@ HRESULT CicBridge::OnSetOpenStatus(
} }
/** /**
* Selects the IME context.
* @implemented * @implemented
*/ */
HRESULT HRESULT
CicBridge::SelectEx( CicBridge::SelectEx(
TLS *pTLS, _Inout_ TLS *pTLS,
ITfThreadMgr_P *pThreadMgr, _Inout_ ITfThreadMgr_P *pThreadMgr,
HIMC hIMC, _In_ HIMC hIMC,
BOOL fSelect, _In_ BOOL fSelect,
HKL hKL) _In_ HKL hKL)
{ {
CicIMCLock imcLock(hIMC); CicIMCLock imcLock(hIMC);
if (FAILED(imcLock.m_hr)) if (FAILED(imcLock.m_hr))
@ -1910,12 +1954,12 @@ CicBridge::SelectEx(
CicInputContext *pCicIC = imeContext.get().m_pCicIC; CicInputContext *pCicIC = imeContext.get().m_pCicIC;
if (pCicIC) if (pCicIC)
pCicIC->m_dw2[11] |= 1; pCicIC->m_bSelecting = TRUE;
if (fSelect) if (fSelect)
{ {
if (pCicIC) if (pCicIC)
pCicIC->m_dw2[1] &= ~1; pCicIC->m_dwUnknown6[1] &= ~1;
if (imcLock.get().fOpen) if (imcLock.get().fOpen)
OnSetOpenStatus(pTLS, pThreadMgr, imcLock, pCicIC); OnSetOpenStatus(pTLS, pThreadMgr, imcLock, pCicIC);
} }
@ -1924,7 +1968,7 @@ CicBridge::SelectEx(
ITfContext *pContext = GetInputContext(imeContext); ITfContext *pContext = GetInputContext(imeContext);
pThreadMgr->RequestPostponedLock(pContext); pThreadMgr->RequestPostponedLock(pContext);
if (pCicIC) if (pCicIC)
pCicIC->m_dw2[11] &= ~1; pCicIC->m_bSelecting = FALSE;
if (pContext) if (pContext)
pContext->Release(); pContext->Release();
} }
@ -1932,6 +1976,10 @@ CicBridge::SelectEx(
return imeContext.m_hr; return imeContext.m_hr;
} }
/**
* Used in CicBridge::EnumCreateInputContextCallback and
* CicBridge::EnumDestroyInputContextCallback.
*/
typedef struct ENUM_CREATE_DESTROY_IC typedef struct ENUM_CREATE_DESTROY_IC
{ {
TLS *m_pTLS; TLS *m_pTLS;
@ -1939,6 +1987,7 @@ typedef struct ENUM_CREATE_DESTROY_IC
} ENUM_CREATE_DESTROY_IC, *PENUM_CREATE_DESTROY_IC; } ENUM_CREATE_DESTROY_IC, *PENUM_CREATE_DESTROY_IC;
/** /**
* Creates input context for the current thread.
* @implemented * @implemented
*/ */
BOOL CALLBACK CicBridge::EnumCreateInputContextCallback(HIMC hIMC, LPARAM lParam) BOOL CALLBACK CicBridge::EnumCreateInputContextCallback(HIMC hIMC, LPARAM lParam)
@ -1949,6 +1998,7 @@ BOOL CALLBACK CicBridge::EnumCreateInputContextCallback(HIMC hIMC, LPARAM lParam
} }
/** /**
* Destroys input context for the current thread.
* @implemented * @implemented
*/ */
BOOL CALLBACK CicBridge::EnumDestroyInputContextCallback(HIMC hIMC, LPARAM lParam) BOOL CALLBACK CicBridge::EnumDestroyInputContextCallback(HIMC hIMC, LPARAM lParam)
@ -1961,7 +2011,10 @@ BOOL CALLBACK CicBridge::EnumDestroyInputContextCallback(HIMC hIMC, LPARAM lPara
/** /**
* @implemented * @implemented
*/ */
HRESULT CicBridge::ActivateIMMX(TLS *pTLS, ITfThreadMgr_P *pThreadMgr) HRESULT
CicBridge::ActivateIMMX(
_Inout_ TLS *pTLS,
_Inout_ ITfThreadMgr_P *pThreadMgr)
{ {
HRESULT hr = pThreadMgr->ActivateEx(&m_cliendId, 1); HRESULT hr = pThreadMgr->ActivateEx(&m_cliendId, 1);
if (hr != S_OK) if (hr != S_OK)
@ -2006,7 +2059,7 @@ HRESULT CicBridge::ActivateIMMX(TLS *pTLS, ITfThreadMgr_P *pThreadMgr)
pThreadMgr->SetSysHookSink(this); pThreadMgr->SetSysHookSink(this);
hr = S_OK; hr = S_OK;
if (pTLS->m_dwUnknown2[1] & 1) if (pTLS->m_bDestroyed)
{ {
ENUM_CREATE_DESTROY_IC Data = { pTLS, this }; ENUM_CREATE_DESTROY_IC Data = { pTLS, this };
ImmEnumInputContext(0, CicBridge::EnumCreateInputContextCallback, (LPARAM)&Data); ImmEnumInputContext(0, CicBridge::EnumCreateInputContextCallback, (LPARAM)&Data);
@ -2023,7 +2076,10 @@ Finish:
/** /**
* @implemented * @implemented
*/ */
HRESULT CicBridge::DeactivateIMMX(TLS *pTLS, ITfThreadMgr_P *pThreadMgr) HRESULT
CicBridge::DeactivateIMMX(
_Inout_ TLS *pTLS,
_Inout_ ITfThreadMgr_P *pThreadMgr)
{ {
if (m_bDeactivating) if (m_bDeactivating)
return TRUE; return TRUE;
@ -2034,7 +2090,7 @@ HRESULT CicBridge::DeactivateIMMX(TLS *pTLS, ITfThreadMgr_P *pThreadMgr)
{ {
ENUM_CREATE_DESTROY_IC Data = { pTLS, this }; ENUM_CREATE_DESTROY_IC Data = { pTLS, this };
ImmEnumInputContext(0, CicBridge::EnumDestroyInputContextCallback, (LPARAM)&Data); ImmEnumInputContext(0, CicBridge::EnumDestroyInputContextCallback, (LPARAM)&Data);
pTLS->m_dwUnknown2[1] |= 1; pTLS->m_bDestroyed = TRUE;
ITfSourceSingle *pSource = NULL; ITfSourceSingle *pSource = NULL;
if (pThreadMgr->QueryInterface(IID_ITfSourceSingle, (void **)&pSource) == S_OK) if (pThreadMgr->QueryInterface(IID_ITfSourceSingle, (void **)&pSource) == S_OK)
@ -2068,9 +2124,10 @@ HRESULT CicBridge::DeactivateIMMX(TLS *pTLS, ITfThreadMgr_P *pThreadMgr)
/** /**
* @implemented * @implemented
*/ */
HRESULT CicBridge::InitIMMX(TLS *pTLS) HRESULT
CicBridge::InitIMMX(_Inout_ TLS *pTLS)
{ {
if (m_dwImmxInit & 1) if (m_bImmxInited)
return S_OK; return S_OK;
HRESULT hr = S_OK; HRESULT hr = S_OK;
@ -2130,14 +2187,14 @@ HRESULT CicBridge::InitIMMX(TLS *pTLS)
return E_FAIL; return E_FAIL;
} }
m_dwImmxInit |= 1; m_bImmxInited = TRUE;
return S_OK; return S_OK;
} }
/** /**
* @implemented * @implemented
*/ */
BOOL CicBridge::UnInitIMMX(TLS *pTLS) BOOL CicBridge::UnInitIMMX(_Inout_ TLS *pTLS)
{ {
UninitDisplayAttrbuteLib(&m_LibThread); UninitDisplayAttrbuteLib(&m_LibThread);
TFUninitLib_Thread(&m_LibThread); TFUninitLib_Thread(&m_LibThread);
@ -2167,7 +2224,7 @@ BOOL CicBridge::UnInitIMMX(TLS *pTLS)
pTLS->m_pThreadMgr = NULL; pTLS->m_pThreadMgr = NULL;
} }
m_dwImmxInit &= ~1; m_bImmxInited = FALSE;
return TRUE; return TRUE;
} }
@ -2198,7 +2255,11 @@ STDMETHODIMP CicBridge::OnSysShellProc(INT, UINT, LONG)
/** /**
* @implemented * @implemented
*/ */
void CicBridge::PostTransMsg(HWND hWnd, INT cTransMsgs, LPTRANSMSG pTransMsgs) void
CicBridge::PostTransMsg(
_In_ HWND hWnd,
_In_ INT cTransMsgs,
_In_ const TRANSMSG *pTransMsgs)
{ {
for (INT i = 0; i < cTransMsgs; ++i, ++pTransMsgs) for (INT i = 0; i < cTransMsgs; ++i, ++pTransMsgs)
{ {
@ -2211,10 +2272,10 @@ void CicBridge::PostTransMsg(HWND hWnd, INT cTransMsgs, LPTRANSMSG pTransMsgs)
*/ */
HRESULT HRESULT
CicBridge::ConfigureGeneral( CicBridge::ConfigureGeneral(
TLS* pTLS, _Inout_ TLS* pTLS,
ITfThreadMgr *pThreadMgr, _In_ ITfThreadMgr *pThreadMgr,
HKL hKL, _In_ HKL hKL,
HWND hWnd) _In_ HWND hWnd)
{ {
CicProfile *pProfile = pTLS->m_pProfile; CicProfile *pProfile = pTLS->m_pProfile;
if (!pProfile) if (!pProfile)
@ -2250,11 +2311,11 @@ CicBridge::ConfigureGeneral(
*/ */
HRESULT HRESULT
CicBridge::ConfigureRegisterWord( CicBridge::ConfigureRegisterWord(
TLS* pTLS, _Inout_ TLS* pTLS,
ITfThreadMgr *pThreadMgr, _In_ ITfThreadMgr *pThreadMgr,
HKL hKL, _In_ HKL hKL,
HWND hWnd, _In_ HWND hWnd,
LPVOID lpData) _Inout_opt_ LPVOID lpData)
{ {
CicProfile *pProfile = pTLS->m_pProfile; CicProfile *pProfile = pTLS->m_pProfile;
if (!pProfile) if (!pProfile)
@ -2311,9 +2372,9 @@ CicBridge::ConfigureRegisterWord(
*/ */
HRESULT HRESULT
CicProfile::GetActiveLanguageProfile( CicProfile::GetActiveLanguageProfile(
HKL hKL, _In_ HKL hKL,
REFGUID rguid, _In_ REFGUID rguid,
TF_LANGUAGEPROFILE *pProfile) _Out_ TF_LANGUAGEPROFILE *pProfile)
{ {
return E_NOTIMPL; return E_NOTIMPL;
} }
@ -2916,7 +2977,9 @@ CtfImeIsIME(
return FALSE; return FALSE;
} }
/** /***********************************************************************
* CtfImeThreadDetach (MSCTFIME.@)
*
* @implemented * @implemented
*/ */
EXTERN_C HRESULT WINAPI EXTERN_C HRESULT WINAPI

View file

@ -184,22 +184,24 @@ protected:
} }
}; };
#define CUSTOM_CAND_INFO_SIZE 1964
inline BOOL CicIMCLock::ClearCand() inline BOOL CicIMCLock::ClearCand()
{ {
HIMCC hNewCandInfo, hCandInfo = m_pIC->hCandInfo; HIMCC hNewCandInfo, hCandInfo = m_pIC->hCandInfo;
if (hCandInfo) if (hCandInfo)
{ {
hNewCandInfo = ImmReSizeIMCC(hCandInfo, 1964); hNewCandInfo = ImmReSizeIMCC(hCandInfo, CUSTOM_CAND_INFO_SIZE);
if (!hNewCandInfo) if (!hNewCandInfo)
{ {
ImmDestroyIMCC(m_pIC->hCandInfo); ImmDestroyIMCC(m_pIC->hCandInfo);
m_pIC->hCandInfo = ImmCreateIMCC(1964); m_pIC->hCandInfo = ImmCreateIMCC(CUSTOM_CAND_INFO_SIZE);
return FALSE; return FALSE;
} }
} }
else else
{ {
hNewCandInfo = ImmCreateIMCC(1964u); hNewCandInfo = ImmCreateIMCC(CUSTOM_CAND_INFO_SIZE);
} }
m_pIC->hCandInfo = hNewCandInfo; m_pIC->hCandInfo = hNewCandInfo;
@ -210,24 +212,15 @@ inline BOOL CicIMCLock::ClearCand()
if (!candInfo) if (!candInfo)
{ {
ImmDestroyIMCC(m_pIC->hCandInfo); ImmDestroyIMCC(m_pIC->hCandInfo);
m_pIC->hCandInfo = ImmCreateIMCC(1964); m_pIC->hCandInfo = ImmCreateIMCC(CUSTOM_CAND_INFO_SIZE);
return FALSE; return FALSE;
} }
candInfo.get().dwSize = 1964; candInfo.get().dwSize = CUSTOM_CAND_INFO_SIZE;
candInfo.get().dwCount = 0; candInfo.get().dwCount = 0;
candInfo.get().dwOffset[0] = sizeof(CANDIDATEINFO); candInfo.get().dwOffset[0] = sizeof(CANDIDATEINFO);
LPBYTE pb = (LPBYTE)(&candInfo.get()); // FIXME: Something is trailing after CANDIDATEINFO...
pb += sizeof(CANDIDATEINFO);
LPDWORD pdwUnknown = (LPDWORD)pb;
pdwUnknown[0] = candInfo.get().dwSize - sizeof(CANDIDATEINFO); // +0x0
pdwUnknown[2] = 0; // +0x08
pdwUnknown[3] = 0; // +0x0c
pdwUnknown[4] = 0; // +0x10
pdwUnknown[1] = 1; // +0x04
pdwUnknown[5] = 9; // +0x14
pdwUnknown[6] = 1048; // +0x18
return TRUE; return TRUE;
} }