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.
532 lines
14 KiB
532 lines
14 KiB
//
|
|
// nui.cpp
|
|
//
|
|
|
|
#include "private.h"
|
|
#include "ids.h"
|
|
#include "immxutil.h"
|
|
#include "nui.h"
|
|
#include "slbarid.h"
|
|
#include "mslbui.h"
|
|
#include "cregkey.h"
|
|
#include "tchar.h"
|
|
|
|
|
|
extern HINSTANCE g_hInst;
|
|
|
|
/* 7e4bf406-00e4-469e-bc40-0ce2cb626849 */
|
|
const GUID GUID_LBI_CICPADITEM = {
|
|
0x7e4bf406,
|
|
0x00e4,
|
|
0x469e,
|
|
{0xbc, 0x40, 0x0c, 0xe2, 0xcb, 0x62, 0x68, 0x49}
|
|
};
|
|
|
|
/* 2aad8804-c5c8-4d7c-90b3-b5214ac54a9f */
|
|
const GUID GUID_LBI_TESTITEM = {
|
|
0x2aad8804,
|
|
0xc5c8,
|
|
0x4d7c,
|
|
{0x90, 0xb3, 0xb5, 0x21, 0x4a, 0xc5, 0x4a, 0x9f}
|
|
};
|
|
|
|
const GUID GUID_LBI_UNAWARE_MICROPHONE = {
|
|
0x24d583e2,
|
|
0xa785,
|
|
0x4b16,
|
|
{0x86, 0x6b, 0xf9, 0xdc, 0x08, 0x1f, 0x4c, 0x2c}
|
|
};
|
|
|
|
/* 237bdc50-2aaa-44cd-be05-1b452b1acff1 */
|
|
const GUID GUID_LBI_UNAWARE_BALLOON = {
|
|
0x237bdc50,
|
|
0x2aaa,
|
|
0x44cd,
|
|
{0xbe, 0x05, 0x1b, 0x45, 0x2b, 0x1a, 0xcf, 0xf1}
|
|
};
|
|
|
|
/* a6b9e52b-3ab2-46b8-99d1-e44c1c8b3cf8 */
|
|
const GUID GUID_LBI_UNAWARE_CFGMENUBUTTON = {
|
|
0xa6b9e52b,
|
|
0x3ab2,
|
|
0x46b8,
|
|
{0x99, 0xd1, 0xe4, 0x4c, 0x1c, 0x8b, 0x3c, 0xf8}
|
|
};
|
|
|
|
// == don't know if we use the following 4 items
|
|
|
|
#ifdef PERHAPS
|
|
|
|
/* 17f9fa7f-a9ed-47b5-8bcd-eebb94b2e6ca */
|
|
const GUID GUID_LBI_UNAWARE_COMMANDING = {
|
|
0x17f9fa7f,
|
|
0xa9ed,
|
|
0x47b5,
|
|
{0x8b, 0xcd, 0xee, 0xbb, 0x94, 0xb2, 0xe6, 0xca}
|
|
};
|
|
|
|
/* 49261a4a-87df-47fc-8a68-6ea07ba82a87 */
|
|
const GUID GUID_LBI_UNAWARE_DICTATION = {
|
|
0x49261a4a,
|
|
0x87df,
|
|
0x47fc,
|
|
{0x8a, 0x68, 0x6e, 0xa0, 0x7b, 0xa8, 0x2a, 0x87}
|
|
};
|
|
|
|
/* 791b4403-0cda-4fe1-b748-517d049fde08 */
|
|
const GUID GUID_LBI_UNAWARE_TTS_PLAY_STOP = {
|
|
0x791b4403,
|
|
0x0cda,
|
|
0x4fe1,
|
|
{0xb7, 0x48, 0x51, 0x7d, 0x04, 0x9f, 0xde, 0x08}
|
|
};
|
|
|
|
/* e6fbfc9d-a2e0-4203-a27b-af2353e6a44e */
|
|
const GUID GUID_LBI_UNAWARE_TTS_PAUSE_RESUME = {
|
|
0xe6fbfc9d,
|
|
0xa2e0,
|
|
0x4203,
|
|
{0xa2, 0x7b, 0xaf, 0x23, 0x53, 0xe6, 0xa4, 0x4e}
|
|
};
|
|
|
|
#endif
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// LBarCicPadItem
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ctor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CLBarCicPadItem::CLBarCicPadItem()
|
|
{
|
|
Dbg_MemSetThisName(TEXT("CLBarCicPadItem"));
|
|
|
|
InitNuiInfo(CLSID_SYSTEMLANGBARITEM2,
|
|
GUID_LBI_CICPADITEM,
|
|
TF_LBI_STYLE_BTN_BUTTON
|
|
| TF_LBI_STYLE_HIDDENSTATUSCONTROL
|
|
| TF_LBI_STYLE_BTN_TOGGLE,
|
|
CICPADBTN_ORDER,
|
|
L"Cicero Pad");
|
|
|
|
|
|
SetToolTip(L"CicPad");
|
|
SetText(L"CicPad");
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// GetIcon
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CLBarCicPadItem::GetIcon(HICON *phIcon)
|
|
{
|
|
*phIcon = LoadSmIcon(g_hInst, MAKEINTRESOURCE(ID_ICON_CICPAD));
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnLButtonUpHandler
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
const TCHAR c_szCicPadWndClass[] = TEXT("cicpad_mainwnd");
|
|
|
|
HRESULT CLBarCicPadItem::OnLButtonUp(const POINT pt, const RECT *prcArea)
|
|
{
|
|
HWND hwnd = FindWindow(c_szCicPadWndClass, NULL);
|
|
if (!hwnd)
|
|
{
|
|
WinExec("cicpad.exe", 0);
|
|
hwnd = FindWindow(c_szCicPadWndClass, NULL);
|
|
if (!hwnd)
|
|
return E_FAIL;
|
|
|
|
SetGlobalCompartmentDWORD(GUID_COMPARTMENT_CICPAD, TRUE);
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
DWORD dw;
|
|
if (SUCCEEDED(GetGlobalCompartmentDWORD(GUID_COMPARTMENT_CICPAD, &dw)))
|
|
{
|
|
SetGlobalCompartmentDWORD(GUID_COMPARTMENT_CICPAD, dw ? FALSE : TRUE);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CLBarItemMicrophone
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ctor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CLBarItemMicrophone::CLBarItemMicrophone()
|
|
{
|
|
Dbg_MemSetThisName(TEXT("CLBarItemMicrophone"));
|
|
|
|
InitNuiInfo(CLSID_SYSTEMLANGBARITEM_SPEECH,
|
|
GUID_LBI_UNAWARE_MICROPHONE,
|
|
TF_LBI_STYLE_HIDDENSTATUSCONTROL
|
|
| TF_LBI_STYLE_BTN_TOGGLE
|
|
| TF_LBI_STYLE_SHOWNINTRAY,
|
|
SORT_MICROPHONE,
|
|
CRStr(IDS_NUI_MICROPHONE_TOOLTIP));
|
|
|
|
SetToolTip(CRStr(IDS_NUI_MICROPHONE_TOOLTIP));
|
|
SetText(CRStr(IDS_NUI_MICROPHONE_TEXT));
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// dtor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CLBarItemMicrophone::~CLBarItemMicrophone()
|
|
{
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// GetIcon
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CLBarItemMicrophone::GetIcon(HICON *phIcon)
|
|
{
|
|
if (!phIcon)
|
|
return E_INVALIDARG;
|
|
|
|
*phIcon = LoadSmIcon(g_hInst, MAKEINTRESOURCE(ID_ICON_MICROPHONE));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnLButtonUp
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT CLBarItemMicrophone::OnLButtonUp(const POINT pt, const RECT *prcArea)
|
|
{
|
|
|
|
DWORD dw;
|
|
if (SUCCEEDED(GetGlobalCompartmentDWORD(GUID_COMPARTMENT_SPEECH_OPENCLOSE, &dw)))
|
|
{
|
|
SetGlobalCompartmentDWORD(GUID_COMPARTMENT_SPEECH_OPENCLOSE, dw ? FALSE : TRUE);
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CLBarItemBalloon
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ctor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CLBarItemBalloon::CLBarItemBalloon()
|
|
{
|
|
Dbg_MemSetThisName(TEXT("CLBarItemBalloon"));
|
|
|
|
InitNuiInfo(CLSID_SYSTEMLANGBARITEM_SPEECH,
|
|
GUID_LBI_UNAWARE_BALLOON,
|
|
0,
|
|
SORT_BALLOON,
|
|
CRStr(IDS_NUI_BALLOON_TEXT));
|
|
|
|
SIZE size;
|
|
size.cx = 100;
|
|
size.cy = 16;
|
|
SetPreferedSize(&size);
|
|
SetToolTip(CRStr(IDS_NUI_BALLOON_TOOLTIP));
|
|
|
|
// by default Balloon is hidden.
|
|
// SetStatusInternal(TF_LBI_STATUS_HIDDEN);
|
|
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// dtor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CLBarItemBalloon::~CLBarItemBalloon()
|
|
{
|
|
if (_pszText)
|
|
delete _pszText;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// GetBalloonInfo
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CLBarItemBalloon::GetBalloonInfo(TF_LBBALLOONINFO *pInfo)
|
|
{
|
|
pInfo->style = _style;
|
|
pInfo->bstrText = SysAllocString(_pszText);
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Set
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void CLBarItemBalloon::Set(TfLBBalloonStyle style, const WCHAR *psz)
|
|
{
|
|
if (_pszText)
|
|
{
|
|
delete _pszText;
|
|
_pszText = NULL;
|
|
}
|
|
|
|
_pszText = new WCHAR[wcslen(psz) + 1];
|
|
if (_pszText)
|
|
{
|
|
wcscpy(_pszText, psz);
|
|
SetToolTip(_pszText);
|
|
}
|
|
|
|
_style = style;
|
|
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// CLBarItemCfgmenuButton
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ctor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CLBarItemCfgMenuButton::CLBarItemCfgMenuButton()
|
|
{
|
|
Dbg_MemSetThisName(TEXT("CLBarItemCfgMenuButton"));
|
|
|
|
InitNuiInfo(CLSID_SYSTEMLANGBARITEM_SPEECH,
|
|
GUID_LBI_UNAWARE_CFGMENUBUTTON,
|
|
TF_LBI_STYLE_BTN_MENU,
|
|
SORT_CFGMENUBUTTON,
|
|
CRStr(IDS_NUI_CFGMENU_TOOLTIP));
|
|
|
|
SetToolTip(CRStr(IDS_NUI_CFGMENU_TOOLTIP));
|
|
SetText(CRStr(IDS_NUI_CFGMENU_TEXT));
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// dtor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CLBarItemCfgMenuButton::~CLBarItemCfgMenuButton()
|
|
{
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// GetIcon
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CLBarItemCfgMenuButton::GetIcon(HICON *phIcon)
|
|
{
|
|
if (!phIcon)
|
|
return E_INVALIDARG;
|
|
|
|
*phIcon = LoadSmIcon(g_hInst, MAKEINTRESOURCE(ID_ICON_CFGMENU));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// InitMenu
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CLBarItemCfgMenuButton::InitMenu(ITfMenu *pMenu)
|
|
{
|
|
#if 0 // do I need this?
|
|
UINT nTipCurMenuID = IDM_CUSTOM_MENU_START;
|
|
_InsertCustomMenus(pMenu, &nTipCurMenuID);
|
|
#endif
|
|
|
|
HandleMenuCmd(IDSLB_INITMENU, pMenu, 0);
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// OnMenuSelect
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CLBarItemCfgMenuButton::OnMenuSelect(UINT uID)
|
|
{
|
|
HRESULT hr;
|
|
#if 0 // do I need this?
|
|
if (uID >= IDM_CUSTOM_MENU_START)
|
|
hr = CLBarItemSystemButtonBase::OnMenuSelect(uID);
|
|
else
|
|
#endif
|
|
hr = HandleMenuCmd(IDSLB_ONMENUSELECT, NULL, uID);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// HandleMenuCmd
|
|
//
|
|
// Builds a list of fake menuitems. Nothing's real except "options..."
|
|
// this is because we can't use COM here.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
HRESULT
|
|
CLBarItemCfgMenuButton::HandleMenuCmd(UINT uCode, ITfMenu *pMenu, UINT wID)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (uCode == IDSLB_INITMENU)
|
|
{
|
|
WCHAR sz[128];
|
|
|
|
sz[0] = '\0';
|
|
LoadStringWrapW(g_hInst, IDS_MIC_OPTIONS, sz, ARRAYSIZE(sz));
|
|
LangBarInsertMenu(pMenu, IDM_MIC_OPTIONS, sz);
|
|
|
|
sz[0] = '\0';
|
|
LoadStringWrapW(g_hInst, IDS_MIC_SHOWBALLOON, sz, ARRAYSIZE(sz));
|
|
LangBarInsertGrayedMenu(pMenu, sz);
|
|
|
|
sz[0] = '\0';
|
|
LoadStringWrapW(g_hInst, IDS_MIC_TRAINING, sz, ARRAYSIZE(sz));
|
|
LangBarInsertGrayedMenu(pMenu, sz);
|
|
|
|
sz[0] = '\0';
|
|
LoadStringWrapW(g_hInst, IDS_MIC_ADDDELETE, sz, ARRAYSIZE(sz));
|
|
LangBarInsertGrayedMenu(pMenu, sz);
|
|
|
|
// [Save Data] menu...
|
|
sz[0] = '\0';
|
|
LoadStringWrapW(g_hInst, IDS_MIC_SAVEDATA, sz, ARRAYSIZE(sz));
|
|
LangBarInsertGrayedMenu(pMenu, sz);
|
|
|
|
|
|
LoadStringWrapW(g_hInst, IDS_MIC_CURRENTUSER, sz, ARRAYSIZE(sz));
|
|
LangBarInsertGrayedMenu(pMenu, sz);
|
|
}
|
|
else if (uCode == IDSLB_ONMENUSELECT)
|
|
{
|
|
if (wID == IDM_MIC_OPTIONS)
|
|
{
|
|
TCHAR szCplPath[MAX_PATH];
|
|
TCHAR szCmdLine[MAX_PATH * 2];
|
|
|
|
GetSapiCplPath(szCplPath, ARRAYSIZE(szCplPath));
|
|
StringCchPrintf(szCmdLine, ARRAYSIZE(szCmdLine), TEXT("rundll32 shell32.dll,Control_RunDLL \"%s\""), szCplPath);
|
|
|
|
// start speech control panel applet
|
|
RunCPLSetting(szCmdLine);
|
|
}
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
const TCHAR c_szcplsKey[] = TEXT("software\\microsoft\\windows\\currentversion\\control panel\\cpls");
|
|
void CLBarItemCfgMenuButton::GetSapiCplPath(TCHAR *szCplPath, int cch)
|
|
{
|
|
CMyRegKey regkey;
|
|
|
|
if (cch <= 0)
|
|
return;
|
|
|
|
szCplPath[0] = '\0';
|
|
|
|
if (S_OK == regkey.Open(HKEY_LOCAL_MACHINE, c_szcplsKey, KEY_READ))
|
|
{
|
|
LONG lret = regkey.QueryValueCch(szCplPath, TEXT("SapiCpl"), cch);
|
|
|
|
if (lret != ERROR_SUCCESS)
|
|
lret = regkey.QueryValueCch(szCplPath, TEXT("Speech"), cch);
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// LBarTestItem
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef DEBUG
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// ctor
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CLBarTestItem::CLBarTestItem()
|
|
{
|
|
Dbg_MemSetThisName(TEXT("CLBarTestItem"));
|
|
|
|
InitNuiInfo(CLSID_SYSTEMLANGBARITEM2,
|
|
GUID_LBI_TESTITEM,
|
|
TF_LBI_STYLE_BTN_BUTTON,
|
|
CICPADBTN_ORDER + 1,
|
|
L"Cicero Pad");
|
|
|
|
|
|
SetToolTip(L"Test");
|
|
SetText(L"Test");
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// GetIcon
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDAPI CLBarTestItem::GetIcon(HICON *phIcon)
|
|
{
|
|
*phIcon = LoadSmIcon(g_hInst, MAKEINTRESOURCE(ID_ICON_TEST));
|
|
return S_OK;
|
|
}
|
|
|
|
#endif DEBUG
|