Leaked source code of windows server 2003
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

//
// 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);
}