/**************************************************************************\ * Module Name: softkbdes.cpp * * Copyright (c) 1985 - 2000, Microsoft Corporation * * Soft Keyboard Event Sink for the Symbol layout * * History: * 28-March-2000 weibz Created \**************************************************************************/ #include "private.h" #include "globals.h" #include "immxutil.h" #include "proputil.h" #include "helpers.h" #include "editcb.h" #include "dispattr.h" #include "computil.h" #include "regsvr.h" #include "Softkbdimx.h" #include "SoftKbdES.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CSoftKeyboardEventSink::CSoftKeyboardEventSink(CSoftkbdIMX *pSoftKbdIMX, DWORD dwSoftLayout) { _pSoftKbdIMX = pSoftKbdIMX; _dwSoftLayout= dwSoftLayout; _fCaps = FALSE; _fShift= FALSE; _tid = pSoftKbdIMX->_tid; _tim = pSoftKbdIMX->_tim; _tim->AddRef( ); _cRef = 1; } CSoftKeyboardEventSink::~CSoftKeyboardEventSink() { SafeReleaseClear(_tim); } //+--------------------------------------------------------------------------- // // IUnknown // //---------------------------------------------------------------------------- STDAPI CSoftKeyboardEventSink::QueryInterface(REFIID riid, void **ppvObj) { *ppvObj = NULL; if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ISoftKeyboardEventSink)) { *ppvObj = SAFECAST(this, CSoftKeyboardEventSink *); } if (*ppvObj) { AddRef(); return S_OK; } return E_NOINTERFACE; } STDAPI_(ULONG) CSoftKeyboardEventSink::AddRef() { return ++_cRef; } STDAPI_(ULONG) CSoftKeyboardEventSink::Release() { long cr; cr = --_cRef; Assert(cr >= 0); if (cr == 0) { delete this; } return cr; } // // ISoftKeyboardEventSink // STDAPI CSoftKeyboardEventSink::OnKeySelection(KEYID KeySelected, WCHAR *lpszLabel) { ITfContext *pic; HRESULT hr; CEditSession *pes; hr = S_OK; switch ( KeySelected ) { case KID_CTRL : case KID_ALT : // doesn't handle // just return break; case KID_CAPS : _fCaps = !_fCaps; if ( _fCaps == _fShift ) // use state 0 (_pSoftKbdIMX->_KbdSymbol).dwCurLabel = 0; else // use state 1 (_pSoftKbdIMX->_KbdSymbol).dwCurLabel = 1; hr = SetCompartmentDWORD(_tid, _tim, GUID_COMPARTMENT_SOFTKBD_KBDLAYOUT, _dwSoftLayout, FALSE); break; case KID_LSHFT : case KID_RSHFT : _fShift = !_fShift; if ( _fCaps == _fShift ) // use state 0 (_pSoftKbdIMX->_KbdSymbol).dwCurLabel = 0; else // use state 1 (_pSoftKbdIMX->_KbdSymbol).dwCurLabel = 1; hr = SetCompartmentDWORD(_tid, _tim, GUID_COMPARTMENT_SOFTKBD_KBDLAYOUT, _dwSoftLayout, FALSE); break; case KID_F1 : case KID_F2 : case KID_F3 : case KID_F4 : case KID_F5 : case KID_F6 : case KID_F7 : case KID_F8 : case KID_F9 : case KID_F10 : case KID_F11 : case KID_F12 : case KID_TAB : // simulate a key event and send to system. case KID_ENTER : case KID_ESC : case KID_SPACE : case KID_BACK : case KID_UP : case KID_DOWN : case KID_LEFT : case KID_RIGHT : { BYTE bVk, bScan; int j, jIndex; KEYID keyId; BOOL fExtendKey, fPictureKey; keyId = KeySelected; fPictureKey = FALSE; for ( j=0; jGetIC( ); if ( pic == NULL ) { return hr; } if (pes = new CEditSession(CSoftkbdIMX::_EditSessionCallback)) { WCHAR *lpLabel; int i, iLen; iLen = (int) wcslen(lpszLabel); lpLabel = (WCHAR *)cicMemAllocClear((iLen+1)*sizeof(WCHAR)); if ( lpLabel == NULL ) { // not enough memory. hr = E_OUTOFMEMORY; return hr; } for ( i=0; i_state.u = ESCB_KEYLABEL; pes->_state.pv = _pSoftKbdIMX; pes->_state.wParam = (WPARAM)KeySelected; pes->_state.lParam = (LPARAM)lpLabel; pes->_state.pic = pic; pes->_state.pv1 = NULL; pic->RequestEditSession(_pSoftKbdIMX->_tid, pes, TF_ES_READWRITE, &hr); if ( FAILED(hr) ) { SafeFreePointer(lpLabel); } SafeRelease(pes); } else hr = E_FAIL; SafeRelease(pic); break; } return hr; } CSoftKbdWindowEventSink::CSoftKbdWindowEventSink(CSoftkbdIMX *pSoftKbdIMX) { _pSoftKbdIMX = pSoftKbdIMX; _cRef = 1; } CSoftKbdWindowEventSink::~CSoftKbdWindowEventSink() { } //+--------------------------------------------------------------------------- // // IUnknown // //---------------------------------------------------------------------------- STDAPI CSoftKbdWindowEventSink::QueryInterface(REFIID riid, void **ppvObj) { *ppvObj = NULL; if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ISoftKbdWindowEventSink)) { *ppvObj = SAFECAST(this, CSoftKbdWindowEventSink *); } if (*ppvObj) { AddRef(); return S_OK; } return E_NOINTERFACE; } STDAPI_(ULONG) CSoftKbdWindowEventSink::AddRef() { return ++_cRef; } STDAPI_(ULONG) CSoftKbdWindowEventSink::Release() { long cr; cr = --_cRef; Assert(cr >= 0); if (cr == 0) { delete this; } return cr; } // // ISoftKbdWindowEventSink // STDAPI CSoftKbdWindowEventSink::OnWindowClose( ) { HRESULT hr = S_OK; if ( _pSoftKbdIMX != NULL ) _pSoftKbdIMX->SetSoftKBDOnOff(FALSE); return hr; } STDAPI CSoftKbdWindowEventSink::OnWindowMove(int xWnd, int yWnd, int width, int height) { HRESULT hr = S_OK; if ( _pSoftKbdIMX != NULL ) _pSoftKbdIMX->SetSoftKBDPosition(xWnd, yWnd); // support size change later. UNREFERENCED_PARAMETER(width); UNREFERENCED_PARAMETER(height); return hr; }