windows-nt/Source/XPSP1/NT/sdktools/tweakui/general.cpp
2020-09-26 16:20:57 +08:00

675 lines
18 KiB
C++

/*
* general - Dialog box property sheet for "general ui tweaks"
*/
#include "tweakui.h"
#pragma BEGIN_CONST_DATA
KL const c_klSmooth = { &c_hkCU, c_tszRegPathDesktop, c_tszSmoothScroll };
KL const c_klEngine = { &g_hkCUSMIE, c_tszSearchUrl, 0 };
KL const c_klPaintVersion =
{ &c_hkCU, c_tszRegPathDesktop, c_tszPaintDesktop };
/* SOMEDAY
Software\Microsoft\Internet Explorer\RestrictUI::Toolbar, ::History
IE\Toolbar\::BackBitmap
*/
const static DWORD CODESEG rgdwHelp[] = {
IDC_EFFECTGROUP, IDH_GROUP,
// IDC_ANIMATE, IDH_ANIMATE,
// IDC_SMOOTHSCROLL, IDH_SMOOTHSCROLL,
// IDC_BEEP, IDH_BEEP,
IDC_IE3GROUP, IDH_GROUP,
IDC_IE3TXT, IDH_IE3ENGINE,
IDC_IE3ENGINETXT, IDH_IE3ENGINE,
IDC_IE3ENGINE, IDH_IE3ENGINE,
IDC_RUDEGROUP, IDH_GROUP,
IDC_RUDE, IDH_RUDEAPP,
IDC_RUDEFLASHINFINITE, IDH_RUDEAPPFLASH,
IDC_RUDEFLASHFINITE, IDH_RUDEAPPFLASH,
IDC_RUDEFLASHCOUNT, IDH_RUDEAPPFLASH,
IDC_RUDEFLASHUD, IDH_RUDEAPPFLASH,
IDC_RUDEFLASHTXT, IDH_RUDEAPPFLASH,
0, 0,
};
#pragma END_CONST_DATA
/*
* Instanced. We're a cpl so have only one instance, but I declare
* all the instance stuff in one place so it's easy to convert this
* code to multiple-instance if ever we need to.
*/
typedef struct GDII { /* general_dialog instance info */
DWORD dwForegroundLock; /* Original foreground lock */
TCHAR tszUrl[1024]; /* Search URL */
} GDII, *PGDII;
GDII gdii;
#define pgdii (&gdii)
#define DestroyCursor(hcur) SafeDestroyIcon((HICON)(hcur))
/*****************************************************************************
*
* General_GetAni
*
* Determine whether minimize animations are enabled.
*
* Always returns exactly 0 or 1.
*
*****************************************************************************/
BOOL PASCAL
General_GetAni(LPARAM lParam, LPVOID pvRef)
{
ANIMATIONINFO anii;
anii.cbSize = sizeof(anii);
SystemParametersInfo(SPI_GETANIMATION, sizeof(anii), &anii, 0);
return anii.iMinAnimate != 0;
}
/*****************************************************************************
*
* General_SetAni
*
* Set the new animation flag.
*
*****************************************************************************/
BOOL PASCAL
General_SetAni(BOOL f, LPARAM lParam, LPVOID pvRef)
{
BOOL fRc;
ANIMATIONINFO anii;
anii.cbSize = sizeof(anii);
anii.iMinAnimate = f;
fRc = SystemParametersInfo(SPI_SETANIMATION, sizeof(anii), &anii,
SPIF_UPDATEINIFILE);
if (fRc && pvRef) {
LPBOOL pf = (LPBOOL)pvRef;
*pf = TRUE;
}
return fRc;
}
/*****************************************************************************
*
* General_GetSmooth
*
* Determine whether smooth scrolling is enabled.
*
* Always returns exactly 0 or 1.
*
*****************************************************************************/
BOOL PASCAL
General_GetSmooth(LPARAM lParam, LPVOID pvRef)
{
if (g_fSmoothScroll) {
return GetDwordPkl(&c_klSmooth, 1) != 0;
} else {
return -1;
}
}
/*****************************************************************************
*
* General_SetSmooth
*
* Set the new smooth-scroll flag.
*
*****************************************************************************/
BOOL PASCAL
General_SetSmooth(BOOL f, LPARAM lParam, LPVOID pvRef)
{
BOOL fRc = SetDwordPkl(&c_klSmooth, f);
if (fRc && pvRef) {
LPBOOL pf = (LPBOOL)pvRef;
*pf = TRUE;
}
return fRc;
}
/*****************************************************************************
*
* General_GetPntVer
*
* Determine whether we should paint the version on the desktop.
*
* Always returns exactly 0 or 1.
*
*****************************************************************************/
BOOL PASCAL
General_GetPntVer(LPARAM lParam, LPVOID pvRef)
{
if (g_fMemphis) {
return GetIntPkl(0, &c_klPaintVersion) != 0;
} else if (g_fNT5) {
return GetDwordPkl(&c_klPaintVersion, 0) != 0;
} else {
return -1;
}
}
/*****************************************************************************
*
* General_SetPntVer
*
* Set the PaintVersion flag.
*
*****************************************************************************/
BOOL PASCAL
General_SetPntVer(BOOL f, LPARAM lParam, LPVOID pvRef)
{
BOOL fRc = FALSE;
if (g_fMemphis) {
fRc = SetIntPkl(f, &c_klPaintVersion);
} else if (g_fNT5) {
fRc = SetDwordPkl2(&c_klPaintVersion, f);
}
if (fRc && pvRef) {
LPBOOL pf = (LPBOOL)pvRef;
*pf = TRUE;
}
return fRc;
}
/*****************************************************************************
*
* General_GetSpi
*
* Return the setting of an SPI.
*
*****************************************************************************/
BOOL PASCAL
General_GetSpi(LPARAM lParam, LPVOID pvRef)
{
BOOL f;
if (SystemParametersInfo((UINT)lParam, 0, &f, 0)) {
return f;
} else {
return -1;
}
}
/*****************************************************************************
*
* General_SetSpiW
*
* Set the SPI value in the wParam. Only SPI_SETBEEP needs this.
*
*****************************************************************************/
BOOL
General_SetSpiW(BOOL f, LPARAM lParam, LPVOID pvRef)
{
return SystemParametersInfo((UINT)(lParam+1), f, NULL, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
}
/*****************************************************************************
*
* General_SetSpi
*
* Set the SPI value in the lParam.
*
*****************************************************************************/
BOOL
General_SetSpi(BOOL f, LPARAM lParam, LPVOID pvRef)
{
return SystemParametersInfo((UINT)(lParam+1), 0, IntToPtr(f), SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
}
#pragma BEGIN_CONST_DATA
/*
* Note that this needs to be in sync with the IDS_GENERALEFFECTS
* strings.
*
* Note that SPI_GETGRADIENTCAPTIONS is not needed, because the
* standard Control Panel.Desktop.Appearance lets you munge the
* gradient flag.
*
* SPI_SETACTIVEWINDOWTRACKING is handled over on the Mouse tab.
*/
CHECKLISTITEM c_rgcliGeneral[] = {
{ General_GetAni, General_SetAni, 0, },
{ General_GetSmooth, General_SetSmooth, 0, },
{ General_GetSpi, General_SetSpiW, SPI_GETBEEP },
{ General_GetSpi, General_SetSpi, SPI_GETMENUANIMATION },
{ General_GetSpi, General_SetSpi, SPI_GETCOMBOBOXANIMATION },
{ General_GetSpi, General_SetSpi, SPI_GETLISTBOXSMOOTHSCROLLING },
{ General_GetSpi, General_SetSpi, SPI_GETKEYBOARDCUES },
{ General_GetSpi, General_SetSpi, SPI_GETHOTTRACKING },
{ General_GetSpi, General_SetSpi, SPI_GETMENUFADE },
{ General_GetSpi, General_SetSpi, SPI_GETSELECTIONFADE },
{ General_GetSpi, General_SetSpi, SPI_GETTOOLTIPANIMATION },
{ General_GetSpi, General_SetSpi, SPI_GETTOOLTIPFADE },
{ General_GetSpi, General_SetSpi, SPI_GETCURSORSHADOW },
{ General_GetPntVer, General_SetPntVer, 0, },
};
#pragma END_CONST_DATA
/*****************************************************************************
*
* General_SetDirty
*
* Make a control dirty.
*
*****************************************************************************/
void INLINE
General_SetDirty(HWND hdlg)
{
Common_SetDirty(hdlg);
}
/*****************************************************************************
*
* General_Engine_OnEditChange
*
* Enable the OK button if the URL contains exactly one %s.
*
*****************************************************************************/
void PASCAL
General_Engine_OnEditChange(HWND hdlg)
{
TCHAR tszUrl[cA(pgdii->tszUrl)];
PTSTR ptsz;
int cPercentS;
GetDlgItemText(hdlg, IDC_SEARCHURL, tszUrl, cA(tszUrl));
/*
* All appearances of "%" must be followed by "%" or "s".
*/
cPercentS = 0;
ptsz = tszUrl;
while ((ptsz = ptszStrChr(ptsz, TEXT('%'))) != 0) {
if (ptsz[1] == TEXT('%')) {
ptsz += 2;
} else if (ptsz[1] == TEXT('s')) {
cPercentS++;
ptsz += 2;
} else {
cPercentS = 0; break; /* Percent-mumble */
}
}
EnableWindow(GetDlgItem(hdlg, IDOK), cPercentS == 1);
}
/*****************************************************************************
*
* General_Engine_OnOk
*
* Save the answer.
*
*****************************************************************************/
void INLINE
General_Engine_OnOk(HWND hdlg)
{
GetDlgItemText(hdlg, IDC_SEARCHURL, pgdii->tszUrl, cA(pgdii->tszUrl));
}
/*****************************************************************************
*
* General_Engine_OnCommand
*
* If the edit control changed, update the OK button.
*
*****************************************************************************/
void PASCAL
General_Engine_OnCommand(HWND hdlg, int id, UINT codeNotify)
{
switch (id) {
case IDCANCEL:
EndDialog(hdlg, 0); break;
case IDOK:
General_Engine_OnOk(hdlg);
EndDialog(hdlg, 1);
break;
case IDC_SEARCHURL:
if (codeNotify == EN_CHANGE) General_Engine_OnEditChange(hdlg);
break;
}
}
/*****************************************************************************
*
* General_Engine_OnInitDialog
*
* Shove the current engine URL in so the user can edit it.
*
*****************************************************************************/
void PASCAL
General_Engine_OnInitDialog(HWND hdlg)
{
SetDlgItemTextLimit(hdlg, IDC_SEARCHURL, pgdii->tszUrl, cA(pgdii->tszUrl));
General_Engine_OnEditChange(hdlg);
}
/*****************************************************************************
*
* General_Engine_DlgProc
*
* Dialog procedure.
*
*****************************************************************************/
INT_PTR EXPORT
General_Engine_DlgProc(HWND hdlg, UINT wm, WPARAM wParam, LPARAM lParam)
{
switch (wm) {
case WM_INITDIALOG: General_Engine_OnInitDialog(hdlg); break;
case WM_COMMAND:
General_Engine_OnCommand(hdlg,
(int)GET_WM_COMMAND_ID(wParam, lParam),
(UINT)GET_WM_COMMAND_CMD(wParam, lParam));
break;
default: return 0; /* Unhandled */
}
return 1; /* Handled */
}
/*****************************************************************************
*
* General_UpdateEngine
*
* If the person selected "Custom", then pop up the customize dialog.
*
* At any rate, put the matching URL into pgdii->tszUrl.
*
*****************************************************************************/
void PASCAL
General_UpdateEngine(HWND hdlg)
{
int ieng = (int)Misc_Combo_GetCurItemData(GetDlgItem(hdlg, IDC_IE3ENGINE));
if (ieng == 0) {
if (DialogBox(hinstCur, MAKEINTRESOURCE(IDD_SEARCHURL), hdlg,
General_Engine_DlgProc)) {
} else {
goto skip;
}
} else {
LoadString(hinstCur, IDS_URL+ieng, pgdii->tszUrl, cA(pgdii->tszUrl));
}
General_SetDirty(hdlg);
skip:;
}
/*****************************************************************************
*
* General_Reset
*
* Reset all controls to initial values. This also marks
* the control as clean.
*
* Note: This doesn't really work any more.
*
*****************************************************************************/
BOOL PASCAL
General_Reset(HWND hdlg)
{
HWND hwnd;
UINT i;
TCHAR tsz[256];
GetStrPkl(pgdii->tszUrl, cbX(pgdii->tszUrl), &c_klEngine);
if (pgdii->tszUrl[0] && !g_fIE5) {
hwnd = GetDlgItem(hdlg, IDC_IE3ENGINE);
ComboBox_ResetContent(hwnd);
for (i = 0; LoadString(hinstCur, IDS_ENGINE+i, tsz, cA(tsz)); i++) {
int iItem = ComboBox_AddString(hwnd, tsz);
ComboBox_SetItemData(hwnd, iItem, i);
if (i) LoadString(hinstCur, IDS_URL+i, tsz, cA(tsz));
if (i == 0 || lstrcmpi(tsz, pgdii->tszUrl) == 0) {
ComboBox_SetCurSel(hwnd, iItem);
}
}
} else {
AdjustDlgItems(hdlg, IDC_IE3FIRST, IDC_IE3LAST, ADI_DISABLE | ADI_HIDE);
MoveDlgItems(hdlg, IDC_IE3GROUP, IDC_RUDEFIRST, IDC_RUDELAST);
}
DWORD dw;
if (SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, &dw, 0)) {
if (dw) {
pgdii->dwForegroundLock = dw;
} else {
/* Default foreground lock timeout differs based on platform */
pgdii->dwForegroundLock = g_fNT ? 200000 : 15000;
}
CheckDlgButton(hdlg, IDC_RUDE, dw != 0);
if (SystemParametersInfo(SPI_GETFOREGROUNDFLASHCOUNT, 0, &dw, 0)) {
if (dw) {
CheckDlgButton(hdlg, IDC_RUDEFLASHFINITE, TRUE);
SetDlgItemInt(hdlg, IDC_RUDEFLASHCOUNT, dw, 0);
} else {
/* WindMill and NT default to 3 */
CheckDlgButton(hdlg, IDC_RUDEFLASHINFINITE, TRUE);
SetDlgItemInt(hdlg, IDC_RUDEFLASHCOUNT, 3, 0);
}
} else {
/* Win98 had the flash count hard-coded to 2 */
SetDlgItemInt(hdlg, IDC_RUDEFLASHCOUNT, 2, 0);
EnableDlgItems(hdlg, IDC_RUDEFLASHFIRST, IDC_RUDEFLASHLAST, FALSE);
}
} else {
AdjustDlgItems(hdlg, IDC_RUDEFIRST, IDC_RUDELAST, ADI_DISABLE | ADI_HIDE);
}
Common_SetClean(hdlg);
return 1;
}
/*****************************************************************************
*
* General_Apply
*
* Write the changes to the registry.
*
*****************************************************************************/
void NEAR PASCAL
General_OnApply(HWND hdlg)
{
BOOL fSendWinIniChange = 0;
int i;
Checklist_OnApply(hdlg, c_rgcliGeneral, &fSendWinIniChange, FALSE);
if (fSendWinIniChange) {
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
(LPARAM)(LPCTSTR)c_tszWindows);
}
if (pgdii->tszUrl[0]) {
SetStrPkl(&c_klEngine, pgdii->tszUrl);
}
BOOL f = IsDlgButtonChecked(hdlg, IDC_RUDE);
if (SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0,
IntToPtr(f ? pgdii->dwForegroundLock : 0),
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE)) {
int cFlash;
if (IsDlgButtonChecked(hdlg, IDC_RUDEFLASHINFINITE)) {
cFlash = 0; f = TRUE;
} else {
cFlash = (int)GetDlgItemInt(hdlg, IDC_RUDEFLASHCOUNT, &f, FALSE);
}
if (f && SystemParametersInfo(SPI_SETFOREGROUNDFLASHCOUNT, 0, IntToPtr(cFlash),
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE)) {
/* Happy joy */
}
}
General_Reset(hdlg);
}
/*****************************************************************************
*
* General_OnCommand
*
* Ooh, we got a command.
*
*****************************************************************************/
void PASCAL
General_OnCommand(HWND hdlg, int id, UINT codeNotify)
{
switch (id) {
case IDC_ANIMATE:
case IDC_SMOOTHSCROLL:
case IDC_BEEP:
case IDC_RUDE:
case IDC_RUDEFLASHINFINITE:
case IDC_RUDEFLASHFINITE:
if (codeNotify == BN_CLICKED) General_SetDirty(hdlg);
break;
case IDC_IE3ENGINE:
if (codeNotify == CBN_SELCHANGE) General_UpdateEngine(hdlg);
break;
case IDC_RUDEFLASHCOUNT:
if (codeNotify == EN_CHANGE) {
General_SetDirty(hdlg);
}
break;
}
}
#if 0
/*****************************************************************************
*
* General_OnNotify
*
* Ooh, we got a notification.
*
*****************************************************************************/
BOOL PASCAL
General_OnNotify(HWND hdlg, NMHDR FAR *pnm)
{
switch (pnm->code) {
case PSN_APPLY:
General_Apply(hdlg);
break;
}
return 0;
}
#endif
/*****************************************************************************
*
* General_OnInitDialog
*
* Initialize the controls.
*
*****************************************************************************/
BOOL NEAR PASCAL
General_OnInitDialog(HWND hwnd)
{
HWND hdlg = GetParent(hwnd);
ZeroMemory(pgdii, cbX(*pgdii));
Checklist_OnInitDialog(hwnd, c_rgcliGeneral, cA(c_rgcliGeneral),
IDS_GENERALEFFECTS, 0);
SendDlgItemMessage(hdlg, IDC_RUDEFLASHUD,
UDM_SETRANGE, 0, MAKELPARAM(999, 1));
General_Reset(hdlg);
return 1;
}
/*****************************************************************************
*
* General_OnWhatsThis
*
*****************************************************************************/
void PASCAL
General_OnWhatsThis(HWND hwnd, int iItem)
{
LV_ITEM lvi;
Misc_LV_GetItemInfo(hwnd, &lvi, iItem, LVIF_PARAM);
WinHelp(hwnd, c_tszMyHelp, HELP_CONTEXTPOPUP,
IDH_ANIMATE + lvi.lParam);
}
/*****************************************************************************
*
* Oh yeah, we need this too.
*
*****************************************************************************/
#pragma BEGIN_CONST_DATA
LVCI lvciGeneral[] = {
{ IDC_WHATSTHIS, General_OnWhatsThis },
{ 0, 0 },
};
LVV lvvGeneral = {
General_OnCommand,
0, /* General_OnInitContextMenu */
0, /* General_Dirtify */
0, /* General_GetIcon */
General_OnInitDialog,
General_OnApply,
0, /* General_OnDestroy */
0, /* General_OnSelChange */
6, /* iMenu */
rgdwHelp,
0, /* Double-click action */
lvvflCanCheck, /* We need check boxes */
lvciGeneral,
};
#pragma END_CONST_DATA
/*****************************************************************************
*
* Our window procedure.
*
*****************************************************************************/
INT_PTR EXPORT
General_DlgProc(HWND hdlg, UINT wm, WPARAM wParam, LPARAM lParam)
{
return LV_DlgProc(&lvvGeneral, hdlg, wm, wParam, lParam);
}