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.
570 lines
13 KiB
570 lines
13 KiB
//
|
|
// mslbui.cpp
|
|
//
|
|
|
|
#include "private.h"
|
|
#include "globals.h"
|
|
#include "mslbui.h"
|
|
#include "helpers.h"
|
|
|
|
|
|
/* 2dc1cc1f-3e09-49c5-9cf0-bf67154dc827 */
|
|
const GUID GUID_COMPARTMENT_CICPAD = {
|
|
0x2dc1cc1f,
|
|
0x3e09,
|
|
0x49c5,
|
|
{0x9c, 0xf0, 0xbf, 0x67, 0x15, 0x4d, 0xc8, 0x27}
|
|
};
|
|
|
|
|
|
// Issue: we should add this to private header
|
|
/* c1a1554f-b715-48e1-921f-716fd7332ce9 */
|
|
const GUID GUID_COMPARTMENT_SHARED_BLN_TEXT = {
|
|
0xc1a1554f,
|
|
0xb715,
|
|
0x48e1,
|
|
{0x92, 0x1f, 0x71, 0x6f, 0xd7, 0x33, 0x2c, 0xe9}
|
|
};
|
|
|
|
/* 574e41bb-1bf4-4630-95dd-b143372ac8d0 */
|
|
const GUID GUID_COMPARTMENT_SPEECHUISHOWN = {
|
|
0x574e41bb,
|
|
0x1bf4,
|
|
0x4630,
|
|
{0x95, 0xdd, 0xb1, 0x43, 0x37, 0x2a, 0xc8, 0xd0}
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CTFGetLangBarAddIn
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT CTFGetLangBarAddIn(ITfLangBarAddIn **ppAddIn)
|
|
{
|
|
CUnCicAppLangBarAddIn *pAddIn;
|
|
|
|
*ppAddIn = NULL;
|
|
pAddIn = new CUnCicAppLangBarAddIn;
|
|
if (!pAddIn)
|
|
return E_OUTOFMEMORY;
|
|
|
|
*ppAddIn = pAddIn;
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CUnCicAppLangBarAddIn
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// IUnknown
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CUnCicAppLangBarAddIn::QueryInterface(REFIID riid, void **ppvObj)
|
|
{
|
|
*ppvObj = NULL;
|
|
|
|
if (IsEqualIID(riid, IID_IUnknown) ||
|
|
IsEqualIID(riid, IID_ITfLangBarAddIn))
|
|
{
|
|
*ppvObj = SAFECAST(this, ITfLangBarAddIn *);
|
|
}
|
|
|
|
if (*ppvObj)
|
|
{
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
return E_NOINTERFACE;
|
|
}
|
|
|
|
STDAPI_(ULONG) CUnCicAppLangBarAddIn::AddRef()
|
|
{
|
|
return ++_cRef;
|
|
}
|
|
|
|
STDAPI_(ULONG) CUnCicAppLangBarAddIn::Release()
|
|
{
|
|
long cr;
|
|
|
|
cr = --_cRef;
|
|
Assert(cr >= 0);
|
|
|
|
if (cr == 0)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return cr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ctor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CUnCicAppLangBarAddIn::CUnCicAppLangBarAddIn()
|
|
{
|
|
_cRef = 1;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// dtor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CUnCicAppLangBarAddIn::~CUnCicAppLangBarAddIn()
|
|
{
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnStart
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CUnCicAppLangBarAddIn::OnStart(CLSID *pclsid)
|
|
{
|
|
ITfLangBarItemMgr *plbim = NULL;
|
|
|
|
HRESULT hr;
|
|
|
|
Assert(!_plbim);
|
|
Assert(!_pCicPadItem);
|
|
|
|
|
|
hr = TF_CreateLangBarItemMgr(&plbim);
|
|
if (FAILED(hr))
|
|
return hr;
|
|
|
|
if (!plbim)
|
|
return E_FAIL;
|
|
|
|
_plbim = plbim;
|
|
#ifdef _DEBUG_
|
|
CLBarTestItem *pTestItem;
|
|
pTestItem = new CLBarTestItem;
|
|
if (pTestItem)
|
|
{
|
|
if (SUCCEEDED(plbim->AddItem(pTestItem)))
|
|
_pTestItem = pTestItem;
|
|
else
|
|
Assert(0);
|
|
}
|
|
#endif
|
|
|
|
*pclsid = CLSID_MSLBUI;
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnUpdate()
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CUnCicAppLangBarAddIn::OnUpdate(DWORD dwFlags)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
#if 1
|
|
if (!_pces &&
|
|
(_pces = new CGlobalCompartmentEventSink(_CompEventSinkCallback,this)))
|
|
{
|
|
hr =_pces->_Advise(GUID_COMPARTMENT_CICPAD);
|
|
|
|
if (S_OK == hr)
|
|
hr = _pces->_Advise(GUID_COMPARTMENT_SPEECH_OPENCLOSE);
|
|
|
|
if (S_OK == hr)
|
|
hr = _pces->_Advise(GUID_COMPARTMENT_SHARED_BLN_TEXT);
|
|
|
|
if (S_OK != hr)
|
|
{
|
|
_pces->_Unadvise();
|
|
delete _pces;
|
|
_pces = NULL;
|
|
}
|
|
}
|
|
#endif
|
|
// let's assume language bar item manager is initialized already
|
|
if (!_plbim)
|
|
return E_FAIL;
|
|
|
|
DWORD dwMicOn = 0;
|
|
|
|
hr = GetGlobalCompartmentDWORD(GUID_COMPARTMENT_SPEECH_OPENCLOSE, &dwMicOn);
|
|
|
|
if ( FAILED(hr))
|
|
return hr;
|
|
|
|
if (_pCicPadItem)
|
|
{
|
|
_pCicPadItem->SetOrClearStatus(TF_LBI_STATUS_HIDDEN,
|
|
dwFlags ? TRUE : FALSE);
|
|
if (_pCicPadItem->GetSink())
|
|
_pCicPadItem->GetSink()->OnUpdate(TF_LBI_STATUS);
|
|
}
|
|
#if 0
|
|
else if (!dwFlags) // non-Cicero case
|
|
{
|
|
CLBarCicPadItem *pCicPadItem = NULL;
|
|
// create cicpad item
|
|
pCicPadItem = new CLBarCicPadItem;
|
|
if (!pCicPadItem)
|
|
return E_OUTOFMEMORY;
|
|
|
|
hr = _plbim->AddItem(pCicPadItem);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
pCicPadItem->Release();
|
|
return hr;
|
|
}
|
|
|
|
_pCicPadItem = pCicPadItem;
|
|
}
|
|
#endif
|
|
// We don't need to create Mic, Balloon or Cfg menu
|
|
// when the thread has speech UI server running already
|
|
// *OR* the speech isn't installed on the system
|
|
//
|
|
|
|
if (!_IsSREnabledForLangInReg(LANGIDFROMHKL(GetSystemDefaultHKL()))
|
|
||( GetUIStatus() & TF_SPEECHUI_SHOWN ))
|
|
{
|
|
dwFlags |= 1;
|
|
_DeleteSpeechUIItems();
|
|
}
|
|
|
|
if (_pMicrophoneItem)
|
|
{
|
|
_pMicrophoneItem->SetOrClearStatus(TF_LBI_STATUS_HIDDEN,
|
|
dwFlags ? TRUE : FALSE);
|
|
if (_pMicrophoneItem->GetSink())
|
|
_pMicrophoneItem->GetSink()->OnUpdate(TF_LBI_STATUS);
|
|
|
|
}
|
|
else if (!dwFlags) // non-Cicero case
|
|
{
|
|
|
|
CLBarItemMicrophone *pMicrophoneItem = NULL;
|
|
// create microphone item
|
|
pMicrophoneItem = new CLBarItemMicrophone;
|
|
if (!pMicrophoneItem)
|
|
return E_OUTOFMEMORY;
|
|
|
|
hr = _plbim->AddItem(pMicrophoneItem);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
pMicrophoneItem->Release();
|
|
return hr;
|
|
}
|
|
_pMicrophoneItem = pMicrophoneItem;
|
|
}
|
|
|
|
if ( _pMicrophoneItem && !dwFlags )
|
|
{
|
|
// For Non-Cicero application, we want to show the Mic button
|
|
// as pressed if the MIC status is ON.
|
|
ToggleMicrophoneBtn(dwMicOn ? TRUE : FALSE);
|
|
}
|
|
|
|
if (_pBalloonItem)
|
|
{
|
|
_pBalloonItem->SetOrClearStatus(TF_LBI_STATUS_HIDDEN,
|
|
dwFlags ? TRUE : FALSE);
|
|
if (_pBalloonItem->GetSink())
|
|
_pBalloonItem->GetSink()->OnUpdate(TF_LBI_STATUS);
|
|
|
|
}
|
|
else // when balloon isn't initialized
|
|
{
|
|
|
|
if (dwFlags)
|
|
{
|
|
// this is the case you are on Cicero app
|
|
RemoveItemBalloon();
|
|
}
|
|
else if (dwMicOn)
|
|
{
|
|
// this is the case you are on non-Cicero app
|
|
AddItemBalloon();
|
|
}
|
|
}
|
|
|
|
if ( _pBalloonItem && !dwFlags && dwMicOn && GetBalloonStatus())
|
|
{
|
|
// Display "Mic is On" on the balloon for Non-Cicero Aware Application.
|
|
|
|
if (!(TF_LBI_STATUS_HIDDEN &
|
|
_pMicrophoneItem->GetStatusInternal()))
|
|
{
|
|
SetBalloonText(CRStr(IDS_MIC_ON));
|
|
}
|
|
}
|
|
|
|
if (_pCfgMenuItem)
|
|
{
|
|
_pCfgMenuItem->SetOrClearStatus(TF_LBI_STATUS_HIDDEN,
|
|
dwFlags ? TRUE : FALSE);
|
|
if (_pCfgMenuItem->GetSink())
|
|
_pCfgMenuItem->GetSink()->OnUpdate(TF_LBI_STATUS);
|
|
|
|
}
|
|
else if (!dwFlags) // non-Cicero case
|
|
{
|
|
CLBarItemCfgMenuButton *pCfgMenuItem = NULL;
|
|
|
|
// create tool menu item
|
|
pCfgMenuItem = new CLBarItemCfgMenuButton;
|
|
if (!pCfgMenuItem)
|
|
return E_OUTOFMEMORY;
|
|
|
|
hr = _plbim->AddItem(pCfgMenuItem);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
pCfgMenuItem->Release();
|
|
return hr;
|
|
}
|
|
_pCfgMenuItem = pCfgMenuItem;
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// dtor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CUnCicAppLangBarAddIn::OnTerminate()
|
|
{
|
|
|
|
if (g_fProcessDetached)
|
|
return S_OK;
|
|
|
|
if (_pces)
|
|
{
|
|
_pces->_Unadvise();
|
|
_pces->Release();
|
|
_pces = NULL;
|
|
}
|
|
|
|
if (_pCicPadItem)
|
|
{
|
|
_plbim->RemoveItem(_pCicPadItem);
|
|
_pCicPadItem->Release();
|
|
_pCicPadItem = NULL;
|
|
}
|
|
|
|
_DeleteSpeechUIItems();
|
|
|
|
if (_ptim)
|
|
{
|
|
_ptim->Release();
|
|
_ptim = NULL;
|
|
}
|
|
|
|
#ifdef _DEBUG_
|
|
if (_pTestItem)
|
|
{
|
|
_plbim->RemoveItem(_pTestItem);
|
|
_pTestItem->Release();
|
|
_pTestItem = NULL;
|
|
}
|
|
|
|
#endif
|
|
|
|
SafeReleaseClear(_plbim);
|
|
SafeReleaseClear(_pCompMgr);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
void CUnCicAppLangBarAddIn::_DeleteSpeechUIItems()
|
|
{
|
|
|
|
if (_pMicrophoneItem)
|
|
{
|
|
_plbim->RemoveItem(_pMicrophoneItem);
|
|
_pMicrophoneItem->Release();
|
|
_pMicrophoneItem = NULL;
|
|
}
|
|
|
|
if (_pBalloonItem)
|
|
{
|
|
_plbim->RemoveItem(_pBalloonItem);
|
|
_pBalloonItem->Release();
|
|
_pBalloonItem = NULL;
|
|
}
|
|
|
|
if (_pCfgMenuItem)
|
|
{
|
|
_plbim->RemoveItem(_pCfgMenuItem);
|
|
_pCfgMenuItem->Release();
|
|
_pCfgMenuItem = NULL;
|
|
}
|
|
}
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// _CompEventSinkCallback
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT CUnCicAppLangBarAddIn::_CompEventSinkCallback(void *pv, REFGUID rguid)
|
|
{
|
|
CUnCicAppLangBarAddIn *_this = (CUnCicAppLangBarAddIn *)pv;
|
|
|
|
if (!_this)
|
|
return E_FAIL;
|
|
|
|
if (IsEqualGUID(rguid, GUID_COMPARTMENT_CICPAD))
|
|
{
|
|
if (!_this->_pCicPadItem)
|
|
return E_FAIL;
|
|
|
|
DWORD dw;
|
|
if (SUCCEEDED(GetGlobalCompartmentDWORD(rguid, &dw)))
|
|
{
|
|
_this->_pCicPadItem->SetOrClearStatus(TF_LBI_STATUS_BTN_TOGGLED,
|
|
dw ? TRUE : FALSE);
|
|
if (_this->_pCicPadItem->GetSink())
|
|
_this->_pCicPadItem->GetSink()->OnUpdate(TF_LBI_STATUS);
|
|
}
|
|
}
|
|
else if (IsEqualGUID(rguid, GUID_COMPARTMENT_SPEECH_OPENCLOSE))
|
|
{
|
|
if (!_this->_pMicrophoneItem)
|
|
return E_FAIL;
|
|
|
|
DWORD dwMicOn;
|
|
if (SUCCEEDED(GetGlobalCompartmentDWORD(rguid, &dwMicOn)))
|
|
{
|
|
_this->ToggleMicrophoneBtn(dwMicOn ? TRUE : FALSE);
|
|
}
|
|
|
|
if (!(TF_LBI_STATUS_HIDDEN &
|
|
_this->_pMicrophoneItem->GetStatusInternal()))
|
|
{
|
|
if (GetBalloonStatus() && dwMicOn)
|
|
{
|
|
_this->AddItemBalloon();
|
|
|
|
if (_this->_pBalloonItem)
|
|
{
|
|
_this->SetBalloonText(CRStr(IDS_MIC_ON));
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
_this->RemoveItemBalloon();
|
|
}
|
|
}
|
|
}
|
|
else if (IsEqualGUID(rguid, GUID_COMPARTMENT_SHARED_BLN_TEXT))
|
|
{
|
|
if (_this->_pBalloonItem &&
|
|
!(TF_LBI_STATUS_HIDDEN & _this->_pBalloonItem->GetStatusInternal()))
|
|
{
|
|
DWORD dw;
|
|
|
|
if (SUCCEEDED(GetGlobalCompartmentDWORD(rguid, &dw)))
|
|
{
|
|
ATOM hAtom = (WORD)dw;
|
|
WCHAR szAtom[MAX_PATH] = {0};
|
|
|
|
GlobalGetAtomNameW(hAtom, szAtom, ARRAYSIZE(szAtom));
|
|
|
|
_this->SetBalloonText(szAtom);
|
|
}
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//
|
|
// Toggle the Microphone Button
|
|
//
|
|
void CUnCicAppLangBarAddIn::ToggleMicrophoneBtn( BOOL fOn)
|
|
{
|
|
_pMicrophoneItem->SetOrClearStatus(TF_LBI_STATUS_BTN_TOGGLED, fOn);
|
|
|
|
if (_pMicrophoneItem->GetSink())
|
|
_pMicrophoneItem->GetSink()->OnUpdate(TF_LBI_STATUS);
|
|
}
|
|
|
|
//
|
|
// Show the Balloon Text for non-cicero Aware Application.
|
|
//
|
|
void CUnCicAppLangBarAddIn::SetBalloonText(WCHAR *pwszText )
|
|
{
|
|
if (_pBalloonItem && pwszText)
|
|
{
|
|
_pBalloonItem->Set(TF_LB_BALLOON_RECO, pwszText);
|
|
|
|
if (_pBalloonItem->GetSink())
|
|
{
|
|
_pBalloonItem->GetSink()->OnUpdate(TF_LBI_BALLOON);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Add/Remove ballon item
|
|
//
|
|
void CUnCicAppLangBarAddIn::AddItemBalloon()
|
|
{
|
|
if (!_pBalloonItem)
|
|
{
|
|
_pBalloonItem = new CLBarItemBalloon();
|
|
}
|
|
|
|
if (_plbim && _pBalloonItem)
|
|
{
|
|
_plbim->AddItem(_pBalloonItem);
|
|
}
|
|
}
|
|
void CUnCicAppLangBarAddIn::RemoveItemBalloon()
|
|
{
|
|
if (_plbim && _pBalloonItem)
|
|
_plbim->RemoveItem(_pBalloonItem);
|
|
}
|
|
|
|
//
|
|
// global functions
|
|
//
|
|
BOOL GetBalloonStatus()
|
|
{
|
|
DWORD dw;
|
|
GetGlobalCompartmentDWORD(GUID_COMPARTMENT_SPEECH_UI_STATUS, &dw);
|
|
|
|
return (dw & TF_DISABLE_BALLOON) ? FALSE : TRUE;
|
|
|
|
}
|
|
void SetBalloonStatus(BOOL fShow, BOOL fForce = FALSE)
|
|
{
|
|
if (!fForce && fShow == GetBalloonStatus())
|
|
return;
|
|
|
|
DWORD dw;
|
|
GetGlobalCompartmentDWORD(GUID_COMPARTMENT_SPEECH_UI_STATUS, &dw);
|
|
dw &= ~TF_DISABLE_BALLOON;
|
|
dw |= fShow ? 0: TF_DISABLE_BALLOON;
|
|
SetGlobalCompartmentDWORD(GUID_COMPARTMENT_SPEECH_UI_STATUS, dw);
|
|
}
|
|
|