3 * Copyright (C) 2004, 2007 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * PROJECT: ReactOS Main Control Panel
22 * FILE: lib/cpl/main/mouse.c
23 * PURPOSE: Mouse Control Panel
24 * PROGRAMMER: Eric Kohl
30 // Options- pointer precision
48 #define DEFAULT_DOUBLE_CLICK_SPEED 500
49 #define DEFAULT_CLICK_LOCK_TIME 2200
50 #define DEFAULT_MOUSE_SENSITIVITY 16
51 #define DEFAULT_MOUSE_THRESHOLD1 6
52 #define DEFAULT_MOUSE_THRESHOLD2 10
53 #define MIN_DOUBLE_CLICK_SPEED 200
54 #define MAX_DOUBLE_CLICK_SPEED 900
55 #define DEFAULT_WHEEL_SCROLL_LINES 3
58 typedef struct _BUTTON_DATA
60 ULONG g_SwapMouseButtons
;
61 ULONG g_OrigSwapMouseButtons
;
62 ULONG g_DoubleClickSpeed
; // = DEFAULT_DOUBLE_CLICK_SPEED;
63 ULONG g_OrigDoubleClickSpeed
;
64 BOOL g_ClickLockEnabled
; // = 0;
65 DWORD g_ClickLockTime
; // = DEFAULT_CLICK_LOCK_TIME;
73 } BUTTON_DATA
, *PBUTTON_DATA
;
76 typedef struct _POINTER_DATA
83 } POINTER_DATA
, *PPOINTER_DATA
;
86 typedef struct _OPTION_DATA
88 ULONG ulMouseSensitivity
;
89 ULONG ulOrigMouseSensitivity
;
91 ULONG ulMouseSpeed
; // = 1;
92 ULONG ulMouseThreshold1
; // = DEFAULT_MOUSE_THRESHOLD1;
93 ULONG ulMouseThreshold2
; // = DEFAULT_MOUSE_THRESHOLD2;
95 ULONG ulSnapToDefaultButton
;
99 } OPTION_DATA
, *POPTION_DATA
;
102 typedef struct _WHEEL_DATA
104 UINT uWheelScrollLines
;
105 } WHEEL_DATA
, *PWHEEL_DATA
;
108 typedef struct _CURSOR_DATA
111 UINT uDefaultCursorId
;
114 TCHAR szCursorName
[MAX_PATH
];
115 TCHAR szCursorPath
[MAX_PATH
];
116 } CURSOR_DATA
, *PCURSOR_DATA
;
119 CURSOR_DATA g_CursorData
[] =
120 {{IDS_ARROW
, 100/*OCR_NORMAL*/, _T("Arrow"), 0, _T(""), _T("")},
121 {IDS_HELP
, 112/*OCR_HELP*/, _T("Help"), 0, _T(""), _T("")},
122 {IDS_APPSTARTING
, 111/*OCR_APPSTARTING*/, _T("AppStarting"), 0, _T(""), _T("")},
123 {IDS_WAIT
, 102/*OCR_WAIT*/, _T("Wait"), 0, _T(""), _T("")},
124 {IDS_CROSSHAIR
, 103/*OCR_CROSS*/, _T("Crosshair"), 0, _T(""), _T("")},
125 {IDS_IBEAM
, 101/*OCR_IBEAM*/, _T("IBeam"), 0, _T(""), _T("")},
126 {IDS_NWPEN
, 113/*OCR_NWPEN*/, _T("NWPen"), 0, _T(""), _T("")},
127 {IDS_NO
, 110/*OCR_NO*/, _T("No"), 0, _T(""), _T("")},
128 {IDS_SIZENS
, 108/*OCR_SIZENS*/, _T("SizeNS"), 0, _T(""), _T("")},
129 {IDS_SIZEWE
, 107/*OCR_SIZEWE*/, _T("SizeWE"), 0, _T(""), _T("")},
130 {IDS_SIZENWSE
, 105/*OCR_SIZENWSE*/, _T("SizeNWSE"), 0, _T(""), _T("")},
131 {IDS_SIZENESW
, 106/*OCR_SIZENESW*/, _T("SizeNESW"), 0, _T(""), _T("")},
132 {IDS_SIZEALL
, 109/*OCR_SIZEALL*/, _T("SizeAll"), 0, _T(""), _T("")},
133 {IDS_UPARROW
, 104/*OCR_UP*/, _T("UpArrow"), 0, _T(""), _T("")},
134 {IDS_HAND
, 114/*OCR_HAND*/, _T("Hand"), 0, _T(""), _T("")}};
139 DebugMsg(LPTSTR fmt
, ...)
141 TCHAR szBuffer
[2048];
144 va_start(marker
, fmt
);
145 _vstprintf(szBuffer
, fmt
, marker
);
148 MessageBox(NULL
, szBuffer
, _T("Debug message"), MB_OK
);
153 /* Property page dialog callback */
154 static INT_PTR CALLBACK
155 MouseHardwareProc(IN HWND hwndDlg
,
161 Guids
[0] = GUID_DEVCLASS_MOUSE
;
163 UNREFERENCED_PARAMETER(lParam
);
164 UNREFERENCED_PARAMETER(wParam
);
169 /* create the hardware page */
170 DeviceCreateHardwarePageEx(hwndDlg
,
172 sizeof(Guids
) / sizeof(Guids
[0]),
181 static INT_PTR CALLBACK
182 ClickLockProc(IN HWND hwndDlg
,
190 PBUTTON_DATA pButtonData
;
192 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
197 pButtonData
= (PBUTTON_DATA
)lParam
;
198 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
200 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
201 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 10));
202 pos
= (pButtonData
->g_ClickLockTime
- 200) / 200;
203 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pos
);
207 if (LOWORD(wParam
) == IDOK
)
209 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
210 pButtonData
->g_ClickLockTime
= (DWORD
) (SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) * 200) + 200;
211 EndDialog(hwndDlg
, TRUE
);
213 else if (LOWORD(wParam
) == IDCANCEL
)
215 EndDialog(hwndDlg
, FALSE
);
224 static INT_PTR CALLBACK
225 ButtonProc(IN HWND hwndDlg
,
234 PBUTTON_DATA pButtonData
;
236 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
241 pButtonData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(BUTTON_DATA
));
242 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
244 pButtonData
->g_SwapMouseButtons
= GetSystemMetrics(SM_SWAPBUTTON
);
245 pButtonData
->g_OrigSwapMouseButtons
= pButtonData
->g_SwapMouseButtons
;
246 pButtonData
->g_DoubleClickSpeed
= GetDoubleClickTime();
247 pButtonData
->g_OrigDoubleClickSpeed
= pButtonData
->g_DoubleClickSpeed
;
249 /* Click lock time */
250 SystemParametersInfo(SPI_GETMOUSECLICKLOCK
, 0, &pButtonData
->g_ClickLockEnabled
, 0);
251 SystemParametersInfo(SPI_GETMOUSECLICKLOCKTIME
, 0, &pButtonData
->g_ClickLockTime
, 0);
253 /* Load mouse button icons */
254 pButtonData
->hButtonLeft
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_LEFT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
255 pButtonData
->hButtonRight
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_RIGHT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
257 /* Load folder icons */
258 pButtonData
->hIcon1
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_CLOSED
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
259 pButtonData
->hIcon2
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_OPEN
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
261 if (pButtonData
->g_SwapMouseButtons
)
263 SendDlgItemMessage(hwndDlg
, IDC_SWAP_MOUSE_BUTTONS
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
264 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
268 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
271 if (pButtonData
->g_ClickLockEnabled
)
273 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_CLICK_LOCK
);
274 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
278 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
279 EnableWindow(hDlgCtrl
, FALSE
);
282 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
);
283 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 14));
284 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, 14 - ((pButtonData
->g_DoubleClickSpeed
- 200) / 50));
287 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hIcon1
);
288 pButtonData
->bClicked
= TRUE
;
292 DestroyIcon(pButtonData
->hButtonLeft
);
293 DestroyIcon(pButtonData
->hButtonRight
);
294 DestroyIcon(pButtonData
->hIcon1
);
295 DestroyIcon(pButtonData
->hIcon2
);
296 HeapFree(GetProcessHeap(), 0, pButtonData
);
300 switch(LOWORD(wParam
))
302 case IDC_SWAP_MOUSE_BUTTONS
:
303 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
304 if (lResult
== BST_CHECKED
)
306 pButtonData
->g_SwapMouseButtons
= FALSE
;
307 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
308 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
310 else if (lResult
== BST_UNCHECKED
)
312 pButtonData
->g_SwapMouseButtons
= TRUE
;
313 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
314 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
316 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_SwapMouseButtons
, NULL
, SPIF_SENDCHANGE
);
317 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
320 case IDC_CHECK_CLICK_LOCK
:
321 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
322 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
323 if (lResult
== BST_CHECKED
)
325 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
326 pButtonData
->g_ClickLockEnabled
= FALSE
;
327 EnableWindow(hDlgCtrl
, FALSE
);
329 else if (lResult
== BST_UNCHECKED
)
331 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
332 EnableWindow(hDlgCtrl
, TRUE
);
333 pButtonData
->g_ClickLockEnabled
= TRUE
;
335 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
338 case IDC_BUTTON_CLICK_LOCK
:
339 DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_CLICK_LOCK
), hwndDlg
, ClickLockProc
, (LPARAM
)pButtonData
);
342 case IDC_IMAGE_DOUBLE_CLICK_SPEED
:
343 if (HIWORD(wParam
) == STN_DBLCLK
)
345 pButtonData
->bClicked
= !pButtonData
->bClicked
;
346 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
,
347 (LPARAM
)(pButtonData
->bClicked
? pButtonData
->hIcon1
: pButtonData
->hIcon2
));
354 lppsn
= (LPPSHNOTIFY
) lParam
;
355 if (lppsn
->hdr
.code
== PSN_APPLY
)
357 #if (WINVER >= 0x0500)
358 SystemParametersInfo(SPI_SETMOUSECLICKLOCK
, pButtonData
->g_ClickLockEnabled
, NULL
, SPIF_SENDCHANGE
);
359 if (pButtonData
->g_ClickLockEnabled
)
360 SystemParametersInfo(SPI_SETMOUSECLICKLOCKTIME
, pButtonData
->g_ClickLockTime
, NULL
, SPIF_SENDCHANGE
);
362 SetWindowLong(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
364 else if (lppsn
->hdr
.code
== PSN_RESET
)
366 /* Reset swap mouse button setting */
367 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_OrigSwapMouseButtons
, NULL
, SPIF_SENDCHANGE
);
369 /* Reset double click speed setting */
370 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_OrigDoubleClickSpeed, NULL, SPIF_SENDCHANGE);
371 SetDoubleClickTime(pButtonData
->g_OrigDoubleClickSpeed
);
376 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
))
378 switch (LOWORD(wParam
))
387 lResult
= SendDlgItemMessage(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
, TBM_GETPOS
, 0, 0);
388 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)lResult
) * 50 + 200;
389 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, SPIF_SENDCHANGE);
390 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
391 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
395 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)HIWORD(wParam
)) * 50 + 200;
396 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, SPIF_SENDCHANGE);
397 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
398 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
410 EnumerateCursorSchemes(HWND hwndDlg
)
415 TCHAR szValueName
[MAX_PATH
];
417 TCHAR szSystemScheme
[MAX_PATH
];
418 TCHAR szValueData
[2000];
423 BOOL ProcessedHKLM
= FALSE
;
424 TCHAR szCurrentScheme
[MAX_PATH
];
425 DWORD dwCurrentScheme
;
430 if (RegOpenCurrentUser(KEY_READ
, &hCuKey
) != ERROR_SUCCESS
)
433 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
, &hCuCursorKey
) != ERROR_SUCCESS
)
439 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
440 SendMessage(hDlgCtrl
, CB_RESETCONTENT
, 0, 0);
445 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
446 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
447 dwResult
= RegEnumValue(hCuCursorKey
, dwIndex
, szValueName
, &dwValueName
, NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
449 if (dwResult
== ERROR_NO_MORE_ITEMS
)
453 RegCloseKey(hCuCursorKey
);
454 dwResult
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
455 _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cursors\\Schemes"),
456 0, KEY_READ
, &hCuCursorKey
);
457 if (dwResult
== ERROR_SUCCESS
)
460 ProcessedHKLM
= TRUE
;
461 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
468 if (_tcslen(szValueData
) > 0)
470 TCHAR
* copy
= _tcsdup(szValueData
);
473 _tcscat(szValueName
, TEXT(" "));
474 _tcscat(szValueName
, szSystemScheme
);
476 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szValueName
);
477 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)copy
);
483 RegCloseKey(hCuCursorKey
);
486 /* Add the "(none)" entry */
487 LoadString(hApplet
, IDS_NONE
, szSystemScheme
, MAX_PATH
);
488 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szSystemScheme
);
489 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)NULL
);
492 /* Get the name of the current cursor scheme */
493 szCurrentScheme
[0] = 0;
494 if (RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Control Panel\\Cursors"), 0, KEY_READ
, &hCuCursorKey
) == ERROR_SUCCESS
)
496 dwCurrentScheme
= sizeof(szCurrentScheme
) / sizeof(TCHAR
);
497 if (RegQueryValueEx(hCuCursorKey
, NULL
, NULL
, NULL
, (LPBYTE
)szCurrentScheme
, &dwCurrentScheme
))
498 szCurrentScheme
[0] = 0;
499 RegCloseKey(hCuCursorKey
);
502 /* Search for the matching entry in the cursor scheme list */
503 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
505 nCount
= (INT
)SendMessage(hDlgCtrl
, CB_GETCOUNT
, 0, 0);
506 for (i
= 0; i
< nCount
; i
++)
508 SendMessage(hDlgCtrl
, CB_GETLBTEXT
, i
, (LPARAM
)szValueName
);
510 p
= _tcsstr(szValueName
, szSystemScheme
);
517 if (_tcscmp(szValueName
, szCurrentScheme
) == 0)
519 nSchemeIndex
= (INT
)i
;
524 /* Select the matching entry */
525 if (nSchemeIndex
!= -1)
526 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)nSchemeIndex
, (LPARAM
)0);
529 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)lResult
, (LPARAM
)0);
530 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
);
531 EnableWindow(hDlgCtrl
, FALSE
);
539 RefreshCursorList(HWND hwndDlg
, BOOL bInit
)
545 nSel
= bInit
? 0 : SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
549 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_RESETCONTENT
, 0, 0);
550 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
552 LoadString(hApplet
, index
, g_CursorData
[i
].szCursorName
, MAX_PATH
);
553 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_ADDSTRING
, 0, (LPARAM
)i
);
556 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_SETCURSEL
, nSel
, 0);
560 InvalidateRect(GetDlgItem(hwndDlg
, IDC_LISTBOX_CURSOR
), NULL
, FALSE
);
563 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
, STM_SETIMAGE
, IMAGE_CURSOR
,
564 (LPARAM
)g_CursorData
[nSel
].hCursor
);
566 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), (g_CursorData
[nSel
].szCursorPath
[0] != 0));
571 DeleteUserCursorScheme(HWND hwndDlg
)
573 TCHAR szSchemeName
[MAX_PATH
];
575 TCHAR szRawText
[256];
583 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
584 nSel
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
588 SendMessage(hDlgCtrl
, CB_GETLBTEXT
, nSel
, (LPARAM
)szSchemeName
);
590 LoadString(hApplet
, IDS_REMOVE_TITLE
, szTitle
, 128);
591 LoadString(hApplet
, IDS_REMOVE_TEXT
, szRawText
, 256);
593 _stprintf(szText
, szRawText
, szSchemeName
);
595 /* Confirm scheme removal */
596 if (MessageBox(hwndDlg
, szText
, szTitle
, MB_YESNO
| MB_ICONQUESTION
) == IDNO
)
599 if (RegOpenCurrentUser(KEY_READ
| KEY_SET_VALUE
, &hCuKey
) != ERROR_SUCCESS
)
602 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
| KEY_SET_VALUE
, &hCuCursorKey
) != ERROR_SUCCESS
)
608 lResult
= RegDeleteValue(hCuCursorKey
, szSchemeName
);
610 RegCloseKey(hCuCursorKey
);
613 if (lResult
== ERROR_SUCCESS
)
615 SendMessage(hDlgCtrl
, CB_DELETESTRING
, nSel
, 0);
616 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)0, (LPARAM
)0);
619 return (lResult
== ERROR_SUCCESS
);
623 static INT_PTR CALLBACK
624 SaveSchemeProc(IN HWND hwndDlg
,
634 pSchemeName
= (LPTSTR
)lParam
;
635 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pSchemeName
);
636 SendDlgItemMessage(hwndDlg
, IDC_EDIT_SCHEME_NAME
, WM_SETTEXT
,
637 0, (LPARAM
)pSchemeName
);
641 if (LOWORD(wParam
) == IDOK
)
643 pSchemeName
= (LPTSTR
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
644 SendDlgItemMessage(hwndDlg
, IDC_EDIT_SCHEME_NAME
, WM_GETTEXT
,
645 (WPARAM
)MAX_PATH
, (LPARAM
)pSchemeName
);
646 EndDialog(hwndDlg
, TRUE
);
648 else if (LOWORD(wParam
) == IDCANCEL
)
650 EndDialog(hwndDlg
, FALSE
);
660 SaveCursorScheme(HWND hwndDlg
)
662 TCHAR szSystemScheme
[MAX_PATH
];
663 TCHAR szSchemeName
[MAX_PATH
];
664 TCHAR szNewSchemeName
[MAX_PATH
];
668 INT index
, i
, nLength
;
672 LONG lResult
= ERROR_SUCCESS
;
675 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
677 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
687 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)szNewSchemeName
);
689 if (_tcsstr(szNewSchemeName
, szSystemScheme
))
691 szNewSchemeName
[_tcslen(szNewSchemeName
) - _tcslen(szSystemScheme
) - 1] = 0;
695 /* Ask for a name for the new cursor scheme */
696 if (!DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_CURSOR_SCHEME_SAVEAS
),
697 hwndDlg
, SaveSchemeProc
, (LPARAM
)szNewSchemeName
))
700 /* Check all non-system schemes for the new name */
701 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCOUNT
, 0, 0);
705 bSchemeExists
= FALSE
;
706 for (i
= 0; i
< nSel
; i
++)
708 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, i
, (LPARAM
)szSchemeName
);
709 if (_tcsstr(szSchemeName
, szSystemScheme
) == NULL
)
711 if (_tcscmp(szSchemeName
, szNewSchemeName
) == 0)
713 bSchemeExists
= TRUE
;
721 LoadString(hApplet
, IDS_OVERWRITE_TITLE
, szTitle
, 128);
722 LoadString(hApplet
, IDS_OVERWRITE_TEXT
, szText
, 256);
724 /* Confirm scheme overwrite */
725 if (MessageBox(hwndDlg
, szText
, szTitle
, MB_YESNO
| MB_ICONQUESTION
) == IDNO
)
729 /* Save the cursor scheme */
731 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
735 nLength
+= _tcslen(g_CursorData
[i
].szCursorPath
);
739 lpSchemeData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, nLength
* sizeof(TCHAR
));
741 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
744 _tcscat(lpSchemeData
, _T(","));
745 _tcscat(lpSchemeData
, g_CursorData
[i
].szCursorPath
);
748 if (RegOpenCurrentUser(KEY_READ
| KEY_SET_VALUE
, &hCuKey
) != ERROR_SUCCESS
)
751 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
| KEY_SET_VALUE
, &hCuCursorKey
) != ERROR_SUCCESS
)
757 lResult
= RegSetValueEx(hCuCursorKey
, szNewSchemeName
, 0, REG_EXPAND_SZ
,
758 (LPBYTE
)lpSchemeData
, nLength
* sizeof(TCHAR
));
760 RegCloseKey(hCuCursorKey
);
763 HeapFree(GetProcessHeap(), 0, lpSchemeData
);
765 return (lResult
== ERROR_SUCCESS
);
770 BrowseCursor(HWND hwndDlg
)
772 TCHAR szFileName
[MAX_PATH
];
773 TCHAR szFilter
[MAX_PATH
];
774 TCHAR szTitle
[MAX_PATH
];
778 LoadString(hApplet
, IDS_BROWSE_FILTER
, szFilter
, MAX_PATH
);
779 LoadString(hApplet
, IDS_BROWSE_TITLE
, szTitle
, MAX_PATH
);
781 memset(szFileName
, 0x0, sizeof(szFileName
));
782 nSel
= SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
785 MessageBox(hwndDlg
, _T("LB_ERR"), _T(""), MB_ICONERROR
);
789 ZeroMemory(&ofn
, sizeof(OPENFILENAME
));
790 ofn
.lStructSize
= sizeof(OPENFILENAME
);
791 ofn
.hwndOwner
= hwndDlg
;
792 ofn
.lpstrFilter
= szFilter
;
793 ofn
.nFilterIndex
= 1;
794 ofn
.lpstrFile
= szFileName
;
795 ofn
.nMaxFile
= MAX_PATH
;
796 ofn
.lpstrInitialDir
= _T("%WINDIR%\\Cursors");
797 ofn
.lpstrTitle
= szTitle
;
798 ofn
.Flags
= OFN_EXPLORER
| OFN_FILEMUSTEXIST
;
800 if (!GetOpenFileName(&ofn
))
803 /* Store the new cursor file path */
804 _tcsncpy(g_CursorData
[nSel
].szCursorPath
, szFileName
, MAX_PATH
);
811 LoadCursorScheme(LPTSTR lpName
, BOOL bSystem
)
815 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
817 if (g_CursorData
[i
].hCursor
!= NULL
)
819 DestroyCursor(g_CursorData
[i
].hCursor
);
820 g_CursorData
[i
].hCursor
= 0;
822 g_CursorData
[i
].szCursorPath
[0] = 0;
827 LPTSTR pStart
= lpName
;
828 LPTSTR pEnd
= pStart
;
834 pEnd
= _tcschr(pStart
, _T(','));
836 nLength
= ((INT_PTR
)pEnd
- (INT_PTR
)pStart
) / sizeof(TCHAR
);
838 nLength
= _tcslen(pStart
);
840 _tcsncpy(g_CursorData
[i
].szCursorPath
, pStart
, nLength
);
841 g_CursorData
[i
].szCursorPath
[nLength
] = 0;
843 pStart
= pStart
+ (nLength
+ 1);
849 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
851 if (g_CursorData
[i
].szCursorPath
[0] == 0)
852 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, MAKEINTRESOURCE(g_CursorData
[i
].uDefaultCursorId
),
854 LR_DEFAULTSIZE
| LR_SHARED
);
856 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, g_CursorData
[i
].szCursorPath
,
858 LR_LOADFROMFILE
| LR_DEFAULTSIZE
);
864 ReloadCurrentCursorScheme(VOID
)
868 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
870 if (g_CursorData
[i
].hCursor
!= NULL
)
871 DestroyCursor(g_CursorData
[i
].hCursor
);
873 if (g_CursorData
[i
].szCursorPath
[0] == 0)
874 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, MAKEINTRESOURCE(g_CursorData
[i
].uDefaultCursorId
),
876 LR_DEFAULTSIZE
| LR_SHARED
);
878 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, g_CursorData
[i
].szCursorPath
,
880 LR_LOADFROMFILE
| LR_DEFAULTSIZE
);
886 OnDrawItem(UINT idCtl
,
887 LPDRAWITEMSTRUCT lpdis
,
888 PPOINTER_DATA pPointerData
)
892 if (lpdis
->itemState
& ODS_SELECTED
)
896 (HBRUSH
)(COLOR_HIGHLIGHT
+ 1));
897 SetBkColor(lpdis
->hDC
,
898 GetSysColor(COLOR_HIGHLIGHT
));
899 SetTextColor(lpdis
->hDC
,
900 GetSysColor(COLOR_HIGHLIGHTTEXT
));
906 (HBRUSH
)(COLOR_WINDOW
+ 1));
907 SetBkColor(lpdis
->hDC
,
908 GetSysColor(COLOR_WINDOW
));
909 SetTextColor(lpdis
->hDC
,
910 GetSysColor(COLOR_WINDOWTEXT
));
913 if (lpdis
->itemID
!= -1)
915 CopyRect(&rc
, &lpdis
->rcItem
);
918 g_CursorData
[lpdis
->itemData
].szCursorName
,
921 DT_SINGLELINE
| DT_VCENTER
| DT_LEFT
);
923 if (g_CursorData
[lpdis
->itemData
].hCursor
!= NULL
)
926 lpdis
->rcItem
.right
- pPointerData
->cxCursor
- 4,
927 lpdis
->rcItem
.top
+ 2,
928 g_CursorData
[lpdis
->itemData
].hCursor
);
932 if (lpdis
->itemState
& ODS_FOCUS
)
934 CopyRect(&rc
, &lpdis
->rcItem
);
935 InflateRect(&rc
, -1, -1);
936 DrawFocusRect(lpdis
->hDC
, &rc
);
942 LoadNewCursorScheme(HWND hwndDlg
, BOOL bInit
)
944 TCHAR buffer
[MAX_PATH
];
945 TCHAR szSystemScheme
[MAX_PATH
];
951 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
955 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)buffer
);
957 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
958 if (_tcsstr(buffer
, szSystemScheme
) || nSel
== 0) //avoid the default scheme can be deleted
964 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
);
965 EnableWindow(hDlgCtrl
, bEnable
);
967 lpName
= (LPTSTR
)SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETITEMDATA
, nSel
, 0);
968 LoadCursorScheme(lpName
, !bEnable
);
969 RefreshCursorList(hwndDlg
, bInit
);
974 ApplyCursorScheme(HWND hwndDlg
)
976 /* FIXME: Apply the cursor scheme */
982 static INT_PTR CALLBACK
983 PointerProc(IN HWND hwndDlg
,
988 PPOINTER_DATA pPointerData
;
992 pPointerData
= (PPOINTER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
997 pPointerData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(POINTER_DATA
));
998 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pPointerData
);
1000 pPointerData
->cxCursor
= GetSystemMetrics(SM_CXCURSOR
);
1001 pPointerData
->cyCursor
= GetSystemMetrics(SM_CYCURSOR
);
1003 EnumerateCursorSchemes(hwndDlg
);
1004 LoadNewCursorScheme(hwndDlg
, TRUE
);
1006 /* Get drop shadow setting */
1007 if (!SystemParametersInfo(SPI_GETDROPSHADOW
, 0, &pPointerData
->bDropShadow
, 0))
1008 pPointerData
->bDropShadow
= FALSE
;
1010 pPointerData
->bOrigDropShadow
= pPointerData
->bDropShadow
;
1012 if (pPointerData
->bDropShadow
)
1014 SendDlgItemMessage(hwndDlg
, IDC_CHECK_DROP_SHADOW
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1017 if ((INT
)wParam
== IDC_LISTBOX_CURSOR
)
1022 case WM_MEASUREITEM
:
1023 ((LPMEASUREITEMSTRUCT
)lParam
)->itemHeight
= GetSystemMetrics(SM_CYCURSOR
) + 4;
1027 if (wParam
== IDC_LISTBOX_CURSOR
)
1028 OnDrawItem((UINT
)wParam
, (LPDRAWITEMSTRUCT
)lParam
, pPointerData
);
1032 HeapFree(GetProcessHeap(), 0, pPointerData
);
1036 lppsn
= (LPPSHNOTIFY
) lParam
;
1037 if (lppsn
->hdr
.code
== PSN_APPLY
)
1039 ApplyCursorScheme(hwndDlg
);
1040 #if (WINVER >= 0x0500)
1041 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bDropShadow
, SPIF_SENDCHANGE
);
1045 else if (lppsn
->hdr
.code
== PSN_RESET
)
1047 #if (WINVER >= 0x0500)
1048 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bOrigDropShadow
, SPIF_SENDCHANGE
);
1054 switch (LOWORD(wParam
))
1056 case IDC_COMBO_CURSOR_SCHEME
:
1057 if (HIWORD(wParam
) == CBN_SELENDOK
)
1059 LoadNewCursorScheme(hwndDlg
, FALSE
);
1061 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1065 case IDC_LISTBOX_CURSOR
:
1066 switch (HIWORD(wParam
))
1069 nSel
= SendMessage((HWND
)lParam
, LB_GETCURSEL
, 0, 0);
1070 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
, STM_SETIMAGE
, IMAGE_CURSOR
,
1071 (LPARAM
)g_CursorData
[nSel
].hCursor
);
1072 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
),
1073 (g_CursorData
[nSel
].szCursorPath
[0] != 0));
1077 if (BrowseCursor(hwndDlg
))
1079 /* Update cursor list and preview */
1080 ReloadCurrentCursorScheme();
1081 RefreshCursorList(hwndDlg
, FALSE
);
1083 /* Enable the "Set Default" button */
1084 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), TRUE
);
1086 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1092 case IDC_BUTTON_SAVEAS_SCHEME
:
1093 SaveCursorScheme(hwndDlg
);
1096 case IDC_BUTTON_USE_DEFAULT_CURSOR
:
1097 nSel
= SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
1100 /* Clean the path of the currently selected cursor */
1101 memset(g_CursorData
[nSel
].szCursorPath
, 0x0, MAX_PATH
* sizeof(TCHAR
));
1103 /* Update cursor list and preview */
1104 ReloadCurrentCursorScheme();
1105 RefreshCursorList(hwndDlg
, FALSE
);
1107 /* Disable the "Set Default" button */
1108 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), FALSE
);
1110 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1114 case IDC_BUTTON_BROWSE_CURSOR
:
1115 if (BrowseCursor(hwndDlg
))
1117 /* Update cursor list and preview */
1118 ReloadCurrentCursorScheme();
1119 RefreshCursorList(hwndDlg
, FALSE
);
1121 /* Enable the "Set Default" button */
1122 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), TRUE
);
1124 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1128 case IDC_BUTTON_DELETE_SCHEME
:
1129 DeleteUserCursorScheme(hwndDlg
);
1132 case IDC_CHECK_DROP_SHADOW
:
1133 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_DROP_SHADOW
))
1135 pPointerData
->bDropShadow
= FALSE
;
1136 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1137 #if (WINVER >= 0x0500)
1138 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bDropShadow
, SPIF_SENDCHANGE
);
1140 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1144 pPointerData
->bDropShadow
= TRUE
;
1145 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1146 #if (WINVER >= 0x0500)
1147 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bDropShadow
, SPIF_SENDCHANGE
);
1149 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1161 InitializeMouse(POPTION_DATA pOptionData
)
1167 /* Get mouse sensitivity */
1168 if (!SystemParametersInfo(SPI_GETMOUSESPEED
, 0, &pOptionData
->ulMouseSensitivity
, 0))
1169 pOptionData
->ulMouseSensitivity
= DEFAULT_MOUSE_SENSITIVITY
;
1170 pOptionData
->ulOrigMouseSensitivity
= pOptionData
->ulMouseSensitivity
;
1172 pOptionData
->ulMouseSpeed
= 1;
1173 pOptionData
->ulMouseThreshold1
= DEFAULT_MOUSE_THRESHOLD1
;
1174 pOptionData
->ulMouseThreshold2
= DEFAULT_MOUSE_THRESHOLD2
;
1176 /* snap to default button */
1177 if (SystemParametersInfo(SPI_GETSNAPTODEFBUTTON
, 0, &pOptionData
->ulSnapToDefaultButton
, 0))
1178 pOptionData
->ulSnapToDefaultButton
= 0;
1181 if (!SystemParametersInfo(SPI_GETMOUSETRAILS
, 0, &pOptionData
->ulMouseTrails
, 0))
1182 pOptionData
->ulMouseTrails
= 0;
1184 /* hide pointer while typing */
1185 if (!SystemParametersInfo(SPI_GETMOUSEVANISH
, 0, &pOptionData
->ulHidePointer
, 0))
1186 pOptionData
->ulHidePointer
= 0;
1188 /* show pointer with Ctrl-Key */
1189 if (!SystemParametersInfo(SPI_GETMOUSESONAR
, 0, &pOptionData
->ulShowPointer
, 0))
1190 pOptionData
->ulShowPointer
= 0;
1196 static INT_PTR CALLBACK
1197 OptionProc(IN HWND hwndDlg
,
1205 POPTION_DATA pOptionData
;
1207 pOptionData
= (POPTION_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1212 pOptionData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(OPTION_DATA
));
1213 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pOptionData
);
1215 InitializeMouse(pOptionData
);
1217 /* set mouse sensitivity */
1218 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
);
1219 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 19));
1220 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->ulMouseSensitivity
- 1);
1222 if (pOptionData
->ulMouseSpeed
)
1224 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_POINTER_PRECISION
);
1225 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1228 if (pOptionData
->ulSnapToDefaultButton
)
1230 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SNAP_TO
);
1231 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1234 /* set mouse trail */
1235 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1236 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 5));
1237 if (pOptionData
->ulMouseTrails
< 2)
1238 EnableWindow(hDlgCtrl
, FALSE
);
1240 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->ulMouseTrails
- 2);
1242 if (pOptionData
->ulShowPointer
)
1244 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SHOW_POINTER
);
1245 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1248 if (pOptionData
->ulHidePointer
)
1250 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_HIDE_POINTER
);
1251 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1256 HeapFree(GetProcessHeap(), 0, pOptionData
);
1260 switch(LOWORD(wParam
))
1262 case IDC_CHECK_POINTER_PRECISION
:
1263 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_PRECISION
))
1265 pOptionData
->ulMouseSpeed
= 0;
1266 pOptionData
->ulMouseThreshold1
= 0;
1267 pOptionData
->ulMouseThreshold2
= 0;
1268 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1272 pOptionData
->ulMouseSpeed
= 1;
1273 pOptionData
->ulMouseThreshold1
= 6;
1274 pOptionData
->ulMouseThreshold2
= 10;
1275 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1279 case IDC_CHECK_SNAP_TO
:
1280 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SNAP_TO
))
1282 pOptionData
->ulSnapToDefaultButton
= 0;
1283 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1287 pOptionData
->ulSnapToDefaultButton
= 1;
1288 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1292 case IDC_CHECK_POINTER_TRAIL
:
1293 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1294 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_TRAIL
))
1296 pOptionData
->ulMouseTrails
= 0;
1297 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1298 EnableWindow(hDlgCtrl
, FALSE
);
1302 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1303 EnableWindow(hDlgCtrl
, TRUE
);
1304 pOptionData
->ulMouseTrails
= (ULONG
)SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 2;
1308 case IDC_CHECK_SHOW_POINTER
:
1309 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SHOW_POINTER
))
1311 pOptionData
->ulShowPointer
= 0;
1312 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1316 pOptionData
->ulShowPointer
= 1;
1317 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1321 case IDC_CHECK_HIDE_POINTER
:
1322 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_HIDE_POINTER
))
1324 pOptionData
->ulHidePointer
= 0;
1325 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1329 pOptionData
->ulHidePointer
= 1;
1330 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1334 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1338 lppsn
= (LPPSHNOTIFY
)lParam
;
1339 if (lppsn
->hdr
.code
== PSN_APPLY
)
1341 /* set snap to default button */
1342 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, pOptionData
->ulSnapToDefaultButton
, 0, SPIF_SENDCHANGE
);
1345 /* set mouse trails */
1346 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_TRAIL
))
1348 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1349 lResult
= SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 2;
1356 SystemParametersInfo(SPI_SETMOUSETRAILS
, (UINT
) lResult
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1363 /* calc pos and set mouse sensitivity */
1364 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
);
1365 lResult
= SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 1;
1366 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSensitivity
, SPIF_SENDCHANGE
);
1368 /* hide pointer while typing */
1369 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, (PVOID
)pOptionData
->ulHidePointer
, SPIF_SENDCHANGE
);
1371 /* show pointer with Ctrl-Key */
1372 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, (PVOID
)pOptionData
->ulShowPointer
, SPIF_SENDCHANGE
);
1374 SetWindowLong(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
1377 else if (lppsn
->hdr
.code
== PSN_RESET
)
1379 /* Set the original mouse speed */
1380 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulOrigMouseSensitivity
, SPIF_SENDCHANGE
);
1385 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
))
1387 switch (LOWORD(wParam
))
1396 pOptionData
->ulMouseSensitivity
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
, TBM_GETPOS
, 0, 0) + 1;
1397 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSensitivity
, SPIF_SENDCHANGE
);
1398 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1402 pOptionData
->ulMouseSensitivity
= (ULONG
)HIWORD(wParam
) + 1;
1403 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSensitivity
, SPIF_SENDCHANGE
);
1404 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1409 else if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
))
1411 switch (LOWORD(wParam
))
1420 pOptionData
->ulMouseTrails
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
, TBM_GETPOS
, 0, 0) + 2;
1421 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->ulMouseTrails
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1422 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1426 pOptionData
->ulMouseTrails
= (ULONG
)HIWORD(wParam
) + 2;
1427 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->ulMouseTrails
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1428 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1440 ShowDialogWheelControls(HWND hwndDlg
, UINT uWheelScrollLines
, BOOL bInit
)
1444 if (uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1446 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1447 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1449 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1450 EnableWindow(hDlgCtrl
, TRUE
);
1452 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1453 EnableWindow(hDlgCtrl
, TRUE
);
1455 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1456 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1460 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1461 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1463 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1464 EnableWindow(hDlgCtrl
, FALSE
);
1466 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1467 EnableWindow(hDlgCtrl
, FALSE
);
1469 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1470 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1472 /* Set the default scroll lines value */
1474 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, DEFAULT_WHEEL_SCROLL_LINES
, FALSE
);
1479 static INT_PTR CALLBACK
1480 WheelProc(IN HWND hwndDlg
,
1486 PWHEEL_DATA pWheelData
;
1488 pWheelData
= (PWHEEL_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1493 pWheelData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WHEEL_DATA
));
1494 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pWheelData
);
1496 /* Get wheel scroll lines */
1497 if (!SystemParametersInfo(SPI_GETWHEELSCROLLLINES
, 0, &pWheelData
->uWheelScrollLines
, 0))
1499 pWheelData
->uWheelScrollLines
= DEFAULT_WHEEL_SCROLL_LINES
;
1502 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, TRUE
);
1503 SendDlgItemMessage(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
, UDM_SETRANGE
, 0, MAKELONG((short)100, (short)0));
1504 if (pWheelData
->uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1506 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, pWheelData
->uWheelScrollLines
, FALSE
);
1511 HeapFree(GetProcessHeap(), 0, pWheelData
);
1515 switch (LOWORD(wParam
))
1517 case IDC_RADIO_WHEEL_SCROLL_LINES
:
1518 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1519 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1520 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1523 case IDC_RADIO_WHEEL_SCROLL_PAGE
:
1524 pWheelData
->uWheelScrollLines
= WHEEL_PAGESCROLL
;
1525 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1526 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1529 case IDC_EDIT_WHEEL_SCROLL_LINES
:
1530 if (pWheelData
&& HIWORD(wParam
) == EN_CHANGE
)
1532 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1533 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1540 lppsn
= (LPPSHNOTIFY
)lParam
;
1541 if (lppsn
->hdr
.code
== PSN_APPLY
)
1543 SystemParametersInfo(SPI_SETWHEELSCROLLLINES
, pWheelData
->uWheelScrollLines
,
1544 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1555 MouseApplet(HWND hwnd
, UINT uMsg
, LONG lParam1
, LONG lParam2
)
1557 PROPSHEETPAGE psp
[5];
1558 PROPSHEETHEADER psh
;
1561 UNREFERENCED_PARAMETER(lParam1
);
1562 UNREFERENCED_PARAMETER(lParam2
);
1563 UNREFERENCED_PARAMETER(uMsg
);
1564 UNREFERENCED_PARAMETER(hwnd
);
1566 LoadString(hApplet
, IDS_CPLNAME_1
, Caption
, sizeof(Caption
) / sizeof(TCHAR
));
1568 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
1569 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
1570 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
1571 psh
.hwndParent
= NULL
;
1572 psh
.hInstance
= hApplet
;
1573 psh
.hIcon
= LoadIcon(hApplet
, MAKEINTRESOURCE(IDC_CPLICON_1
));
1574 psh
.pszCaption
= Caption
;
1575 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
1579 InitPropSheetPage(&psp
[0], IDD_PAGE_BUTTON
, ButtonProc
);
1580 InitPropSheetPage(&psp
[1], IDD_PAGE_POINTER
, PointerProc
);
1581 InitPropSheetPage(&psp
[2], IDD_PAGE_OPTION
, OptionProc
);
1582 InitPropSheetPage(&psp
[3], IDD_PAGE_WHEEL
, WheelProc
);
1583 InitPropSheetPage(&psp
[4], IDD_HARDWARE
, MouseHardwareProc
);
1584 return (LONG
)(PropertySheet(&psh
) != -1);