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
50 #define DEFAULT_DOUBLE_CLICK_SPEED 500
51 #define DEFAULT_CLICK_LOCK_TIME 2200
52 #define DEFAULT_MOUSE_SPEED 10
53 #define DEFAULT_MOUSE_ACCELERATION 1
54 #define DEFAULT_MOUSE_THRESHOLD1 6
55 #define DEFAULT_MOUSE_THRESHOLD2 10
56 #define MIN_DOUBLE_CLICK_SPEED 200
57 #define MAX_DOUBLE_CLICK_SPEED 900
58 #define DEFAULT_WHEEL_SCROLL_LINES 3
60 typedef struct _BUTTON_DATA
62 ULONG g_SwapMouseButtons
;
63 ULONG g_OrigSwapMouseButtons
;
64 ULONG g_DoubleClickSpeed
; // = DEFAULT_DOUBLE_CLICK_SPEED;
65 ULONG g_OrigDoubleClickSpeed
;
66 BOOL g_ClickLockEnabled
; // = 0;
67 DWORD g_ClickLockTime
; // = DEFAULT_CLICK_LOCK_TIME;
75 } BUTTON_DATA
, *PBUTTON_DATA
;
78 typedef struct _POINTER_DATA
85 } POINTER_DATA
, *PPOINTER_DATA
;
88 typedef struct _MOUSE_ACCEL
95 typedef struct _OPTION_DATA
98 ULONG ulOrigMouseSpeed
;
100 MOUSE_ACCEL MouseAccel
;
101 MOUSE_ACCEL OrigMouseAccel
;
103 BOOL bSnapToDefaultButton
;
104 BOOL bOrigSnapToDefaultButton
;
107 UINT uOrigMouseTrails
;
110 BOOL bOrigMouseVanish
;
113 BOOL bOrigMouseSonar
;
114 } OPTION_DATA
, *POPTION_DATA
;
117 typedef struct _WHEEL_DATA
119 UINT uWheelScrollLines
;
120 } WHEEL_DATA
, *PWHEEL_DATA
;
123 typedef struct _CURSOR_DATA
126 UINT uDefaultCursorId
;
129 TCHAR szCursorName
[MAX_PATH
];
130 TCHAR szCursorPath
[MAX_PATH
];
131 } CURSOR_DATA
, *PCURSOR_DATA
;
134 CURSOR_DATA g_CursorData
[] =
135 {{IDS_ARROW
, 100/*OCR_NORMAL*/, _T("Arrow"), 0, _T(""), _T("")},
136 {IDS_HELP
, 112/*OCR_HELP*/, _T("Help"), 0, _T(""), _T("")},
137 {IDS_APPSTARTING
, 111/*OCR_APPSTARTING*/, _T("AppStarting"), 0, _T(""), _T("")},
138 {IDS_WAIT
, 102/*OCR_WAIT*/, _T("Wait"), 0, _T(""), _T("")},
139 {IDS_CROSSHAIR
, 103/*OCR_CROSS*/, _T("Crosshair"), 0, _T(""), _T("")},
140 {IDS_IBEAM
, 101/*OCR_IBEAM*/, _T("IBeam"), 0, _T(""), _T("")},
141 {IDS_NWPEN
, 113/*OCR_NWPEN*/, _T("NWPen"), 0, _T(""), _T("")},
142 {IDS_NO
, 110/*OCR_NO*/, _T("No"), 0, _T(""), _T("")},
143 {IDS_SIZENS
, 108/*OCR_SIZENS*/, _T("SizeNS"), 0, _T(""), _T("")},
144 {IDS_SIZEWE
, 107/*OCR_SIZEWE*/, _T("SizeWE"), 0, _T(""), _T("")},
145 {IDS_SIZENWSE
, 105/*OCR_SIZENWSE*/, _T("SizeNWSE"), 0, _T(""), _T("")},
146 {IDS_SIZENESW
, 106/*OCR_SIZENESW*/, _T("SizeNESW"), 0, _T(""), _T("")},
147 {IDS_SIZEALL
, 109/*OCR_SIZEALL*/, _T("SizeAll"), 0, _T(""), _T("")},
148 {IDS_UPARROW
, 104/*OCR_UP*/, _T("UpArrow"), 0, _T(""), _T("")},
149 {IDS_HAND
, 114/*OCR_HAND*/, _T("Hand"), 0, _T(""), _T("")}};
154 DebugMsg(LPTSTR fmt
, ...)
156 TCHAR szBuffer
[2048];
159 va_start(marker
, fmt
);
160 _vstprintf(szBuffer
, fmt
, marker
);
163 MessageBox(NULL
, szBuffer
, _T("Debug message"), MB_OK
);
168 /* Property page dialog callback */
169 static INT_PTR CALLBACK
170 MouseHardwareProc(IN HWND hwndDlg
,
176 Guids
[0] = GUID_DEVCLASS_MOUSE
;
178 UNREFERENCED_PARAMETER(lParam
);
179 UNREFERENCED_PARAMETER(wParam
);
184 /* create the hardware page */
185 DeviceCreateHardwarePageEx(hwndDlg
,
187 sizeof(Guids
) / sizeof(Guids
[0]),
196 static INT_PTR CALLBACK
197 ClickLockProc(IN HWND hwndDlg
,
205 PBUTTON_DATA pButtonData
;
207 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
212 pButtonData
= (PBUTTON_DATA
)lParam
;
213 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
215 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
216 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 10));
217 pos
= (pButtonData
->g_ClickLockTime
- 200) / 200;
218 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pos
);
222 if (LOWORD(wParam
) == IDOK
)
224 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
225 pButtonData
->g_ClickLockTime
= (DWORD
) (SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) * 200) + 200;
226 EndDialog(hwndDlg
, TRUE
);
228 else if (LOWORD(wParam
) == IDCANCEL
)
230 EndDialog(hwndDlg
, FALSE
);
239 static INT_PTR CALLBACK
240 ButtonProc(IN HWND hwndDlg
,
249 PBUTTON_DATA pButtonData
;
251 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
256 pButtonData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(BUTTON_DATA
));
257 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
259 pButtonData
->g_SwapMouseButtons
= GetSystemMetrics(SM_SWAPBUTTON
);
260 pButtonData
->g_OrigSwapMouseButtons
= pButtonData
->g_SwapMouseButtons
;
261 pButtonData
->g_DoubleClickSpeed
= GetDoubleClickTime();
262 pButtonData
->g_OrigDoubleClickSpeed
= pButtonData
->g_DoubleClickSpeed
;
264 /* Click lock time */
265 SystemParametersInfo(SPI_GETMOUSECLICKLOCK
, 0, &pButtonData
->g_ClickLockEnabled
, 0);
266 SystemParametersInfo(SPI_GETMOUSECLICKLOCKTIME
, 0, &pButtonData
->g_ClickLockTime
, 0);
268 /* Load mouse button icons */
269 pButtonData
->hButtonLeft
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_LEFT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
270 pButtonData
->hButtonRight
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_RIGHT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
272 /* Load folder icons */
273 pButtonData
->hIcon1
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_CLOSED
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
274 pButtonData
->hIcon2
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_OPEN
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
276 if (pButtonData
->g_SwapMouseButtons
)
278 SendDlgItemMessage(hwndDlg
, IDC_SWAP_MOUSE_BUTTONS
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
279 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
283 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
286 if (pButtonData
->g_ClickLockEnabled
)
288 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_CLICK_LOCK
);
289 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
293 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
294 EnableWindow(hDlgCtrl
, FALSE
);
297 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
);
298 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 14));
299 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, 14 - ((pButtonData
->g_DoubleClickSpeed
- 200) / 50));
302 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hIcon1
);
303 pButtonData
->bClicked
= TRUE
;
307 DestroyIcon(pButtonData
->hButtonLeft
);
308 DestroyIcon(pButtonData
->hButtonRight
);
309 DestroyIcon(pButtonData
->hIcon1
);
310 DestroyIcon(pButtonData
->hIcon2
);
311 HeapFree(GetProcessHeap(), 0, pButtonData
);
315 switch(LOWORD(wParam
))
317 case IDC_SWAP_MOUSE_BUTTONS
:
318 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
319 if (lResult
== BST_CHECKED
)
321 pButtonData
->g_SwapMouseButtons
= FALSE
;
322 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
323 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
325 else if (lResult
== BST_UNCHECKED
)
327 pButtonData
->g_SwapMouseButtons
= TRUE
;
328 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
329 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
331 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_SwapMouseButtons
, NULL
, 0);
332 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
335 case IDC_CHECK_CLICK_LOCK
:
336 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
337 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
338 if (lResult
== BST_CHECKED
)
340 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
341 pButtonData
->g_ClickLockEnabled
= FALSE
;
342 EnableWindow(hDlgCtrl
, FALSE
);
344 else if (lResult
== BST_UNCHECKED
)
346 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
347 pButtonData
->g_ClickLockEnabled
= TRUE
;
348 EnableWindow(hDlgCtrl
, TRUE
);
350 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
353 case IDC_BUTTON_CLICK_LOCK
:
354 DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_CLICK_LOCK
), hwndDlg
, ClickLockProc
, (LPARAM
)pButtonData
);
357 case IDC_IMAGE_DOUBLE_CLICK_SPEED
:
358 if (HIWORD(wParam
) == STN_DBLCLK
)
360 pButtonData
->bClicked
= !pButtonData
->bClicked
;
361 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
,
362 (LPARAM
)(pButtonData
->bClicked
? pButtonData
->hIcon1
: pButtonData
->hIcon2
));
369 lppsn
= (LPPSHNOTIFY
) lParam
;
370 if (lppsn
->hdr
.code
== PSN_APPLY
)
372 if (pButtonData
->g_OrigSwapMouseButtons
!= pButtonData
->g_SwapMouseButtons
)
374 pButtonData
->g_OrigSwapMouseButtons
= pButtonData
->g_SwapMouseButtons
;
375 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_OrigSwapMouseButtons
, NULL
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
379 #if (WINVER >= 0x0500)
380 SystemParametersInfo(SPI_SETMOUSECLICKLOCK
, pButtonData
->g_ClickLockEnabled
, NULL
, SPIF_SENDCHANGE
);
381 if (pButtonData
->g_ClickLockEnabled
)
382 SystemParametersInfo(SPI_SETMOUSECLICKLOCKTIME
, pButtonData
->g_ClickLockTime
, NULL
, SPIF_SENDCHANGE
);
385 else if (lppsn
->hdr
.code
== PSN_RESET
)
387 /* Reset swap mouse button setting */
388 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_OrigSwapMouseButtons
, NULL
, 0);
390 /* Reset double click speed setting */
391 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_OrigDoubleClickSpeed, NULL, 0);
392 SetDoubleClickTime(pButtonData
->g_OrigDoubleClickSpeed
);
397 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
))
399 switch (LOWORD(wParam
))
408 lResult
= SendDlgItemMessage(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
, TBM_GETPOS
, 0, 0);
409 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)lResult
) * 50 + 200;
410 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, 0);
411 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
412 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
416 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)HIWORD(wParam
)) * 50 + 200;
417 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, 0);
418 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
419 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
431 CompressPath(LPTSTR lpShortPath
, LPTSTR lpPath
)
433 TCHAR szUserProfile
[MAX_PATH
];
434 TCHAR szSystemRoot
[MAX_PATH
];
435 TCHAR szProgramFiles
[MAX_PATH
];
438 DWORD dwProgramFiles
;
440 dwUserProfile
= GetEnvironmentVariable(_T("USERPROFILE"), szUserProfile
, MAX_PATH
);
441 dwSystemRoot
= GetEnvironmentVariable(_T("SystemRoot"), szSystemRoot
, MAX_PATH
);
442 dwProgramFiles
= GetEnvironmentVariable(_T("ProgramFiles"), szProgramFiles
, MAX_PATH
);
444 if (dwUserProfile
> 0 && _tcsncmp(lpPath
, szUserProfile
, dwUserProfile
) == 0)
446 _tcscpy(lpShortPath
, _T("%USERPROFILE%"));
447 _tcscat(lpShortPath
, &lpPath
[dwUserProfile
]);
449 else if (dwSystemRoot
> 0 && _tcsncmp(lpPath
, szSystemRoot
, dwSystemRoot
) == 0)
451 _tcscpy(lpShortPath
, _T("%SystemRoot%"));
452 _tcscat(lpShortPath
, &lpPath
[dwSystemRoot
]);
454 else if (dwProgramFiles
> 0 && _tcsncmp(lpPath
, szProgramFiles
, dwProgramFiles
) == 0)
456 _tcscpy(lpShortPath
, _T("%ProgramFiles%"));
457 _tcscat(lpShortPath
, &lpPath
[dwProgramFiles
]);
461 _tcscpy(lpShortPath
, lpPath
);
467 EnumerateCursorSchemes(HWND hwndDlg
)
471 TCHAR szValueName
[MAX_PATH
];
473 TCHAR szSystemScheme
[MAX_PATH
];
474 TCHAR szValueData
[2000];
475 TCHAR szTempData
[2000];
481 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
482 SendMessage(hDlgCtrl
, CB_RESETCONTENT
, 0, 0);
484 /* Read the users cursor schemes */
485 lError
= RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Control Panel\\Cursors\\Schemes"),
486 0, KEY_READ
| KEY_QUERY_VALUE
, &hCursorKey
);
487 if (lError
== ERROR_SUCCESS
)
489 for (dwIndex
= 0;; dwIndex
++)
491 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
492 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
493 lError
= RegEnumValue(hCursorKey
, dwIndex
, szValueName
, &dwValueName
,
494 NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
495 if (lError
== ERROR_NO_MORE_ITEMS
)
498 ExpandEnvironmentStrings(szValueData
, szTempData
, 2000);
500 if (_tcslen(szTempData
) > 0)
502 LPTSTR lpCopy
, lpStart
;
504 /* Remove quotation marks */
505 if (szTempData
[0] == _T('"'))
507 lpStart
= szValueData
+ 1;
508 szTempData
[_tcslen(szTempData
) - 1] = 0;
512 lpStart
= szTempData
;
515 lpCopy
= _tcsdup(lpStart
);
517 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szValueName
);
518 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)lpCopy
);
522 RegCloseKey(hCursorKey
);
525 /* Read the system cursor schemes */
526 lError
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
527 _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cursors\\Schemes"),
528 0, KEY_READ
| KEY_QUERY_VALUE
, &hCursorKey
);
529 if (lError
== ERROR_SUCCESS
)
531 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
533 for (dwIndex
= 0;; dwIndex
++)
535 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
536 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
537 lError
= RegEnumValue(hCursorKey
, dwIndex
, szValueName
, &dwValueName
,
538 NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
539 if (lError
== ERROR_NO_MORE_ITEMS
)
542 if (_tcslen(szValueData
) > 0)
544 LPTSTR lpCopy
, lpStart
;
546 /* Remove quotation marks */
547 if (szValueData
[0] == _T('"'))
549 lpStart
= szValueData
+ 1;
550 szValueData
[_tcslen(szValueData
) - 1] = 0;
554 lpStart
= szValueData
;
557 lpCopy
= _tcsdup(lpStart
);
559 _tcscat(szValueName
, TEXT(" "));
560 _tcscat(szValueName
, szSystemScheme
);
562 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szValueName
);
563 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)lpCopy
);
567 RegCloseKey(hCursorKey
);
570 /* Add the "(none)" entry */
571 LoadString(hApplet
, IDS_NONE
, szSystemScheme
, MAX_PATH
);
572 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szSystemScheme
);
573 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)NULL
);
580 RefreshCursorList(HWND hwndDlg
, BOOL bInit
)
586 nSel
= bInit
? 0 : SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
590 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_RESETCONTENT
, 0, 0);
591 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
593 LoadString(hApplet
, index
, g_CursorData
[i
].szCursorName
, MAX_PATH
);
594 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_ADDSTRING
, 0, (LPARAM
)i
);
597 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_SETCURSEL
, nSel
, 0);
601 InvalidateRect(GetDlgItem(hwndDlg
, IDC_LISTBOX_CURSOR
), NULL
, FALSE
);
604 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
, STM_SETIMAGE
, IMAGE_CURSOR
,
605 (LPARAM
)g_CursorData
[nSel
].hCursor
);
607 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), (g_CursorData
[nSel
].szCursorPath
[0] != 0));
612 DeleteUserCursorScheme(HWND hwndDlg
)
614 TCHAR szSchemeName
[MAX_PATH
];
616 TCHAR szRawText
[256];
624 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
625 nSel
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
629 SendMessage(hDlgCtrl
, CB_GETLBTEXT
, nSel
, (LPARAM
)szSchemeName
);
631 LoadString(hApplet
, IDS_REMOVE_TITLE
, szTitle
, 128);
632 LoadString(hApplet
, IDS_REMOVE_TEXT
, szRawText
, 256);
634 _stprintf(szText
, szRawText
, szSchemeName
);
636 /* Confirm scheme removal */
637 if (MessageBox(hwndDlg
, szText
, szTitle
, MB_YESNO
| MB_ICONQUESTION
) == IDNO
)
640 if (RegOpenCurrentUser(KEY_READ
| KEY_SET_VALUE
, &hCuKey
) != ERROR_SUCCESS
)
643 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
| KEY_SET_VALUE
, &hCuCursorKey
) != ERROR_SUCCESS
)
649 lResult
= RegDeleteValue(hCuCursorKey
, szSchemeName
);
651 RegCloseKey(hCuCursorKey
);
654 if (lResult
== ERROR_SUCCESS
)
656 SendMessage(hDlgCtrl
, CB_DELETESTRING
, nSel
, 0);
657 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)0, (LPARAM
)0);
660 return (lResult
== ERROR_SUCCESS
);
664 static INT_PTR CALLBACK
665 SaveSchemeProc(IN HWND hwndDlg
,
675 pSchemeName
= (LPTSTR
)lParam
;
676 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pSchemeName
);
677 SendDlgItemMessage(hwndDlg
, IDC_EDIT_SCHEME_NAME
, WM_SETTEXT
,
678 0, (LPARAM
)pSchemeName
);
682 if (LOWORD(wParam
) == IDOK
)
684 pSchemeName
= (LPTSTR
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
685 SendDlgItemMessage(hwndDlg
, IDC_EDIT_SCHEME_NAME
, WM_GETTEXT
,
686 (WPARAM
)MAX_PATH
, (LPARAM
)pSchemeName
);
687 EndDialog(hwndDlg
, TRUE
);
689 else if (LOWORD(wParam
) == IDCANCEL
)
691 EndDialog(hwndDlg
, FALSE
);
701 SaveCursorScheme(HWND hwndDlg
)
703 TCHAR szSystemScheme
[MAX_PATH
];
704 TCHAR szSchemeName
[MAX_PATH
];
705 TCHAR szNewSchemeName
[MAX_PATH
];
706 TCHAR szTempPath
[MAX_PATH
];
710 INT index
, i
, nLength
;
714 LONG lError
= ERROR_SUCCESS
;
717 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
719 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
729 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)szNewSchemeName
);
731 if (_tcsstr(szNewSchemeName
, szSystemScheme
))
733 szNewSchemeName
[_tcslen(szNewSchemeName
) - _tcslen(szSystemScheme
) - 1] = 0;
737 /* Ask for a name for the new cursor scheme */
738 if (!DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_CURSOR_SCHEME_SAVEAS
),
739 hwndDlg
, SaveSchemeProc
, (LPARAM
)szNewSchemeName
))
742 /* Check all non-system schemes for the new name */
743 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCOUNT
, 0, 0);
747 bSchemeExists
= FALSE
;
748 for (i
= 0; i
< nSel
; i
++)
750 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, i
, (LPARAM
)szSchemeName
);
751 if (_tcsstr(szSchemeName
, szSystemScheme
) == NULL
)
753 if (_tcscmp(szSchemeName
, szNewSchemeName
) == 0)
755 bSchemeExists
= TRUE
;
763 LoadString(hApplet
, IDS_OVERWRITE_TITLE
, szTitle
, 128);
764 LoadString(hApplet
, IDS_OVERWRITE_TEXT
, szText
, 256);
766 /* Confirm scheme overwrite */
767 if (MessageBox(hwndDlg
, szText
, szTitle
, MB_YESNO
| MB_ICONQUESTION
) == IDNO
)
771 /* Save the cursor scheme */
773 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
777 nLength
+= _tcslen(g_CursorData
[i
].szCursorPath
);
781 lpSchemeData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, nLength
* sizeof(TCHAR
));
783 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
785 CompressPath(szTempPath
, g_CursorData
[i
].szCursorPath
);
787 _tcscat(lpSchemeData
, _T(","));
788 _tcscat(lpSchemeData
, szTempPath
);
791 if (RegOpenCurrentUser(KEY_READ
| KEY_SET_VALUE
, &hCuKey
) != ERROR_SUCCESS
)
794 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
| KEY_SET_VALUE
, &hCuCursorKey
) != ERROR_SUCCESS
)
800 lError
= RegSetValueEx(hCuCursorKey
, szNewSchemeName
, 0,
801 REG_EXPAND_SZ
, (LPBYTE
)lpSchemeData
,
802 (_tcslen(lpSchemeData
) + 1) * sizeof(TCHAR
));
804 RegCloseKey(hCuCursorKey
);
807 /* Add the new scheme to the scheme list and select it */
808 if (lError
== ERROR_SUCCESS
)
810 LPTSTR copy
= _tcsdup(lpSchemeData
);
812 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szNewSchemeName
);
813 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_SETITEMDATA
, (WPARAM
)nSel
, (LPARAM
)copy
);
814 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_SETCURSEL
, (WPARAM
)nSel
, (LPARAM
)0);
817 HeapFree(GetProcessHeap(), 0, lpSchemeData
);
819 return (lError
== ERROR_SUCCESS
);
824 BrowseCursor(HWND hwndDlg
)
826 TCHAR szFileName
[MAX_PATH
];
827 TCHAR szFilter
[MAX_PATH
];
828 TCHAR szTitle
[MAX_PATH
];
832 LoadString(hApplet
, IDS_BROWSE_FILTER
, szFilter
, MAX_PATH
);
833 LoadString(hApplet
, IDS_BROWSE_TITLE
, szTitle
, MAX_PATH
);
835 memset(szFileName
, 0x0, sizeof(szFileName
));
836 nSel
= SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
839 MessageBox(hwndDlg
, _T("LB_ERR"), _T(""), MB_ICONERROR
);
843 ZeroMemory(&ofn
, sizeof(OPENFILENAME
));
844 ofn
.lStructSize
= sizeof(OPENFILENAME
);
845 ofn
.hwndOwner
= hwndDlg
;
846 ofn
.lpstrFilter
= szFilter
;
847 ofn
.nFilterIndex
= 1;
848 ofn
.lpstrFile
= szFileName
;
849 ofn
.nMaxFile
= MAX_PATH
;
850 ofn
.lpstrInitialDir
= _T("%WINDIR%\\Cursors");
851 ofn
.lpstrTitle
= szTitle
;
852 ofn
.Flags
= OFN_EXPLORER
| OFN_FILEMUSTEXIST
;
854 if (!GetOpenFileName(&ofn
))
857 /* Store the new cursor file path */
858 _tcsncpy(g_CursorData
[nSel
].szCursorPath
, szFileName
, MAX_PATH
);
865 LoadCursorScheme(LPTSTR lpName
, BOOL bSystem
)
869 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
871 if (g_CursorData
[i
].hCursor
!= NULL
)
873 DestroyCursor(g_CursorData
[i
].hCursor
);
874 g_CursorData
[i
].hCursor
= 0;
876 g_CursorData
[i
].szCursorPath
[0] = 0;
881 LPTSTR pStart
= lpName
;
882 LPTSTR pEnd
= pStart
;
888 pEnd
= _tcschr(pStart
, _T(','));
890 nLength
= ((INT_PTR
)pEnd
- (INT_PTR
)pStart
) / sizeof(TCHAR
);
892 nLength
= _tcslen(pStart
);
894 _tcsncpy(g_CursorData
[i
].szCursorPath
, pStart
, nLength
);
895 g_CursorData
[i
].szCursorPath
[nLength
] = 0;
897 pStart
= pStart
+ (nLength
+ 1);
903 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
905 if (g_CursorData
[i
].szCursorPath
[0] == 0)
906 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, MAKEINTRESOURCE(g_CursorData
[i
].uDefaultCursorId
),
908 LR_DEFAULTSIZE
| LR_SHARED
);
910 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, g_CursorData
[i
].szCursorPath
,
912 LR_LOADFROMFILE
| LR_DEFAULTSIZE
);
918 ReloadCurrentCursorScheme(VOID
)
922 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
924 if (g_CursorData
[i
].hCursor
!= NULL
)
925 DestroyCursor(g_CursorData
[i
].hCursor
);
927 if (g_CursorData
[i
].szCursorPath
[0] == 0)
928 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, MAKEINTRESOURCE(g_CursorData
[i
].uDefaultCursorId
),
930 LR_DEFAULTSIZE
| LR_SHARED
);
932 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, g_CursorData
[i
].szCursorPath
,
934 LR_LOADFROMFILE
| LR_DEFAULTSIZE
);
940 OnDrawItem(UINT idCtl
,
941 LPDRAWITEMSTRUCT lpdis
,
942 PPOINTER_DATA pPointerData
)
946 if (lpdis
->itemState
& ODS_SELECTED
)
950 (HBRUSH
)(COLOR_HIGHLIGHT
+ 1));
951 SetBkColor(lpdis
->hDC
,
952 GetSysColor(COLOR_HIGHLIGHT
));
953 SetTextColor(lpdis
->hDC
,
954 GetSysColor(COLOR_HIGHLIGHTTEXT
));
960 (HBRUSH
)(COLOR_WINDOW
+ 1));
961 SetBkColor(lpdis
->hDC
,
962 GetSysColor(COLOR_WINDOW
));
963 SetTextColor(lpdis
->hDC
,
964 GetSysColor(COLOR_WINDOWTEXT
));
967 if (lpdis
->itemID
!= -1)
969 CopyRect(&rc
, &lpdis
->rcItem
);
972 g_CursorData
[lpdis
->itemData
].szCursorName
,
975 DT_SINGLELINE
| DT_VCENTER
| DT_LEFT
);
977 if (g_CursorData
[lpdis
->itemData
].hCursor
!= NULL
)
980 lpdis
->rcItem
.right
- pPointerData
->cxCursor
- 4,
981 lpdis
->rcItem
.top
+ 2,
982 g_CursorData
[lpdis
->itemData
].hCursor
);
986 if (lpdis
->itemState
& ODS_FOCUS
)
988 CopyRect(&rc
, &lpdis
->rcItem
);
989 InflateRect(&rc
, -1, -1);
990 DrawFocusRect(lpdis
->hDC
, &rc
);
996 LoadNewCursorScheme(HWND hwndDlg
)
998 TCHAR buffer
[MAX_PATH
];
999 TCHAR szSystemScheme
[MAX_PATH
];
1005 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
1009 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)buffer
);
1011 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
1012 if (_tcsstr(buffer
, szSystemScheme
) || nSel
== 0) //avoid the default scheme can be deleted
1018 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
);
1019 EnableWindow(hDlgCtrl
, bEnable
);
1021 lpName
= (LPTSTR
)SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETITEMDATA
, nSel
, 0);
1022 LoadCursorScheme(lpName
, !bEnable
);
1023 RefreshCursorList(hwndDlg
, FALSE
);
1028 LoadInitialCursorScheme(HWND hwndDlg
)
1030 TCHAR szSchemeName
[256];
1031 TCHAR szSystemScheme
[256];
1032 TCHAR szCursorPath
[256];
1036 DWORD dwSchemeSource
= 0;
1041 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
1043 g_CursorData
[i
].hCursor
= 0;
1044 g_CursorData
[i
].szCursorPath
[0] = 0;
1047 lError
= RegOpenKeyEx(HKEY_CURRENT_USER
,
1048 _T("Control Panel\\Cursors"),
1050 KEY_READ
| KEY_QUERY_VALUE
,
1052 if (lError
!= ERROR_SUCCESS
)
1055 dwDataSize
= sizeof(DWORD
);
1056 lError
= RegQueryValueEx(hCursorKey
,
1057 _T("Scheme Source"),
1060 (LPBYTE
)&dwSchemeSource
,
1063 if (dwSchemeSource
!= 0)
1065 dwDataSize
= 256 * sizeof(TCHAR
);
1066 lError
= RegQueryValueEx(hCursorKey
,
1070 (LPBYTE
)szSchemeName
,
1073 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
1075 dwDataSize
= MAX_PATH
* sizeof(TCHAR
);
1076 lError
= RegQueryValueEx(hCursorKey
,
1077 g_CursorData
[i
].lpValueName
,
1080 (LPBYTE
)szCursorPath
,
1082 if (lError
== ERROR_SUCCESS
)
1084 if (dwType
== REG_EXPAND_SZ
)
1086 ExpandEnvironmentStrings(szCursorPath
, g_CursorData
[i
].szCursorPath
, MAX_PATH
);
1090 _tcscpy(g_CursorData
[i
].szCursorPath
, szCursorPath
);
1096 RegCloseKey(hCursorKey
);
1098 ReloadCurrentCursorScheme();
1099 RefreshCursorList(hwndDlg
, TRUE
);
1101 /* Build the full scheme name */
1102 if (dwSchemeSource
== 0)
1104 LoadString(hApplet
, IDS_NONE
, szSchemeName
, MAX_PATH
);
1106 else if (dwSchemeSource
== 2)
1108 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
1109 _tcscat(szSchemeName
, _T(" "));
1110 _tcscat(szSchemeName
, szSystemScheme
);
1113 /* Search and select the curent scheme name from the scheme list */
1114 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_FINDSTRINGEXACT
, -1, (LPARAM
)szSchemeName
);
1116 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_SETCURSEL
, (WPARAM
)nSel
, (LPARAM
)0);
1118 /* Enable /disable delete button */
1119 EnableWindow(GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
), (dwSchemeSource
== 1));
1124 ApplyCursorScheme(HWND hwndDlg
)
1126 TCHAR szSchemeName
[MAX_PATH
];
1127 TCHAR szSystemScheme
[MAX_PATH
];
1128 TCHAR szTempPath
[MAX_PATH
];
1129 LPTSTR lpSchemeData
;
1131 DWORD dwSchemeSource
;
1136 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
1140 lpSchemeData
= (LPTSTR
)SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETITEMDATA
, nSel
, 0);
1141 if (lpSchemeData
== NULL
)
1143 /* "None" cursor scheme */
1145 szSchemeName
[0] = 0;
1150 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)szSchemeName
);
1151 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
1153 if (_tcsstr(szSchemeName
, szSystemScheme
))
1157 szSchemeName
[_tcslen(szSchemeName
) - _tcslen(szSystemScheme
) - 1] = 0;
1165 dwNameLength
= (_tcslen(szSchemeName
) + 1) * sizeof(TCHAR
);
1168 if (RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Control Panel\\Cursors"), 0,
1169 KEY_READ
| KEY_SET_VALUE
, &hCursorKey
) != ERROR_SUCCESS
)
1172 RegSetValueEx(hCursorKey
, NULL
, 0, REG_SZ
,
1173 (LPBYTE
)szSchemeName
, dwNameLength
);
1175 RegSetValueEx(hCursorKey
, _T("Scheme Source"), 0, REG_DWORD
,
1176 (LPBYTE
)&dwSchemeSource
, sizeof(DWORD
));
1178 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
1180 CompressPath(szTempPath
, g_CursorData
[i
].szCursorPath
);
1181 RegSetValueEx(hCursorKey
, g_CursorData
[i
].lpValueName
, 0,
1182 REG_EXPAND_SZ
, (LPBYTE
)szTempPath
,
1183 (_tcslen(szTempPath
) + 1) * sizeof(TCHAR
));
1186 RegCloseKey(hCursorKey
);
1188 /* Force the system to reload its cursors */
1189 SystemParametersInfo(SPI_SETCURSORS
, 0, NULL
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1195 static INT_PTR CALLBACK
1196 PointerProc(IN HWND hwndDlg
,
1201 PPOINTER_DATA pPointerData
;
1205 pPointerData
= (PPOINTER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1210 pPointerData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(POINTER_DATA
));
1211 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pPointerData
);
1213 pPointerData
->cxCursor
= GetSystemMetrics(SM_CXCURSOR
);
1214 pPointerData
->cyCursor
= GetSystemMetrics(SM_CYCURSOR
);
1216 EnumerateCursorSchemes(hwndDlg
);
1217 LoadInitialCursorScheme(hwndDlg
);
1219 /* Get drop shadow setting */
1220 if (!SystemParametersInfo(SPI_GETDROPSHADOW
, 0, &pPointerData
->bDropShadow
, 0))
1221 pPointerData
->bDropShadow
= FALSE
;
1223 pPointerData
->bOrigDropShadow
= pPointerData
->bDropShadow
;
1225 if (pPointerData
->bDropShadow
)
1227 SendDlgItemMessage(hwndDlg
, IDC_CHECK_DROP_SHADOW
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1230 if ((INT
)wParam
== IDC_LISTBOX_CURSOR
)
1235 case WM_MEASUREITEM
:
1236 ((LPMEASUREITEMSTRUCT
)lParam
)->itemHeight
= GetSystemMetrics(SM_CYCURSOR
) + 4;
1240 if (wParam
== IDC_LISTBOX_CURSOR
)
1241 OnDrawItem((UINT
)wParam
, (LPDRAWITEMSTRUCT
)lParam
, pPointerData
);
1245 HeapFree(GetProcessHeap(), 0, pPointerData
);
1249 lppsn
= (LPPSHNOTIFY
) lParam
;
1250 if (lppsn
->hdr
.code
== PSN_APPLY
)
1252 ApplyCursorScheme(hwndDlg
);
1253 //#if (WINVER >= 0x0500)
1254 if (pPointerData
->bOrigDropShadow
!= pPointerData
->bDropShadow
)
1256 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bDropShadow
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1257 pPointerData
->bOrigDropShadow
= pPointerData
->bDropShadow
;
1262 else if (lppsn
->hdr
.code
== PSN_RESET
)
1264 //#if (WINVER >= 0x0500)
1265 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bOrigDropShadow
, 0);
1271 switch (LOWORD(wParam
))
1273 case IDC_COMBO_CURSOR_SCHEME
:
1274 if (HIWORD(wParam
) == CBN_SELENDOK
)
1276 LoadNewCursorScheme(hwndDlg
);
1277 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1281 case IDC_LISTBOX_CURSOR
:
1282 switch (HIWORD(wParam
))
1285 nSel
= SendMessage((HWND
)lParam
, LB_GETCURSEL
, 0, 0);
1286 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
, STM_SETIMAGE
, IMAGE_CURSOR
,
1287 (LPARAM
)g_CursorData
[nSel
].hCursor
);
1288 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
),
1289 (g_CursorData
[nSel
].szCursorPath
[0] != 0));
1293 if (BrowseCursor(hwndDlg
))
1295 /* Update cursor list and preview */
1296 ReloadCurrentCursorScheme();
1297 RefreshCursorList(hwndDlg
, FALSE
);
1299 /* Enable the "Set Default" button */
1300 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), TRUE
);
1302 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1308 case IDC_BUTTON_SAVEAS_SCHEME
:
1309 SaveCursorScheme(hwndDlg
);
1312 case IDC_BUTTON_USE_DEFAULT_CURSOR
:
1313 nSel
= SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
1316 /* Clean the path of the currently selected cursor */
1317 memset(g_CursorData
[nSel
].szCursorPath
, 0x0, MAX_PATH
* sizeof(TCHAR
));
1319 /* Update cursor list and preview */
1320 ReloadCurrentCursorScheme();
1321 RefreshCursorList(hwndDlg
, FALSE
);
1323 /* Disable the "Set Default" button */
1324 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), FALSE
);
1326 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1330 case IDC_BUTTON_BROWSE_CURSOR
:
1331 if (BrowseCursor(hwndDlg
))
1333 /* Update cursor list and preview */
1334 ReloadCurrentCursorScheme();
1335 RefreshCursorList(hwndDlg
, FALSE
);
1337 /* Enable the "Set Default" button */
1338 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), TRUE
);
1340 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1344 case IDC_BUTTON_DELETE_SCHEME
:
1345 DeleteUserCursorScheme(hwndDlg
);
1348 case IDC_CHECK_DROP_SHADOW
:
1349 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_DROP_SHADOW
))
1351 pPointerData
->bDropShadow
= FALSE
;
1352 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1353 //#if (WINVER >= 0x0500)
1354 // SystemParametersInfo(SPI_SETDROPSHADOW, 0, (PVOID)pPointerData->bDropShadow, 0);
1356 // PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1360 pPointerData
->bDropShadow
= TRUE
;
1361 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1363 //#if (WINVER >= 0x0500)
1364 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bDropShadow
, 0);
1366 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1376 static INT_PTR CALLBACK
1377 OptionProc(IN HWND hwndDlg
,
1382 POPTION_DATA pOptionData
;
1386 pOptionData
= (POPTION_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1391 pOptionData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(OPTION_DATA
));
1392 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pOptionData
);
1394 /* Get mouse sensitivity */
1395 if (!SystemParametersInfo(SPI_GETMOUSESPEED
, 0, &pOptionData
->ulMouseSpeed
, 0))
1396 pOptionData
->ulMouseSpeed
= DEFAULT_MOUSE_SPEED
;
1397 pOptionData
->ulOrigMouseSpeed
= pOptionData
->ulMouseSpeed
;
1400 if (!SystemParametersInfo(SPI_GETMOUSE
, 0, &pOptionData
->MouseAccel
, 0))
1402 pOptionData
->MouseAccel
.nAcceleration
= DEFAULT_MOUSE_ACCELERATION
;
1403 pOptionData
->MouseAccel
.nThreshold1
= DEFAULT_MOUSE_THRESHOLD1
;
1404 pOptionData
->MouseAccel
.nThreshold2
= DEFAULT_MOUSE_THRESHOLD2
;
1406 pOptionData
->OrigMouseAccel
.nAcceleration
= pOptionData
->MouseAccel
.nAcceleration
;
1407 pOptionData
->OrigMouseAccel
.nThreshold1
= pOptionData
->MouseAccel
.nThreshold1
;
1408 pOptionData
->OrigMouseAccel
.nThreshold2
= pOptionData
->MouseAccel
.nThreshold2
;
1410 /* snap to default button */
1411 if (SystemParametersInfo(SPI_GETSNAPTODEFBUTTON
, 0, &pOptionData
->bSnapToDefaultButton
, 0))
1412 pOptionData
->bSnapToDefaultButton
= FALSE
;
1413 pOptionData
->bOrigSnapToDefaultButton
= pOptionData
->bSnapToDefaultButton
;
1416 if (!SystemParametersInfo(SPI_GETMOUSETRAILS
, 0, &pOptionData
->uMouseTrails
, 0))
1417 pOptionData
->uMouseTrails
= 0;
1418 pOptionData
->uOrigMouseTrails
= pOptionData
->uMouseTrails
;
1420 /* hide pointer while typing */
1421 if (!SystemParametersInfo(SPI_GETMOUSEVANISH
, 0, &pOptionData
->bMouseVanish
, 0))
1422 pOptionData
->bMouseVanish
= FALSE
;
1423 pOptionData
->bOrigMouseVanish
= pOptionData
->bMouseVanish
;
1425 /* show pointer with Ctrl-Key */
1426 if (!SystemParametersInfo(SPI_GETMOUSESONAR
, 0, &pOptionData
->bMouseSonar
, 0))
1427 pOptionData
->bMouseSonar
= FALSE
;
1428 pOptionData
->bOrigMouseSonar
= pOptionData
->bMouseSonar
;
1430 /* Set mouse speed */
1431 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SPEED
);
1432 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 19));
1433 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->ulMouseSpeed
- 1);
1435 if (pOptionData
->MouseAccel
.nAcceleration
)
1437 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_POINTER_PRECISION
);
1438 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1441 if (pOptionData
->bSnapToDefaultButton
)
1443 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SNAP_TO
);
1444 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1447 /* set mouse trail */
1448 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1449 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 5));
1450 if (pOptionData
->uMouseTrails
< 2)
1452 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)5);
1453 EnableWindow(hDlgCtrl
, FALSE
);
1454 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_SHORT
), FALSE
);
1455 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_LONG
), FALSE
);
1459 SendDlgItemMessage(hwndDlg
, IDC_CHECK_POINTER_TRAIL
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1460 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->uMouseTrails
- 2);
1463 if (pOptionData
->bMouseVanish
)
1465 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_HIDE_POINTER
);
1466 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1469 if (pOptionData
->bMouseSonar
)
1471 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SHOW_POINTER
);
1472 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1478 HeapFree(GetProcessHeap(), 0, pOptionData
);
1482 switch(LOWORD(wParam
))
1484 case IDC_CHECK_POINTER_PRECISION
:
1485 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_PRECISION
))
1487 pOptionData
->MouseAccel
.nAcceleration
= 0;
1488 pOptionData
->MouseAccel
.nThreshold1
= 0;
1489 pOptionData
->MouseAccel
.nThreshold2
= 0;
1490 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1494 pOptionData
->MouseAccel
.nAcceleration
= 1;
1495 pOptionData
->MouseAccel
.nThreshold1
= 6;
1496 pOptionData
->MouseAccel
.nThreshold2
= 10;
1497 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1499 SystemParametersInfo(SPI_SETMOUSE
, 0, &pOptionData
->MouseAccel
, 0);
1502 case IDC_CHECK_SNAP_TO
:
1503 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SNAP_TO
))
1505 pOptionData
->bSnapToDefaultButton
= 0;
1506 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1510 pOptionData
->bSnapToDefaultButton
= 1;
1511 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1513 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, (UINT
)pOptionData
->bSnapToDefaultButton
, 0, 0);
1516 case IDC_CHECK_POINTER_TRAIL
:
1517 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1518 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_TRAIL
))
1520 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1521 EnableWindow(hDlgCtrl
, FALSE
);
1522 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_SHORT
), FALSE
);
1523 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_LONG
), FALSE
);
1524 pOptionData
->uMouseTrails
= 0;
1528 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1529 EnableWindow(hDlgCtrl
, TRUE
);
1530 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_SHORT
), TRUE
);
1531 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_LONG
), TRUE
);
1532 pOptionData
->uMouseTrails
= (UINT
)SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 2;
1534 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, 0);
1537 case IDC_CHECK_HIDE_POINTER
:
1538 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_HIDE_POINTER
))
1540 pOptionData
->bMouseVanish
= FALSE
;
1541 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1545 pOptionData
->bMouseVanish
= TRUE
;
1546 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1548 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, (PVOID
)pOptionData
->bMouseVanish
, 0);
1551 case IDC_CHECK_SHOW_POINTER
:
1552 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SHOW_POINTER
))
1554 pOptionData
->bMouseSonar
= FALSE
;
1555 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1559 pOptionData
->bMouseSonar
= TRUE
;
1560 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1562 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, (PVOID
)pOptionData
->bMouseSonar
, 0);
1566 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1570 lppsn
= (LPPSHNOTIFY
)lParam
;
1571 if (lppsn
->hdr
.code
== PSN_APPLY
)
1573 /* Set mouse speed */
1574 if (pOptionData
->ulOrigMouseSpeed
!= pOptionData
->ulMouseSpeed
)
1576 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSpeed
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1577 pOptionData
->ulOrigMouseSpeed
= pOptionData
->ulMouseSpeed
;
1580 if (pOptionData
->OrigMouseAccel
.nAcceleration
!= pOptionData
->MouseAccel
.nAcceleration
)
1582 SystemParametersInfo(SPI_SETMOUSE
, 0, &pOptionData
->MouseAccel
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1583 pOptionData
->OrigMouseAccel
.nAcceleration
= pOptionData
->MouseAccel
.nAcceleration
;
1584 pOptionData
->OrigMouseAccel
.nThreshold1
= pOptionData
->MouseAccel
.nThreshold1
;
1585 pOptionData
->OrigMouseAccel
.nThreshold2
= pOptionData
->MouseAccel
.nThreshold2
;
1589 /* set snap to default button */
1590 if (pOptionData
->bOrigSnapToDefaultButton
!= pOptionData
->bSnapToDefaultButton
)
1592 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, (UINT
)pOptionData
->bSnapToDefaultButton
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1593 pOptionData
->bOrigSnapToDefaultButton
= pOptionData
->bSnapToDefaultButton
;
1596 /* Set mouse trails setting */
1597 if (pOptionData
->uOrigMouseTrails
!= pOptionData
->uMouseTrails
)
1599 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1600 pOptionData
->uOrigMouseTrails
= pOptionData
->uMouseTrails
;
1603 /* hide pointer while typing */
1604 if (pOptionData
->bOrigMouseVanish
!= pOptionData
->bMouseVanish
)
1606 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, (PVOID
)pOptionData
->bMouseVanish
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1607 pOptionData
->bOrigMouseVanish
= pOptionData
->bMouseVanish
;
1610 /* show pointer with Ctrl-Key */
1611 if (pOptionData
->bOrigMouseSonar
!= pOptionData
->bMouseSonar
)
1613 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, (PVOID
)pOptionData
->bMouseSonar
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1614 pOptionData
->bOrigMouseSonar
= pOptionData
->bMouseSonar
;
1618 else if (lppsn
->hdr
.code
== PSN_RESET
)
1620 /* Set the original mouse speed */
1621 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulOrigMouseSpeed
, 0);
1622 SystemParametersInfo(SPI_SETMOUSE
, 0, &pOptionData
->OrigMouseAccel
, 0);
1623 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, (UINT
)pOptionData
->bOrigSnapToDefaultButton
, 0, 0);
1624 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uOrigMouseTrails
, 0, 0);
1625 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, (PVOID
)pOptionData
->bOrigMouseVanish
, 0);
1626 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, (PVOID
)pOptionData
->bOrigMouseSonar
, 0);
1631 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SPEED
))
1633 switch (LOWORD(wParam
))
1642 pOptionData
->ulMouseSpeed
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_MOUSE_SPEED
, TBM_GETPOS
, 0, 0) + 1;
1643 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSpeed
, SPIF_SENDCHANGE
);
1644 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1648 pOptionData
->ulMouseSpeed
= (ULONG
)HIWORD(wParam
) + 1;
1649 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSpeed
, SPIF_SENDCHANGE
);
1650 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1655 else if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
))
1657 switch (LOWORD(wParam
))
1666 pOptionData
->uMouseTrails
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
, TBM_GETPOS
, 0, 0) + 2;
1667 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_UPDATEINIFILE
);
1668 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1672 pOptionData
->uMouseTrails
= (ULONG
)HIWORD(wParam
) + 2;
1673 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_UPDATEINIFILE
);
1674 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1686 ShowDialogWheelControls(HWND hwndDlg
, UINT uWheelScrollLines
, BOOL bInit
)
1690 if (uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1692 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1693 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1695 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1696 EnableWindow(hDlgCtrl
, TRUE
);
1698 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1699 EnableWindow(hDlgCtrl
, TRUE
);
1701 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1702 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1706 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1707 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1709 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1710 EnableWindow(hDlgCtrl
, FALSE
);
1712 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1713 EnableWindow(hDlgCtrl
, FALSE
);
1715 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1716 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1718 /* Set the default scroll lines value */
1720 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, DEFAULT_WHEEL_SCROLL_LINES
, FALSE
);
1725 static INT_PTR CALLBACK
1726 WheelProc(IN HWND hwndDlg
,
1732 PWHEEL_DATA pWheelData
;
1734 pWheelData
= (PWHEEL_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1739 pWheelData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WHEEL_DATA
));
1740 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pWheelData
);
1742 /* Get wheel scroll lines */
1743 if (!SystemParametersInfo(SPI_GETWHEELSCROLLLINES
, 0, &pWheelData
->uWheelScrollLines
, 0))
1745 pWheelData
->uWheelScrollLines
= DEFAULT_WHEEL_SCROLL_LINES
;
1748 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, TRUE
);
1749 SendDlgItemMessage(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
, UDM_SETRANGE
, 0, MAKELONG((short)100, (short)0));
1750 if (pWheelData
->uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1752 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, pWheelData
->uWheelScrollLines
, FALSE
);
1757 HeapFree(GetProcessHeap(), 0, pWheelData
);
1761 switch (LOWORD(wParam
))
1763 case IDC_RADIO_WHEEL_SCROLL_LINES
:
1764 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1765 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1766 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1769 case IDC_RADIO_WHEEL_SCROLL_PAGE
:
1770 pWheelData
->uWheelScrollLines
= WHEEL_PAGESCROLL
;
1771 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1772 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1775 case IDC_EDIT_WHEEL_SCROLL_LINES
:
1776 if (pWheelData
&& HIWORD(wParam
) == EN_CHANGE
)
1778 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1779 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1786 lppsn
= (LPPSHNOTIFY
)lParam
;
1787 if (lppsn
->hdr
.code
== PSN_APPLY
)
1789 SystemParametersInfo(SPI_SETWHEELSCROLLLINES
, pWheelData
->uWheelScrollLines
,
1790 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1806 { IDD_PAGE_BUTTON
, ButtonProc
, CPLPAGE_MOUSE_BUTTONS
},
1807 { IDD_PAGE_POINTER
, PointerProc
, 0 },
1808 { IDD_PAGE_OPTION
, OptionProc
, CPLPAGE_MOUSE_PTRMOTION
},
1809 { IDD_PAGE_WHEEL
, WheelProc
, CPLPAGE_MOUSE_WHEEL
},
1810 { IDD_HARDWARE
, MouseHardwareProc
, 0 },
1814 MouseApplet(HWND hwnd
, UINT uMsg
, LPARAM lParam1
, LPARAM lParam2
)
1816 HPROPSHEETPAGE hpsp
[MAX_CPL_PAGES
];
1817 PROPSHEETHEADER psh
;
1823 UNREFERENCED_PARAMETER(lParam1
);
1824 UNREFERENCED_PARAMETER(lParam2
);
1825 UNREFERENCED_PARAMETER(uMsg
);
1826 UNREFERENCED_PARAMETER(hwnd
);
1828 LoadString(hApplet
, IDS_CPLNAME_1
, Caption
, sizeof(Caption
) / sizeof(TCHAR
));
1830 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
1831 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
1832 psh
.dwFlags
= PSH_PROPTITLE
;
1833 psh
.hwndParent
= NULL
;
1834 psh
.hInstance
= hApplet
;
1835 psh
.hIcon
= LoadIcon(hApplet
, MAKEINTRESOURCE(IDC_CPLICON_1
));
1836 psh
.pszCaption
= Caption
;
1840 /* Load additional pages provided by shell extensions */
1841 hpsxa
= SHCreatePropSheetExtArray(HKEY_LOCAL_MACHINE
, REGSTR_PATH_CONTROLSFOLDER
TEXT("\\Mouse"), MAX_CPL_PAGES
- psh
.nPages
);
1843 for (i
= 0; i
!= sizeof(PropPages
) / sizeof(PropPages
[0]); i
++)
1845 /* Override the background page if requested by a shell extension */
1846 if (PropPages
[i
].uiReplaceWith
!= 0 && hpsxa
!= NULL
&&
1847 SHReplaceFromPropSheetExtArray(hpsxa
, PropPages
[i
].uiReplaceWith
, PropSheetAddPage
, (LPARAM
)&psh
) != 0)
1849 /* The shell extension added one or more pages to replace a page.
1850 Don't create the built-in page anymore! */
1854 InitPropSheetPage(&psh
, PropPages
[i
].idDlg
, PropPages
[i
].DlgProc
);
1858 SHAddFromPropSheetExtArray(hpsxa
, PropSheetAddPage
, (LPARAM
)&psh
);
1860 ret
= (LONG
)(PropertySheet(&psh
) != -1);
1863 SHDestroyPropSheetExtArray(hpsxa
);