|
|
//
// kes.cpp
//
#include "private.h"
#include "helpers.h"
#include "kes.h"
//+---------------------------------------------------------------------------
//
// IUnknown
//
//----------------------------------------------------------------------------
STDAPI CKeyEventSink::QueryInterface(REFIID riid, void **ppvObj) { *ppvObj = NULL;
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfKeyEventSink)) { *ppvObj = this; }
if (*ppvObj) { AddRef(); return S_OK; }
return E_NOINTERFACE; }
STDAPI_(ULONG) CKeyEventSink::AddRef() { return ++_cRef; }
STDAPI_(ULONG) CKeyEventSink::Release() { _cRef--; Assert(_cRef >= 0);
if (_cRef == 0) { delete this; return 0; }
return _cRef; }
//+---------------------------------------------------------------------------
//
// ctor
//
//----------------------------------------------------------------------------
CKeyEventSink::CKeyEventSink(KESCALLBACK pfnCallback, void *pv) { Dbg_MemSetThisName(TEXT("CKeyEventSink"));
_pfnPreKeyCallback = NULL; _pfnCallback = pfnCallback; _pv = pv; _cRef = 1; }
CKeyEventSink::CKeyEventSink(KESCALLBACK pfnCallback, KESPREKEYCALLBACK pfnPreKeyCallback, void *pv) { Dbg_MemSetThisName(TEXT("CKeyEventSink"));
_pfnCallback = pfnCallback; _pfnPreKeyCallback = pfnPreKeyCallback; _pv = pv; _cRef = 1; }
//+---------------------------------------------------------------------------
//
// dtor
//
//----------------------------------------------------------------------------
CKeyEventSink::~CKeyEventSink() { }
//+---------------------------------------------------------------------------
//
// OnTestKeyDown
//
//----------------------------------------------------------------------------
STDAPI CKeyEventSink::OnTestKeyDown(ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) { return _pfnCallback(KES_CODE_KEYDOWN | KES_CODE_TEST, pic, wParam, lParam, pfEaten, _pv); }
//+---------------------------------------------------------------------------
//
// OnKeyDown
//
//----------------------------------------------------------------------------
STDAPI CKeyEventSink::OnKeyDown(ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) { return _pfnCallback(KES_CODE_KEYDOWN, pic, wParam, lParam, pfEaten, _pv); }
//+---------------------------------------------------------------------------
//
// OnTestKeyUp
//
//----------------------------------------------------------------------------
STDAPI CKeyEventSink::OnTestKeyUp(ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) { return _pfnCallback(KES_CODE_KEYUP | KES_CODE_TEST, pic, wParam, lParam, pfEaten, _pv); }
//+---------------------------------------------------------------------------
//
// OnKeyUp
//
//----------------------------------------------------------------------------
STDAPI CKeyEventSink::OnKeyUp(ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) { return _pfnCallback(KES_CODE_KEYUP, pic, wParam, lParam, pfEaten, _pv); }
//+---------------------------------------------------------------------------
//
// SetFocus
//
//----------------------------------------------------------------------------
STDAPI CKeyEventSink::OnSetFocus(BOOL fForeground) { return _pfnCallback(KES_CODE_FOCUS, NULL, fForeground, 0, NULL, _pv); }
//+---------------------------------------------------------------------------
//
// OnPreservedKey
//
//----------------------------------------------------------------------------
STDAPI CKeyEventSink::OnPreservedKey(ITfContext *pic, REFGUID rguid, BOOL *pfEaten) { if (!_pfnPreKeyCallback) return E_NOTIMPL;
return _pfnPreKeyCallback(pic, rguid, pfEaten, _pv); }
//+---------------------------------------------------------------------------
//
// Register
//
//----------------------------------------------------------------------------
HRESULT CKeyEventSink::_Register(ITfThreadMgr *ptim, TfClientId tid, const KESPRESERVEDKEY *pprekey) { HRESULT hr; ITfKeystrokeMgr *pKeyMgr;
Assert(_pfnPreKeyCallback);
if (FAILED(ptim->QueryInterface(IID_ITfKeystrokeMgr, (void **)&pKeyMgr))) return E_FAIL;
hr = E_FAIL;
while (pprekey->pguid) { if (FAILED(pKeyMgr->PreserveKey(tid, *pprekey->pguid, &pprekey->tfpk, pprekey->psz, wcslen(pprekey->psz)))) goto Exit;
pprekey++; }
ptim->AddRef();
hr = S_OK;
Exit: SafeRelease(pKeyMgr); return hr; }
//+---------------------------------------------------------------------------
//
// CKeyEventSink::Unadvise
//
//----------------------------------------------------------------------------
HRESULT CKeyEventSink::_Unregister(ITfThreadMgr *ptim, TfClientId tid, const KESPRESERVEDKEY *pprekey) { HRESULT hr; ITfKeystrokeMgr *pKeyMgr = NULL;
hr = E_FAIL;
Assert(_pfnPreKeyCallback);
if (FAILED(ptim->QueryInterface(IID_ITfKeystrokeMgr, (void **)&pKeyMgr))) goto Exit;
while (pprekey->pguid) { if (FAILED(pKeyMgr->UnpreserveKey(*pprekey->pguid, &pprekey->tfpk))) goto Exit;
pprekey++; }
hr = S_OK; SafeRelease(ptim);
Exit: SafeRelease(pKeyMgr); return hr; }
|