You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
8.2 KiB
255 lines
8.2 KiB
/*++
|
|
|
|
Copyright (c) 1985 - 1999, Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
immif.h
|
|
|
|
Abstract:
|
|
|
|
This file defines the IMM Interface Class.
|
|
|
|
Author:
|
|
|
|
Revision History:
|
|
|
|
Notes:
|
|
|
|
--*/
|
|
|
|
#ifndef _IMMIF_H_
|
|
#define _IMMIF_H_
|
|
|
|
#include "imedefs.h"
|
|
#include "cime.h"
|
|
#include "ctxtcomp.h"
|
|
#include "caime.h"
|
|
#include "ico.h"
|
|
#include "globals.h"
|
|
#include "immxutil.h"
|
|
#include "a_context.h"
|
|
|
|
class ImmIfIME : public CAIME
|
|
{
|
|
public:
|
|
ImmIfIME();
|
|
~ImmIfIME();
|
|
|
|
//
|
|
// IActiveIME methods
|
|
//
|
|
|
|
STDMETHODIMP ConnectIMM(IActiveIMMIME_Private *pActiveIMM);
|
|
STDMETHODIMP UnconnectIMM();
|
|
STDMETHODIMP Inquire(DWORD dwSystemInfoFlags, IMEINFO *pIMEInfo, LPWSTR szWndClass, DWORD *pdwPrivate);
|
|
STDMETHODIMP ConversionList(HIMC hIMC, LPWSTR szSource, UINT uFlag, UINT uBufLen, CANDIDATELIST *pDest, UINT *puCopied);
|
|
STDMETHODIMP Configure(HKL hKL, HWND hWnd, DWORD dwMode, REGISTERWORDW *pRegisterWord);
|
|
STDMETHODIMP Destroy(UINT uReserved);
|
|
STDMETHODIMP Escape(HIMC hIMC, UINT uEscape, void *pData, LRESULT *plResult);
|
|
STDMETHODIMP ProcessKey(HIMC hIMC, UINT uVirKey, DWORD lParam, BYTE *pbKeyState);
|
|
STDMETHODIMP Notify(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue);
|
|
STDMETHODIMP SelectEx(HIMC hIMC, DWORD dwFlags, BOOL bIsRealIme_SelKL, BOOL bIsRealIme_UnSelKL);
|
|
STDMETHODIMP UnSelectCheck(HIMC hIMC);
|
|
STDMETHODIMP SetCompositionString(HIMC hIMC, DWORD dwIndex, void *pComp, DWORD dwCompLen, void *pRead, DWORD dwReadLen);
|
|
STDMETHODIMP ToAsciiEx(UINT uVirKey, UINT uScanCode, BYTE *pbKeyState, UINT fuState, HIMC hIMC, DWORD *pdwTransBuf, UINT *puSize);
|
|
STDMETHODIMP RegisterWord(LPWSTR szReading, DWORD dwStyle, LPWSTR szString);
|
|
STDMETHODIMP UnregisterWord(LPWSTR szReading, DWORD dwStyle, LPWSTR szString);
|
|
STDMETHODIMP GetRegisterWordStyle(UINT nItem, STYLEBUFW *pStyleBuf, UINT *puBufSize);
|
|
STDMETHODIMP EnumRegisterWord(LPWSTR szReading, DWORD dwStyle, LPWSTR szRegister, LPVOID pData, IEnumRegisterWordW **ppEnum);
|
|
STDMETHODIMP GetCodePageA(UINT *uCodePage);
|
|
STDMETHODIMP GetLangId(LANGID *plid);
|
|
STDMETHODIMP AssociateFocus(HWND hWnd, HIMC hIMC, DWORD dwFlags);
|
|
STDMETHODIMP SetThreadCompartmentValue(REFGUID rguid, VARIANT *pvar);
|
|
STDMETHODIMP GetThreadCompartmentValue(REFGUID rguid, VARIANT *pvar);
|
|
|
|
HRESULT ToAsciiEx(UINT uVirKey, UINT uScanCode, BYTE* pbKeyState, UINT fuState, HIMC hIMC, TRANSMSGLIST* pTransBuf, UINT* puSize);
|
|
|
|
//
|
|
// AIMM1.2 interface
|
|
//
|
|
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppv);
|
|
|
|
public:
|
|
BOOL _ImeInquire(LPIMEINFO, LPWSTR, DWORD);
|
|
|
|
//
|
|
// Helpers
|
|
//
|
|
static BOOL WINAPI _RegisterImeClass(WNDPROC lpfnUIWndProc);
|
|
static void WINAPI _UnRegisterImeClass();
|
|
|
|
LIBTHREAD *_GetLibTLS()
|
|
{
|
|
return &_libTLS;
|
|
}
|
|
|
|
BOOL IsRealIme()
|
|
{
|
|
BOOL fReal = FALSE;
|
|
if (m_pIActiveIMMIME)
|
|
{
|
|
m_pIActiveIMMIME->IsRealImePublic(&fReal);
|
|
}
|
|
|
|
return fReal;
|
|
}
|
|
|
|
private:
|
|
BOOL WINAPI _NotifyIME(HIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue);
|
|
|
|
HRESULT WINAPI _ToAsciiEx(HIMC hImc, UINT uVKey, UINT uScanCode, TRANSMSGLIST* pTransBuf, UINT* puSize);
|
|
|
|
BOOL WINAPI _WantThisKey(HIMC hImc, UINT uVKey, BOOL* pfNextHook = NULL)
|
|
{
|
|
IMCLock imc(hImc);
|
|
if (imc.Invalid())
|
|
return false;
|
|
|
|
return _WantThisKey(imc, uVKey, pfNextHook);
|
|
}
|
|
BOOL WINAPI _WantThisKey(IMCLock& imc, UINT uVKey, BOOL* pfNextHook = NULL);
|
|
|
|
HRESULT _HandleThisKey(IMCLock& imc, UINT uVKey);
|
|
|
|
public:
|
|
HRESULT _UpdateCompositionString(DWORD dwDeltaStart = 0);
|
|
|
|
HRESULT _CompCancel(IMCLock& imc);
|
|
HRESULT _CompComplete(IMCLock& imc, BOOL fSync = TRUE);
|
|
|
|
|
|
public:
|
|
//
|
|
// Cicero stuff
|
|
//
|
|
HRESULT InitIMMX();
|
|
void UnInitIMMX();
|
|
|
|
private:
|
|
BOOL IsCheckAtom();
|
|
|
|
public:
|
|
Interface_Attach<ITfContext> GetInputContext(IMCLock& imc) const
|
|
{
|
|
CAImeContext* _pAImeContext = imc->m_pAImeContext;
|
|
if (!_pAImeContext)
|
|
return NULL;
|
|
Interface_Attach<ITfContext> ic(_pAImeContext->GetInputContext());
|
|
return ic;
|
|
}
|
|
|
|
Interface_Attach<ITfDocumentMgr> GetDocumentManager(IMCLock& imc) const
|
|
{
|
|
CAImeContext* _pAImeContext = imc->m_pAImeContext;
|
|
if (!_pAImeContext)
|
|
return NULL;
|
|
Interface_Attach<ITfDocumentMgr> dim(_pAImeContext->GetDocumentManager());
|
|
return dim;
|
|
}
|
|
|
|
Interface_Attach<ITfContextOwnerServices> GetInputContextOwnerSink(IMCLock& imc) const
|
|
{
|
|
CAImeContext* _pAImeContext = imc->m_pAImeContext;
|
|
if (!_pAImeContext)
|
|
return NULL;
|
|
Interface_Attach<ITfContextOwnerServices> iccb(_pAImeContext->GetInputContextOwnerSink());
|
|
return iccb;
|
|
}
|
|
|
|
Interface_Attach<ITfThreadMgr_P> GetThreadManagerInternal() const
|
|
{
|
|
Interface_Attach<ITfThreadMgr_P> tim(m_tim);
|
|
return tim;
|
|
}
|
|
|
|
Interface_Attach<ImmIfIME> GetCurrentInterface()
|
|
{
|
|
Interface_Attach<ImmIfIME> ImmIfIme(this);
|
|
return ImmIfIme;
|
|
}
|
|
|
|
TfClientId GetClientId() {return m_tfClientId;}
|
|
bool IsOpenStatusChanging() {return m_ulOpenStatusChanging > 0;}
|
|
|
|
protected:
|
|
static const char s_szUIClassName[16];
|
|
|
|
protected:
|
|
bool m_fCicInit : 1;
|
|
bool m_fOnSetFocus : 1;
|
|
ULONG m_ulOpenStatusChanging;
|
|
ULONG m_ulKorImxModeChanging;
|
|
|
|
ITfThreadMgr_P *m_tim;
|
|
ITfDocumentMgr *m_dimEmpty; // empty dim for NULL hIMC.
|
|
TfClientId m_tfClientId;
|
|
|
|
ITfKeystrokeMgr *m_pkm;
|
|
|
|
IAImeProfile *m_AImeProfile;
|
|
|
|
LIBTHREAD _libTLS; // tls for the helper library. Since this object is apt threaded,
|
|
// all members are accessed in a single thread
|
|
// also, cicero will only create a single instance of this obj per thread
|
|
|
|
BOOL m_fAddedProcessAtom : 1;
|
|
|
|
private:
|
|
|
|
HRESULT Internal_SetCompositionString(CWCompString& wCompStr, CWCompString& wCompReadStr);
|
|
HRESULT Internal_ReconvertString(IMCLock& imc, CWReconvertString& wReconvStr, CWReconvertString& wReconvReadStr);
|
|
|
|
static HRESULT Internal_QueryReconvertString_ICOwnerSink(UINT uCode, ICOARGS *pargs, VOID *pv);
|
|
HRESULT Internal_QueryReconvertString(IMCLock& imc, RECONVERTSTRING* pReconv, UINT cp, BOOL fNeedAW);
|
|
|
|
void SetFocus(HWND hWnd, ITfDocumentMgr* pdim, BOOL fSetFocus);
|
|
|
|
public:
|
|
// void AdjustZeroCompLenReconvertString(RECONVERTSTRING *pReconv, UINT cp, BOOL fAnsi);
|
|
HRESULT SetupReconvertString(ITfContext *pic, IMCLock& imc, UINT uPrivMsg = 0);
|
|
HRESULT EndReconvertString(IMCLock& imc);
|
|
|
|
HRESULT SetupDocFeedString(ITfContext *pic, IMCLock& imc);
|
|
HRESULT ClearDocFeedBuffer(ITfContext *pic, IMCLock& imc, BOOL fSync = TRUE);
|
|
|
|
private:
|
|
HRESULT _ReconvertStringNegotiation(ITfContext *pic, IMCLock& imc, UINT uPrivMsg);
|
|
HRESULT _ReconvertStringTextStore(ITfContext *pic, IMCLock& imc, UINT uPrivMsg);
|
|
|
|
public:
|
|
HRESULT GetTextAndAttribute(IMCLock& imc,
|
|
CWCompString* wCompString, CWCompAttribute* wCompAttribute);
|
|
HRESULT GetTextAndAttribute(IMCLock& imc,
|
|
CBCompString* bCompString, CBCompAttribute* bCompAttribute);
|
|
public:
|
|
HRESULT GetCursorPosition(IMCLock& imc, CWCompCursorPos* wCursorPosition);
|
|
public:
|
|
HRESULT GetSelection(IMCLock& imc, CWCompCursorPos& wStartSelection, CWCompCursorPos& wEndSelection);
|
|
|
|
//
|
|
// Notification
|
|
//
|
|
public:
|
|
HRESULT OnSetOpenStatus(IMCLock& imc);
|
|
HRESULT OnSetConversionSentenceMode(IMCLock& imc);
|
|
HRESULT OnSetCandidatePos(IMCLock& imc);
|
|
HRESULT OnSetKorImxConversionMode(IMCLock& imc);
|
|
|
|
};
|
|
|
|
inline void SetThis(HWND hWnd, LPARAM lParam)
|
|
{
|
|
SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)((CREATESTRUCT *)lParam)->lpCreateParams);
|
|
}
|
|
|
|
inline ImmIfIME *GetThis(HWND hWnd)
|
|
{
|
|
ImmIfIME *pIME = (ImmIfIME *)GetWindowLongPtr(hWnd, GWLP_USERDATA);
|
|
|
|
ASSERT(pIME != NULL);
|
|
|
|
return pIME;
|
|
}
|
|
|
|
#endif // _IMMIF_H_
|