164 lines
4.6 KiB
C++
164 lines
4.6 KiB
C++
//////////////////////////////////////////////////////////////////////
|
|
//
|
|
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
// TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
// PARTICULAR PURPOSE.
|
|
//
|
|
// Copyright (C) 2003 Microsoft Corporation. All rights reserved.
|
|
//
|
|
// Compartment.cpp
|
|
//
|
|
// The status of GUID_COMPARTMENT_KEYBOARD_OPENCLOSE and
|
|
// GUID_COMPARTMENT_KEYBOARD_DISABLED.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "Globals.h"
|
|
#include "TextService.h"
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// _IsKeyboardDisabled
|
|
//
|
|
// GUID_COMPARTMENT_KEYBOARD_DISABLED is the compartment in the context
|
|
// object.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL CTextService::_IsKeyboardDisabled()
|
|
{
|
|
ITfCompartmentMgr *pCompMgr = NULL;
|
|
ITfDocumentMgr *pDocMgrFocus = NULL;
|
|
ITfContext *pContext = NULL;
|
|
BOOL fDisabled = FALSE;
|
|
|
|
if ((_pThreadMgr->GetFocus(&pDocMgrFocus) != S_OK) ||
|
|
(pDocMgrFocus == NULL))
|
|
{
|
|
// if there is no focus document manager object, the keyboard
|
|
// is disabled.
|
|
fDisabled = TRUE;
|
|
goto Exit;
|
|
}
|
|
|
|
if ((pDocMgrFocus->GetTop(&pContext) != S_OK) ||
|
|
(pContext == NULL))
|
|
{
|
|
// if there is no context object, the keyboard is disabled.
|
|
fDisabled = TRUE;
|
|
goto Exit;
|
|
}
|
|
|
|
if (pContext->QueryInterface(IID_ITfCompartmentMgr, (void **)&pCompMgr) == S_OK)
|
|
{
|
|
ITfCompartment *pCompartmentDisabled;
|
|
ITfCompartment *pCompartmentEmptyContext;
|
|
|
|
// Check GUID_COMPARTMENT_KEYBOARD_DISABLED.
|
|
if (pCompMgr->GetCompartment(GUID_COMPARTMENT_KEYBOARD_DISABLED, &pCompartmentDisabled) == S_OK)
|
|
{
|
|
VARIANT var;
|
|
if (S_OK == pCompartmentDisabled->GetValue(&var))
|
|
{
|
|
if (var.vt == VT_I4) // Even VT_EMPTY, GetValue() can succeed
|
|
{
|
|
fDisabled = (BOOL)var.lVal;
|
|
}
|
|
}
|
|
pCompartmentDisabled->Release();
|
|
}
|
|
|
|
// Check GUID_COMPARTMENT_EMPTYCONTEXT.
|
|
if (pCompMgr->GetCompartment(GUID_COMPARTMENT_EMPTYCONTEXT, &pCompartmentEmptyContext) == S_OK)
|
|
{
|
|
VARIANT var;
|
|
if (S_OK == pCompartmentEmptyContext->GetValue(&var))
|
|
{
|
|
if (var.vt == VT_I4) // Even VT_EMPTY, GetValue() can succeed
|
|
{
|
|
fDisabled = (BOOL)var.lVal;
|
|
}
|
|
}
|
|
pCompartmentEmptyContext->Release();
|
|
}
|
|
|
|
pCompMgr->Release();
|
|
}
|
|
|
|
Exit:
|
|
if (pContext)
|
|
pContext->Release();
|
|
|
|
if (pDocMgrFocus)
|
|
pDocMgrFocus->Release();
|
|
|
|
return fDisabled;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// _IsKeyboardOpen
|
|
//
|
|
// GUID_COMPARTMENT_KEYBOARD_OPENCLOSE is the compartment in the thread manager
|
|
// object.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL CTextService::_IsKeyboardOpen()
|
|
{
|
|
ITfCompartmentMgr *pCompMgr = NULL;
|
|
BOOL fOpen = FALSE;
|
|
|
|
if (_pThreadMgr->QueryInterface(IID_ITfCompartmentMgr, (void **)&pCompMgr) == S_OK)
|
|
{
|
|
ITfCompartment *pCompartment;
|
|
if (pCompMgr->GetCompartment(GUID_COMPARTMENT_KEYBOARD_OPENCLOSE, &pCompartment) == S_OK)
|
|
{
|
|
VARIANT var;
|
|
if (S_OK == pCompartment->GetValue(&var))
|
|
{
|
|
if (var.vt == VT_I4) // Even VT_EMPTY, GetValue() can succeed
|
|
{
|
|
fOpen = (BOOL)var.lVal;
|
|
}
|
|
}
|
|
}
|
|
pCompMgr->Release();
|
|
}
|
|
|
|
return fOpen;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// _SetKeyboardOpen
|
|
//
|
|
// GUID_COMPARTMENT_KEYBOARD_OPENCLOSE is the compartment in the thread manager
|
|
// object.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT CTextService::_SetKeyboardOpen(BOOL fOpen)
|
|
{
|
|
HRESULT hr = E_FAIL;
|
|
ITfCompartmentMgr *pCompMgr = NULL;
|
|
|
|
if (_pThreadMgr->QueryInterface(IID_ITfCompartmentMgr, (void **)&pCompMgr) == S_OK)
|
|
{
|
|
ITfCompartment *pCompartment;
|
|
if (pCompMgr->GetCompartment(GUID_COMPARTMENT_KEYBOARD_OPENCLOSE, &pCompartment) == S_OK)
|
|
{
|
|
VARIANT var;
|
|
var.vt = VT_I4;
|
|
var.lVal = fOpen;
|
|
hr = pCompartment->SetValue(_tfClientId, &var);
|
|
}
|
|
pCompMgr->Release();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|