3 * Copyright (C) 2004 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
29 //detect slider changes - for apply stuff
30 //implement Double-Click Speed measuring
31 // cursor icon shows - may need overriden items
32 // implement Pointer-APPLY
33 // implement Pointer-Browser
35 // Options- pointer precision
49 #define DEFAULT_DOUBLE_CLICK_SPEED 500
50 #define DEFAULT_CLICK_LOCK_TIME 2200
51 #define DEFAULT_MOUSE_SENSITIVITY 16
52 #define DEFAULT_MOUSE_THRESHOLD1 6
53 #define DEFAULT_MOUSE_THRESHOLD2 10
54 #define MIN_DOUBLE_CLICK_SPEED 200
55 #define MAX_DOUBLE_CLICK_SPEED 900
56 #define DEFAULT_WHEEL_SCROLL_LINES 3
58 ULONG g_Initialized
= 0;
60 UINT g_WheelScrollLines
= 5;
61 ULONG g_SwapMouseButtons
= 0;
62 ULONG g_DoubleClickSpeed
= DEFAULT_DOUBLE_CLICK_SPEED
;
63 BOOL g_ClickLockEnabled
= 0;
64 BOOL g_DropShadow
= 0;
66 DWORD g_ClickLockTime
= DEFAULT_CLICK_LOCK_TIME
;
67 ULONG g_MouseSensitivity
= DEFAULT_MOUSE_SENSITIVITY
;
68 ULONG g_MouseSpeed
= 1;
69 ULONG g_MouseThreshold1
= DEFAULT_MOUSE_THRESHOLD1
;
70 ULONG g_MouseThreshold2
= DEFAULT_MOUSE_THRESHOLD2
;
71 ULONG g_SnapToDefaultButton
= 0;
72 ULONG g_MouseTrails
= 0;
73 ULONG g_ShowPointer
= 0;
74 ULONG g_HidePointer
= 0;
75 ULONG g_ApplyCount
= 0;
78 TCHAR g_CurrentScheme
[MAX_PATH
];
79 TCHAR g_szArrow
[MAX_PATH
];
80 TCHAR g_szHelp
[MAX_PATH
];
81 TCHAR g_szAppStarting
[MAX_PATH
];
82 TCHAR g_szWait
[MAX_PATH
];
83 TCHAR g_szCrosshair
[MAX_PATH
];
84 TCHAR g_szIBeam
[MAX_PATH
];
85 TCHAR g_szNWPen
[MAX_PATH
];
86 TCHAR g_szNo
[MAX_PATH
];
87 TCHAR g_szSizeNS
[MAX_PATH
];
88 TCHAR g_szSizeWE
[MAX_PATH
];
89 TCHAR g_szSizeNWSE
[MAX_PATH
];
90 TCHAR g_szSizeNESW
[MAX_PATH
];
91 TCHAR g_szSizeAll
[MAX_PATH
];
92 TCHAR g_szUpArrow
[MAX_PATH
];
93 TCHAR g_szHand
[MAX_PATH
];
95 TCHAR g_szNewScheme
[MAX_PATH
];
97 /* Property page dialog callback */
98 static INT_PTR CALLBACK
99 MouseHardwareProc(IN HWND hwndDlg
,
105 Guids
[0] = GUID_DEVCLASS_MOUSE
;
111 /* create the hardware page */
112 DeviceCreateHardwarePageEx(hwndDlg
,
114 sizeof(Guids
) / sizeof(Guids
[0]),
124 BOOL
InitializeMouse()
127 SystemParametersInfo(SPI_GETMOUSETRAILS
, 0, &g_MouseTrails
, 0);
129 /* snap to default button */
130 SystemParametersInfo(SPI_GETSNAPTODEFBUTTON
, 0, &g_SnapToDefaultButton
, 0);
132 /* wheel scroll lines */
133 SystemParametersInfo(SPI_GETWHEELSCROLLLINES
, 0, &g_WheelScrollLines
, 0);
135 #if (WINVER >= 0x0500)
140 /* mouse sensitivity */
141 SystemParametersInfo(SPI_GETMOUSESPEED
, 0, &g_MouseSensitivity
, 0);
143 /* hide pointer while typing */
144 SystemParametersInfo(SPI_GETMOUSEVANISH
, 0, &g_HidePointer
, 0);
146 /* click lock time */
147 SystemParametersInfo(SPI_GETMOUSECLICKLOCK
, 0, &g_ClickLockEnabled
, 0);
148 SystemParametersInfo(SPI_GETMOUSECLICKLOCKTIME
, 0, &g_ClickLockTime
, 0);
150 g_DoubleClickSpeed
= GetDoubleClickTime();
151 g_SwapMouseButtons
= GetSystemMetrics(SM_SWAPBUTTON
);
154 /* show pointer with Ctrl-Key */
155 SystemParametersInfo(SPI_GETMOUSESONAR
, 0, &g_ShowPointer
, 0);
162 static INT_PTR CALLBACK
163 ClickLockProc(IN HWND hwndDlg
,
174 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
175 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 10));
176 pos
= (g_ClickLockTime
-200) / 200;
177 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pos
);
182 if (LOWORD(wParam
) == IDOK
)
184 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
185 g_ClickLockTime
= (SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) * 200) + 200;
186 EndDialog(hwndDlg
, TRUE
);
188 else if (LOWORD(wParam
) == IDCANCEL
)
190 EndDialog(hwndDlg
, FALSE
);
198 static INT_PTR CALLBACK
199 ButtonProc(IN HWND hwndDlg
,
213 if (InitializeMouse())
215 if (g_SwapMouseButtons
)
217 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SWAP_MOUSE_BUTTONS
);
218 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
220 if (g_ClickLockEnabled
)
222 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_CLICK_LOCK
);
223 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
227 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
228 EnableWindow(hDlgCtrl
, FALSE
);
230 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
);
231 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 11));
232 pos
= ((float)g_DoubleClickSpeed
/ MAX_DOUBLE_CLICK_SPEED
);
234 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)(INT
)rintf(pos
));
242 switch(LOWORD(wParam
))
244 case IDC_SWAP_MOUSE_BUTTONS
:
246 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
247 if (lResult
== BST_CHECKED
)
249 g_SwapMouseButtons
= FALSE
;
250 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
252 else if (lResult
== BST_UNCHECKED
)
254 g_SwapMouseButtons
= TRUE
;
255 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
259 case IDC_CHECK_CLICK_LOCK
:
261 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
262 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
263 if (lResult
== BST_CHECKED
)
265 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
266 g_ClickLockEnabled
= FALSE
;
267 EnableWindow(hDlgCtrl
, FALSE
);
269 else if (lResult
== BST_UNCHECKED
)
271 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
272 EnableWindow(hDlgCtrl
, TRUE
);
273 g_ClickLockEnabled
= TRUE
;
277 case IDC_BUTTON_CLICK_LOCK
:
279 lResult
= DialogBox(hApplet
, MAKEINTRESOURCE(IDD_CLICK_LOCK
), hwndDlg
, ClickLockProc
);
280 if ((INT
)lResult
== FALSE
)
281 return FALSE
; // no need to enable apply button
285 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
290 lppsn
= (LPPSHNOTIFY
) lParam
;
291 if (lppsn
->hdr
.code
== PSN_APPLY
)
293 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, g_SwapMouseButtons
, NULL
, SPIF_SENDCHANGE
);
294 SystemParametersInfo(SPI_SETDOUBLECLICKTIME
, g_DoubleClickSpeed
, NULL
, SPIF_SENDCHANGE
);
296 #if (WINVER >= 0x0500)
297 SystemParametersInfo(SPI_SETMOUSECLICKLOCK
, g_ClickLockEnabled
, NULL
, SPIF_SENDCHANGE
);
298 if (g_ClickLockEnabled
)
299 SystemParametersInfo(SPI_SETMOUSECLICKLOCKTIME
, g_ClickLockTime
, NULL
, SPIF_SENDCHANGE
);
301 SetWindowLong(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
308 LPDRAWITEMSTRUCT drawItem
;
309 drawItem
= (LPDRAWITEMSTRUCT
)lParam
;
310 if(drawItem
->CtlID
== IDC_IMAGE_SWAP_MOUSE
)
313 //show mouse with left/right button highlighted
314 // depending on val g_SwapMouseButtons
317 else if (drawItem
->CtlID
== IDC_IMAGE_DOUBLE_CLICK_SPEED
)
320 //measure click speed && draw item
328 BOOL
ReadActiveCursorScheme()
333 TCHAR szValueName
[MAX_PATH
];
335 TCHAR szValueData
[2000];
339 if (RegOpenCurrentUser(KEY_READ
, &hCuKey
) != ERROR_SUCCESS
)
342 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors"), 0, KEY_READ
, &hCuCursorKey
) != ERROR_SUCCESS
)
348 memset(g_szArrow
, 0x0, sizeof(g_szArrow
));
349 memset(g_szHelp
, 0x0, sizeof(g_szHelp
));
350 memset(g_szAppStarting
, 0x0, sizeof(g_szAppStarting
));
351 memset(g_szWait
, 0x0, sizeof(g_szWait
));
352 memset(g_szCrosshair
, 0x0, sizeof(g_szCrosshair
));
353 memset(g_szIBeam
, 0x0, sizeof(g_szIBeam
));
354 memset(g_szNWPen
, 0x0, sizeof(g_szNWPen
));
355 memset(g_szNo
, 0x0, sizeof(g_szNo
));
356 memset(g_szSizeNS
, 0x0, sizeof(g_szSizeNS
));
357 memset(g_szSizeWE
, 0x0, sizeof(g_szSizeWE
));
358 memset(g_szSizeNWSE
, 0x0, sizeof(g_szSizeNWSE
));
359 memset(g_szSizeNESW
, 0x0, sizeof(g_szSizeNESW
));
360 memset(g_szSizeAll
, 0x0, sizeof(g_szSizeAll
));
361 memset(g_szUpArrow
, 0x0, sizeof(g_szUpArrow
));
362 memset(g_szHand
, 0x0, sizeof(g_szHand
));
367 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
368 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
369 dwResult
= RegEnumValue(hCuCursorKey
, dwIndex
, szValueName
, &dwValueName
, NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
371 if (dwResult
== ERROR_NO_MORE_ITEMS
)
374 if (_tcsicmp(_T("Arrow"), szValueName
))
375 _tcsncpy(g_szArrow
, szValueData
, MAX_PATH
);
376 else if (_tcsicmp(_T("Help"), szValueName
))
377 _tcsncpy(g_szHelp
, szValueData
, MAX_PATH
);
378 else if (_tcsicmp(_T("AppStarting"), szValueName
))
379 _tcsncpy(g_szAppStarting
, szValueData
, MAX_PATH
);
380 else if (_tcsicmp(_T("Wait"), szValueName
))
381 _tcsncpy(g_szWait
, szValueData
, MAX_PATH
);
382 else if (_tcsicmp(_T("Crosshair"), szValueName
))
383 _tcsncpy(g_szCrosshair
, szValueData
, MAX_PATH
);
384 else if (_tcsicmp(_T("IBeam"), szValueName
))
385 _tcsncpy(g_szIBeam
, szValueData
, MAX_PATH
);
386 else if (_tcsicmp(_T("NWPen"), szValueName
))
387 _tcsncpy(g_szNWPen
, szValueData
, MAX_PATH
);
388 else if (_tcscmp(_T("No"), szValueName
))
389 _tcsncpy(g_szNo
, szValueData
, MAX_PATH
);
390 else if (_tcsicmp(_T("SizeNS"), szValueName
))
391 _tcsncpy(g_szSizeNS
, szValueData
, MAX_PATH
);
392 else if (_tcsicmp(_T("SizeWE"), szValueName
))
393 _tcsncpy(g_szSizeWE
, szValueData
, MAX_PATH
);
394 else if (_tcsicmp(_T("SizeNWSE"), szValueName
))
395 _tcsncpy(g_szSizeNWSE
, szValueData
, MAX_PATH
);
396 else if (_tcsicmp(_T("SizeNESW"), szValueName
))
397 _tcsncpy(g_szSizeNESW
, szValueData
, MAX_PATH
);
398 else if (_tcsicmp(_T("SizeAll"), szValueName
))
399 _tcsncpy(g_szSizeAll
, szValueData
, MAX_PATH
);
400 else if (_tcsicmp(_T("UpArrow"), szValueName
))
401 _tcsncpy(g_szUpArrow
, szValueData
, MAX_PATH
);
402 else if (_tcsicmp(_T("Hand"), szValueName
))
403 _tcsncpy(g_szHand
, szValueData
, MAX_PATH
);
408 RegCloseKey(hCuCursorKey
);
414 BOOL
EnumerateCursorSchemes(HWND hwndDlg
)
419 TCHAR szValueName
[MAX_PATH
];
421 TCHAR szSystemScheme
[MAX_PATH
];
422 TCHAR szValueData
[2000];
427 BOOL ProcessedHKLM
= FALSE
;
429 if (RegOpenCurrentUser(KEY_READ
, &hCuKey
) != ERROR_SUCCESS
)
433 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
, &hCuCursorKey
) != ERROR_SUCCESS
)
439 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
440 SendMessage(hDlgCtrl
, CB_RESETCONTENT
, 0, 0);
445 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
446 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
447 dwResult
= RegEnumValue(hCuCursorKey
, dwIndex
, szValueName
, &dwValueName
, NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
449 if (dwResult
== ERROR_NO_MORE_ITEMS
)
453 RegCloseKey(hCuCursorKey
);
454 dwResult
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
455 _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cursors\\Schemes"),
456 0, KEY_READ
, &hCuCursorKey
);
457 if (dwResult
== ERROR_SUCCESS
)
460 ProcessedHKLM
= TRUE
;
461 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
467 if(_tcslen(szValueData
) > 0)
469 TCHAR
* copy
= _tcsdup(szValueData
);
471 _tcscat(szValueName
, szSystemScheme
);
472 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szValueName
);
473 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)copy
);
479 RegCloseKey(hCuCursorKey
);
482 LoadString(hApplet
, IDS_NONE
, szSystemScheme
, MAX_PATH
);
483 SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szSystemScheme
);
484 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)0, (LPARAM
)0);
490 void RefreshCursorList(HWND hwndDlg
)
492 TCHAR szCursorName
[MAX_PATH
];
498 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_LISTVIEW_CURSOR
);
499 (void)ListView_DeleteAllItems(hDlgCtrl
);
501 ZeroMemory(&column
, sizeof(LV_COLUMN
));
502 column
.mask
= LVCF_SUBITEM
| LVCF_WIDTH
;
506 (void)ListView_InsertColumn(hDlgCtrl
, 0, &column
);
509 LoadString(hApplet
, IDS_ARROW
, szCursorName
, MAX_PATH
);
511 ZeroMemory(&listItem
, sizeof(LV_ITEM
));
512 listItem
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_STATE
| LVIF_IMAGE
;
513 listItem
.pszText
= szCursorName
;
515 listItem
.iImage
= -1;
516 listItem
.iItem
= index
++;
519 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
521 LoadString(hApplet
, IDS_HELP
, szCursorName
, MAX_PATH
);
522 listItem
.iItem
= index
++;
523 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
525 LoadString(hApplet
, IDS_APPSTARTING
, szCursorName
, MAX_PATH
);
526 listItem
.iItem
= index
++;
527 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
529 LoadString(hApplet
, IDS_WAIT
, szCursorName
, MAX_PATH
);
530 listItem
.iItem
= index
++;
531 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
533 LoadString(hApplet
, IDS_CROSSHAIR
, szCursorName
, MAX_PATH
);
534 listItem
.iItem
= index
++;
535 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
537 LoadString(hApplet
, IDS_IBEAM
, szCursorName
, MAX_PATH
);
538 listItem
.iItem
= index
++;
539 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
541 LoadString(hApplet
, IDS_NWPEN
, szCursorName
, MAX_PATH
);
542 listItem
.iItem
= index
++;
543 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
545 LoadString(hApplet
, IDS_NO
, szCursorName
, MAX_PATH
);
546 listItem
.iItem
= index
++;
547 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
549 LoadString(hApplet
, IDS_SIZENS
, szCursorName
, MAX_PATH
);
550 listItem
.iItem
= index
++;
551 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
554 LoadString(hApplet
, IDS_SIZENWSE
, szCursorName
, MAX_PATH
);
555 listItem
.iItem
= index
++;
556 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
558 LoadString(hApplet
, IDS_SIZENESW
, szCursorName
, MAX_PATH
);
559 listItem
.iItem
= index
++;
560 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
562 LoadString(hApplet
, IDS_SIZEALL
, szCursorName
, MAX_PATH
);
563 listItem
.iItem
= index
++;
564 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
566 LoadString(hApplet
, IDS_UPARROW
, szCursorName
, MAX_PATH
);
567 listItem
.iItem
= index
++;
568 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
570 LoadString(hApplet
, IDS_HAND
, szCursorName
, MAX_PATH
);
571 listItem
.iItem
= index
++;
572 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
575 BOOL
DeleteUserCursorScheme(TCHAR
* szScheme
)
580 if (RegOpenCurrentUser(KEY_READ
| KEY_SET_VALUE
, &hCuKey
) != ERROR_SUCCESS
)
584 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
| KEY_SET_VALUE
, &hCuCursorKey
) != ERROR_SUCCESS
)
589 Result
= RegDeleteValue(hCuCursorKey
, szScheme
);
591 RegCloseKey(hCuCursorKey
);
593 return (Result
== ERROR_SUCCESS
);
596 static INT_PTR CALLBACK
597 SaveSchemeProc(IN HWND hwndDlg
,
608 if (LOWORD(wParam
) == IDOK
)
610 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_SCHEME_NAME
);
611 SendMessage(hDlgCtrl
, WM_GETTEXT
, (WPARAM
)MAX_PATH
, (LPARAM
)g_szNewScheme
);
612 EndDialog(hwndDlg
, TRUE
);
614 else if (LOWORD(wParam
) == IDCANCEL
)
616 EndDialog(hwndDlg
, FALSE
);
624 BOOL
BrowseCursor(TCHAR
* szFileName
, HWND hwndDlg
)
626 //FIXME load text resources from string
628 static TCHAR szFilter
[] = _T("Cursors\0*.ani;*.cur\0Animated Cursors\0*.ani\0Static Cursors\0*.cur\0All Files\0*.*\0\0");
630 ZeroMemory(&ofn
, sizeof(OPENFILENAME
));
632 ofn
.lStructSize
= sizeof(OPENFILENAME
);
633 ofn
.hwndOwner
= hwndDlg
;
634 ofn
.lpstrFilter
= szFilter
;
635 ofn
.nFilterIndex
= 1;
636 ofn
.lpstrFile
= szFileName
;
637 ofn
.nMaxFile
= MAX_PATH
;
638 ofn
.lpstrInitialDir
= _T("%WINDIR%\\Cursors");
639 ofn
.lpstrTitle
= _T("Browse");
640 ofn
.Flags
= OFN_EXPLORER
| OFN_FILEMUSTEXIST
;
642 if (GetOpenFileName(&ofn
))
649 static INT_PTR CALLBACK
650 PointerProc(IN HWND hwndDlg
,
656 TCHAR buffer
[MAX_PATH
];
657 TCHAR szSystemScheme
[MAX_PATH
];
667 EnumerateCursorSchemes(hwndDlg
);
668 RefreshCursorList(hwndDlg
);
669 #if (WINVER >= 0x0500)
671 SystemParametersInfo(SPI_GETDROPSHADOW
, 0, &g_DropShadow
, 0);
674 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_DROP_SHADOW
);
675 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
678 if ((INT
)wParam
== IDC_LISTVIEW_CURSOR
)
685 lppsn
= (LPPSHNOTIFY
) lParam
;
686 if (lppsn
->hdr
.code
== PSN_APPLY
)
688 #if (WINVER >= 0x0500)
689 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)g_DropShadow
, SPIF_SENDCHANGE
);
691 SetWindowLong(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
698 switch(HIWORD(wParam
))
703 wParam
= SendMessage((HWND
)lParam
, CB_GETCURSEL
, 0, 0);
706 SendMessage((HWND
)lParam
, CB_GETLBTEXT
, wParam
, (LPARAM
)buffer
);
707 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
708 if(_tcsstr(buffer
, szSystemScheme
) || wParam
== 0) //avoid the default scheme can be deleted
714 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
);
715 EnableWindow(hDlgCtrl
, bEnable
);
721 switch(LOWORD(wParam
))
723 case IDC_BUTTON_SAVEAS_SCHEME
:
725 if(DialogBox(hApplet
, MAKEINTRESOURCE(IDD_CURSOR_SCHEME_SAVEAS
), hwndDlg
, SaveSchemeProc
))
733 case IDC_BUTTON_USE_DEFAULT_CURSOR
:
735 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_LISTVIEW_CURSOR
);
736 lResult
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
737 if (lResult
!= CB_ERR
)
739 if ((INT
)lResult
== 0)
740 memset(g_szArrow
, 0x0, MAX_PATH
* sizeof(TCHAR
));
741 else if ((INT
)lResult
== 1)
742 memset(g_szHelp
, 0x0, MAX_PATH
* sizeof(TCHAR
));
743 else if ((INT
)lResult
== 2)
744 memset(g_szAppStarting
, 0x0, MAX_PATH
* sizeof(TCHAR
));
745 else if ((INT
)lResult
== 3)
746 memset(g_szWait
, 0x0, MAX_PATH
* sizeof(TCHAR
));
747 else if ((INT
)lResult
== 4)
748 memset(g_szCrosshair
, 0x0, MAX_PATH
* sizeof(TCHAR
));
749 else if ((INT
)lResult
== 5)
750 memset(g_szIBeam
, 0x0, MAX_PATH
* sizeof(TCHAR
));
751 else if ((INT
)lResult
== 6)
752 memset(g_szNWPen
, 0x0, MAX_PATH
* sizeof(TCHAR
));
753 else if ((INT
)lResult
== 7)
754 memset(g_szNo
, 0x0, MAX_PATH
* sizeof(TCHAR
));
755 else if ((INT
)lResult
== 8)
756 memset(g_szSizeNS
, 0x0, MAX_PATH
* sizeof(TCHAR
));
757 else if ((INT
)lResult
== 9)
758 memset(g_szSizeWE
,0x0, MAX_PATH
* sizeof(TCHAR
));
759 else if ((INT
)lResult
== 10)
760 memset(g_szSizeNWSE
, 0x0, MAX_PATH
* sizeof(TCHAR
));
761 else if ((INT
)lResult
== 11)
762 memset(g_szSizeNESW
, 0x0, MAX_PATH
* sizeof(TCHAR
));
763 else if ((INT
)lResult
== 12)
764 memset(g_szSizeAll
, 0x0, MAX_PATH
* sizeof(TCHAR
));
765 else if ((INT
)lResult
== 13)
766 memset(g_szUpArrow
, 0x0, MAX_PATH
* sizeof(TCHAR
));
767 else if ((INT
)lResult
== 14)
768 memset(g_szHand
, 0x0, MAX_PATH
* sizeof(TCHAR
));
772 case IDC_BUTTON_BROWSE_CURSOR
:
774 memset(buffer
, 0x0, sizeof(buffer
));
775 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_LISTVIEW_CURSOR
);
776 lResult
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
777 if (lResult
== CB_ERR
)
778 MessageBox(hwndDlg
, _T("CB_ERR"), _T(""),MB_ICONERROR
);
779 if (BrowseCursor(buffer
, hwndDlg
))
782 if ((INT
)lResult
== 0)
783 _tcsncpy(g_szArrow
, buffer
, MAX_PATH
);
784 else if ((INT
)lResult
== 1)
785 _tcsncpy(g_szHelp
, buffer
, MAX_PATH
);
786 else if ((INT
)lResult
== 2)
787 _tcsncpy(g_szAppStarting
, buffer
, MAX_PATH
);
788 else if ((INT
)lResult
== 3)
789 _tcsncpy(g_szWait
, buffer
, MAX_PATH
);
790 else if ((INT
)lResult
== 4)
791 _tcsncpy(g_szCrosshair
, buffer
, MAX_PATH
);
792 else if ((INT
)lResult
== 5)
793 _tcsncpy(g_szIBeam
, buffer
, MAX_PATH
);
794 else if ((INT
)lResult
== 6)
795 _tcsncpy(g_szNWPen
, buffer
, MAX_PATH
);
796 else if ((INT
)lResult
== 7)
797 _tcsncpy(g_szNo
, buffer
, MAX_PATH
);
798 else if ((INT
)lResult
== 8)
799 _tcsncpy(g_szSizeNS
, buffer
, MAX_PATH
);
800 else if ((INT
)lResult
== 9)
801 _tcsncpy(g_szSizeWE
, buffer
, MAX_PATH
);
802 else if ((INT
)lResult
== 10)
803 _tcsncpy(g_szSizeNWSE
, buffer
, MAX_PATH
);
804 else if ((INT
)lResult
== 11)
805 _tcsncpy(g_szSizeNESW
, buffer
, MAX_PATH
);
806 else if ((INT
)lResult
== 12)
807 _tcsncpy(g_szSizeAll
, buffer
, MAX_PATH
);
808 else if ((INT
)lResult
== 13)
809 _tcsncpy(g_szUpArrow
, buffer
, MAX_PATH
);
810 else if ((INT
)lResult
== 14)
811 _tcsncpy(g_szHand
, buffer
, MAX_PATH
);
816 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
);
817 memDC
= GetDC(hDlgCtrl
);
818 hCursor
= (HCURSOR
) LoadImage(NULL
, buffer
, IMAGE_CURSOR
, 0, 0, LR_LOADFROMFILE
| LR_SHARED
);
821 DrawIcon(memDC
, 10, 10, (HICON
)hCursor
);
822 DestroyCursor(hCursor
);
824 ReleaseDC(hDlgCtrl
, memDC
);
828 case IDC_BUTTON_DELETE_SCHEME
:
830 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
831 wParam
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
834 SendMessage(hDlgCtrl
, CB_GETLBTEXT
, wParam
, (LPARAM
)buffer
);
835 if (DeleteUserCursorScheme(buffer
))
837 SendMessage(hDlgCtrl
, CB_DELETESTRING
, wParam
, 0);
838 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)0, (LPARAM
)0);
842 case IDC_CHECK_DROP_SHADOW
:
844 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_DROP_SHADOW
))
847 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
852 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
864 static INT_PTR CALLBACK
865 OptionProc(IN HWND hwndDlg
,
878 if (InitializeMouse())
880 /* set mouse sensitivity */
881 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
);
882 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 19));
883 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)g_MouseSensitivity
-1);
887 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_POINTER_PRECISION
);
888 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
891 if (g_SnapToDefaultButton
)
893 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SNAP_TO
);
894 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
897 /* set mouse trail */
898 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
899 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 5));
901 EnableWindow(hDlgCtrl
, FALSE
);
903 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)g_MouseTrails
-2);
907 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SHOW_POINTER
);
908 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
913 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_HIDE_POINTER
);
914 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
923 switch(LOWORD(wParam
))
925 case IDC_CHECK_POINTER_PRECISION
:
927 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_PRECISION
))
930 g_MouseThreshold1
= 0;
931 g_MouseThreshold2
= 0;
932 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
937 g_MouseThreshold1
= 6;
938 g_MouseThreshold2
= 10;
939 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
943 case IDC_CHECK_SNAP_TO
:
945 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SNAP_TO
))
947 g_SnapToDefaultButton
= 0;
948 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
952 g_SnapToDefaultButton
= 1;
953 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
957 case IDC_CHECK_POINTER_TRAIL
:
959 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
960 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_TRAIL
))
963 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
964 EnableWindow(hDlgCtrl
, FALSE
);
968 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
969 EnableWindow(hDlgCtrl
, TRUE
);
970 g_MouseTrails
= SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 2;
974 case IDC_CHECK_SHOW_POINTER
:
976 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SHOW_POINTER
))
979 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
984 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
988 case IDC_CHECK_HIDE_POINTER
:
990 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_HIDE_POINTER
))
993 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
998 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1003 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1008 lppsn
= (LPPSHNOTIFY
) lParam
;
1009 if (lppsn
->hdr
.code
== PSN_APPLY
)
1011 /* set snap to default button */
1012 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, g_SnapToDefaultButton
, 0, SPIF_SENDCHANGE
);
1014 /* set mouse trails */
1015 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_TRAIL
))
1017 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1018 lResult
= SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0);
1023 SystemParametersInfo(SPI_SETMOUSETRAILS
, lResult
, 0, SPIF_SENDCHANGE
);
1025 #if (WINVER >= 0x0500)
1030 /* calc pos and set mouse sensitivity */
1031 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
);
1032 lResult
= SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 1;
1033 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)g_MouseSensitivity
, SPIF_SENDCHANGE
);
1036 /* hide pointer while typing */
1037 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, (PVOID
)g_HidePointer
, SPIF_SENDCHANGE
);
1039 /* show pointer with Ctrl-Key */
1040 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, (PVOID
)g_ShowPointer
, SPIF_SENDCHANGE
);
1043 SetWindowLong(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
1053 static void ShowDialogWheelControls(HWND hwndDlg
)
1057 if (g_WheelScrollLines
!= -1)
1059 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1060 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1062 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1063 EnableWindow(hDlgCtrl
, TRUE
);
1065 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1066 EnableWindow(hDlgCtrl
, TRUE
);
1068 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1069 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1073 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1074 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1076 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1077 EnableWindow(hDlgCtrl
, FALSE
);
1079 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1080 EnableWindow(hDlgCtrl
, TRUE
);
1082 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1083 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1088 static INT_PTR CALLBACK
1089 WheelProc(IN HWND hwndDlg
,
1095 WCHAR buffer
[MAX_PATH
];
1102 ShowDialogWheelControls(hwndDlg
);
1103 if (g_WheelScrollLines
!= UINT_MAX
)
1105 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1106 wsprintf(buffer
, _T("%d"), g_WheelScrollLines
);
1107 SendMessage(hDlgCtrl
, WM_SETTEXT
, (WPARAM
)0, (LPARAM
)buffer
);
1113 switch(LOWORD(wParam
))
1115 case IDC_RADIO_WHEEL_SCROLL_LINES
:
1117 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1118 SendMessageW(hDlgCtrl
, WM_GETTEXT
, (WPARAM
)100, (LPARAM
)buffer
);
1119 g_WheelScrollLines
= _wtoi(buffer
);
1120 ShowDialogWheelControls(hwndDlg
);
1123 case IDC_RADIO_WHEEL_SCROLL_PAGE
:
1125 g_WheelScrollLines
= -1;
1126 ShowDialogWheelControls(hwndDlg
);
1130 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1135 lppsn
= (LPPSHNOTIFY
) lParam
;
1136 if (lppsn
->hdr
.code
== PSN_APPLY
)
1138 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1139 SendMessageW(hDlgCtrl
, WM_GETTEXT
, (WPARAM
)MAX_PATH
, (LPARAM
)buffer
);
1140 g_WheelScrollLines
= _wtoi(buffer
);
1141 SystemParametersInfo(SPI_SETWHEELSCROLLLINES
, g_WheelScrollLines
, 0, SPIF_SENDCHANGE
);
1143 SetWindowLong(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
1155 MouseApplet(HWND hwnd
, UINT uMsg
, LONG lParam1
, LONG lParam2
)
1157 PROPSHEETPAGE psp
[5];
1158 PROPSHEETHEADER psh
;
1161 LoadString(hApplet
, IDS_CPLNAME_1
, Caption
, sizeof(Caption
) / sizeof(TCHAR
));
1163 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
1164 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
1165 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
1166 psh
.hwndParent
= NULL
;
1167 psh
.hInstance
= hApplet
;
1168 psh
.hIcon
= LoadIcon(hApplet
, MAKEINTRESOURCE(IDC_CPLICON_1
));
1169 psh
.pszCaption
= Caption
;
1170 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
1174 InitPropSheetPage(&psp
[0], IDD_PAGE_BUTTON
, ButtonProc
);
1175 InitPropSheetPage(&psp
[1], IDD_PAGE_POINTER
, PointerProc
);
1176 InitPropSheetPage(&psp
[2], IDD_PAGE_OPTION
, OptionProc
);
1177 InitPropSheetPage(&psp
[3], IDD_PAGE_WHEEL
, WheelProc
);
1178 InitPropSheetPage(&psp
[4], IDD_HARDWARE
, MouseHardwareProc
);
1179 return (LONG
)(PropertySheet(&psh
) != -1);