Leaked source code of windows server 2003
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

//
// 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