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
29 //detect slider changes - for apply stuff
30 // cursor icon shows - may need overriden items
31 // implement Pointer-APPLY
32 // implement Pointer-Browser
34 // Options- pointer precision
50 #define DEFAULT_DOUBLE_CLICK_SPEED 500
51 #define DEFAULT_CLICK_LOCK_TIME 2200
52 #define DEFAULT_MOUSE_SENSITIVITY 16
53 #define DEFAULT_MOUSE_THRESHOLD1 6
54 #define DEFAULT_MOUSE_THRESHOLD2 10
55 #define MIN_DOUBLE_CLICK_SPEED 200
56 #define MAX_DOUBLE_CLICK_SPEED 900
57 #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 _OPTION_DATA
80 ULONG ulMouseSensitivity
;
81 ULONG ulOrigMouseSensitivity
;
83 ULONG ulMouseSpeed
; // = 1;
84 ULONG ulMouseThreshold1
; // = DEFAULT_MOUSE_THRESHOLD1;
85 ULONG ulMouseThreshold2
; // = DEFAULT_MOUSE_THRESHOLD2;
87 ULONG ulSnapToDefaultButton
; // = 0;
91 ULONG ulShowPointer
; // = 0;
92 ULONG ulHidePointer
; // = 0;
94 } OPTION_DATA
, *POPTION_DATA
;
97 typedef struct _WHEEL_DATA
99 UINT uWheelScrollLines
;
100 } WHEEL_DATA
, *PWHEEL_DATA
;
103 ULONG g_Initialized
= 0;
105 BOOL g_DropShadow
= 0;
107 ULONG g_ApplyCount
= 0;
110 TCHAR g_CurrentScheme
[MAX_PATH
];
111 TCHAR g_szArrow
[MAX_PATH
];
112 TCHAR g_szHelp
[MAX_PATH
];
113 TCHAR g_szAppStarting
[MAX_PATH
];
114 TCHAR g_szWait
[MAX_PATH
];
115 TCHAR g_szCrosshair
[MAX_PATH
];
116 TCHAR g_szIBeam
[MAX_PATH
];
117 TCHAR g_szNWPen
[MAX_PATH
];
118 TCHAR g_szNo
[MAX_PATH
];
119 TCHAR g_szSizeNS
[MAX_PATH
];
120 TCHAR g_szSizeWE
[MAX_PATH
];
121 TCHAR g_szSizeNWSE
[MAX_PATH
];
122 TCHAR g_szSizeNESW
[MAX_PATH
];
123 TCHAR g_szSizeAll
[MAX_PATH
];
124 TCHAR g_szUpArrow
[MAX_PATH
];
125 TCHAR g_szHand
[MAX_PATH
];
127 TCHAR g_szNewScheme
[MAX_PATH
];
130 /* Property page dialog callback */
131 static INT_PTR CALLBACK
132 MouseHardwareProc(IN HWND hwndDlg
,
138 Guids
[0] = GUID_DEVCLASS_MOUSE
;
140 UNREFERENCED_PARAMETER(lParam
);
141 UNREFERENCED_PARAMETER(wParam
);
146 /* create the hardware page */
147 DeviceCreateHardwarePageEx(hwndDlg
,
149 sizeof(Guids
) / sizeof(Guids
[0]),
158 static INT_PTR CALLBACK
159 ClickLockProc(IN HWND hwndDlg
,
167 PBUTTON_DATA pButtonData
;
169 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
174 pButtonData
= (PBUTTON_DATA
)lParam
;
175 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
177 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
178 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 10));
179 pos
= (pButtonData
->g_ClickLockTime
- 200) / 200;
180 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pos
);
184 if (LOWORD(wParam
) == IDOK
)
186 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
187 pButtonData
->g_ClickLockTime
= (DWORD
) (SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) * 200) + 200;
188 EndDialog(hwndDlg
, TRUE
);
190 else if (LOWORD(wParam
) == IDCANCEL
)
192 EndDialog(hwndDlg
, FALSE
);
201 static INT_PTR CALLBACK
202 ButtonProc(IN HWND hwndDlg
,
211 PBUTTON_DATA pButtonData
;
213 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
218 pButtonData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(BUTTON_DATA
));
219 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
221 pButtonData
->g_SwapMouseButtons
= GetSystemMetrics(SM_SWAPBUTTON
);
222 pButtonData
->g_OrigSwapMouseButtons
= pButtonData
->g_SwapMouseButtons
;
223 pButtonData
->g_DoubleClickSpeed
= GetDoubleClickTime();
224 pButtonData
->g_OrigDoubleClickSpeed
= pButtonData
->g_DoubleClickSpeed
;
226 /* Click lock time */
227 SystemParametersInfo(SPI_GETMOUSECLICKLOCK
, 0, &pButtonData
->g_ClickLockEnabled
, 0);
228 SystemParametersInfo(SPI_GETMOUSECLICKLOCKTIME
, 0, &pButtonData
->g_ClickLockTime
, 0);
230 /* Load mouse button icons */
231 pButtonData
->hButtonLeft
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_LEFT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
232 pButtonData
->hButtonRight
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_RIGHT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
234 /* Load folder icons */
235 pButtonData
->hIcon1
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_CLOSED
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
236 pButtonData
->hIcon2
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_OPEN
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
238 if (pButtonData
->g_SwapMouseButtons
)
240 SendDlgItemMessage(hwndDlg
, IDC_SWAP_MOUSE_BUTTONS
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
241 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
245 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
248 if (pButtonData
->g_ClickLockEnabled
)
250 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_CLICK_LOCK
);
251 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
255 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
256 EnableWindow(hDlgCtrl
, FALSE
);
259 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
);
260 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 14));
261 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, 14 - ((pButtonData
->g_DoubleClickSpeed
- 200) / 50));
264 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hIcon1
);
265 pButtonData
->bClicked
= TRUE
;
269 DestroyIcon(pButtonData
->hButtonLeft
);
270 DestroyIcon(pButtonData
->hButtonRight
);
271 DestroyIcon(pButtonData
->hIcon1
);
272 DestroyIcon(pButtonData
->hIcon2
);
273 HeapFree(GetProcessHeap(), 0, pButtonData
);
277 switch(LOWORD(wParam
))
279 case IDC_SWAP_MOUSE_BUTTONS
:
280 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
281 if (lResult
== BST_CHECKED
)
283 pButtonData
->g_SwapMouseButtons
= FALSE
;
284 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
285 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
287 else if (lResult
== BST_UNCHECKED
)
289 pButtonData
->g_SwapMouseButtons
= TRUE
;
290 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
291 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
293 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_SwapMouseButtons
, NULL
, SPIF_SENDCHANGE
);
294 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
297 case IDC_CHECK_CLICK_LOCK
:
298 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
299 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
300 if (lResult
== BST_CHECKED
)
302 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
303 pButtonData
->g_ClickLockEnabled
= FALSE
;
304 EnableWindow(hDlgCtrl
, FALSE
);
306 else if (lResult
== BST_UNCHECKED
)
308 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
309 EnableWindow(hDlgCtrl
, TRUE
);
310 pButtonData
->g_ClickLockEnabled
= TRUE
;
312 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
315 case IDC_BUTTON_CLICK_LOCK
:
316 DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_CLICK_LOCK
), hwndDlg
, ClickLockProc
, (LPARAM
)pButtonData
);
319 case IDC_IMAGE_DOUBLE_CLICK_SPEED
:
320 if (HIWORD(wParam
) == STN_DBLCLK
)
322 pButtonData
->bClicked
= !pButtonData
->bClicked
;
323 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
,
324 (LPARAM
)(pButtonData
->bClicked
? pButtonData
->hIcon1
: pButtonData
->hIcon2
));
331 lppsn
= (LPPSHNOTIFY
) lParam
;
332 if (lppsn
->hdr
.code
== PSN_APPLY
)
334 #if (WINVER >= 0x0500)
335 SystemParametersInfo(SPI_SETMOUSECLICKLOCK
, pButtonData
->g_ClickLockEnabled
, NULL
, SPIF_SENDCHANGE
);
336 if (pButtonData
->g_ClickLockEnabled
)
337 SystemParametersInfo(SPI_SETMOUSECLICKLOCKTIME
, pButtonData
->g_ClickLockTime
, NULL
, SPIF_SENDCHANGE
);
339 SetWindowLong(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
341 else if (lppsn
->hdr
.code
== PSN_RESET
)
343 /* Reset swap mouse button setting */
344 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_OrigSwapMouseButtons
, NULL
, SPIF_SENDCHANGE
);
346 /* Reset double click speed setting */
347 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_OrigDoubleClickSpeed, NULL, SPIF_SENDCHANGE);
348 SetDoubleClickTime(pButtonData
->g_OrigDoubleClickSpeed
);
353 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
))
355 switch (LOWORD(wParam
))
364 lResult
= SendDlgItemMessage(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
, TBM_GETPOS
, 0, 0);
365 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)lResult
) * 50 + 200;
366 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, SPIF_SENDCHANGE);
367 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
368 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
372 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)HIWORD(wParam
)) * 50 + 200;
373 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, SPIF_SENDCHANGE);
374 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
375 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
388 ReadActiveCursorScheme(VOID
)
393 TCHAR szValueName
[MAX_PATH
];
395 TCHAR szValueData
[2000];
399 if (RegOpenCurrentUser(KEY_READ
, &hCuKey
) != ERROR_SUCCESS
)
402 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors"), 0, KEY_READ
, &hCuCursorKey
) != ERROR_SUCCESS
)
408 memset(g_szArrow
, 0x0, sizeof(g_szArrow
));
409 memset(g_szHelp
, 0x0, sizeof(g_szHelp
));
410 memset(g_szAppStarting
, 0x0, sizeof(g_szAppStarting
));
411 memset(g_szWait
, 0x0, sizeof(g_szWait
));
412 memset(g_szCrosshair
, 0x0, sizeof(g_szCrosshair
));
413 memset(g_szIBeam
, 0x0, sizeof(g_szIBeam
));
414 memset(g_szNWPen
, 0x0, sizeof(g_szNWPen
));
415 memset(g_szNo
, 0x0, sizeof(g_szNo
));
416 memset(g_szSizeNS
, 0x0, sizeof(g_szSizeNS
));
417 memset(g_szSizeWE
, 0x0, sizeof(g_szSizeWE
));
418 memset(g_szSizeNWSE
, 0x0, sizeof(g_szSizeNWSE
));
419 memset(g_szSizeNESW
, 0x0, sizeof(g_szSizeNESW
));
420 memset(g_szSizeAll
, 0x0, sizeof(g_szSizeAll
));
421 memset(g_szUpArrow
, 0x0, sizeof(g_szUpArrow
));
422 memset(g_szHand
, 0x0, sizeof(g_szHand
));
427 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
428 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
429 dwResult
= RegEnumValue(hCuCursorKey
, dwIndex
, szValueName
, &dwValueName
, NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
430 if (dwResult
== ERROR_NO_MORE_ITEMS
)
433 if (_tcsicmp(_T("Arrow"), szValueName
))
434 _tcsncpy(g_szArrow
, szValueData
, MAX_PATH
);
435 else if (_tcsicmp(_T("Help"), szValueName
))
436 _tcsncpy(g_szHelp
, szValueData
, MAX_PATH
);
437 else if (_tcsicmp(_T("AppStarting"), szValueName
))
438 _tcsncpy(g_szAppStarting
, szValueData
, MAX_PATH
);
439 else if (_tcsicmp(_T("Wait"), szValueName
))
440 _tcsncpy(g_szWait
, szValueData
, MAX_PATH
);
441 else if (_tcsicmp(_T("Crosshair"), szValueName
))
442 _tcsncpy(g_szCrosshair
, szValueData
, MAX_PATH
);
443 else if (_tcsicmp(_T("IBeam"), szValueName
))
444 _tcsncpy(g_szIBeam
, szValueData
, MAX_PATH
);
445 else if (_tcsicmp(_T("NWPen"), szValueName
))
446 _tcsncpy(g_szNWPen
, szValueData
, MAX_PATH
);
447 else if (_tcscmp(_T("No"), szValueName
))
448 _tcsncpy(g_szNo
, szValueData
, MAX_PATH
);
449 else if (_tcsicmp(_T("SizeNS"), szValueName
))
450 _tcsncpy(g_szSizeNS
, szValueData
, MAX_PATH
);
451 else if (_tcsicmp(_T("SizeWE"), szValueName
))
452 _tcsncpy(g_szSizeWE
, szValueData
, MAX_PATH
);
453 else if (_tcsicmp(_T("SizeNWSE"), szValueName
))
454 _tcsncpy(g_szSizeNWSE
, szValueData
, MAX_PATH
);
455 else if (_tcsicmp(_T("SizeNESW"), szValueName
))
456 _tcsncpy(g_szSizeNESW
, szValueData
, MAX_PATH
);
457 else if (_tcsicmp(_T("SizeAll"), szValueName
))
458 _tcsncpy(g_szSizeAll
, szValueData
, MAX_PATH
);
459 else if (_tcsicmp(_T("UpArrow"), szValueName
))
460 _tcsncpy(g_szUpArrow
, szValueData
, MAX_PATH
);
461 else if (_tcsicmp(_T("Hand"), szValueName
))
462 _tcsncpy(g_szHand
, szValueData
, MAX_PATH
);
467 RegCloseKey(hCuCursorKey
);
476 EnumerateCursorSchemes(HWND hwndDlg
)
481 TCHAR szValueName
[MAX_PATH
];
483 TCHAR szSystemScheme
[MAX_PATH
];
484 TCHAR szValueData
[2000];
489 BOOL ProcessedHKLM
= FALSE
;
491 if (RegOpenCurrentUser(KEY_READ
, &hCuKey
) != ERROR_SUCCESS
)
494 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
, &hCuCursorKey
) != ERROR_SUCCESS
)
500 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
501 SendMessage(hDlgCtrl
, CB_RESETCONTENT
, 0, 0);
506 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
507 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
508 dwResult
= RegEnumValue(hCuCursorKey
, dwIndex
, szValueName
, &dwValueName
, NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
510 if (dwResult
== ERROR_NO_MORE_ITEMS
)
514 RegCloseKey(hCuCursorKey
);
515 dwResult
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
516 _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cursors\\Schemes"),
517 0, KEY_READ
, &hCuCursorKey
);
518 if (dwResult
== ERROR_SUCCESS
)
521 ProcessedHKLM
= TRUE
;
522 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
529 if(_tcslen(szValueData
) > 0)
531 TCHAR
* copy
= _tcsdup(szValueData
);
534 _tcscat(szValueName
, TEXT(" "));
535 _tcscat(szValueName
, szSystemScheme
);
537 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szValueName
);
538 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)copy
);
544 RegCloseKey(hCuCursorKey
);
547 LoadString(hApplet
, IDS_NONE
, szSystemScheme
, MAX_PATH
);
548 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szSystemScheme
);
549 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)NULL
);
550 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)0, (LPARAM
)0);
557 RefreshCursorList(HWND hwndDlg
)
559 TCHAR szCursorName
[MAX_PATH
];
565 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_LISTVIEW_CURSOR
);
566 (void)ListView_DeleteAllItems(hDlgCtrl
);
568 ZeroMemory(&column
, sizeof(LV_COLUMN
));
569 column
.mask
= LVCF_SUBITEM
| LVCF_WIDTH
;
573 (void)ListView_InsertColumn(hDlgCtrl
, 0, &column
);
575 LoadString(hApplet
, IDS_ARROW
, szCursorName
, MAX_PATH
);
577 ZeroMemory(&listItem
, sizeof(LV_ITEM
));
578 listItem
.mask
= LVIF_TEXT
| LVIF_PARAM
| LVIF_STATE
| LVIF_IMAGE
;
579 listItem
.pszText
= szCursorName
;
581 listItem
.iImage
= -1;
582 listItem
.iItem
= index
++;
585 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
587 LoadString(hApplet
, IDS_HELP
, szCursorName
, MAX_PATH
);
588 listItem
.iItem
= index
++;
589 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
591 LoadString(hApplet
, IDS_APPSTARTING
, szCursorName
, MAX_PATH
);
592 listItem
.iItem
= index
++;
593 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
595 LoadString(hApplet
, IDS_WAIT
, szCursorName
, MAX_PATH
);
596 listItem
.iItem
= index
++;
597 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
599 LoadString(hApplet
, IDS_CROSSHAIR
, szCursorName
, MAX_PATH
);
600 listItem
.iItem
= index
++;
601 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
603 LoadString(hApplet
, IDS_IBEAM
, szCursorName
, MAX_PATH
);
604 listItem
.iItem
= index
++;
605 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
607 LoadString(hApplet
, IDS_NWPEN
, szCursorName
, MAX_PATH
);
608 listItem
.iItem
= index
++;
609 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
611 LoadString(hApplet
, IDS_NO
, szCursorName
, MAX_PATH
);
612 listItem
.iItem
= index
++;
613 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
615 LoadString(hApplet
, IDS_SIZENS
, szCursorName
, MAX_PATH
);
616 listItem
.iItem
= index
++;
617 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
620 LoadString(hApplet
, IDS_SIZENWSE
, szCursorName
, MAX_PATH
);
621 listItem
.iItem
= index
++;
622 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
624 LoadString(hApplet
, IDS_SIZENESW
, szCursorName
, MAX_PATH
);
625 listItem
.iItem
= index
++;
626 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
628 LoadString(hApplet
, IDS_SIZEALL
, szCursorName
, MAX_PATH
);
629 listItem
.iItem
= index
++;
630 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
632 LoadString(hApplet
, IDS_UPARROW
, szCursorName
, MAX_PATH
);
633 listItem
.iItem
= index
++;
634 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
636 LoadString(hApplet
, IDS_HAND
, szCursorName
, MAX_PATH
);
637 listItem
.iItem
= index
++;
638 (void)ListView_InsertItem(hDlgCtrl
, &listItem
);
643 DeleteUserCursorScheme(TCHAR
* szScheme
)
649 if (RegOpenCurrentUser(KEY_READ
| KEY_SET_VALUE
, &hCuKey
) != ERROR_SUCCESS
)
652 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
| KEY_SET_VALUE
, &hCuCursorKey
) != ERROR_SUCCESS
)
658 Result
= RegDeleteValue(hCuCursorKey
, szScheme
);
660 RegCloseKey(hCuCursorKey
);
663 return (Result
== ERROR_SUCCESS
);
667 static INT_PTR CALLBACK
668 SaveSchemeProc(IN HWND hwndDlg
,
674 UNREFERENCED_PARAMETER(lParam
);
679 if (LOWORD(wParam
) == IDOK
)
681 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_SCHEME_NAME
);
682 SendMessage(hDlgCtrl
, WM_GETTEXT
, (WPARAM
)MAX_PATH
, (LPARAM
)g_szNewScheme
);
683 EndDialog(hwndDlg
, TRUE
);
685 else if (LOWORD(wParam
) == IDCANCEL
)
687 EndDialog(hwndDlg
, FALSE
);
697 BrowseCursor(TCHAR
* szFileName
, HWND hwndDlg
)
699 //FIXME load text resources from string
701 static TCHAR szFilter
[] = _T("Cursors\0*.ani;*.cur\0Animated Cursors\0*.ani\0Static Cursors\0*.cur\0All Files\0*.*\0\0");
703 ZeroMemory(&ofn
, sizeof(OPENFILENAME
));
705 ofn
.lStructSize
= sizeof(OPENFILENAME
);
706 ofn
.hwndOwner
= hwndDlg
;
707 ofn
.lpstrFilter
= szFilter
;
708 ofn
.nFilterIndex
= 1;
709 ofn
.lpstrFile
= szFileName
;
710 ofn
.nMaxFile
= MAX_PATH
;
711 ofn
.lpstrInitialDir
= _T("%WINDIR%\\Cursors");
712 ofn
.lpstrTitle
= _T("Browse");
713 ofn
.Flags
= OFN_EXPLORER
| OFN_FILEMUSTEXIST
;
715 if (GetOpenFileName(&ofn
))
723 LoadCurrentCursorScheme(LPTSTR lpName
, BOOL bSystem
)
730 LPTSTR ptrStart
, ptrEnd
;
736 memset(g_szArrow
, 0x0, sizeof(g_szArrow
));
737 memset(g_szHelp
, 0x0, sizeof(g_szHelp
));
738 memset(g_szAppStarting
, 0x0, sizeof(g_szAppStarting
));
739 memset(g_szWait
, 0x0, sizeof(g_szWait
));
740 memset(g_szCrosshair
, 0x0, sizeof(g_szCrosshair
));
741 memset(g_szIBeam
, 0x0, sizeof(g_szIBeam
));
742 memset(g_szNWPen
, 0x0, sizeof(g_szNWPen
));
743 memset(g_szNo
, 0x0, sizeof(g_szNo
));
744 memset(g_szSizeNS
, 0x0, sizeof(g_szSizeNS
));
745 memset(g_szSizeWE
, 0x0, sizeof(g_szSizeWE
));
746 memset(g_szSizeNWSE
, 0x0, sizeof(g_szSizeNWSE
));
747 memset(g_szSizeNESW
, 0x0, sizeof(g_szSizeNESW
));
748 memset(g_szSizeAll
, 0x0, sizeof(g_szSizeAll
));
749 memset(g_szUpArrow
, 0x0, sizeof(g_szUpArrow
));
750 memset(g_szHand
, 0x0, sizeof(g_szHand
));
756 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
757 _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cursors\\Schemes"),
758 0, KEY_READ
, &hCursorKey
))
763 if (RegOpenKeyEx(HKEY_CURRENT_USER
,
764 _T("Control Panel\\Cursors\\Schemes"),
765 0, KEY_READ
, &hCursorKey
) != ERROR_SUCCESS
)
769 dwValueLen
= 2048 * sizeof(TCHAR
);
770 lError
= RegQueryValueEx(hCursorKey
, lpName
, NULL
, NULL
, (LPBYTE
)szValue
, &dwValueLen
);
772 RegCloseKey(hCursorKey
);
774 if (lError
== ERROR_SUCCESS
)
779 ptrEnd
= _tcschr(ptrStart
, TEXT(','));
782 len
= (ptrEnd
- ptrStart
) / sizeof(TCHAR
);
783 _tcsncpy(szRaw
, ptrStart
, len
);
788 _tcscpy(szRaw
, ptrStart
);
794 ExpandEnvironmentStrings(szRaw
, g_szArrow
, MAX_PATH
);
804 ptrStart
= ptrEnd
+ 1;
811 static INT_PTR CALLBACK
812 PointerProc(IN HWND hwndDlg
,
818 TCHAR buffer
[MAX_PATH
];
819 TCHAR szSystemScheme
[MAX_PATH
];
828 EnumerateCursorSchemes(hwndDlg
);
829 RefreshCursorList(hwndDlg
);
831 SystemParametersInfo(SPI_GETDROPSHADOW
, 0, &g_DropShadow
, 0);
834 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_DROP_SHADOW
);
835 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
837 if ((INT
)wParam
== IDC_LISTVIEW_CURSOR
)
843 lppsn
= (LPPSHNOTIFY
) lParam
;
844 if (lppsn
->hdr
.code
== PSN_APPLY
)
846 #if (WINVER >= 0x0500)
847 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)g_DropShadow
, SPIF_SENDCHANGE
);
849 SetWindowLong(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
855 switch(HIWORD(wParam
))
862 wParam
= SendMessage((HWND
)lParam
, CB_GETCURSEL
, 0, 0);
865 SendMessage((HWND
)lParam
, CB_GETLBTEXT
, wParam
, (LPARAM
)buffer
);
866 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
867 if(_tcsstr(buffer
, szSystemScheme
) || wParam
== 0) //avoid the default scheme can be deleted
873 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
);
874 EnableWindow(hDlgCtrl
, bEnable
);
876 lpName
= (LPTSTR
)SendMessage((HWND
)lParam
, CB_GETITEMDATA
, wParam
, 0);
877 LoadCurrentCursorScheme(lpName
, !bEnable
);
882 switch (LOWORD(wParam
))
884 case IDC_BUTTON_SAVEAS_SCHEME
:
885 if (DialogBox(hApplet
, MAKEINTRESOURCE(IDD_CURSOR_SCHEME_SAVEAS
), hwndDlg
, SaveSchemeProc
))
892 case IDC_BUTTON_USE_DEFAULT_CURSOR
:
893 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_LISTVIEW_CURSOR
);
894 lResult
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
895 if (lResult
!= CB_ERR
)
897 if ((INT
)lResult
== 0)
898 memset(g_szArrow
, 0x0, MAX_PATH
* sizeof(TCHAR
));
899 else if ((INT
)lResult
== 1)
900 memset(g_szHelp
, 0x0, MAX_PATH
* sizeof(TCHAR
));
901 else if ((INT
)lResult
== 2)
902 memset(g_szAppStarting
, 0x0, MAX_PATH
* sizeof(TCHAR
));
903 else if ((INT
)lResult
== 3)
904 memset(g_szWait
, 0x0, MAX_PATH
* sizeof(TCHAR
));
905 else if ((INT
)lResult
== 4)
906 memset(g_szCrosshair
, 0x0, MAX_PATH
* sizeof(TCHAR
));
907 else if ((INT
)lResult
== 5)
908 memset(g_szIBeam
, 0x0, MAX_PATH
* sizeof(TCHAR
));
909 else if ((INT
)lResult
== 6)
910 memset(g_szNWPen
, 0x0, MAX_PATH
* sizeof(TCHAR
));
911 else if ((INT
)lResult
== 7)
912 memset(g_szNo
, 0x0, MAX_PATH
* sizeof(TCHAR
));
913 else if ((INT
)lResult
== 8)
914 memset(g_szSizeNS
, 0x0, MAX_PATH
* sizeof(TCHAR
));
915 else if ((INT
)lResult
== 9)
916 memset(g_szSizeWE
,0x0, MAX_PATH
* sizeof(TCHAR
));
917 else if ((INT
)lResult
== 10)
918 memset(g_szSizeNWSE
, 0x0, MAX_PATH
* sizeof(TCHAR
));
919 else if ((INT
)lResult
== 11)
920 memset(g_szSizeNESW
, 0x0, MAX_PATH
* sizeof(TCHAR
));
921 else if ((INT
)lResult
== 12)
922 memset(g_szSizeAll
, 0x0, MAX_PATH
* sizeof(TCHAR
));
923 else if ((INT
)lResult
== 13)
924 memset(g_szUpArrow
, 0x0, MAX_PATH
* sizeof(TCHAR
));
925 else if ((INT
)lResult
== 14)
926 memset(g_szHand
, 0x0, MAX_PATH
* sizeof(TCHAR
));
930 case IDC_BUTTON_BROWSE_CURSOR
:
931 memset(buffer
, 0x0, sizeof(buffer
));
932 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_LISTVIEW_CURSOR
);
933 lResult
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
934 if (lResult
== CB_ERR
)
935 MessageBox(hwndDlg
, _T("CB_ERR"), _T(""),MB_ICONERROR
);
936 if (BrowseCursor(buffer
, hwndDlg
))
938 if ((INT
)lResult
== 0)
939 _tcsncpy(g_szArrow
, buffer
, MAX_PATH
);
940 else if ((INT
)lResult
== 1)
941 _tcsncpy(g_szHelp
, buffer
, MAX_PATH
);
942 else if ((INT
)lResult
== 2)
943 _tcsncpy(g_szAppStarting
, buffer
, MAX_PATH
);
944 else if ((INT
)lResult
== 3)
945 _tcsncpy(g_szWait
, buffer
, MAX_PATH
);
946 else if ((INT
)lResult
== 4)
947 _tcsncpy(g_szCrosshair
, buffer
, MAX_PATH
);
948 else if ((INT
)lResult
== 5)
949 _tcsncpy(g_szIBeam
, buffer
, MAX_PATH
);
950 else if ((INT
)lResult
== 6)
951 _tcsncpy(g_szNWPen
, buffer
, MAX_PATH
);
952 else if ((INT
)lResult
== 7)
953 _tcsncpy(g_szNo
, buffer
, MAX_PATH
);
954 else if ((INT
)lResult
== 8)
955 _tcsncpy(g_szSizeNS
, buffer
, MAX_PATH
);
956 else if ((INT
)lResult
== 9)
957 _tcsncpy(g_szSizeWE
, buffer
, MAX_PATH
);
958 else if ((INT
)lResult
== 10)
959 _tcsncpy(g_szSizeNWSE
, buffer
, MAX_PATH
);
960 else if ((INT
)lResult
== 11)
961 _tcsncpy(g_szSizeNESW
, buffer
, MAX_PATH
);
962 else if ((INT
)lResult
== 12)
963 _tcsncpy(g_szSizeAll
, buffer
, MAX_PATH
);
964 else if ((INT
)lResult
== 13)
965 _tcsncpy(g_szUpArrow
, buffer
, MAX_PATH
);
966 else if ((INT
)lResult
== 14)
967 _tcsncpy(g_szHand
, buffer
, MAX_PATH
);
972 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
);
973 memDC
= GetDC(hDlgCtrl
);
974 hCursor
= (HCURSOR
) LoadImage(NULL
, buffer
, IMAGE_CURSOR
, 0, 0, LR_LOADFROMFILE
| LR_SHARED
);
977 DrawIcon(memDC
, 10, 10, (HICON
)hCursor
);
978 DestroyCursor(hCursor
);
980 ReleaseDC(hDlgCtrl
, memDC
);
984 case IDC_BUTTON_DELETE_SCHEME
:
985 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
986 wParam
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
989 SendMessage(hDlgCtrl
, CB_GETLBTEXT
, wParam
, (LPARAM
)buffer
);
990 if (DeleteUserCursorScheme(buffer
))
992 SendMessage(hDlgCtrl
, CB_DELETESTRING
, wParam
, 0);
993 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)0, (LPARAM
)0);
997 case IDC_CHECK_DROP_SHADOW
:
998 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_DROP_SHADOW
))
1001 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1006 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1017 InitializeMouse(POPTION_DATA pOptionData
)
1023 /* Get mouse sensitivity */
1024 if (!SystemParametersInfo(SPI_GETMOUSESPEED
, 0, &pOptionData
->ulMouseSensitivity
, 0))
1025 pOptionData
->ulMouseSensitivity
= DEFAULT_MOUSE_SENSITIVITY
;
1026 pOptionData
->ulOrigMouseSensitivity
= pOptionData
->ulMouseSensitivity
;
1028 pOptionData
->ulMouseSpeed
= 1;
1029 pOptionData
->ulMouseThreshold1
= DEFAULT_MOUSE_THRESHOLD1
;
1030 pOptionData
->ulMouseThreshold2
= DEFAULT_MOUSE_THRESHOLD2
;
1032 /* snap to default button */
1033 if (SystemParametersInfo(SPI_GETSNAPTODEFBUTTON
, 0, &pOptionData
->ulSnapToDefaultButton
, 0))
1034 pOptionData
->ulSnapToDefaultButton
= 0;
1037 if (!SystemParametersInfo(SPI_GETMOUSETRAILS
, 0, &pOptionData
->uMouseTrails
, 0))
1038 pOptionData
->uMouseTrails
= 0;
1040 /* hide pointer while typing */
1041 if (!SystemParametersInfo(SPI_GETMOUSEVANISH
, 0, &pOptionData
->ulHidePointer
, 0))
1042 pOptionData
->ulHidePointer
= 0;
1044 /* show pointer with Ctrl-Key */
1045 if (!SystemParametersInfo(SPI_GETMOUSESONAR
, 0, &pOptionData
->ulShowPointer
, 0))
1046 pOptionData
->ulShowPointer
= 0;
1052 static INT_PTR CALLBACK
1053 OptionProc(IN HWND hwndDlg
,
1061 POPTION_DATA pOptionData
;
1063 pOptionData
= (POPTION_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1068 pOptionData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(OPTION_DATA
));
1069 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pOptionData
);
1071 InitializeMouse(pOptionData
);
1073 /* set mouse sensitivity */
1074 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
);
1075 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 19));
1076 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->ulMouseSensitivity
- 1);
1078 if (pOptionData
->ulMouseSpeed
)
1080 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_POINTER_PRECISION
);
1081 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1084 if (pOptionData
->ulSnapToDefaultButton
)
1086 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SNAP_TO
);
1087 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1090 /* set mouse trail */
1091 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1092 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 5));
1093 if (pOptionData
->uMouseTrails
< 2)
1094 EnableWindow(hDlgCtrl
, FALSE
);
1096 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->uMouseTrails
- 2);
1098 if (pOptionData
->ulShowPointer
)
1100 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SHOW_POINTER
);
1101 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1104 if (pOptionData
->ulHidePointer
)
1106 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_HIDE_POINTER
);
1107 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1112 HeapFree(GetProcessHeap(), 0, pOptionData
);
1116 switch(LOWORD(wParam
))
1118 case IDC_CHECK_POINTER_PRECISION
:
1119 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_PRECISION
))
1121 pOptionData
->ulMouseSpeed
= 0;
1122 pOptionData
->ulMouseThreshold1
= 0;
1123 pOptionData
->ulMouseThreshold2
= 0;
1124 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1128 pOptionData
->ulMouseSpeed
= 1;
1129 pOptionData
->ulMouseThreshold1
= 6;
1130 pOptionData
->ulMouseThreshold2
= 10;
1131 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1135 case IDC_CHECK_SNAP_TO
:
1136 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SNAP_TO
))
1138 pOptionData
->ulSnapToDefaultButton
= 0;
1139 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1143 pOptionData
->ulSnapToDefaultButton
= 1;
1144 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1148 case IDC_CHECK_POINTER_TRAIL
:
1149 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1150 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_TRAIL
))
1152 pOptionData
->uMouseTrails
= 0;
1153 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1154 EnableWindow(hDlgCtrl
, FALSE
);
1158 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1159 EnableWindow(hDlgCtrl
, TRUE
);
1160 pOptionData
->uMouseTrails
= (ULONG
)SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 2;
1164 case IDC_CHECK_SHOW_POINTER
:
1165 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SHOW_POINTER
))
1167 pOptionData
->ulShowPointer
= 0;
1168 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1172 pOptionData
->ulShowPointer
= 1;
1173 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1177 case IDC_CHECK_HIDE_POINTER
:
1178 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_HIDE_POINTER
))
1180 pOptionData
->ulHidePointer
= 0;
1181 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1185 pOptionData
->ulHidePointer
= 1;
1186 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1190 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1194 lppsn
= (LPPSHNOTIFY
)lParam
;
1195 if (lppsn
->hdr
.code
== PSN_APPLY
)
1197 /* set snap to default button */
1198 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, pOptionData
->ulSnapToDefaultButton
, 0, SPIF_SENDCHANGE
);
1201 /* set mouse trails */
1202 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_TRAIL
))
1204 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1205 lResult
= SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 2;
1212 SystemParametersInfo(SPI_SETMOUSETRAILS
, (UINT
) lResult
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1219 /* calc pos and set mouse sensitivity */
1220 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
);
1221 lResult
= SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 1;
1222 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSensitivity
, SPIF_SENDCHANGE
);
1224 /* hide pointer while typing */
1225 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, (PVOID
)pOptionData
->ulHidePointer
, SPIF_SENDCHANGE
);
1227 /* show pointer with Ctrl-Key */
1228 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, (PVOID
)pOptionData
->ulShowPointer
, SPIF_SENDCHANGE
);
1230 SetWindowLong(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
1233 else if (lppsn
->hdr
.code
== PSN_RESET
)
1235 /* Set the original mouse speed */
1236 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulOrigMouseSensitivity
, SPIF_SENDCHANGE
);
1241 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
))
1243 switch (LOWORD(wParam
))
1252 pOptionData
->ulMouseSensitivity
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
, TBM_GETPOS
, 0, 0) + 1;
1253 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSensitivity
, SPIF_SENDCHANGE
);
1254 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1258 pOptionData
->ulMouseSensitivity
= (ULONG
)HIWORD(wParam
) + 1;
1259 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSensitivity
, SPIF_SENDCHANGE
);
1260 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1265 else if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
))
1267 switch (LOWORD(wParam
))
1276 pOptionData
->uMouseTrails
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
, TBM_GETPOS
, 0, 0) + 2;
1277 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1278 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1282 pOptionData
->uMouseTrails
= (ULONG
)HIWORD(wParam
) + 2;
1283 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->uMouseTrails
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1284 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1296 ShowDialogWheelControls(HWND hwndDlg
, UINT uWheelScrollLines
, BOOL bInit
)
1300 if (uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1302 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1303 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1305 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1306 EnableWindow(hDlgCtrl
, TRUE
);
1308 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1309 EnableWindow(hDlgCtrl
, TRUE
);
1311 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1312 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1316 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1317 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1319 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1320 EnableWindow(hDlgCtrl
, FALSE
);
1322 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1323 EnableWindow(hDlgCtrl
, FALSE
);
1325 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1326 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1328 /* Set the default scroll lines value */
1330 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, DEFAULT_WHEEL_SCROLL_LINES
, FALSE
);
1335 static INT_PTR CALLBACK
1336 WheelProc(IN HWND hwndDlg
,
1342 PWHEEL_DATA pWheelData
;
1344 pWheelData
= (PWHEEL_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1349 pWheelData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WHEEL_DATA
));
1350 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pWheelData
);
1352 /* Get wheel scroll lines */
1353 if (!SystemParametersInfo(SPI_GETWHEELSCROLLLINES
, 0, &pWheelData
->uWheelScrollLines
, 0))
1355 pWheelData
->uWheelScrollLines
= DEFAULT_WHEEL_SCROLL_LINES
;
1358 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, TRUE
);
1359 SendDlgItemMessage(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
, UDM_SETRANGE
, 0, MAKELONG((short)100, (short)0));
1360 if (pWheelData
->uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1362 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, pWheelData
->uWheelScrollLines
, FALSE
);
1367 HeapFree(GetProcessHeap(), 0, pWheelData
);
1371 switch (LOWORD(wParam
))
1373 case IDC_RADIO_WHEEL_SCROLL_LINES
:
1374 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1375 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1376 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1379 case IDC_RADIO_WHEEL_SCROLL_PAGE
:
1380 pWheelData
->uWheelScrollLines
= WHEEL_PAGESCROLL
;
1381 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1382 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1385 case IDC_EDIT_WHEEL_SCROLL_LINES
:
1386 if (pWheelData
&& HIWORD(wParam
) == EN_CHANGE
)
1388 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1389 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1396 lppsn
= (LPPSHNOTIFY
)lParam
;
1397 if (lppsn
->hdr
.code
== PSN_APPLY
)
1399 SystemParametersInfo(SPI_SETWHEELSCROLLLINES
, pWheelData
->uWheelScrollLines
,
1400 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1411 MouseApplet(HWND hwnd
, UINT uMsg
, LONG lParam1
, LONG lParam2
)
1413 PROPSHEETPAGE psp
[5];
1414 PROPSHEETHEADER psh
;
1417 UNREFERENCED_PARAMETER(lParam1
);
1418 UNREFERENCED_PARAMETER(lParam2
);
1419 UNREFERENCED_PARAMETER(uMsg
);
1420 UNREFERENCED_PARAMETER(hwnd
);
1422 LoadString(hApplet
, IDS_CPLNAME_1
, Caption
, sizeof(Caption
) / sizeof(TCHAR
));
1424 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
1425 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
1426 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
1427 psh
.hwndParent
= NULL
;
1428 psh
.hInstance
= hApplet
;
1429 psh
.hIcon
= LoadIcon(hApplet
, MAKEINTRESOURCE(IDC_CPLICON_1
));
1430 psh
.pszCaption
= Caption
;
1431 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
1435 InitPropSheetPage(&psp
[0], IDD_PAGE_BUTTON
, ButtonProc
);
1436 InitPropSheetPage(&psp
[1], IDD_PAGE_POINTER
, PointerProc
);
1437 InitPropSheetPage(&psp
[2], IDD_PAGE_OPTION
, OptionProc
);
1438 InitPropSheetPage(&psp
[3], IDD_PAGE_WHEEL
, WheelProc
);
1439 InitPropSheetPage(&psp
[4], IDD_HARDWARE
, MouseHardwareProc
);
1440 return (LONG
)(PropertySheet(&psh
) != -1);