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 along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 * PROJECT: ReactOS Main Control Panel
21 * FILE: dll/cpl/main/mouse.c
22 * PURPOSE: Mouse Control Panel
23 * PROGRAMMER: Eric Kohl
36 #define DEFAULT_DOUBLE_CLICK_SPEED 500
37 #define DEFAULT_CLICK_LOCK_TIME 2200
38 #define DEFAULT_MOUSE_SPEED 10
39 #define DEFAULT_MOUSE_ACCELERATION 1
40 #define DEFAULT_MOUSE_THRESHOLD1 6
41 #define DEFAULT_MOUSE_THRESHOLD2 10
42 #define MIN_DOUBLE_CLICK_SPEED 200
43 #define MAX_DOUBLE_CLICK_SPEED 900
44 #define DEFAULT_WHEEL_SCROLL_LINES 3
46 typedef struct _BUTTON_DATA
48 ULONG g_SwapMouseButtons
;
49 ULONG g_OrigSwapMouseButtons
;
50 ULONG g_DoubleClickSpeed
; // = DEFAULT_DOUBLE_CLICK_SPEED;
51 ULONG g_OrigDoubleClickSpeed
;
52 BOOL g_ClickLockEnabled
; // = 0;
53 DWORD g_ClickLockTime
; // = DEFAULT_CLICK_LOCK_TIME;
61 } BUTTON_DATA
, *PBUTTON_DATA
;
64 typedef struct _POINTER_DATA
67 BOOL bOrigCursorShadow
;
71 } POINTER_DATA
, *PPOINTER_DATA
;
74 typedef struct _MOUSE_ACCEL
81 typedef struct _OPTION_DATA
84 ULONG ulOrigMouseSpeed
;
86 MOUSE_ACCEL MouseAccel
;
87 MOUSE_ACCEL OrigMouseAccel
;
89 BOOL bSnapToDefaultButton
;
90 BOOL bOrigSnapToDefaultButton
;
93 UINT uOrigMouseTrails
;
96 BOOL bOrigMouseVanish
;
100 } OPTION_DATA
, *POPTION_DATA
;
103 typedef struct _WHEEL_DATA
105 UINT uWheelScrollLines
;
106 } WHEEL_DATA
, *PWHEEL_DATA
;
109 typedef struct _CURSOR_DATA
112 UINT uDefaultCursorId
;
115 TCHAR szCursorName
[MAX_PATH
];
116 TCHAR szCursorPath
[MAX_PATH
];
117 } CURSOR_DATA
, *PCURSOR_DATA
;
120 CURSOR_DATA g_CursorData
[] =
121 {{IDS_ARROW
, 100/*OCR_NORMAL*/, _T("Arrow"), 0, _T(""), _T("")},
122 {IDS_HELP
, 112/*OCR_HELP*/, _T("Help"), 0, _T(""), _T("")},
123 {IDS_APPSTARTING
, 111/*OCR_APPSTARTING*/, _T("AppStarting"), 0, _T(""), _T("")},
124 {IDS_WAIT
, 102/*OCR_WAIT*/, _T("Wait"), 0, _T(""), _T("")},
125 {IDS_CROSSHAIR
, 103/*OCR_CROSS*/, _T("Crosshair"), 0, _T(""), _T("")},
126 {IDS_IBEAM
, 101/*OCR_IBEAM*/, _T("IBeam"), 0, _T(""), _T("")},
127 {IDS_NWPEN
, 113/*OCR_NWPEN*/, _T("NWPen"), 0, _T(""), _T("")},
128 {IDS_NO
, 110/*OCR_NO*/, _T("No"), 0, _T(""), _T("")},
129 {IDS_SIZENS
, 108/*OCR_SIZENS*/, _T("SizeNS"), 0, _T(""), _T("")},
130 {IDS_SIZEWE
, 107/*OCR_SIZEWE*/, _T("SizeWE"), 0, _T(""), _T("")},
131 {IDS_SIZENWSE
, 105/*OCR_SIZENWSE*/, _T("SizeNWSE"), 0, _T(""), _T("")},
132 {IDS_SIZENESW
, 106/*OCR_SIZENESW*/, _T("SizeNESW"), 0, _T(""), _T("")},
133 {IDS_SIZEALL
, 109/*OCR_SIZEALL*/, _T("SizeAll"), 0, _T(""), _T("")},
134 {IDS_UPARROW
, 104/*OCR_UP*/, _T("UpArrow"), 0, _T(""), _T("")},
135 {IDS_HAND
, 114/*OCR_HAND*/, _T("Hand"), 0, _T(""), _T("")}};
140 DebugMsg(LPTSTR fmt
, ...)
142 TCHAR szBuffer
[2048];
145 va_start(marker
, fmt
);
146 _vstprintf(szBuffer
, fmt
, marker
);
149 MessageBox(NULL
, szBuffer
, _T("Debug message"), MB_OK
);
154 /* Property page dialog callback */
155 static INT_PTR CALLBACK
156 MouseHardwareProc(IN HWND hwndDlg
,
162 Guids
[0] = GUID_DEVCLASS_MOUSE
;
164 UNREFERENCED_PARAMETER(lParam
);
165 UNREFERENCED_PARAMETER(wParam
);
170 /* create the hardware page */
171 DeviceCreateHardwarePageEx(hwndDlg
,
173 sizeof(Guids
) / sizeof(Guids
[0]),
182 static INT_PTR CALLBACK
183 ClickLockProc(IN HWND hwndDlg
,
192 PBUTTON_DATA pButtonData
;
194 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
199 pButtonData
= (PBUTTON_DATA
)lParam
;
200 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
202 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
203 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 10));
204 pos
= (pButtonData
->g_ClickLockTime
- 200) / 200;
205 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pos
);
207 hIcon
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_LOOK_KEY
),
208 IMAGE_ICON
, 16, 16, 0);
209 SendMessage(hwndDlg
, WM_SETICON
, ICON_SMALL
, (LPARAM
)hIcon
);
213 if (LOWORD(wParam
) == IDOK
)
215 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
216 pButtonData
->g_ClickLockTime
= (DWORD
) (SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) * 200) + 200;
217 EndDialog(hwndDlg
, TRUE
);
218 if (hIcon
) DestroyIcon(hIcon
);
220 else if (LOWORD(wParam
) == IDCANCEL
)
222 EndDialog(hwndDlg
, FALSE
);
223 if (hIcon
) DestroyIcon(hIcon
);
232 static INT_PTR CALLBACK
233 ButtonProc(IN HWND hwndDlg
,
242 PBUTTON_DATA pButtonData
;
244 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
249 pButtonData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(BUTTON_DATA
));
250 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
252 pButtonData
->g_SwapMouseButtons
= GetSystemMetrics(SM_SWAPBUTTON
);
253 pButtonData
->g_OrigSwapMouseButtons
= pButtonData
->g_SwapMouseButtons
;
254 pButtonData
->g_DoubleClickSpeed
= GetDoubleClickTime();
255 pButtonData
->g_OrigDoubleClickSpeed
= pButtonData
->g_DoubleClickSpeed
;
257 /* Click lock time */
258 SystemParametersInfo(SPI_GETMOUSECLICKLOCK
, 0, &pButtonData
->g_ClickLockEnabled
, 0);
259 SystemParametersInfo(SPI_GETMOUSECLICKLOCKTIME
, 0, &pButtonData
->g_ClickLockTime
, 0);
261 /* Load mouse button icons */
262 pButtonData
->hButtonLeft
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_LEFT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
263 pButtonData
->hButtonRight
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_RIGHT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
265 /* Load folder icons */
266 pButtonData
->hIcon1
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_CLOSED
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
267 pButtonData
->hIcon2
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_OPEN
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
269 if (pButtonData
->g_SwapMouseButtons
)
271 SendDlgItemMessage(hwndDlg
, IDC_SWAP_MOUSE_BUTTONS
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
272 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
276 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
279 if (pButtonData
->g_ClickLockEnabled
)
281 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_CLICK_LOCK
);
282 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
286 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
287 EnableWindow(hDlgCtrl
, FALSE
);
290 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
);
291 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 14));
292 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, 14 - ((pButtonData
->g_DoubleClickSpeed
- 200) / 50));
295 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hIcon1
);
296 pButtonData
->bClicked
= TRUE
;
300 DestroyIcon(pButtonData
->hButtonLeft
);
301 DestroyIcon(pButtonData
->hButtonRight
);
302 DestroyIcon(pButtonData
->hIcon1
);
303 DestroyIcon(pButtonData
->hIcon2
);
304 HeapFree(GetProcessHeap(), 0, pButtonData
);
308 switch(LOWORD(wParam
))
310 case IDC_SWAP_MOUSE_BUTTONS
:
311 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
312 if (lResult
== BST_CHECKED
)
314 pButtonData
->g_SwapMouseButtons
= FALSE
;
315 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
316 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
318 else if (lResult
== BST_UNCHECKED
)
320 pButtonData
->g_SwapMouseButtons
= TRUE
;
321 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
322 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
324 //SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, pButtonData->g_SwapMouseButtons, NULL, 0);
325 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
328 case IDC_CHECK_CLICK_LOCK
:
329 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
330 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
331 if (lResult
== BST_CHECKED
)
333 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
334 pButtonData
->g_ClickLockEnabled
= FALSE
;
335 EnableWindow(hDlgCtrl
, FALSE
);
337 else if (lResult
== BST_UNCHECKED
)
339 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
340 pButtonData
->g_ClickLockEnabled
= TRUE
;
341 EnableWindow(hDlgCtrl
, TRUE
);
343 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
346 case IDC_BUTTON_CLICK_LOCK
:
347 DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_CLICK_LOCK
), hwndDlg
, ClickLockProc
, (LPARAM
)pButtonData
);
350 case IDC_IMAGE_DOUBLE_CLICK_SPEED
:
351 if (HIWORD(wParam
) == STN_DBLCLK
)
353 pButtonData
->bClicked
= !pButtonData
->bClicked
;
354 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
,
355 (LPARAM
)(pButtonData
->bClicked
? pButtonData
->hIcon1
: pButtonData
->hIcon2
));
362 lppsn
= (LPPSHNOTIFY
) lParam
;
363 if (lppsn
->hdr
.code
== PSN_APPLY
)
365 if (pButtonData
->g_OrigSwapMouseButtons
!= pButtonData
->g_SwapMouseButtons
)
367 pButtonData
->g_OrigSwapMouseButtons
= pButtonData
->g_SwapMouseButtons
;
368 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_OrigSwapMouseButtons
, NULL
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
371 SystemParametersInfo(SPI_SETDOUBLECLICKTIME
, pButtonData
->g_DoubleClickSpeed
, NULL
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
372 //SetDoubleClickTime(pButtonData->g_DoubleClickSpeed);
374 #if (WINVER >= 0x0500)
375 SystemParametersInfo(SPI_SETMOUSECLICKLOCK
, 0, UlongToPtr(pButtonData
->g_ClickLockEnabled
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
376 if (pButtonData
->g_ClickLockEnabled
)
377 SystemParametersInfo(SPI_SETMOUSECLICKLOCKTIME
, pButtonData
->g_ClickLockTime
, NULL
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
380 else if (lppsn
->hdr
.code
== PSN_RESET
)
382 /* Reset swap mouse button setting */
383 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_OrigSwapMouseButtons
, NULL
, 0);
385 /* Reset double click speed setting */
386 SystemParametersInfo(SPI_SETDOUBLECLICKTIME
, pButtonData
->g_OrigDoubleClickSpeed
, NULL
, 0);
387 //SetDoubleClickTime(pButtonData->g_OrigDoubleClickSpeed);
392 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
))
394 switch (LOWORD(wParam
))
403 lResult
= SendDlgItemMessage(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
, TBM_GETPOS
, 0, 0);
404 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)lResult
) * 50 + 200;
405 //SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
406 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
407 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
411 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)HIWORD(wParam
)) * 50 + 200;
412 //SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, 0);
413 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
414 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
426 CompressPath(LPTSTR lpShortPath
, LPTSTR lpPath
)
428 TCHAR szUserProfile
[MAX_PATH
];
429 TCHAR szSystemRoot
[MAX_PATH
];
430 TCHAR szProgramFiles
[MAX_PATH
];
433 DWORD dwProgramFiles
;
435 dwUserProfile
= GetEnvironmentVariable(_T("USERPROFILE"), szUserProfile
, MAX_PATH
);
436 dwSystemRoot
= GetEnvironmentVariable(_T("SystemRoot"), szSystemRoot
, MAX_PATH
);
437 dwProgramFiles
= GetEnvironmentVariable(_T("ProgramFiles"), szProgramFiles
, MAX_PATH
);
439 if (dwUserProfile
> 0 && _tcsncmp(lpPath
, szUserProfile
, dwUserProfile
) == 0)
441 _tcscpy(lpShortPath
, _T("%USERPROFILE%"));
442 _tcscat(lpShortPath
, &lpPath
[dwUserProfile
]);
444 else if (dwSystemRoot
> 0 && _tcsncmp(lpPath
, szSystemRoot
, dwSystemRoot
) == 0)
446 _tcscpy(lpShortPath
, _T("%SystemRoot%"));
447 _tcscat(lpShortPath
, &lpPath
[dwSystemRoot
]);
449 else if (dwProgramFiles
> 0 && _tcsncmp(lpPath
, szProgramFiles
, dwProgramFiles
) == 0)
451 _tcscpy(lpShortPath
, _T("%ProgramFiles%"));
452 _tcscat(lpShortPath
, &lpPath
[dwProgramFiles
]);
456 _tcscpy(lpShortPath
, lpPath
);
462 EnumerateCursorSchemes(HWND hwndDlg
)
466 TCHAR szValueName
[MAX_PATH
];
468 TCHAR szSystemScheme
[MAX_PATH
];
469 TCHAR szValueData
[2000];
470 TCHAR szTempData
[2000];
476 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
477 SendMessage(hDlgCtrl
, CB_RESETCONTENT
, 0, 0);
479 /* Read the users cursor schemes */
480 lError
= RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Control Panel\\Cursors\\Schemes"),
481 0, KEY_READ
| KEY_QUERY_VALUE
, &hCursorKey
);
482 if (lError
== ERROR_SUCCESS
)
484 for (dwIndex
= 0;; dwIndex
++)
486 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
487 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
488 lError
= RegEnumValue(hCursorKey
, dwIndex
, szValueName
, &dwValueName
,
489 NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
490 if (lError
== ERROR_NO_MORE_ITEMS
)
493 ExpandEnvironmentStrings(szValueData
, szTempData
, 2000);
495 if (_tcslen(szTempData
) > 0)
497 LPTSTR lpCopy
, lpStart
;
499 /* Remove quotation marks */
500 if (szTempData
[0] == _T('"'))
502 lpStart
= szTempData
+ 1;
503 szTempData
[_tcslen(szTempData
) - 1] = 0;
507 lpStart
= szTempData
;
510 lpCopy
= _tcsdup(lpStart
);
512 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szValueName
);
513 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)lpCopy
);
517 RegCloseKey(hCursorKey
);
520 /* Read the system cursor schemes */
521 lError
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
522 _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cursors\\Schemes"),
523 0, KEY_READ
| KEY_QUERY_VALUE
, &hCursorKey
);
524 if (lError
== ERROR_SUCCESS
)
526 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
528 for (dwIndex
= 0;; dwIndex
++)
530 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
531 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
532 lError
= RegEnumValue(hCursorKey
, dwIndex
, szValueName
, &dwValueName
,
533 NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
534 if (lError
== ERROR_NO_MORE_ITEMS
)
537 if (_tcslen(szValueData
) > 0)
539 LPTSTR lpCopy
, lpStart
;
541 /* Remove quotation marks */
542 if (szValueData
[0] == _T('"'))
544 lpStart
= szValueData
+ 1;
545 szValueData
[_tcslen(szValueData
) - 1] = 0;
549 lpStart
= szValueData
;
552 lpCopy
= _tcsdup(lpStart
);
554 _tcscat(szValueName
, TEXT(" "));
555 _tcscat(szValueName
, szSystemScheme
);
557 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szValueName
);
558 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)lpCopy
);
562 RegCloseKey(hCursorKey
);
565 /* Add the "(none)" entry */
566 LoadString(hApplet
, IDS_NONE
, szSystemScheme
, MAX_PATH
);
567 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szSystemScheme
);
568 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)NULL
);
575 RefreshCursorList(HWND hwndDlg
, BOOL bInit
)
581 nSel
= bInit
? 0 : SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
585 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_RESETCONTENT
, 0, 0);
586 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
588 LoadString(hApplet
, index
, g_CursorData
[i
].szCursorName
, MAX_PATH
);
589 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_ADDSTRING
, 0, (LPARAM
)i
);
592 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_SETCURSEL
, nSel
, 0);
596 InvalidateRect(GetDlgItem(hwndDlg
, IDC_LISTBOX_CURSOR
), NULL
, FALSE
);
599 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
, STM_SETIMAGE
, IMAGE_CURSOR
,
600 (LPARAM
)g_CursorData
[nSel
].hCursor
);
602 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), (g_CursorData
[nSel
].szCursorPath
[0] != 0));
607 DeleteUserCursorScheme(HWND hwndDlg
)
609 TCHAR szSchemeName
[MAX_PATH
];
611 TCHAR szRawText
[256];
619 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
620 nSel
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
624 SendMessage(hDlgCtrl
, CB_GETLBTEXT
, nSel
, (LPARAM
)szSchemeName
);
626 LoadString(hApplet
, IDS_REMOVE_TITLE
, szTitle
, 128);
627 LoadString(hApplet
, IDS_REMOVE_TEXT
, szRawText
, 256);
629 _stprintf(szText
, szRawText
, szSchemeName
);
631 /* Confirm scheme removal */
632 if (MessageBox(hwndDlg
, szText
, szTitle
, MB_YESNO
| MB_ICONQUESTION
) == IDNO
)
635 if (RegOpenCurrentUser(KEY_READ
| KEY_SET_VALUE
, &hCuKey
) != ERROR_SUCCESS
)
638 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
| KEY_SET_VALUE
, &hCuCursorKey
) != ERROR_SUCCESS
)
644 lResult
= RegDeleteValue(hCuCursorKey
, szSchemeName
);
646 RegCloseKey(hCuCursorKey
);
649 if (lResult
== ERROR_SUCCESS
)
651 SendMessage(hDlgCtrl
, CB_DELETESTRING
, nSel
, 0);
652 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)0, (LPARAM
)0);
655 return (lResult
== ERROR_SUCCESS
);
659 static INT_PTR CALLBACK
660 SaveSchemeProc(IN HWND hwndDlg
,
670 pSchemeName
= (LPTSTR
)lParam
;
671 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pSchemeName
);
672 SendDlgItemMessage(hwndDlg
, IDC_EDIT_SCHEME_NAME
, WM_SETTEXT
,
673 0, (LPARAM
)pSchemeName
);
677 if (LOWORD(wParam
) == IDOK
)
679 pSchemeName
= (LPTSTR
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
680 SendDlgItemMessage(hwndDlg
, IDC_EDIT_SCHEME_NAME
, WM_GETTEXT
,
681 (WPARAM
)MAX_PATH
, (LPARAM
)pSchemeName
);
682 EndDialog(hwndDlg
, TRUE
);
684 else if (LOWORD(wParam
) == IDCANCEL
)
686 EndDialog(hwndDlg
, FALSE
);
696 SaveCursorScheme(HWND hwndDlg
)
698 TCHAR szSystemScheme
[MAX_PATH
];
699 TCHAR szSchemeName
[MAX_PATH
];
700 TCHAR szNewSchemeName
[MAX_PATH
];
701 TCHAR szTempPath
[MAX_PATH
];
705 INT index
, i
, nLength
;
709 LONG lError
= ERROR_SUCCESS
;
712 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
714 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
721 szNewSchemeName
[0] = 0;
725 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)szNewSchemeName
);
727 if (_tcsstr(szNewSchemeName
, szSystemScheme
))
729 szNewSchemeName
[_tcslen(szNewSchemeName
) - _tcslen(szSystemScheme
) - 1] = 0;
733 /* Ask for a name for the new cursor scheme */
734 if (!DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_CURSOR_SCHEME_SAVEAS
),
735 hwndDlg
, SaveSchemeProc
, (LPARAM
)szNewSchemeName
))
738 /* Check all non-system schemes for the new name */
739 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCOUNT
, 0, 0);
743 bSchemeExists
= FALSE
;
744 for (i
= 0; i
< nSel
; i
++)
746 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, i
, (LPARAM
)szSchemeName
);
747 if (_tcsstr(szSchemeName
, szSystemScheme
) == NULL
)
749 if (_tcscmp(szSchemeName
, szNewSchemeName
) == 0)
751 bSchemeExists
= TRUE
;
759 LoadString(hApplet
, IDS_OVERWRITE_TITLE
, szTitle
, 128);
760 LoadString(hApplet
, IDS_OVERWRITE_TEXT
, szText
, 256);
762 /* Confirm scheme overwrite */
763 if (MessageBox(hwndDlg
, szText
, szTitle
, MB_YESNO
| MB_ICONQUESTION
) == IDNO
)
767 /* Save the cursor scheme */
769 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
773 nLength
+= _tcslen(g_CursorData
[i
].szCursorPath
);
777 lpSchemeData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, nLength
* sizeof(TCHAR
));
782 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
784 CompressPath(szTempPath
, g_CursorData
[i
].szCursorPath
);
786 _tcscat(lpSchemeData
, _T(","));
787 _tcscat(lpSchemeData
, szTempPath
);
790 if (RegOpenCurrentUser(KEY_READ
| KEY_SET_VALUE
, &hCuKey
) != ERROR_SUCCESS
)
792 HeapFree(GetProcessHeap(), 0, lpSchemeData
);
796 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
| KEY_SET_VALUE
, &hCuCursorKey
) != ERROR_SUCCESS
)
799 HeapFree(GetProcessHeap(), 0, lpSchemeData
);
803 lError
= RegSetValueEx(hCuCursorKey
, szNewSchemeName
, 0,
804 REG_EXPAND_SZ
, (LPBYTE
)lpSchemeData
,
805 (_tcslen(lpSchemeData
) + 1) * sizeof(TCHAR
));
807 RegCloseKey(hCuCursorKey
);
810 /* Add the new scheme to the scheme list and select it */
811 if (lError
== ERROR_SUCCESS
)
813 LPTSTR copy
= _tcsdup(lpSchemeData
);
815 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szNewSchemeName
);
816 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_SETITEMDATA
, (WPARAM
)nSel
, (LPARAM
)copy
);
817 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_SETCURSEL
, (WPARAM
)nSel
, (LPARAM
)0);
820 HeapFree(GetProcessHeap(), 0, lpSchemeData
);
822 return (lError
== ERROR_SUCCESS
);
827 BrowseCursor(HWND hwndDlg
)
829 TCHAR szFileName
[MAX_PATH
];
830 TCHAR szFilter
[MAX_PATH
];
831 TCHAR szTitle
[MAX_PATH
];
835 LoadString(hApplet
, IDS_BROWSE_FILTER
, szFilter
, MAX_PATH
);
836 LoadString(hApplet
, IDS_BROWSE_TITLE
, szTitle
, MAX_PATH
);
838 memset(szFileName
, 0x0, sizeof(szFileName
));
839 nSel
= SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
842 MessageBox(hwndDlg
, _T("LB_ERR"), _T(""), MB_ICONERROR
);
846 ZeroMemory(&ofn
, sizeof(OPENFILENAME
));
847 ofn
.lStructSize
= sizeof(OPENFILENAME
);
848 ofn
.hwndOwner
= hwndDlg
;
849 ofn
.lpstrFilter
= szFilter
;
850 ofn
.nFilterIndex
= 1;
851 ofn
.lpstrFile
= szFileName
;
852 ofn
.nMaxFile
= MAX_PATH
;
853 ofn
.lpstrInitialDir
= _T("%WINDIR%\\Cursors");
854 ofn
.lpstrTitle
= szTitle
;
855 ofn
.Flags
= OFN_EXPLORER
| OFN_FILEMUSTEXIST
| OFN_HIDEREADONLY
;
857 if (!GetOpenFileName(&ofn
))
860 /* Store the new cursor file path */
861 _tcsncpy(g_CursorData
[nSel
].szCursorPath
, szFileName
, MAX_PATH
);
868 LoadCursorScheme(LPTSTR lpName
, BOOL bSystem
)
872 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
874 if (g_CursorData
[i
].hCursor
!= NULL
)
876 DestroyCursor(g_CursorData
[i
].hCursor
);
877 g_CursorData
[i
].hCursor
= 0;
879 g_CursorData
[i
].szCursorPath
[0] = 0;
884 LPTSTR pStart
= lpName
;
885 LPTSTR pEnd
= pStart
;
891 pEnd
= _tcschr(pStart
, _T(','));
893 nLength
= ((INT_PTR
)pEnd
- (INT_PTR
)pStart
) / sizeof(TCHAR
);
895 nLength
= _tcslen(pStart
);
897 _tcsncpy(g_CursorData
[i
].szCursorPath
, pStart
, nLength
);
898 g_CursorData
[i
].szCursorPath
[nLength
] = 0;
900 pStart
= pStart
+ (nLength
+ 1);
906 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
908 if (g_CursorData
[i
].szCursorPath
[0] == 0)
909 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, MAKEINTRESOURCE(g_CursorData
[i
].uDefaultCursorId
),
911 LR_DEFAULTSIZE
| LR_SHARED
);
913 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, g_CursorData
[i
].szCursorPath
,
915 LR_LOADFROMFILE
| LR_DEFAULTSIZE
);
921 ReloadCurrentCursorScheme(VOID
)
925 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
927 if (g_CursorData
[i
].hCursor
!= NULL
)
928 DestroyCursor(g_CursorData
[i
].hCursor
);
930 if (g_CursorData
[i
].szCursorPath
[0] == 0)
931 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, MAKEINTRESOURCE(g_CursorData
[i
].uDefaultCursorId
),
933 LR_DEFAULTSIZE
| LR_SHARED
);
935 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, g_CursorData
[i
].szCursorPath
,
937 LR_LOADFROMFILE
| LR_DEFAULTSIZE
);
943 OnDrawItem(UINT idCtl
,
944 LPDRAWITEMSTRUCT lpdis
,
945 PPOINTER_DATA pPointerData
)
949 if (lpdis
->itemState
& ODS_SELECTED
)
953 (HBRUSH
)(COLOR_HIGHLIGHT
+ 1));
954 SetBkColor(lpdis
->hDC
,
955 GetSysColor(COLOR_HIGHLIGHT
));
956 SetTextColor(lpdis
->hDC
,
957 GetSysColor(COLOR_HIGHLIGHTTEXT
));
963 (HBRUSH
)(COLOR_WINDOW
+ 1));
964 SetBkColor(lpdis
->hDC
,
965 GetSysColor(COLOR_WINDOW
));
966 SetTextColor(lpdis
->hDC
,
967 GetSysColor(COLOR_WINDOWTEXT
));
970 if (lpdis
->itemID
!= (UINT
)-1)
972 CopyRect(&rc
, &lpdis
->rcItem
);
975 g_CursorData
[lpdis
->itemData
].szCursorName
,
978 DT_SINGLELINE
| DT_VCENTER
| DT_LEFT
);
980 if (g_CursorData
[lpdis
->itemData
].hCursor
!= NULL
)
983 lpdis
->rcItem
.right
- pPointerData
->cxCursor
- 4,
984 lpdis
->rcItem
.top
+ 2,
985 g_CursorData
[lpdis
->itemData
].hCursor
);
989 if (lpdis
->itemState
& ODS_FOCUS
)
991 CopyRect(&rc
, &lpdis
->rcItem
);
992 InflateRect(&rc
, -1, -1);
993 DrawFocusRect(lpdis
->hDC
, &rc
);
999 LoadNewCursorScheme(HWND hwndDlg
)
1001 TCHAR buffer
[MAX_PATH
];
1002 TCHAR szSystemScheme
[MAX_PATH
];
1008 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
1012 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)buffer
);
1014 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
1015 if (_tcsstr(buffer
, szSystemScheme
) || nSel
== 0) // Avoid the default scheme - Can be deleted
1021 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
);
1022 EnableWindow(hDlgCtrl
, bEnable
);
1024 lpName
= (LPTSTR
)SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETITEMDATA
, nSel
, 0);
1025 LoadCursorScheme(lpName
, !bEnable
);
1026 RefreshCursorList(hwndDlg
, FALSE
);
1031 LoadInitialCursorScheme(HWND hwndDlg
)
1033 TCHAR szSchemeName
[MAX_PATH
];
1034 TCHAR szSystemScheme
[MAX_PATH
];
1035 TCHAR szCursorPath
[MAX_PATH
];
1039 DWORD dwSchemeSource
= 0;
1044 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
1046 g_CursorData
[i
].hCursor
= 0;
1047 g_CursorData
[i
].szCursorPath
[0] = 0;
1050 lError
= RegOpenKeyEx(HKEY_CURRENT_USER
,
1051 _T("Control Panel\\Cursors"),
1053 KEY_READ
| KEY_QUERY_VALUE
,
1055 if (lError
!= ERROR_SUCCESS
)
1058 dwDataSize
= sizeof(DWORD
);
1059 lError
= RegQueryValueEx(hCursorKey
,
1060 _T("Scheme Source"),
1063 (LPBYTE
)&dwSchemeSource
,
1066 if (dwSchemeSource
!= 0)
1068 dwDataSize
= MAX_PATH
* sizeof(TCHAR
);
1069 lError
= RegQueryValueEx(hCursorKey
,
1073 (LPBYTE
)szSchemeName
,
1076 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
1078 dwDataSize
= MAX_PATH
* sizeof(TCHAR
);
1079 lError
= RegQueryValueEx(hCursorKey
,
1080 g_CursorData
[i
].lpValueName
,
1083 (LPBYTE
)szCursorPath
,
1085 if (lError
== ERROR_SUCCESS
)
1087 if (dwType
== REG_EXPAND_SZ
)
1089 ExpandEnvironmentStrings(szCursorPath
, g_CursorData
[i
].szCursorPath
, MAX_PATH
);
1093 _tcscpy(g_CursorData
[i
].szCursorPath
, szCursorPath
);
1099 RegCloseKey(hCursorKey
);
1101 ReloadCurrentCursorScheme();
1102 RefreshCursorList(hwndDlg
, TRUE
);
1104 /* Build the full scheme name */
1105 if (dwSchemeSource
== 0)
1107 LoadString(hApplet
, IDS_NONE
, szSchemeName
, MAX_PATH
);
1109 else if (dwSchemeSource
== 2)
1111 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
1112 _tcsncat(szSchemeName
, _T(" "), MAX_PATH
- _tcslen(szSchemeName
) - 1);
1113 _tcsncat(szSchemeName
, szSystemScheme
, MAX_PATH
- _tcslen(szSchemeName
) - 1);
1116 /* Search and select the current scheme name from the scheme list */
1117 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_FINDSTRINGEXACT
, -1, (LPARAM
)szSchemeName
);
1119 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_SETCURSEL
, (WPARAM
)nSel
, (LPARAM
)0);
1121 /* Enable /disable delete button */
1122 EnableWindow(GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
), (dwSchemeSource
== 1));
1127 ApplyCursorScheme(HWND hwndDlg
)
1129 TCHAR szSchemeName
[MAX_PATH
];
1130 TCHAR szSystemScheme
[MAX_PATH
];
1131 TCHAR szTempPath
[MAX_PATH
];
1132 LPTSTR lpSchemeData
;
1134 DWORD dwSchemeSource
;
1139 nSel
= SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETCURSEL
, 0, 0);
1143 lpSchemeData
= (LPTSTR
)SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETITEMDATA
, nSel
, 0);
1144 if (lpSchemeData
== NULL
)
1146 /* "None" cursor scheme */
1148 szSchemeName
[0] = 0;
1153 SendDlgItemMessage(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
, CB_GETLBTEXT
, nSel
, (LPARAM
)szSchemeName
);
1154 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
1156 if (_tcsstr(szSchemeName
, szSystemScheme
))
1160 szSchemeName
[_tcslen(szSchemeName
) - _tcslen(szSystemScheme
) - 1] = 0;
1168 dwNameLength
= (_tcslen(szSchemeName
) + 1) * sizeof(TCHAR
);
1171 if (RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Control Panel\\Cursors"), 0,
1172 KEY_READ
| KEY_SET_VALUE
, &hCursorKey
) != ERROR_SUCCESS
)
1175 RegSetValueEx(hCursorKey
, NULL
, 0, REG_SZ
,
1176 (LPBYTE
)szSchemeName
, dwNameLength
);
1178 RegSetValueEx(hCursorKey
, _T("Scheme Source"), 0, REG_DWORD
,
1179 (LPBYTE
)&dwSchemeSource
, sizeof(DWORD
));
1181 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
1183 CompressPath(szTempPath
, g_CursorData
[i
].szCursorPath
);
1184 RegSetValueEx(hCursorKey
, g_CursorData
[i
].lpValueName
, 0,
1185 REG_EXPAND_SZ
, (LPBYTE
)szTempPath
,
1186 (_tcslen(szTempPath
) + 1) * sizeof(TCHAR
));
1189 RegCloseKey(hCursorKey
);
1191 /* Force the system to reload its cursors */
1192 SystemParametersInfo(SPI_SETCURSORS
, 0, NULL
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1198 static INT_PTR CALLBACK
1199 PointerProc(IN HWND hwndDlg
,
1204 PPOINTER_DATA pPointerData
;
1208 pPointerData
= (PPOINTER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1213 pPointerData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(POINTER_DATA
));
1214 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pPointerData
);
1216 pPointerData
->cxCursor
= GetSystemMetrics(SM_CXCURSOR
);
1217 pPointerData
->cyCursor
= GetSystemMetrics(SM_CYCURSOR
);
1219 EnumerateCursorSchemes(hwndDlg
);
1220 LoadInitialCursorScheme(hwndDlg
);
1222 /* Get cursor shadow setting */
1223 SystemParametersInfo(SPI_GETCURSORSHADOW
, 0, &pPointerData
->bCursorShadow
, 0);
1224 pPointerData
->bOrigCursorShadow
= pPointerData
->bCursorShadow
;
1226 if (pPointerData
->bCursorShadow
)
1228 SendDlgItemMessage(hwndDlg
, IDC_CHECK_CURSOR_SHADOW
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1231 if ((INT
)wParam
== IDC_LISTBOX_CURSOR
)
1236 case WM_MEASUREITEM
:
1237 ((LPMEASUREITEMSTRUCT
)lParam
)->itemHeight
= GetSystemMetrics(SM_CYCURSOR
) + 4;
1241 if (wParam
== IDC_LISTBOX_CURSOR
)
1242 OnDrawItem((UINT
)wParam
, (LPDRAWITEMSTRUCT
)lParam
, pPointerData
);
1246 HeapFree(GetProcessHeap(), 0, pPointerData
);
1250 lppsn
= (LPPSHNOTIFY
) lParam
;
1251 if (lppsn
->hdr
.code
== PSN_APPLY
)
1253 ApplyCursorScheme(hwndDlg
);
1254 //#if (WINVER >= 0x0500)
1255 if (pPointerData
->bOrigCursorShadow
!= pPointerData
->bCursorShadow
)
1257 SystemParametersInfo(SPI_SETCURSORSHADOW
, 0, UlongToPtr(pPointerData
->bCursorShadow
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1258 pPointerData
->bOrigCursorShadow
= pPointerData
->bCursorShadow
;
1263 else if (lppsn
->hdr
.code
== PSN_RESET
)
1265 //#if (WINVER >= 0x0500)
1266 SystemParametersInfo(SPI_SETCURSORSHADOW
, 0, UlongToPtr(pPointerData
->bOrigCursorShadow
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1272 switch (LOWORD(wParam
))
1274 case IDC_COMBO_CURSOR_SCHEME
:
1275 if (HIWORD(wParam
) == CBN_SELENDOK
)
1277 LoadNewCursorScheme(hwndDlg
);
1278 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1282 case IDC_LISTBOX_CURSOR
:
1283 switch (HIWORD(wParam
))
1286 nSel
= SendMessage((HWND
)lParam
, LB_GETCURSEL
, 0, 0);
1291 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
, STM_SETIMAGE
, IMAGE_CURSOR
,
1292 (LPARAM
)g_CursorData
[nSel
].hCursor
);
1293 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
),
1294 (g_CursorData
[nSel
].szCursorPath
[0] != 0));
1298 if (BrowseCursor(hwndDlg
))
1300 /* Update cursor list and preview */
1301 ReloadCurrentCursorScheme();
1302 RefreshCursorList(hwndDlg
, FALSE
);
1304 /* Enable the "Set Default" button */
1305 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), TRUE
);
1307 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1313 case IDC_BUTTON_SAVEAS_SCHEME
:
1314 SaveCursorScheme(hwndDlg
);
1317 case IDC_BUTTON_USE_DEFAULT_CURSOR
:
1318 nSel
= SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
1321 /* Clean the path of the currently selected cursor */
1322 memset(g_CursorData
[nSel
].szCursorPath
, 0x0, MAX_PATH
* sizeof(TCHAR
));
1324 /* Update cursor list and preview */
1325 ReloadCurrentCursorScheme();
1326 RefreshCursorList(hwndDlg
, FALSE
);
1328 /* Disable the "Set Default" button */
1329 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), FALSE
);
1331 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1335 case IDC_BUTTON_BROWSE_CURSOR
:
1336 if (BrowseCursor(hwndDlg
))
1338 /* Update cursor list and preview */
1339 ReloadCurrentCursorScheme();
1340 RefreshCursorList(hwndDlg
, FALSE
);
1342 /* Enable the "Set Default" button */
1343 EnableWindow(GetDlgItem(hwndDlg
,IDC_BUTTON_USE_DEFAULT_CURSOR
), TRUE
);
1345 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1349 case IDC_BUTTON_DELETE_SCHEME
:
1350 DeleteUserCursorScheme(hwndDlg
);
1353 case IDC_CHECK_CURSOR_SHADOW
:
1354 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_CURSOR_SHADOW
))
1356 pPointerData
->bCursorShadow
= FALSE
;
1357 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1358 //#if (WINVER >= 0x0500)
1359 // SystemParametersInfo(SPI_SETCURSORSHADOW, 0, (PVOID)pPointerData->bCursorShadow, 0);
1361 // PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1365 pPointerData
->bCursorShadow
= TRUE
;
1366 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1368 //#if (WINVER >= 0x0500)
1369 //SystemParametersInfo(SPI_SETCURSORSHADOW, 0, (PVOID)pPointerData->bCursorShadow, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
1371 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1381 static INT_PTR CALLBACK
1382 OptionProc(IN HWND hwndDlg
,
1387 POPTION_DATA pOptionData
;
1391 pOptionData
= (POPTION_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1396 pOptionData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(OPTION_DATA
));
1397 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pOptionData
);
1399 /* Get mouse sensitivity */
1400 if (!SystemParametersInfo(SPI_GETMOUSESPEED
, 0, &pOptionData
->ulMouseSpeed
, 0))
1401 pOptionData
->ulMouseSpeed
= DEFAULT_MOUSE_SPEED
;
1402 pOptionData
->ulOrigMouseSpeed
= pOptionData
->ulMouseSpeed
;
1405 if (!SystemParametersInfo(SPI_GETMOUSE
, 0, &pOptionData
->MouseAccel
, 0))
1407 pOptionData
->MouseAccel
.nAcceleration
= DEFAULT_MOUSE_ACCELERATION
;
1408 pOptionData
->MouseAccel
.nThreshold1
= DEFAULT_MOUSE_THRESHOLD1
;
1409 pOptionData
->MouseAccel
.nThreshold2
= DEFAULT_MOUSE_THRESHOLD2
;
1411 pOptionData
->OrigMouseAccel
.nAcceleration
= pOptionData
->MouseAccel
.nAcceleration
;
1412 pOptionData
->OrigMouseAccel
.nThreshold1
= pOptionData
->MouseAccel
.nThreshold1
;
1413 pOptionData
->OrigMouseAccel
.nThreshold2
= pOptionData
->MouseAccel
.nThreshold2
;
1415 /* Snap to default button */
1416 SystemParametersInfo(SPI_GETSNAPTODEFBUTTON
, 0, &pOptionData
->bSnapToDefaultButton
, 0);
1417 pOptionData
->bOrigSnapToDefaultButton
= pOptionData
->bSnapToDefaultButton
;
1420 SystemParametersInfo(SPI_GETMOUSETRAILS
, 0, &pOptionData
->uMouseTrails
, 0);
1421 pOptionData
->uOrigMouseTrails
= pOptionData
->uMouseTrails
;
1423 /* Hide pointer while typing */
1424 SystemParametersInfo(SPI_GETMOUSEVANISH
, 0, &pOptionData
->bMouseVanish
, 0);
1425 pOptionData
->bOrigMouseVanish
= pOptionData
->bMouseVanish
;
1427 /* Show pointer with Ctrl-Key */
1428 SystemParametersInfo(SPI_GETMOUSESONAR
, 0, &pOptionData
->bMouseSonar
, 0);
1429 pOptionData
->bOrigMouseSonar
= pOptionData
->bMouseSonar
;
1431 /* Set mouse speed */
1432 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SPEED
);
1433 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(1, 20));
1434 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->ulMouseSpeed
);
1436 if (pOptionData
->MouseAccel
.nAcceleration
)
1438 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_POINTER_PRECISION
);
1439 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1442 if (pOptionData
->bSnapToDefaultButton
)
1444 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SNAP_TO
);
1445 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1448 /* Set mouse trail */
1449 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1450 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 5));
1451 if (pOptionData
->uMouseTrails
< 2)
1453 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)5);
1454 EnableWindow(hDlgCtrl
, FALSE
);
1455 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_SHORT
), FALSE
);
1456 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_LONG
), FALSE
);
1460 SendDlgItemMessage(hwndDlg
, IDC_CHECK_POINTER_TRAIL
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1461 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->uMouseTrails
- 2);
1464 if (pOptionData
->bMouseVanish
)
1466 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_HIDE_POINTER
);
1467 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1470 if (pOptionData
->bMouseSonar
)
1472 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SHOW_POINTER
);
1473 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1479 HeapFree(GetProcessHeap(), 0, pOptionData
);
1483 switch(LOWORD(wParam
))
1485 case IDC_CHECK_POINTER_PRECISION
:
1486 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_PRECISION
))
1488 pOptionData
->MouseAccel
.nAcceleration
= 0;
1489 pOptionData
->MouseAccel
.nThreshold1
= 0;
1490 pOptionData
->MouseAccel
.nThreshold2
= 0;
1491 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1495 pOptionData
->MouseAccel
.nAcceleration
= 1;
1496 pOptionData
->MouseAccel
.nThreshold1
= 6;
1497 pOptionData
->MouseAccel
.nThreshold2
= 10;
1498 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1500 SystemParametersInfo(SPI_SETMOUSE
, 0, &pOptionData
->MouseAccel
, 0);
1503 case IDC_CHECK_SNAP_TO
:
1504 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SNAP_TO
))
1506 pOptionData
->bSnapToDefaultButton
= 0;
1507 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1511 pOptionData
->bSnapToDefaultButton
= 1;
1512 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1514 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, (UINT
)pOptionData
->bSnapToDefaultButton
, 0, 0);
1517 case IDC_CHECK_POINTER_TRAIL
:
1518 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1519 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_TRAIL
))
1521 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1522 EnableWindow(hDlgCtrl
, FALSE
);
1523 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_SHORT
), FALSE
);
1524 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_LONG
), FALSE
);
1525 pOptionData
->uMouseTrails
= 0;
1529 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1530 EnableWindow(hDlgCtrl
, TRUE
);
1531 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_SHORT
), TRUE
);
1532 EnableWindow(GetDlgItem(hwndDlg
, IDC_TEXT_TRAIL_LONG
), TRUE
);
1533 pOptionData
->uMouseTrails
= (UINT
)SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 2;
1535 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, 0);
1538 case IDC_CHECK_HIDE_POINTER
:
1539 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_HIDE_POINTER
))
1541 pOptionData
->bMouseVanish
= FALSE
;
1542 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1546 pOptionData
->bMouseVanish
= TRUE
;
1547 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1549 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, IntToPtr(pOptionData
->bMouseVanish
), 0);
1552 case IDC_CHECK_SHOW_POINTER
:
1553 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SHOW_POINTER
))
1555 pOptionData
->bMouseSonar
= FALSE
;
1556 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1560 pOptionData
->bMouseSonar
= TRUE
;
1561 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1563 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, IntToPtr(pOptionData
->bMouseSonar
), 0);
1567 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1571 lppsn
= (LPPSHNOTIFY
)lParam
;
1572 if (lppsn
->hdr
.code
== PSN_APPLY
)
1574 /* Set mouse speed */
1575 if (pOptionData
->ulOrigMouseSpeed
!= pOptionData
->ulMouseSpeed
)
1577 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, IntToPtr(pOptionData
->ulMouseSpeed
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1578 pOptionData
->ulOrigMouseSpeed
= pOptionData
->ulMouseSpeed
;
1581 if (pOptionData
->OrigMouseAccel
.nAcceleration
!= pOptionData
->MouseAccel
.nAcceleration
)
1583 SystemParametersInfo(SPI_SETMOUSE
, 0, &pOptionData
->MouseAccel
, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1584 pOptionData
->OrigMouseAccel
.nAcceleration
= pOptionData
->MouseAccel
.nAcceleration
;
1585 pOptionData
->OrigMouseAccel
.nThreshold1
= pOptionData
->MouseAccel
.nThreshold1
;
1586 pOptionData
->OrigMouseAccel
.nThreshold2
= pOptionData
->MouseAccel
.nThreshold2
;
1590 /* Set snap to default button */
1591 if (pOptionData
->bOrigSnapToDefaultButton
!= pOptionData
->bSnapToDefaultButton
)
1593 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, (UINT
)pOptionData
->bSnapToDefaultButton
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1594 pOptionData
->bOrigSnapToDefaultButton
= pOptionData
->bSnapToDefaultButton
;
1597 /* Set mouse trails setting */
1598 if (pOptionData
->uOrigMouseTrails
!= pOptionData
->uMouseTrails
)
1600 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1601 pOptionData
->uOrigMouseTrails
= pOptionData
->uMouseTrails
;
1604 /* Hide pointer while typing */
1605 if (pOptionData
->bOrigMouseVanish
!= pOptionData
->bMouseVanish
)
1607 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, IntToPtr(pOptionData
->bMouseVanish
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1608 pOptionData
->bOrigMouseVanish
= pOptionData
->bMouseVanish
;
1611 /* Show pointer with Ctrl-Key */
1612 if (pOptionData
->bOrigMouseSonar
!= pOptionData
->bMouseSonar
)
1614 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, IntToPtr(pOptionData
->bMouseSonar
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1615 pOptionData
->bOrigMouseSonar
= pOptionData
->bMouseSonar
;
1619 else if (lppsn
->hdr
.code
== PSN_RESET
)
1621 /* Set the original mouse speed */
1622 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, IntToPtr(pOptionData
->ulOrigMouseSpeed
), 0);
1623 SystemParametersInfo(SPI_SETMOUSE
, 0, &pOptionData
->OrigMouseAccel
, 0);
1624 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, (UINT
)pOptionData
->bOrigSnapToDefaultButton
, 0, 0);
1625 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uOrigMouseTrails
, 0, 0);
1626 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, IntToPtr(pOptionData
->bOrigMouseVanish
), 0);
1627 SystemParametersInfo(SPI_SETMOUSESONAR
, 0,IntToPtr(pOptionData
->bOrigMouseSonar
), 0);
1632 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SPEED
))
1634 switch (LOWORD(wParam
))
1643 pOptionData
->ulMouseSpeed
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_MOUSE_SPEED
, TBM_GETPOS
, 0, 0);
1644 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, IntToPtr(pOptionData
->ulMouseSpeed
), SPIF_SENDCHANGE
);
1645 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1649 pOptionData
->ulMouseSpeed
= (ULONG
)HIWORD(wParam
) + 1;
1650 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSpeed
, SPIF_SENDCHANGE
);
1651 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1656 else if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
))
1658 switch (LOWORD(wParam
))
1667 pOptionData
->uMouseTrails
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
, TBM_GETPOS
, 0, 0) + 2;
1668 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_UPDATEINIFILE
);
1669 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1673 pOptionData
->uMouseTrails
= (ULONG
)HIWORD(wParam
) + 2;
1674 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_UPDATEINIFILE
);
1675 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1687 ShowDialogWheelControls(HWND hwndDlg
, UINT uWheelScrollLines
, BOOL bInit
)
1691 if (uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1693 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1694 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1696 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1697 EnableWindow(hDlgCtrl
, TRUE
);
1699 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1700 EnableWindow(hDlgCtrl
, TRUE
);
1702 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1703 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1707 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1708 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1710 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1711 EnableWindow(hDlgCtrl
, FALSE
);
1713 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1714 EnableWindow(hDlgCtrl
, FALSE
);
1716 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1717 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1719 /* Set the default scroll lines value */
1721 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, DEFAULT_WHEEL_SCROLL_LINES
, FALSE
);
1726 static INT_PTR CALLBACK
1727 WheelProc(IN HWND hwndDlg
,
1733 PWHEEL_DATA pWheelData
;
1735 pWheelData
= (PWHEEL_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1740 pWheelData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WHEEL_DATA
));
1741 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pWheelData
);
1743 /* Get wheel scroll lines */
1744 SystemParametersInfo(SPI_GETWHEELSCROLLLINES
, 0, &pWheelData
->uWheelScrollLines
, 0);
1746 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, TRUE
);
1747 SendDlgItemMessage(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
, UDM_SETRANGE
, 0, MAKELONG((short)100, (short)0));
1748 if (pWheelData
->uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1750 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, pWheelData
->uWheelScrollLines
, FALSE
);
1755 HeapFree(GetProcessHeap(), 0, pWheelData
);
1759 switch (LOWORD(wParam
))
1761 case IDC_RADIO_WHEEL_SCROLL_LINES
:
1762 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1763 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1764 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1767 case IDC_RADIO_WHEEL_SCROLL_PAGE
:
1768 pWheelData
->uWheelScrollLines
= WHEEL_PAGESCROLL
;
1769 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1770 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1773 case IDC_EDIT_WHEEL_SCROLL_LINES
:
1774 if (pWheelData
&& HIWORD(wParam
) == EN_CHANGE
)
1776 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1777 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1784 lppsn
= (LPPSHNOTIFY
)lParam
;
1785 if (lppsn
->hdr
.code
== PSN_APPLY
)
1787 SystemParametersInfo(SPI_SETWHEELSCROLLLINES
, pWheelData
->uWheelScrollLines
,
1788 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1798 PropSheetProc(HWND hwndDlg
, UINT uMsg
, LPARAM lParam
)
1800 // NOTE: This callback is needed to set large icon correctly.
1804 case PSCB_INITIALIZED
:
1806 hIcon
= LoadIconW(hApplet
, MAKEINTRESOURCEW(IDC_CPLICON_1
));
1807 SendMessageW(hwndDlg
, WM_SETICON
, ICON_BIG
, (LPARAM
)hIcon
);
1821 { IDD_PAGE_BUTTON
, ButtonProc
, CPLPAGE_MOUSE_BUTTONS
},
1822 { IDD_PAGE_POINTER
, PointerProc
, 0 },
1823 { IDD_PAGE_OPTION
, OptionProc
, CPLPAGE_MOUSE_PTRMOTION
},
1824 { IDD_PAGE_WHEEL
, WheelProc
, CPLPAGE_MOUSE_WHEEL
},
1825 { IDD_HARDWARE
, MouseHardwareProc
, 0 },
1829 MouseApplet(HWND hwnd
, UINT uMsg
, LPARAM lParam1
, LPARAM lParam2
)
1831 HPROPSHEETPAGE hpsp
[MAX_CPL_PAGES
];
1832 PROPSHEETHEADER psh
;
1838 UNREFERENCED_PARAMETER(lParam1
);
1839 UNREFERENCED_PARAMETER(lParam2
);
1840 UNREFERENCED_PARAMETER(uMsg
);
1841 UNREFERENCED_PARAMETER(hwnd
);
1843 LoadString(hApplet
, IDS_CPLNAME_1
, Caption
, sizeof(Caption
) / sizeof(TCHAR
));
1845 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
1846 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
1847 psh
.dwFlags
= PSH_PROPTITLE
| PSH_USEICONID
| PSH_USECALLBACK
;
1848 psh
.hwndParent
= hwnd
;
1849 psh
.hInstance
= hApplet
;
1850 psh
.pszIcon
= MAKEINTRESOURCEW(IDC_CPLICON_1
);
1851 psh
.pszCaption
= Caption
;
1854 psh
.pfnCallback
= PropSheetProc
;
1856 /* Load additional pages provided by shell extensions */
1857 hpsxa
= SHCreatePropSheetExtArray(HKEY_LOCAL_MACHINE
, REGSTR_PATH_CONTROLSFOLDER
TEXT("\\Mouse"), MAX_CPL_PAGES
- psh
.nPages
);
1859 for (i
= 0; i
!= sizeof(PropPages
) / sizeof(PropPages
[0]); i
++)
1861 /* Override the background page if requested by a shell extension */
1862 if (PropPages
[i
].uiReplaceWith
!= 0 && hpsxa
!= NULL
&&
1863 SHReplaceFromPropSheetExtArray(hpsxa
, PropPages
[i
].uiReplaceWith
, PropSheetAddPage
, (LPARAM
)&psh
) != 0)
1865 /* The shell extension added one or more pages to replace a page.
1866 Don't create the built-in page anymore! */
1870 InitPropSheetPage(&psh
, PropPages
[i
].idDlg
, PropPages
[i
].DlgProc
);
1874 SHAddFromPropSheetExtArray(hpsxa
, PropSheetAddPage
, (LPARAM
)&psh
);
1876 ret
= (LONG
)(PropertySheet(&psh
) != -1);
1879 SHDestroyPropSheetExtArray(hpsxa
);