windows-nt/Source/XPSP1/NT/shell/osshell/cpls/main/mousemov.c
2020-09-26 16:20:57 +08:00

673 lines
19 KiB
C

/*++
Copyright (c) 1994-1998, Microsoft Corporation All rights reserved.
Module Name:
mousemov.c
Abstract:
This module contains the routines for the Mouse Pointer Property Sheet
page.
Revision History:
--*/
//
// Include Files.
//
#include "main.h"
#include "util.h"
#include "rc.h"
#include "mousehlp.h"
//
// Constant Declarations.
//
#ifdef WINNT // NT does not currently support Mouse Trails
#define NO_MOUSETRAILS 1
#endif
#define ACCELMIN 0
#define ACCELMAX (ACCELMIN + 6) // range of 7 settings
#define TRAILMIN 2
#define TRAILMAX (TRAILMIN + 5) // range of 8 settings
//
// From shell\inc\shsemip.h
//
#define Assert(f)
//
// Typedef Declarations.
//
//
// Struct for SPI_GETMOUSE.
//
typedef struct tag_GetMouse
{
int Thresh1;
int Thresh2;
int Speed;
} GETMOUSE, *LPGETMOUSE;
//
// Dialog Data.
//
typedef struct tag_MouseGenStr
{
GETMOUSE gmOrig;
GETMOUSE gmNew;
short nSpeed;
short nOrigSpeed;
int nSensitivity;
int nOrigSensitivity;
#ifndef NO_MOUSETRAILS // Mouse Trails are not implemented on NT
short nTrailSize;
short nOrigTrailSize;
HWND hWndTrailScroll;
#endif
BOOL fOrigSnapTo;
HWND hWndSpeedScroll;
HWND hDlg;
} MOUSEPTRSTR, *PMOUSEPTRSTR, *LPMOUSEPTRSTR;
//
// Context Help Ids.
//
const DWORD aMouseMoveHelpIds[] =
{
IDC_GROUPBOX_1, IDH_DLGMOUSE_POINTMO,
IDC_GROUPBOX_2, IDH_COMM_GROUPBOX,
MOUSE_SPEEDBMP, NO_HELP,
MOUSE_SPEEDSCROLL, IDH_DLGMOUSE_POINTMO,
IDC_GROUPBOX_3, IDH_DLGMOUSE_ACCELERATION,
MOUSE_ACCELNONE, IDH_DLGMOUSE_ACCELERATION,
MOUSE_ACCELLOW, IDH_DLGMOUSE_ACCELERATION,
MOUSE_ACCELMEDIUM, IDH_DLGMOUSE_ACCELERATION,
MOUSE_ACCELHIGH, IDH_DLGMOUSE_ACCELERATION,
MOUSE_PTRTRAIL, NO_HELP,
MOUSE_TRAILS, IDH_DLGMOUSE_SHOWTRAIL,
MOUSE_TRAILSCROLLTXT1, IDH_DLGMOUSE_TRAILLENGTH,
MOUSE_TRAILSCROLLTXT2, IDH_DLGMOUSE_TRAILLENGTH,
MOUSE_TRAILSCROLL, IDH_DLGMOUSE_TRAILLENGTH,
MOUSE_PTRSNAPDEF, NO_HELP,
IDC_GROUPBOX_4, IDH_DLGMOUSE_SNAPDEF,
MOUSE_SNAPDEF, IDH_DLGMOUSE_SNAPDEF,
0, 0
};
////////////////////////////////////////////////////////////////////////////
//
// DestroyMousePtrDlg
//
////////////////////////////////////////////////////////////////////////////
void DestroyMousePtrDlg(
PMOUSEPTRSTR pMstr)
{
HWND hDlg;
Assert( pMstr )
if( pMstr )
{
hDlg = pMstr->hDlg;
LocalFree( (HGLOBAL)pMstr );
SetWindowLongPtr( hDlg, DWLP_USER, 0 );
}
}
////////////////////////////////////////////////////////////////////////////
//
// EnableTrailScroll
//
////////////////////////////////////////////////////////////////////////////
#ifndef NO_MOUSETRAILS // Mouse Trails are not implemented on NT
void EnableTrailScroll(
HWND hDlg,
BOOL val)
{
EnableWindow(GetDlgItem(hDlg, MOUSE_TRAILSCROLL), val);
EnableWindow(GetDlgItem(hDlg, MOUSE_TRAILSCROLLTXT1), val);
EnableWindow(GetDlgItem(hDlg, MOUSE_TRAILSCROLLTXT2), val);
}
#endif
////////////////////////////////////////////////////////////////////////////
//
// InitMousePtrDlg
//
////////////////////////////////////////////////////////////////////////////
BOOL InitMousePtrDlg(
HWND hDlg)
{
PMOUSEPTRSTR pMstr;
BOOL fSnapTo;
pMstr = (PMOUSEPTRSTR)LocalAlloc(LPTR, sizeof(MOUSEPTRSTR));
if (pMstr == NULL)
{
return (TRUE);
}
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR)pMstr);
pMstr->hDlg = hDlg;
#ifndef NO_MOUSETRAILS // Mouse trails are not implemented on NT
//
// Enable or disable the Mouse Trails Checkbutton.
//
if (SystemParametersInfo(SPI_GETMOUSETRAILS, 0, &pMstr->nTrailSize, 0))
{
pMstr->nOrigTrailSize = pMstr->nTrailSize;
EnableWindow(GetDlgItem(hDlg,MOUSE_TRAILS), TRUE);
SendDlgItemMessage( hDlg,
MOUSE_TRAILSCROLL,
TBM_SETRANGE,
0,
MAKELONG(TRAILMIN, TRAILMAX) );
CheckDlgButton(hDlg, MOUSE_TRAILS, (pMstr->nTrailSize > 1));
if (pMstr->nTrailSize > 1)
{
SendDlgItemMessage( hDlg,
MOUSE_TRAILSCROLL,
TBM_SETPOS,
TRUE,
(LONG)pMstr->nTrailSize );
}
else
{
pMstr->nTrailSize = TRAILMAX;
EnableTrailScroll(hDlg, FALSE);
SendDlgItemMessage( hDlg,
MOUSE_TRAILSCROLL,
TBM_SETPOS,
TRUE,
(LONG)pMstr->nTrailSize );
}
}
else
{
CheckDlgButton(hDlg, MOUSE_TRAILS, FALSE);
EnableWindow(GetDlgItem(hDlg, MOUSE_TRAILS), FALSE);
EnableTrailScroll(hDlg, FALSE);
}
#endif
//
// Enable or disable the Snap To Default Checkbutton
//
if (SystemParametersInfo(SPI_GETSNAPTODEFBUTTON, 0, (PVOID)&fSnapTo, FALSE))
{
pMstr->fOrigSnapTo = fSnapTo;
}
CheckDlgButton(hDlg, MOUSE_SNAPDEF, fSnapTo);
SystemParametersInfo(SPI_GETMOUSE, 0, &pMstr->gmNew, FALSE);
SystemParametersInfo(SPI_GETMOUSESPEED, 0, &pMstr->nOrigSensitivity, FALSE);
if ((pMstr->nOrigSensitivity < 1) || (pMstr->nOrigSensitivity > 20))
{
pMstr->nOrigSensitivity = 10;
}
pMstr->nSensitivity = pMstr->nOrigSensitivity;
pMstr->gmOrig.Thresh1 = pMstr->gmNew.Thresh1;
pMstr->gmOrig.Thresh2 = pMstr->gmNew.Thresh2;
pMstr->gmOrig.Speed = pMstr->gmNew.Speed;
if (pMstr->gmOrig.Speed == 0)
{
CheckRadioButton(hDlg, MOUSE_ACCELNONE, MOUSE_ACCELHIGH, MOUSE_ACCELNONE);
}
else if (pMstr->gmOrig.Speed == 1)
{
CheckRadioButton(hDlg, MOUSE_ACCELNONE, MOUSE_ACCELHIGH, MOUSE_ACCELLOW);
}
else if ((pMstr->gmOrig.Speed == 2) && (pMstr->gmOrig.Thresh2 >= 9))
{
CheckRadioButton(hDlg, MOUSE_ACCELNONE, MOUSE_ACCELHIGH, MOUSE_ACCELMEDIUM);
}
else
{
CheckRadioButton(hDlg, MOUSE_ACCELNONE, MOUSE_ACCELHIGH, MOUSE_ACCELHIGH);
}
#ifndef NO_MOUSETRAILS // Mouse Trails are not implemented on NT
pMstr->hWndTrailScroll = GetDlgItem(hDlg, MOUSE_TRAILSCROLL);
#endif
pMstr->hWndSpeedScroll = GetDlgItem(hDlg, MOUSE_SPEEDSCROLL);
//
// 0 Acc = 4
// 1 Acc, 5 xThreshold = 5
// 1 Acc, 4 xThreshold = 6
// 1 Acc, 3 xThreshold = 7
// 1 Acc, 2 xThreshold = 8
// 1 Acc, 1 xThreshold = 9
// 2 Acc, 5 xThreshold = 10
// 2 Acc, 4 xThreshold = 11
// 2 Acc, 3 xThreshold = 12
// 2 Acc, 2 xThreshold = 13
//
pMstr->nOrigSpeed = pMstr->nSpeed = ACCELMIN;
if (pMstr->gmNew.Speed == 2)
{
pMstr->nSpeed += (24 - pMstr->gmNew.Thresh2) / 3;
}
else if (pMstr->gmNew.Speed == 1)
{
pMstr->nSpeed += (13 - pMstr->gmNew.Thresh1) / 3;
}
pMstr->nOrigSpeed = pMstr->nSpeed;
SendDlgItemMessage( hDlg,
MOUSE_SPEEDSCROLL,
TBM_SETRANGE,
0,
MAKELONG(0, 10) );
SendDlgItemMessage( hDlg,
MOUSE_SPEEDSCROLL,
TBM_SETPOS,
TRUE,
(LONG)pMstr->nOrigSensitivity / 2 );
return (TRUE);
}
////////////////////////////////////////////////////////////////////////////
//
// TrailScroll
//
////////////////////////////////////////////////////////////////////////////
#ifndef NO_MOUSETRAILS
void TrailScroll(
WPARAM wParam,
LPARAM lParam,
PMOUSEPTRSTR pMstr)
{
pMstr->nTrailSize = (int)SendMessage((HWND)lParam, TBM_GETPOS, 0, 0L);
SystemParametersInfo(SPI_SETMOUSETRAILS, pMstr->nTrailSize, 0, 0);
}
#endif
////////////////////////////////////////////////////////////////////////////
//
// SpeedScroll
//
////////////////////////////////////////////////////////////////////////////
void SpeedScroll(
WPARAM wParam,
LPARAM lParam,
PMOUSEPTRSTR pMstr)
{
pMstr->nSensitivity = (int)SendMessage((HWND)lParam, TBM_GETPOS, 0, 0L) * 2;
if (!pMstr->nSensitivity)
{
pMstr->nSensitivity = 1;
}
//
// Update speed when they let go of the thumb.
//
if (LOWORD(wParam) == SB_ENDSCROLL)
{
SystemParametersInfo( SPI_SETMOUSESPEED,
0,
(PVOID)pMstr->nSensitivity,
SPIF_SENDCHANGE );
}
}
////////////////////////////////////////////////////////////////////////////
//
// MouseMovDlg
//
////////////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK MouseMovDlg(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
PMOUSEPTRSTR pMstr;
BOOL bRet;
BOOL fSnapTo;
pMstr = (PMOUSEPTRSTR)GetWindowLongPtr(hDlg, DWLP_USER);
switch (message)
{
case ( WM_INITDIALOG ) :
{
bRet = InitMousePtrDlg(hDlg);
break;
}
case ( WM_DESTROY ) :
{
DestroyMousePtrDlg(pMstr);
break;
}
case ( WM_HSCROLL ) :
{
SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
if ((HWND)lParam == pMstr->hWndSpeedScroll)
{
SpeedScroll(wParam, lParam, pMstr);
}
#ifndef NO_MOUSETRAILS // Mouse Trails are not implemented on NT
else if ((HWND)lParam == pMstr->hWndTrailScroll)
{
TrailScroll(wParam, lParam, pMstr);
}
#endif
break;
}
case ( WM_COMMAND ) :
{
switch (LOWORD(wParam))
{
#ifndef NO_MOUSETRAILS // Mouse Trails are not implemented on NT
case ( MOUSE_TRAILS ) :
{
if (IsDlgButtonChecked(hDlg, MOUSE_TRAILS))
{
EnableTrailScroll(hDlg, TRUE);
pMstr->nTrailSize =
(int)SendMessage( pMstr->hWndTrailScroll,
TBM_GETPOS,
0,
0 );
SystemParametersInfo( SPI_SETMOUSETRAILS,
pMstr->nTrailSize,
0,
0 );
}
else
{
EnableTrailScroll(hDlg, FALSE);
SystemParametersInfo(SPI_SETMOUSETRAILS, 0, 0, 0);
}
SendMessage( GetParent(hDlg),
PSM_CHANGED,
(WPARAM)hDlg,
0L );
break;
}
#endif
case ( MOUSE_SNAPDEF ) :
{
SystemParametersInfo( SPI_SETSNAPTODEFBUTTON,
IsDlgButtonChecked(hDlg, MOUSE_SNAPDEF),
0,
FALSE );
SendMessage( GetParent(hDlg),
PSM_CHANGED,
(WPARAM)hDlg,
0L );
break;
}
case ( MOUSE_ACCELNONE ) :
{
pMstr->gmNew.Speed = 0;
pMstr->gmNew.Thresh1 = 0;
pMstr->gmNew.Thresh2 = 0;
SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
SystemParametersInfo(SPI_SETMOUSE, 0, &pMstr->gmNew, FALSE);
break;
}
case ( MOUSE_ACCELLOW ) :
{
pMstr->gmNew.Speed = 1;
pMstr->gmNew.Thresh1 = 7;
pMstr->gmNew.Thresh2 = 0;
SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
SystemParametersInfo(SPI_SETMOUSE, 0, &pMstr->gmNew, FALSE);
break;
}
case ( MOUSE_ACCELMEDIUM ) :
{
pMstr->gmNew.Speed = 2;
pMstr->gmNew.Thresh1 = 4;
pMstr->gmNew.Thresh2 = 12;
SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
SystemParametersInfo(SPI_SETMOUSE, 0, &pMstr->gmNew, FALSE);
break;
}
case ( MOUSE_ACCELHIGH ) :
{
pMstr->gmNew.Speed = 2;
pMstr->gmNew.Thresh1 = 4;
pMstr->gmNew.Thresh2 = 6;
SendMessage(GetParent(hDlg), PSM_CHANGED, (WPARAM)hDlg, 0L);
SystemParametersInfo(SPI_SETMOUSE, 0, &pMstr->gmNew, FALSE);
break;
}
}
break;
}
case ( WM_NOTIFY ) :
{
switch (((NMHDR *)lParam)->code)
{
case ( PSN_APPLY ) :
{
//
// Change cursor to hour glass.
//
HourGlass(TRUE);
#ifndef NO_MOUSETRAILS // Mouse Trails are not implemented on NT.
//
// Support mouse trails.
//
if (IsWindowEnabled(GetDlgItem(hDlg, MOUSE_TRAILS)))
{
if (IsDlgButtonChecked(hDlg, MOUSE_TRAILS))
{
SystemParametersInfo( SPI_SETMOUSETRAILS,
pMstr->nTrailSize,
0,
SPIF_UPDATEINIFILE |
SPIF_SENDCHANGE );
}
else
{
SystemParametersInfo( SPI_SETMOUSETRAILS,
0,
0,
SPIF_UPDATEINIFILE |
SPIF_SENDCHANGE );
pMstr->nTrailSize = 0;
}
//
// New original once applied.
//
pMstr->nOrigTrailSize = pMstr->nTrailSize;
}
#endif
//
// Support snap to default.
//
if (IsWindowEnabled(GetDlgItem(hDlg, MOUSE_SNAPDEF)))
{
fSnapTo = IsDlgButtonChecked(hDlg, MOUSE_SNAPDEF);
if (fSnapTo != pMstr->fOrigSnapTo)
{
SystemParametersInfo( SPI_SETSNAPTODEFBUTTON,
fSnapTo,
0,
SPIF_UPDATEINIFILE |
SPIF_SENDCHANGE );
}
//
// New original once applied.
//
pMstr->fOrigSnapTo = fSnapTo;
}
//
// Apply mouse speed.
//
SystemParametersInfo( SPI_SETMOUSESPEED,
0,
(PVOID)pMstr->nSensitivity,
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
pMstr->nOrigSensitivity = pMstr->nSensitivity;
//
// Apply mouse acceleration.
//
SystemParametersInfo( SPI_SETMOUSE,
0,
&pMstr->gmNew,
SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
pMstr->gmOrig = pMstr->gmNew;
HourGlass(FALSE);
break;
}
case ( PSN_RESET ) :
{
#ifndef NO_MOUSETRAILS // Mouse Trails are not implemented on NT
//
// Support mouse trails.
//
if (IsWindowEnabled(GetDlgItem(hDlg, MOUSE_TRAILS)))
{
pMstr->nTrailSize = pMstr->nOrigTrailSize;
SystemParametersInfo( SPI_SETMOUSETRAILS,
pMstr->nTrailSize,
0,
0 );
}
#endif
//
// Support snap to default.
//
if (IsWindowEnabled(GetDlgItem(hDlg, MOUSE_SNAPDEF)))
{
CheckDlgButton(hDlg, MOUSE_SNAPDEF, pMstr->fOrigSnapTo);
SystemParametersInfo( SPI_SETSNAPTODEFBUTTON,
pMstr->fOrigSnapTo,
0,
0 );
}
SystemParametersInfo( SPI_SETMOUSE,
0,
&pMstr->gmOrig,
FALSE );
//
// Restore the original mouse sensitivity.
//
SystemParametersInfo( SPI_SETMOUSESPEED,
0,
(PVOID)pMstr->nOrigSensitivity,
FALSE );
break;
}
default :
{
return (FALSE);
}
}
break;
}
case ( WM_HELP ) : // F1
{
WinHelp( (HWND)((LPHELPINFO)lParam)->hItemHandle,
HELP_FILE,
HELP_WM_HELP,
(DWORD_PTR)(LPTSTR)aMouseMoveHelpIds );
break;
}
case ( WM_CONTEXTMENU ) : // right mouse click
{
WinHelp( (HWND)wParam,
HELP_FILE,
HELP_CONTEXTMENU,
(DWORD_PTR)(LPTSTR)aMouseMoveHelpIds );
break;
}
case ( WM_DISPLAYCHANGE ) :
case ( WM_WININICHANGE ) :
case ( WM_SYSCOLORCHANGE ) :
{
SHPropagateMessage(hDlg, message, wParam, lParam, TRUE);
return TRUE;
}
default :
{
return (FALSE);
}
}
return (TRUE);
}