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.
471 lines
11 KiB
471 lines
11 KiB
//
|
|
// ico.cpp
|
|
//
|
|
|
|
#include "private.h"
|
|
#include "ico.h"
|
|
#include "helpers.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CInputContextOwner
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// IUnknown
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextOwner::QueryInterface(REFIID riid, void **ppvObj)
|
|
{
|
|
*ppvObj = NULL;
|
|
|
|
if (IsEqualIID(riid, IID_IUnknown) ||
|
|
IsEqualIID(riid, IID_ITfContextOwner))
|
|
{
|
|
*ppvObj = SAFECAST(this, CInputContextOwner *);
|
|
}
|
|
else if (IsEqualIID(riid, IID_ITfMouseTrackerACP))
|
|
{
|
|
*ppvObj = SAFECAST(this, ITfMouseTrackerACP *);
|
|
}
|
|
|
|
if (*ppvObj)
|
|
{
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDAPI_(ULONG) CInputContextOwner::AddRef()
|
|
{
|
|
return ++_cRef;
|
|
}
|
|
|
|
STDAPI_(ULONG) CInputContextOwner::Release()
|
|
{
|
|
long cr;
|
|
|
|
cr = --_cRef;
|
|
Assert(cr >= 0);
|
|
|
|
if (cr == 0)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return cr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ctor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CInputContextOwner::CInputContextOwner(ICOCALLBACK pfnCallback, void *pv)
|
|
{
|
|
Dbg_MemSetThisName(TEXT("CInputContextOwner"));
|
|
|
|
_cRef = 1;
|
|
_dwCookie = ICO_INVALID_COOKIE;
|
|
|
|
_pfnCallback = pfnCallback;
|
|
_pv = pv;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CInputContextOwner::PointToACP
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextOwner::GetACPFromPoint(const POINT *pt, DWORD dwFlags, LONG *pacp)
|
|
{
|
|
ICOARGS args;
|
|
|
|
args.pta.pt = pt;
|
|
args.pta.dwFlags = dwFlags;
|
|
args.pta.pacp = pacp;
|
|
|
|
return _pfnCallback(ICO_POINT_TO_ACP, &args, _pv);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CInputContextOwner::GetScreenExt
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextOwner::GetScreenExt(RECT *prc)
|
|
{
|
|
ICOARGS args;
|
|
|
|
args.scr_ext.prc = prc;
|
|
|
|
return _pfnCallback(ICO_SCREENEXT, &args, _pv);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CInputContextOwner::GetStatus
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextOwner::GetStatus(TF_STATUS *pdcs)
|
|
{
|
|
ICOARGS args;
|
|
|
|
args.status.pdcs = pdcs;
|
|
|
|
return _pfnCallback(ICO_STATUS, &args, _pv);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CInputContextOwner::GetTextExt
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextOwner::GetTextExt(LONG acpStart, LONG acpEnd, RECT *prc, BOOL *pfClipped)
|
|
{
|
|
ICOARGS args;
|
|
|
|
args.text_ext.acpStart = acpStart;
|
|
args.text_ext.acpEnd = acpEnd;
|
|
args.text_ext.prc = prc;
|
|
args.text_ext.pfClipped = pfClipped;
|
|
|
|
return _pfnCallback(ICO_TEXTEXT, &args, _pv);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CInputContextOwner::GetWnd
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextOwner::GetWnd(HWND *phwnd)
|
|
{
|
|
ICOARGS args;
|
|
|
|
args.hwnd.phwnd = phwnd;
|
|
|
|
return _pfnCallback(ICO_WND, &args, _pv);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CInputContextOwner::GetAttribute
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextOwner::GetAttribute(REFGUID rguidAttribute, VARIANT *pvarValue)
|
|
{
|
|
ICOARGS args;
|
|
|
|
QuickVariantInit(pvarValue); // in case _pfnCallback ignores it
|
|
|
|
args.sys_attr.pguid = &rguidAttribute;
|
|
args.sys_attr.pvar = pvarValue;
|
|
|
|
return _pfnCallback(ICO_ATTR, &args, _pv);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CInputContextOwner::AdviseMouseSink
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextOwner::AdviseMouseSink(ITfRangeACP *rangeACP, ITfMouseSink *pSink, DWORD *pdwCookie)
|
|
{
|
|
ICOARGS args;
|
|
|
|
args.advise_mouse.rangeACP = rangeACP;
|
|
args.advise_mouse.pSink = pSink;
|
|
args.advise_mouse.pdwCookie = pdwCookie;
|
|
|
|
return _pfnCallback(ICO_ADVISEMOUSE, &args, _pv);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CInputContextOwner::UnadviseMouseSink
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextOwner::UnadviseMouseSink(DWORD dwCookie)
|
|
{
|
|
ICOARGS args;
|
|
|
|
args.unadvise_mouse.dwCookie = dwCookie;
|
|
|
|
return _pfnCallback(ICO_UNADVISEMOUSE, &args, _pv);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CInputContextOwner::_Advise
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT CInputContextOwner::_Advise(ITfContext *pic)
|
|
{
|
|
HRESULT hr;
|
|
ITfSource *source = NULL;
|
|
|
|
_pic = NULL;
|
|
hr = E_FAIL;
|
|
|
|
if (FAILED(pic->QueryInterface(IID_ITfSource, (void **)&source)))
|
|
goto Exit;
|
|
|
|
if (FAILED(source->AdviseSink(IID_ITfContextOwner, SAFECAST(this, ITfContextOwner *), &_dwCookie)))
|
|
goto Exit;
|
|
|
|
_pic = pic;
|
|
_pic->AddRef();
|
|
|
|
hr = S_OK;
|
|
|
|
Exit:
|
|
SafeRelease(source);
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CInputContextOwner::_Unadvise
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT CInputContextOwner::_Unadvise()
|
|
{
|
|
HRESULT hr;
|
|
ITfSource *source = NULL;
|
|
|
|
hr = E_FAIL;
|
|
|
|
if (_pic == NULL)
|
|
goto Exit;
|
|
|
|
if (FAILED(_pic->QueryInterface(IID_ITfSource, (void **)&source)))
|
|
goto Exit;
|
|
|
|
if (FAILED(source->UnadviseSink(_dwCookie)))
|
|
goto Exit;
|
|
|
|
hr = S_OK;
|
|
|
|
Exit:
|
|
SafeRelease(source);
|
|
SafeReleaseClear(_pic);
|
|
return hr;
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CInputContextKeyEventSink
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// IUnknown
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextKeyEventSink::QueryInterface(REFIID riid, void **ppvObj)
|
|
{
|
|
*ppvObj = NULL;
|
|
|
|
if (IsEqualIID(riid, IID_IUnknown) ||
|
|
IsEqualIID(riid, IID_ITfContextKeyEventSink))
|
|
{
|
|
*ppvObj = SAFECAST(this, CInputContextKeyEventSink *);
|
|
}
|
|
|
|
if (*ppvObj)
|
|
{
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDAPI_(ULONG) CInputContextKeyEventSink::AddRef()
|
|
{
|
|
return ++_cRef;
|
|
}
|
|
|
|
STDAPI_(ULONG) CInputContextKeyEventSink::Release()
|
|
{
|
|
long cr;
|
|
|
|
cr = --_cRef;
|
|
Assert(cr >= 0);
|
|
|
|
if (cr == 0)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return cr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ctor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CInputContextKeyEventSink::CInputContextKeyEventSink(ICOCALLBACK pfnCallback, void *pv)
|
|
{
|
|
Dbg_MemSetThisName(TEXT("CInputContextKeyEventSink"));
|
|
|
|
_cRef = 1;
|
|
_dwCookie = ICO_INVALID_COOKIE;
|
|
|
|
_pfnCallback = pfnCallback;
|
|
_pv = pv;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CInputContextKeyEventSink::Advise
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT CInputContextKeyEventSink::_Advise(ITfContext *pic)
|
|
{
|
|
HRESULT hr;
|
|
ITfSource *source = NULL;
|
|
|
|
_pic = NULL;
|
|
hr = E_FAIL;
|
|
|
|
if (FAILED(pic->QueryInterface(IID_ITfSource, (void **)&source)))
|
|
goto Exit;
|
|
|
|
if (FAILED(source->AdviseSink(IID_ITfContextKeyEventSink, this, &_dwCookie)))
|
|
goto Exit;
|
|
|
|
_pic = pic;
|
|
_pic->AddRef();
|
|
|
|
hr = S_OK;
|
|
|
|
Exit:
|
|
SafeRelease(source);
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// CInputContextOwner::Unadvise
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT CInputContextKeyEventSink::_Unadvise()
|
|
{
|
|
HRESULT hr;
|
|
ITfSource *source = NULL;
|
|
|
|
hr = E_FAIL;
|
|
|
|
if (_pic == NULL)
|
|
goto Exit;
|
|
|
|
if (FAILED(_pic->QueryInterface(IID_ITfSource, (void **)&source)))
|
|
goto Exit;
|
|
|
|
if (FAILED(source->UnadviseSink(_dwCookie)))
|
|
goto Exit;
|
|
|
|
hr = S_OK;
|
|
|
|
Exit:
|
|
SafeRelease(source);
|
|
SafeReleaseClear(_pic);
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// KeyDown
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextKeyEventSink::OnKeyDown(WPARAM wParam, LPARAM lParam, BOOL *pfEaten)
|
|
{
|
|
ICOARGS args;
|
|
|
|
args.key.wParam = wParam;
|
|
args.key.lParam = lParam;
|
|
args.key.pic = _pic;
|
|
args.key.pfEaten = pfEaten;
|
|
|
|
return _pfnCallback(ICO_KEYDOWN, &args, _pv);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnKeyUp
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextKeyEventSink::OnKeyUp(WPARAM wParam, LPARAM lParam, BOOL *pfEaten)
|
|
{
|
|
ICOARGS args;
|
|
|
|
args.key.wParam = wParam;
|
|
args.key.lParam = lParam;
|
|
args.key.pic = _pic;
|
|
args.key.pfEaten = pfEaten;
|
|
|
|
return _pfnCallback(ICO_KEYUP, &args, _pv);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// KeyTestDown
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextKeyEventSink::OnTestKeyDown(WPARAM wParam, LPARAM lParam, BOOL *pfEaten)
|
|
{
|
|
ICOARGS args;
|
|
|
|
args.key.wParam = wParam;
|
|
args.key.lParam = lParam;
|
|
args.key.pic = _pic;
|
|
args.key.pfEaten = pfEaten;
|
|
|
|
return _pfnCallback(ICO_TESTKEYDOWN, &args, _pv);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnTestKeyUp
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CInputContextKeyEventSink::OnTestKeyUp(WPARAM wParam, LPARAM lParam, BOOL *pfEaten)
|
|
{
|
|
ICOARGS args;
|
|
|
|
args.key.wParam = wParam;
|
|
args.key.lParam = lParam;
|
|
args.key.pic = _pic;
|
|
args.key.pfEaten = pfEaten;
|
|
|
|
return _pfnCallback(ICO_TESTKEYUP, &args, _pv);
|
|
}
|
|
|