📄 mouse.c
字号:
/*
* ReactOS
* Copyright (C) 2004, 2007 ReactOS Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* $Id: mouse.c 27972 2007-07-28 20:02:37Z weiden $
*
* PROJECT: ReactOS Main Control Panel
* FILE: lib/cpl/main/mouse.c
* PURPOSE: Mouse Control Panel
* PROGRAMMER: Eric Kohl
* Johannes Anderwald
*/
//TODO:
// add missing icons
#define WINVER 0x0501
#include <windows.h>
#include <winuser.h>
#include <devguid.h>
#include <commctrl.h>
#include <cpl.h>
#include <tchar.h>
#include <math.h>
#include <limits.h>
#include <stdio.h>
#include "main.h"
#include "resource.h"
#define DEFAULT_DOUBLE_CLICK_SPEED 500
#define DEFAULT_CLICK_LOCK_TIME 2200
#define DEFAULT_MOUSE_SPEED 10
#define DEFAULT_MOUSE_ACCELERATION 1
#define DEFAULT_MOUSE_THRESHOLD1 6
#define DEFAULT_MOUSE_THRESHOLD2 10
#define MIN_DOUBLE_CLICK_SPEED 200
#define MAX_DOUBLE_CLICK_SPEED 900
#define DEFAULT_WHEEL_SCROLL_LINES 3
typedef struct _BUTTON_DATA
{
ULONG g_SwapMouseButtons;
ULONG g_OrigSwapMouseButtons;
ULONG g_DoubleClickSpeed; // = DEFAULT_DOUBLE_CLICK_SPEED;
ULONG g_OrigDoubleClickSpeed;
BOOL g_ClickLockEnabled; // = 0;
DWORD g_ClickLockTime; // = DEFAULT_CLICK_LOCK_TIME;
HICON hButtonLeft;
HICON hButtonRight;
HICON hIcon1;
HICON hIcon2;
BOOL bClicked;
} BUTTON_DATA, *PBUTTON_DATA;
typedef struct _POINTER_DATA
{
BOOL bDropShadow;
BOOL bOrigDropShadow;
INT cxCursor;
INT cyCursor;
} POINTER_DATA, *PPOINTER_DATA;
typedef struct _MOUSE_ACCEL
{
INT nThreshold1;
INT nThreshold2;
INT nAcceleration;
} MOUSE_ACCEL;
typedef struct _OPTION_DATA
{
ULONG ulMouseSpeed;
ULONG ulOrigMouseSpeed;
MOUSE_ACCEL MouseAccel;
MOUSE_ACCEL OrigMouseAccel;
BOOL bSnapToDefaultButton;
BOOL bOrigSnapToDefaultButton;
UINT uMouseTrails;
UINT uOrigMouseTrails;
BOOL bMouseVanish;
BOOL bOrigMouseVanish;
BOOL bMouseSonar;
BOOL bOrigMouseSonar;
} OPTION_DATA, *POPTION_DATA;
typedef struct _WHEEL_DATA
{
UINT uWheelScrollLines;
} WHEEL_DATA, *PWHEEL_DATA;
typedef struct _CURSOR_DATA
{
UINT uStringId;
UINT uDefaultCursorId;
LPTSTR lpValueName;
HCURSOR hCursor;
TCHAR szCursorName[MAX_PATH];
TCHAR szCursorPath[MAX_PATH];
} CURSOR_DATA, *PCURSOR_DATA;
CURSOR_DATA g_CursorData[] =
{{IDS_ARROW, 100/*OCR_NORMAL*/, _T("Arrow"), 0, _T(""), _T("")},
{IDS_HELP, 112/*OCR_HELP*/, _T("Help"), 0, _T(""), _T("")},
{IDS_APPSTARTING, 111/*OCR_APPSTARTING*/, _T("AppStarting"), 0, _T(""), _T("")},
{IDS_WAIT, 102/*OCR_WAIT*/, _T("Wait"), 0, _T(""), _T("")},
{IDS_CROSSHAIR, 103/*OCR_CROSS*/, _T("Crosshair"), 0, _T(""), _T("")},
{IDS_IBEAM, 101/*OCR_IBEAM*/, _T("IBeam"), 0, _T(""), _T("")},
{IDS_NWPEN, 113/*OCR_NWPEN*/, _T("NWPen"), 0, _T(""), _T("")},
{IDS_NO, 110/*OCR_NO*/, _T("No"), 0, _T(""), _T("")},
{IDS_SIZENS, 108/*OCR_SIZENS*/, _T("SizeNS"), 0, _T(""), _T("")},
{IDS_SIZEWE, 107/*OCR_SIZEWE*/, _T("SizeWE"), 0, _T(""), _T("")},
{IDS_SIZENWSE, 105/*OCR_SIZENWSE*/, _T("SizeNWSE"), 0, _T(""), _T("")},
{IDS_SIZENESW, 106/*OCR_SIZENESW*/, _T("SizeNESW"), 0, _T(""), _T("")},
{IDS_SIZEALL, 109/*OCR_SIZEALL*/, _T("SizeAll"), 0, _T(""), _T("")},
{IDS_UPARROW, 104/*OCR_UP*/, _T("UpArrow"), 0, _T(""), _T("")},
{IDS_HAND, 114/*OCR_HAND*/, _T("Hand"), 0, _T(""), _T("")}};
#if 0
static VOID
DebugMsg(LPTSTR fmt, ...)
{
TCHAR szBuffer[2048];
va_list marker;
va_start(marker, fmt);
_vstprintf(szBuffer, fmt, marker);
va_end(marker);
MessageBox(NULL, szBuffer, _T("Debug message"), MB_OK);
}
#endif
/* Property page dialog callback */
static INT_PTR CALLBACK
MouseHardwareProc(IN HWND hwndDlg,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam)
{
GUID Guids[1];
Guids[0] = GUID_DEVCLASS_MOUSE;
UNREFERENCED_PARAMETER(lParam);
UNREFERENCED_PARAMETER(wParam);
switch(uMsg)
{
case WM_INITDIALOG:
/* create the hardware page */
DeviceCreateHardwarePageEx(hwndDlg,
Guids,
sizeof(Guids) / sizeof(Guids[0]),
HWPD_STANDARDLIST);
break;
}
return FALSE;
}
static INT_PTR CALLBACK
ClickLockProc(IN HWND hwndDlg,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam)
{
HWND hDlgCtrl;
int pos;
PBUTTON_DATA pButtonData;
pButtonData = (PBUTTON_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
switch(uMsg)
{
case WM_INITDIALOG:
pButtonData = (PBUTTON_DATA)lParam;
SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pButtonData);
hDlgCtrl = GetDlgItem(hwndDlg, IDC_SLIDER_CLICK_LOCK);
SendMessage(hDlgCtrl, TBM_SETRANGE, (WPARAM)TRUE, (LPARAM)MAKELONG(0, 10));
pos = (pButtonData->g_ClickLockTime - 200) / 200;
SendMessage(hDlgCtrl, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)pos);
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK)
{
hDlgCtrl = GetDlgItem(hwndDlg, IDC_SLIDER_CLICK_LOCK);
pButtonData->g_ClickLockTime = (DWORD) (SendMessage(hDlgCtrl, TBM_GETPOS, 0, 0) * 200) + 200;
EndDialog(hwndDlg, TRUE);
}
else if (LOWORD(wParam) == IDCANCEL)
{
EndDialog(hwndDlg, FALSE);
}
break;
}
return FALSE;
}
static INT_PTR CALLBACK
ButtonProc(IN HWND hwndDlg,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam)
{
HWND hDlgCtrl;
LRESULT lResult;
LPPSHNOTIFY lppsn;
PBUTTON_DATA pButtonData;
pButtonData = (PBUTTON_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
switch (uMsg)
{
case WM_INITDIALOG:
pButtonData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BUTTON_DATA));
SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pButtonData);
pButtonData->g_SwapMouseButtons = GetSystemMetrics(SM_SWAPBUTTON);
pButtonData->g_OrigSwapMouseButtons = pButtonData->g_SwapMouseButtons;
pButtonData->g_DoubleClickSpeed = GetDoubleClickTime();
pButtonData->g_OrigDoubleClickSpeed = pButtonData->g_DoubleClickSpeed;
/* Click lock time */
SystemParametersInfo(SPI_GETMOUSECLICKLOCK, 0, &pButtonData->g_ClickLockEnabled, 0);
SystemParametersInfo(SPI_GETMOUSECLICKLOCKTIME, 0, &pButtonData->g_ClickLockTime, 0);
/* Load mouse button icons */
pButtonData->hButtonLeft = LoadImage(hApplet, MAKEINTRESOURCE(IDI_MOUSE_LEFT), IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR);
pButtonData->hButtonRight = LoadImage(hApplet, MAKEINTRESOURCE(IDI_MOUSE_RIGHT), IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR);
/* Load folder icons */
pButtonData->hIcon1 = LoadImage(hApplet, MAKEINTRESOURCE(IDI_FOLDER_CLOSED), IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR);
pButtonData->hIcon2 = LoadImage(hApplet, MAKEINTRESOURCE(IDI_FOLDER_OPEN), IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR);
if (pButtonData->g_SwapMouseButtons)
{
SendDlgItemMessage(hwndDlg, IDC_SWAP_MOUSE_BUTTONS, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
SendDlgItemMessage(hwndDlg, IDC_IMAGE_SWAP_MOUSE, STM_SETIMAGE, IMAGE_ICON, (LPARAM)pButtonData->hButtonRight);
}
else
{
SendDlgItemMessage(hwndDlg, IDC_IMAGE_SWAP_MOUSE, STM_SETIMAGE, IMAGE_ICON, (LPARAM)pButtonData->hButtonLeft);
}
if (pButtonData->g_ClickLockEnabled)
{
hDlgCtrl = GetDlgItem(hwndDlg, IDC_CHECK_CLICK_LOCK);
SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
}
else
{
hDlgCtrl = GetDlgItem(hwndDlg, IDC_BUTTON_CLICK_LOCK);
EnableWindow(hDlgCtrl, FALSE);
}
hDlgCtrl = GetDlgItem(hwndDlg, IDC_SLIDER_DOUBLE_CLICK_SPEED);
SendMessage(hDlgCtrl, TBM_SETRANGE, (WPARAM)TRUE, (LPARAM)MAKELONG(0, 14));
SendMessage(hDlgCtrl, TBM_SETPOS, (WPARAM)TRUE, 14 - ((pButtonData->g_DoubleClickSpeed - 200) / 50));
SendDlgItemMessage(hwndDlg, IDC_IMAGE_DOUBLE_CLICK_SPEED, STM_SETIMAGE, IMAGE_ICON, (LPARAM)pButtonData->hIcon1);
pButtonData->bClicked = TRUE;
return TRUE;
case WM_DESTROY:
DestroyIcon(pButtonData->hButtonLeft);
DestroyIcon(pButtonData->hButtonRight);
DestroyIcon(pButtonData->hIcon1);
DestroyIcon(pButtonData->hIcon2);
HeapFree(GetProcessHeap(), 0, pButtonData);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDC_SWAP_MOUSE_BUTTONS:
lResult = SendMessage((HWND)lParam, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
if (lResult == BST_CHECKED)
{
pButtonData->g_SwapMouseButtons = FALSE;
SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, (LPARAM)0);
SendDlgItemMessage(hwndDlg, IDC_IMAGE_SWAP_MOUSE, STM_SETIMAGE, IMAGE_ICON, (LPARAM)pButtonData->hButtonLeft);
}
else if (lResult == BST_UNCHECKED)
{
pButtonData->g_SwapMouseButtons = TRUE;
SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
SendDlgItemMessage(hwndDlg, IDC_IMAGE_SWAP_MOUSE, STM_SETIMAGE, IMAGE_ICON, (LPARAM)pButtonData->hButtonRight);
}
SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, pButtonData->g_SwapMouseButtons, NULL, 0);
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
break;
case IDC_CHECK_CLICK_LOCK:
lResult = SendMessage((HWND)lParam, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
hDlgCtrl = GetDlgItem(hwndDlg, IDC_BUTTON_CLICK_LOCK);
if (lResult == BST_CHECKED)
{
SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, (LPARAM)0);
pButtonData->g_ClickLockEnabled = FALSE;
EnableWindow(hDlgCtrl, FALSE);
}
else if (lResult == BST_UNCHECKED)
{
SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
pButtonData->g_ClickLockEnabled = TRUE;
EnableWindow(hDlgCtrl, TRUE);
}
PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
break;
case IDC_BUTTON_CLICK_LOCK:
DialogBoxParam(hApplet, MAKEINTRESOURCE(IDD_CLICK_LOCK), hwndDlg, ClickLockProc, (LPARAM)pButtonData);
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -