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
52 #define DEFAULT_DOUBLE_CLICK_SPEED 500
53 #define DEFAULT_CLICK_LOCK_TIME 2200
54 #define DEFAULT_MOUSE_SENSITIVITY 16
55 #define DEFAULT_MOUSE_THRESHOLD1 6
56 #define DEFAULT_MOUSE_THRESHOLD2 10
57 #define MIN_DOUBLE_CLICK_SPEED 200
58 #define MAX_DOUBLE_CLICK_SPEED 900
59 #define DEFAULT_WHEEL_SCROLL_LINES 3
62 typedef struct _BUTTON_DATA
64 ULONG g_SwapMouseButtons
;
65 ULONG g_OrigSwapMouseButtons
;
66 ULONG g_DoubleClickSpeed
; // = DEFAULT_DOUBLE_CLICK_SPEED;
67 ULONG g_OrigDoubleClickSpeed
;
68 BOOL g_ClickLockEnabled
; // = 0;
69 DWORD g_ClickLockTime
; // = DEFAULT_CLICK_LOCK_TIME;
77 } BUTTON_DATA
, *PBUTTON_DATA
;
80 typedef struct _POINTER_DATA
85 } POINTER_DATA
, *PPOINTER_DATA
;
88 typedef struct _OPTION_DATA
90 ULONG ulMouseSensitivity
;
91 ULONG ulOrigMouseSensitivity
;
93 ULONG ulMouseSpeed
; // = 1;
94 ULONG ulMouseThreshold1
; // = DEFAULT_MOUSE_THRESHOLD1;
95 ULONG ulMouseThreshold2
; // = DEFAULT_MOUSE_THRESHOLD2;
97 ULONG ulSnapToDefaultButton
;
101 } OPTION_DATA
, *POPTION_DATA
;
104 typedef struct _WHEEL_DATA
106 UINT uWheelScrollLines
;
107 } WHEEL_DATA
, *PWHEEL_DATA
;
110 typedef struct _CURSOR_DATA
113 LPWSTR uDefaultCursorId
;
115 TCHAR szCursorName
[MAX_PATH
];
116 TCHAR szCursorPath
[MAX_PATH
];
117 } CURSOR_DATA
, *PCURSOR_DATA
;
120 CURSOR_DATA g_CursorData
[] =
121 {{IDS_ARROW
, IDC_ARROW
, 0, _T(""), _T("")},
122 {IDS_HELP
, IDC_HELP
, 0, _T(""), _T("")},
123 {IDS_APPSTARTING
, IDC_APPSTARTING
, 0, _T(""), _T("")},
124 {IDS_WAIT
, IDC_WAIT
, 0, _T(""), _T("")},
125 {IDS_CROSSHAIR
, IDC_CROSS
, 0, _T(""), _T("")},
126 {IDS_IBEAM
, IDC_IBEAM
, 0, _T(""), _T("")},
127 {IDS_NWPEN
, 0/*IDC_NWPEN*/, 0, _T(""), _T("")}, /* FIXME */
128 {IDS_NO
, IDC_NO
, 0, _T(""), _T("")},
129 {IDS_SIZENS
, IDC_SIZENS
, 0, _T(""), _T("")},
130 {IDS_SIZEWE
, IDC_SIZEWE
, 0, _T(""), _T("")},
131 {IDS_SIZENWSE
, IDC_SIZENWSE
, 0, _T(""), _T("")},
132 {IDS_SIZENESW
, IDC_SIZENESW
, 0, _T(""), _T("")},
133 {IDS_SIZEALL
, IDC_SIZEALL
, 0, _T(""), _T("")},
134 {IDS_UPARROW
, IDC_UPARROW
, 0, _T(""), _T("")},
135 {IDS_HAND
, IDC_HAND
, 0, _T(""), _T("")}};
138 TCHAR g_szNewScheme
[MAX_PATH
];
142 DebugMsg(LPTSTR fmt
, ...)
144 TCHAR szBuffer
[2048];
147 va_start(marker
, fmt
);
148 _vstprintf(szBuffer
, fmt
, marker
);
151 MessageBox(NULL
, szBuffer
, _T("Debug message"), MB_OK
);
156 /* Property page dialog callback */
157 static INT_PTR CALLBACK
158 MouseHardwareProc(IN HWND hwndDlg
,
164 Guids
[0] = GUID_DEVCLASS_MOUSE
;
166 UNREFERENCED_PARAMETER(lParam
);
167 UNREFERENCED_PARAMETER(wParam
);
172 /* create the hardware page */
173 DeviceCreateHardwarePageEx(hwndDlg
,
175 sizeof(Guids
) / sizeof(Guids
[0]),
184 static INT_PTR CALLBACK
185 ClickLockProc(IN HWND hwndDlg
,
193 PBUTTON_DATA pButtonData
;
195 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
200 pButtonData
= (PBUTTON_DATA
)lParam
;
201 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
203 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
204 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 10));
205 pos
= (pButtonData
->g_ClickLockTime
- 200) / 200;
206 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pos
);
210 if (LOWORD(wParam
) == IDOK
)
212 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_CLICK_LOCK
);
213 pButtonData
->g_ClickLockTime
= (DWORD
) (SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) * 200) + 200;
214 EndDialog(hwndDlg
, TRUE
);
216 else if (LOWORD(wParam
) == IDCANCEL
)
218 EndDialog(hwndDlg
, FALSE
);
227 static INT_PTR CALLBACK
228 ButtonProc(IN HWND hwndDlg
,
237 PBUTTON_DATA pButtonData
;
239 pButtonData
= (PBUTTON_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
244 pButtonData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(BUTTON_DATA
));
245 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pButtonData
);
247 pButtonData
->g_SwapMouseButtons
= GetSystemMetrics(SM_SWAPBUTTON
);
248 pButtonData
->g_OrigSwapMouseButtons
= pButtonData
->g_SwapMouseButtons
;
249 pButtonData
->g_DoubleClickSpeed
= GetDoubleClickTime();
250 pButtonData
->g_OrigDoubleClickSpeed
= pButtonData
->g_DoubleClickSpeed
;
252 /* Click lock time */
253 SystemParametersInfo(SPI_GETMOUSECLICKLOCK
, 0, &pButtonData
->g_ClickLockEnabled
, 0);
254 SystemParametersInfo(SPI_GETMOUSECLICKLOCKTIME
, 0, &pButtonData
->g_ClickLockTime
, 0);
256 /* Load mouse button icons */
257 pButtonData
->hButtonLeft
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_LEFT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
258 pButtonData
->hButtonRight
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_MOUSE_RIGHT
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
260 /* Load folder icons */
261 pButtonData
->hIcon1
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_CLOSED
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
262 pButtonData
->hIcon2
= LoadImage(hApplet
, MAKEINTRESOURCE(IDI_FOLDER_OPEN
), IMAGE_ICON
, 48, 48, LR_DEFAULTCOLOR
);
264 if (pButtonData
->g_SwapMouseButtons
)
266 SendDlgItemMessage(hwndDlg
, IDC_SWAP_MOUSE_BUTTONS
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
267 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
271 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
274 if (pButtonData
->g_ClickLockEnabled
)
276 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_CLICK_LOCK
);
277 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
281 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
282 EnableWindow(hDlgCtrl
, FALSE
);
285 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
);
286 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 14));
287 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, 14 - ((pButtonData
->g_DoubleClickSpeed
- 200) / 50));
290 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hIcon1
);
291 pButtonData
->bClicked
= TRUE
;
295 DestroyIcon(pButtonData
->hButtonLeft
);
296 DestroyIcon(pButtonData
->hButtonRight
);
297 DestroyIcon(pButtonData
->hIcon1
);
298 DestroyIcon(pButtonData
->hIcon2
);
299 HeapFree(GetProcessHeap(), 0, pButtonData
);
303 switch(LOWORD(wParam
))
305 case IDC_SWAP_MOUSE_BUTTONS
:
306 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
307 if (lResult
== BST_CHECKED
)
309 pButtonData
->g_SwapMouseButtons
= FALSE
;
310 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
311 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonLeft
);
313 else if (lResult
== BST_UNCHECKED
)
315 pButtonData
->g_SwapMouseButtons
= TRUE
;
316 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
317 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_SWAP_MOUSE
, STM_SETIMAGE
, IMAGE_ICON
, (LPARAM
)pButtonData
->hButtonRight
);
319 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_SwapMouseButtons
, NULL
, SPIF_SENDCHANGE
);
320 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
323 case IDC_CHECK_CLICK_LOCK
:
324 lResult
= SendMessage((HWND
)lParam
, BM_GETCHECK
, (WPARAM
)0, (LPARAM
)0);
325 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_CLICK_LOCK
);
326 if (lResult
== BST_CHECKED
)
328 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
329 pButtonData
->g_ClickLockEnabled
= FALSE
;
330 EnableWindow(hDlgCtrl
, FALSE
);
332 else if (lResult
== BST_UNCHECKED
)
334 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
335 EnableWindow(hDlgCtrl
, TRUE
);
336 pButtonData
->g_ClickLockEnabled
= TRUE
;
338 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
341 case IDC_BUTTON_CLICK_LOCK
:
342 DialogBoxParam(hApplet
, MAKEINTRESOURCE(IDD_CLICK_LOCK
), hwndDlg
, ClickLockProc
, (LPARAM
)pButtonData
);
345 case IDC_IMAGE_DOUBLE_CLICK_SPEED
:
346 if (HIWORD(wParam
) == STN_DBLCLK
)
348 pButtonData
->bClicked
= !pButtonData
->bClicked
;
349 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_DOUBLE_CLICK_SPEED
, STM_SETIMAGE
, IMAGE_ICON
,
350 (LPARAM
)(pButtonData
->bClicked
? pButtonData
->hIcon1
: pButtonData
->hIcon2
));
357 lppsn
= (LPPSHNOTIFY
) lParam
;
358 if (lppsn
->hdr
.code
== PSN_APPLY
)
360 #if (WINVER >= 0x0500)
361 SystemParametersInfo(SPI_SETMOUSECLICKLOCK
, pButtonData
->g_ClickLockEnabled
, NULL
, SPIF_SENDCHANGE
);
362 if (pButtonData
->g_ClickLockEnabled
)
363 SystemParametersInfo(SPI_SETMOUSECLICKLOCKTIME
, pButtonData
->g_ClickLockTime
, NULL
, SPIF_SENDCHANGE
);
365 SetWindowLong(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
367 else if (lppsn
->hdr
.code
== PSN_RESET
)
369 /* Reset swap mouse button setting */
370 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP
, pButtonData
->g_OrigSwapMouseButtons
, NULL
, SPIF_SENDCHANGE
);
372 /* Reset double click speed setting */
373 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_OrigDoubleClickSpeed, NULL, SPIF_SENDCHANGE);
374 SetDoubleClickTime(pButtonData
->g_OrigDoubleClickSpeed
);
379 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
))
381 switch (LOWORD(wParam
))
390 lResult
= SendDlgItemMessage(hwndDlg
, IDC_SLIDER_DOUBLE_CLICK_SPEED
, TBM_GETPOS
, 0, 0);
391 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)lResult
) * 50 + 200;
392 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, SPIF_SENDCHANGE);
393 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
394 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
398 pButtonData
->g_DoubleClickSpeed
= (14 - (INT
)HIWORD(wParam
)) * 50 + 200;
399 // SystemParametersInfo(SPI_SETDOUBLECLICKTIME, pButtonData->g_DoubleClickSpeed, NULL, SPIF_SENDCHANGE);
400 SetDoubleClickTime(pButtonData
->g_DoubleClickSpeed
);
401 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
414 ReadActiveCursorScheme(VOID
)
419 TCHAR szValueName
[MAX_PATH
];
421 TCHAR szValueData
[2000];
425 if (RegOpenCurrentUser(KEY_READ
, &hCuKey
) != ERROR_SUCCESS
)
428 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors"), 0, KEY_READ
, &hCuCursorKey
) != ERROR_SUCCESS
)
434 memset(g_szArrow
, 0x0, sizeof(g_szArrow
));
435 memset(g_szHelp
, 0x0, sizeof(g_szHelp
));
436 memset(g_szAppStarting
, 0x0, sizeof(g_szAppStarting
));
437 memset(g_szWait
, 0x0, sizeof(g_szWait
));
438 memset(g_szCrosshair
, 0x0, sizeof(g_szCrosshair
));
439 memset(g_szIBeam
, 0x0, sizeof(g_szIBeam
));
440 memset(g_szNWPen
, 0x0, sizeof(g_szNWPen
));
441 memset(g_szNo
, 0x0, sizeof(g_szNo
));
442 memset(g_szSizeNS
, 0x0, sizeof(g_szSizeNS
));
443 memset(g_szSizeWE
, 0x0, sizeof(g_szSizeWE
));
444 memset(g_szSizeNWSE
, 0x0, sizeof(g_szSizeNWSE
));
445 memset(g_szSizeNESW
, 0x0, sizeof(g_szSizeNESW
));
446 memset(g_szSizeAll
, 0x0, sizeof(g_szSizeAll
));
447 memset(g_szUpArrow
, 0x0, sizeof(g_szUpArrow
));
448 memset(g_szHand
, 0x0, sizeof(g_szHand
));
453 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
454 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
455 dwResult
= RegEnumValue(hCuCursorKey
, dwIndex
, szValueName
, &dwValueName
, NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
456 if (dwResult
== ERROR_NO_MORE_ITEMS
)
459 if (_tcsicmp(_T("Arrow"), szValueName
))
460 _tcsncpy(g_szArrow
, szValueData
, MAX_PATH
);
461 else if (_tcsicmp(_T("Help"), szValueName
))
462 _tcsncpy(g_szHelp
, szValueData
, MAX_PATH
);
463 else if (_tcsicmp(_T("AppStarting"), szValueName
))
464 _tcsncpy(g_szAppStarting
, szValueData
, MAX_PATH
);
465 else if (_tcsicmp(_T("Wait"), szValueName
))
466 _tcsncpy(g_szWait
, szValueData
, MAX_PATH
);
467 else if (_tcsicmp(_T("Crosshair"), szValueName
))
468 _tcsncpy(g_szCrosshair
, szValueData
, MAX_PATH
);
469 else if (_tcsicmp(_T("IBeam"), szValueName
))
470 _tcsncpy(g_szIBeam
, szValueData
, MAX_PATH
);
471 else if (_tcsicmp(_T("NWPen"), szValueName
))
472 _tcsncpy(g_szNWPen
, szValueData
, MAX_PATH
);
473 else if (_tcscmp(_T("No"), szValueName
))
474 _tcsncpy(g_szNo
, szValueData
, MAX_PATH
);
475 else if (_tcsicmp(_T("SizeNS"), szValueName
))
476 _tcsncpy(g_szSizeNS
, szValueData
, MAX_PATH
);
477 else if (_tcsicmp(_T("SizeWE"), szValueName
))
478 _tcsncpy(g_szSizeWE
, szValueData
, MAX_PATH
);
479 else if (_tcsicmp(_T("SizeNWSE"), szValueName
))
480 _tcsncpy(g_szSizeNWSE
, szValueData
, MAX_PATH
);
481 else if (_tcsicmp(_T("SizeNESW"), szValueName
))
482 _tcsncpy(g_szSizeNESW
, szValueData
, MAX_PATH
);
483 else if (_tcsicmp(_T("SizeAll"), szValueName
))
484 _tcsncpy(g_szSizeAll
, szValueData
, MAX_PATH
);
485 else if (_tcsicmp(_T("UpArrow"), szValueName
))
486 _tcsncpy(g_szUpArrow
, szValueData
, MAX_PATH
);
487 else if (_tcsicmp(_T("Hand"), szValueName
))
488 _tcsncpy(g_szHand
, szValueData
, MAX_PATH
);
493 RegCloseKey(hCuCursorKey
);
502 EnumerateCursorSchemes(HWND hwndDlg
)
507 TCHAR szValueName
[MAX_PATH
];
509 TCHAR szSystemScheme
[MAX_PATH
];
510 TCHAR szValueData
[2000];
515 BOOL ProcessedHKLM
= FALSE
;
516 TCHAR szCurrentScheme
[MAX_PATH
];
517 DWORD dwCurrentScheme
;
522 if (RegOpenCurrentUser(KEY_READ
, &hCuKey
) != ERROR_SUCCESS
)
525 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
, &hCuCursorKey
) != ERROR_SUCCESS
)
531 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
532 SendMessage(hDlgCtrl
, CB_RESETCONTENT
, 0, 0);
537 dwValueName
= sizeof(szValueName
) / sizeof(TCHAR
);
538 dwValueData
= sizeof(szValueData
) / sizeof(TCHAR
);
539 dwResult
= RegEnumValue(hCuCursorKey
, dwIndex
, szValueName
, &dwValueName
, NULL
, NULL
, (LPBYTE
)szValueData
, &dwValueData
);
541 if (dwResult
== ERROR_NO_MORE_ITEMS
)
545 RegCloseKey(hCuCursorKey
);
546 dwResult
= RegOpenKeyEx(HKEY_LOCAL_MACHINE
,
547 _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cursors\\Schemes"),
548 0, KEY_READ
, &hCuCursorKey
);
549 if (dwResult
== ERROR_SUCCESS
)
552 ProcessedHKLM
= TRUE
;
553 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
560 if (_tcslen(szValueData
) > 0)
562 TCHAR
* copy
= _tcsdup(szValueData
);
565 _tcscat(szValueName
, TEXT(" "));
566 _tcscat(szValueName
, szSystemScheme
);
568 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szValueName
);
569 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)copy
);
575 RegCloseKey(hCuCursorKey
);
578 /* Add the "(none)" entry */
579 LoadString(hApplet
, IDS_NONE
, szSystemScheme
, MAX_PATH
);
580 lResult
= SendMessage(hDlgCtrl
, CB_ADDSTRING
, (WPARAM
)0, (LPARAM
)szSystemScheme
);
581 SendMessage(hDlgCtrl
, CB_SETITEMDATA
, (WPARAM
)lResult
, (LPARAM
)NULL
);
584 /* Get the name of the current cursor scheme */
585 szCurrentScheme
[0] = 0;
586 if (RegOpenKeyEx(HKEY_CURRENT_USER
, _T("Control Panel\\Cursors"), 0, KEY_READ
, &hCuCursorKey
) == ERROR_SUCCESS
)
588 dwCurrentScheme
= sizeof(szCurrentScheme
) / sizeof(TCHAR
);
589 if (RegQueryValueEx(hCuCursorKey
, NULL
, NULL
, NULL
, (LPBYTE
)szCurrentScheme
, &dwCurrentScheme
))
590 szCurrentScheme
[0] = 0;
591 RegCloseKey(hCuCursorKey
);
594 /* Search for the matching entry in the cursor scheme list */
595 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
597 nCount
= (INT
)SendMessage(hDlgCtrl
, CB_GETCOUNT
, 0, 0);
598 for (i
= 0; i
< nCount
; i
++)
600 SendMessage(hDlgCtrl
, CB_GETLBTEXT
, i
, (LPARAM
)szValueName
);
602 p
= _tcsstr(szValueName
, szSystemScheme
);
609 // DebugMsg(_T("szCurrentScheme: \"%s\"\nszValueName: \"%s\""), szCurrentScheme, szValueName);
611 if (_tcscmp(szValueName
, szCurrentScheme
) == 0)
613 nSchemeIndex
= (INT
)i
;
618 /* Select the matching entry */
619 if (nSchemeIndex
!= -1)
620 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)nSchemeIndex
, (LPARAM
)0);
623 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)lResult
, (LPARAM
)0);
624 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
);
625 EnableWindow(hDlgCtrl
, FALSE
);
633 RefreshCursorList(HWND hwndDlg
, BOOL bInit
)
639 nSel
= bInit
? 0 : SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_GETCURSEL
, 0, 0);
641 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_RESETCONTENT
, 0, 0);
642 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
644 LoadString(hApplet
, index
, g_CursorData
[i
].szCursorName
, MAX_PATH
);
645 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_ADDSTRING
, 0, (LPARAM
)i
);
648 SendDlgItemMessage(hwndDlg
, IDC_LISTBOX_CURSOR
, LB_SETCURSEL
, nSel
, 0);
649 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
, STM_SETIMAGE
, IMAGE_CURSOR
,
650 (LPARAM
)g_CursorData
[nSel
].hCursor
);
655 DeleteUserCursorScheme(TCHAR
* szScheme
)
661 if (RegOpenCurrentUser(KEY_READ
| KEY_SET_VALUE
, &hCuKey
) != ERROR_SUCCESS
)
664 if (RegOpenKeyEx(hCuKey
, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ
| KEY_SET_VALUE
, &hCuCursorKey
) != ERROR_SUCCESS
)
670 Result
= RegDeleteValue(hCuCursorKey
, szScheme
);
672 RegCloseKey(hCuCursorKey
);
675 return (Result
== ERROR_SUCCESS
);
679 static INT_PTR CALLBACK
680 SaveSchemeProc(IN HWND hwndDlg
,
686 UNREFERENCED_PARAMETER(lParam
);
691 if (LOWORD(wParam
) == IDOK
)
693 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_SCHEME_NAME
);
694 SendMessage(hDlgCtrl
, WM_GETTEXT
, (WPARAM
)MAX_PATH
, (LPARAM
)g_szNewScheme
);
695 EndDialog(hwndDlg
, TRUE
);
697 else if (LOWORD(wParam
) == IDCANCEL
)
699 EndDialog(hwndDlg
, FALSE
);
709 BrowseCursor(TCHAR
* szFileName
, HWND hwndDlg
)
711 //FIXME load text resources from string
713 static TCHAR szFilter
[] = _T("Cursors\0*.ani;*.cur\0Animated Cursors\0*.ani\0Static Cursors\0*.cur\0All Files\0*.*\0\0");
715 ZeroMemory(&ofn
, sizeof(OPENFILENAME
));
717 ofn
.lStructSize
= sizeof(OPENFILENAME
);
718 ofn
.hwndOwner
= hwndDlg
;
719 ofn
.lpstrFilter
= szFilter
;
720 ofn
.nFilterIndex
= 1;
721 ofn
.lpstrFile
= szFileName
;
722 ofn
.nMaxFile
= MAX_PATH
;
723 ofn
.lpstrInitialDir
= _T("%WINDIR%\\Cursors");
724 ofn
.lpstrTitle
= _T("Browse");
725 ofn
.Flags
= OFN_EXPLORER
| OFN_FILEMUSTEXIST
;
727 if (GetOpenFileName(&ofn
))
735 LoadCurrentCursorScheme(LPTSTR lpName
, BOOL bSystem
)
739 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
741 if (g_CursorData
[i
].hCursor
!= NULL
)
743 DestroyCursor(g_CursorData
[i
].hCursor
);
744 g_CursorData
[i
].hCursor
= 0;
746 g_CursorData
[i
].szCursorPath
[0] = 0;
751 // for (index = IDS_ARROW, i = 0; index <= IDS_HAND; index++, i++)
753 // g_CursorData[i].hCursor = LoadCursor(NULL, g_CursorData[i].uDefaultCursorId);
758 LPTSTR pStart
= lpName
;
759 LPTSTR pEnd
= pStart
;
765 pEnd
= _tcschr(pStart
, _T(','));
767 nLength
= ((INT_PTR
)pEnd
- (INT_PTR
)pStart
) / sizeof(TCHAR
);
769 nLength
= _tcslen(pStart
);
771 _tcsncpy(g_CursorData
[i
].szCursorPath
, pStart
, nLength
);
772 g_CursorData
[i
].szCursorPath
[nLength
] = 0;
774 pStart
= pStart
+ (nLength
+ 1);
780 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
782 if (g_CursorData
[i
].szCursorPath
[0] == 0)
783 g_CursorData
[i
].hCursor
= LoadCursor(NULL
, g_CursorData
[i
].uDefaultCursorId
);
785 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, g_CursorData
[i
].szCursorPath
,
787 LR_LOADFROMFILE
| LR_DEFAULTSIZE
);
793 ReloadCurrentCursorScheme(VOID
)
797 for (index
= IDS_ARROW
, i
= 0; index
<= IDS_HAND
; index
++, i
++)
799 if (g_CursorData
[i
].hCursor
!= NULL
)
800 DestroyCursor(g_CursorData
[i
].hCursor
);
802 if (g_CursorData
[i
].szCursorPath
[0] == 0)
803 g_CursorData
[i
].hCursor
= LoadCursor(NULL
, g_CursorData
[i
].uDefaultCursorId
);
805 g_CursorData
[i
].hCursor
= (HCURSOR
)LoadImage(NULL
, g_CursorData
[i
].szCursorPath
,
807 LR_LOADFROMFILE
| LR_DEFAULTSIZE
);
813 OnDrawItem(UINT idCtl
,
814 LPDRAWITEMSTRUCT lpdis
)
818 if (lpdis
->itemState
& ODS_SELECTED
)
822 (HBRUSH
)(COLOR_HIGHLIGHT
+ 1));
823 SetBkColor(lpdis
->hDC
,
824 GetSysColor(COLOR_HIGHLIGHT
));
825 SetTextColor(lpdis
->hDC
,
826 GetSysColor(COLOR_HIGHLIGHTTEXT
));
832 (HBRUSH
)(COLOR_WINDOW
+ 1));
833 SetBkColor(lpdis
->hDC
,
834 GetSysColor(COLOR_WINDOW
));
835 SetTextColor(lpdis
->hDC
,
836 GetSysColor(COLOR_WINDOWTEXT
));
839 if (lpdis
->itemID
!= -1)
841 CopyRect(&rc
, &lpdis
->rcItem
);
844 g_CursorData
[lpdis
->itemData
].szCursorName
,
847 DT_SINGLELINE
| DT_VCENTER
| DT_LEFT
);
849 if (g_CursorData
[lpdis
->itemData
].hCursor
!= NULL
)
852 lpdis
->rcItem
.right
- 32 - 4,
853 lpdis
->rcItem
.top
+ 2,
854 g_CursorData
[lpdis
->itemData
].hCursor
);
858 if (lpdis
->itemState
& ODS_FOCUS
)
860 CopyRect(&rc
, &lpdis
->rcItem
);
861 InflateRect(&rc
, -1, -1);
862 DrawFocusRect(lpdis
->hDC
, &rc
);
867 static INT_PTR CALLBACK
868 PointerProc(IN HWND hwndDlg
,
874 TCHAR buffer
[MAX_PATH
];
875 TCHAR szSystemScheme
[MAX_PATH
];
879 PPOINTER_DATA pPointerData
;
881 pPointerData
= (PPOINTER_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
886 pPointerData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(POINTER_DATA
));
887 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pPointerData
);
889 EnumerateCursorSchemes(hwndDlg
);
890 LoadCurrentCursorScheme(NULL
, FALSE
);
891 RefreshCursorList(hwndDlg
, TRUE
);
893 /* Get drop shadow setting */
894 if (!SystemParametersInfo(SPI_GETDROPSHADOW
, 0, &pPointerData
->bDropShadow
, 0))
895 pPointerData
->bDropShadow
= FALSE
;
897 pPointerData
->bOrigDropShadow
= pPointerData
->bDropShadow
;
899 if (pPointerData
->bDropShadow
)
901 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_DROP_SHADOW
);
902 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
905 if ((INT
)wParam
== IDC_LISTBOX_CURSOR
)
911 ((LPMEASUREITEMSTRUCT
)lParam
)->itemHeight
= 32 + 4;
915 if (wParam
== IDC_LISTBOX_CURSOR
)
916 OnDrawItem((UINT
)wParam
, (LPDRAWITEMSTRUCT
)lParam
);
920 HeapFree(GetProcessHeap(), 0, pPointerData
);
924 lppsn
= (LPPSHNOTIFY
) lParam
;
925 if (lppsn
->hdr
.code
== PSN_APPLY
)
927 #if (WINVER >= 0x0500)
928 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bDropShadow
, SPIF_SENDCHANGE
);
930 // SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
933 else if (lppsn
->hdr
.code
== PSN_RESET
)
935 #if (WINVER >= 0x0500)
936 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bOrigDropShadow
, SPIF_SENDCHANGE
);
942 switch (LOWORD(wParam
))
944 case IDC_COMBO_CURSOR_SCHEME
:
945 if (HIWORD(wParam
) == CBN_SELENDOK
)
950 wParam
= SendMessage((HWND
)lParam
, CB_GETCURSEL
, 0, 0);
954 SendMessage((HWND
)lParam
, CB_GETLBTEXT
, wParam
, (LPARAM
)buffer
);
955 LoadString(hApplet
, IDS_SYSTEM_SCHEME
, szSystemScheme
, MAX_PATH
);
956 if(_tcsstr(buffer
, szSystemScheme
) || wParam
== 0) //avoid the default scheme can be deleted
962 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_BUTTON_DELETE_SCHEME
);
963 EnableWindow(hDlgCtrl
, bEnable
);
965 lpName
= (LPTSTR
)SendMessage((HWND
)lParam
, CB_GETITEMDATA
, wParam
, 0);
966 LoadCurrentCursorScheme(lpName
, !bEnable
);
967 RefreshCursorList(hwndDlg
, FALSE
);
971 case IDC_LISTBOX_CURSOR
:
972 if (HIWORD(wParam
) == LBN_SELCHANGE
)
975 uSel
= SendMessage((HWND
)lParam
, LB_GETCURSEL
, 0, 0);
976 uIndex
= (UINT
)SendMessage((HWND
)lParam
, LB_GETITEMDATA
, (WPARAM
)uSel
, 0);
977 SendDlgItemMessage(hwndDlg
, IDC_IMAGE_CURRENT_CURSOR
, STM_SETIMAGE
, IMAGE_CURSOR
,
978 (LPARAM
)g_CursorData
[uIndex
].hCursor
);
982 case IDC_BUTTON_SAVEAS_SCHEME
:
983 if (DialogBox(hApplet
, MAKEINTRESOURCE(IDD_CURSOR_SCHEME_SAVEAS
), hwndDlg
, SaveSchemeProc
))
985 /* FIXME: save the cursor scheme */
989 case IDC_BUTTON_USE_DEFAULT_CURSOR
:
990 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_LISTBOX_CURSOR
);
991 lResult
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
992 if (lResult
!= CB_ERR
)
997 uIndex
= (UINT
)SendMessage(hDlgCtrl
, LB_GETITEMDATA
, (WPARAM
)lResult
, 0);
999 /* Clean the path of the currently selected cursor */
1000 memset(g_CursorData
[uIndex
].szCursorPath
, 0x0, MAX_PATH
* sizeof(TCHAR
));
1002 ReloadCurrentCursorScheme();
1003 RefreshCursorList(hwndDlg
, FALSE
);
1007 case IDC_BUTTON_BROWSE_CURSOR
:
1008 memset(buffer
, 0x0, sizeof(buffer
));
1009 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_LISTBOX_CURSOR
);
1010 lResult
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
1011 if (lResult
== CB_ERR
)
1012 MessageBox(hwndDlg
, _T("CB_ERR"), _T(""),MB_ICONERROR
);
1013 if (BrowseCursor(buffer
, hwndDlg
))
1018 uIndex
= (UINT
)SendMessage(hDlgCtrl
, LB_GETITEMDATA
, (WPARAM
)lResult
, 0);
1020 /* Store the new cursor file path */
1021 _tcsncpy(g_CursorData
[uIndex
].szCursorPath
, buffer
, MAX_PATH
);
1023 ReloadCurrentCursorScheme();
1024 RefreshCursorList(hwndDlg
, FALSE
);
1028 case IDC_BUTTON_DELETE_SCHEME
:
1029 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_COMBO_CURSOR_SCHEME
);
1030 wParam
= SendMessage(hDlgCtrl
, CB_GETCURSEL
, 0, 0);
1031 if(wParam
== CB_ERR
)
1033 SendMessage(hDlgCtrl
, CB_GETLBTEXT
, wParam
, (LPARAM
)buffer
);
1034 if (DeleteUserCursorScheme(buffer
))
1036 SendMessage(hDlgCtrl
, CB_DELETESTRING
, wParam
, 0);
1037 SendMessage(hDlgCtrl
, CB_SETCURSEL
, (WPARAM
)0, (LPARAM
)0);
1041 case IDC_CHECK_DROP_SHADOW
:
1042 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_DROP_SHADOW
))
1044 pPointerData
->bDropShadow
= FALSE
;
1045 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1046 #if (WINVER >= 0x0500)
1047 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bDropShadow
, SPIF_SENDCHANGE
);
1049 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1053 pPointerData
->bDropShadow
= TRUE
;
1054 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1055 #if (WINVER >= 0x0500)
1056 SystemParametersInfo(SPI_SETDROPSHADOW
, 0, (PVOID
)pPointerData
->bDropShadow
, SPIF_SENDCHANGE
);
1058 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1070 InitializeMouse(POPTION_DATA pOptionData
)
1076 /* Get mouse sensitivity */
1077 if (!SystemParametersInfo(SPI_GETMOUSESPEED
, 0, &pOptionData
->ulMouseSensitivity
, 0))
1078 pOptionData
->ulMouseSensitivity
= DEFAULT_MOUSE_SENSITIVITY
;
1079 pOptionData
->ulOrigMouseSensitivity
= pOptionData
->ulMouseSensitivity
;
1081 pOptionData
->ulMouseSpeed
= 1;
1082 pOptionData
->ulMouseThreshold1
= DEFAULT_MOUSE_THRESHOLD1
;
1083 pOptionData
->ulMouseThreshold2
= DEFAULT_MOUSE_THRESHOLD2
;
1085 /* snap to default button */
1086 if (SystemParametersInfo(SPI_GETSNAPTODEFBUTTON
, 0, &pOptionData
->ulSnapToDefaultButton
, 0))
1087 pOptionData
->ulSnapToDefaultButton
= 0;
1090 if (!SystemParametersInfo(SPI_GETMOUSETRAILS
, 0, &pOptionData
->ulMouseTrails
, 0))
1091 pOptionData
->ulMouseTrails
= 0;
1093 /* hide pointer while typing */
1094 if (!SystemParametersInfo(SPI_GETMOUSEVANISH
, 0, &pOptionData
->ulHidePointer
, 0))
1095 pOptionData
->ulHidePointer
= 0;
1097 /* show pointer with Ctrl-Key */
1098 if (!SystemParametersInfo(SPI_GETMOUSESONAR
, 0, &pOptionData
->ulShowPointer
, 0))
1099 pOptionData
->ulShowPointer
= 0;
1105 static INT_PTR CALLBACK
1106 OptionProc(IN HWND hwndDlg
,
1114 POPTION_DATA pOptionData
;
1116 pOptionData
= (POPTION_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1121 pOptionData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(OPTION_DATA
));
1122 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pOptionData
);
1124 InitializeMouse(pOptionData
);
1126 /* set mouse sensitivity */
1127 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
);
1128 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 19));
1129 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->ulMouseSensitivity
- 1);
1131 if (pOptionData
->ulMouseSpeed
)
1133 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_POINTER_PRECISION
);
1134 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1137 if (pOptionData
->ulSnapToDefaultButton
)
1139 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SNAP_TO
);
1140 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1143 /* set mouse trail */
1144 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1145 SendMessage(hDlgCtrl
, TBM_SETRANGE
, (WPARAM
)TRUE
, (LPARAM
)MAKELONG(0, 5));
1146 if (pOptionData
->ulMouseTrails
< 2)
1147 EnableWindow(hDlgCtrl
, FALSE
);
1149 SendMessage(hDlgCtrl
, TBM_SETPOS
, (WPARAM
)TRUE
, (LPARAM
)pOptionData
->ulMouseTrails
- 2);
1151 if (pOptionData
->ulShowPointer
)
1153 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_SHOW_POINTER
);
1154 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1157 if (pOptionData
->ulHidePointer
)
1159 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_CHECK_HIDE_POINTER
);
1160 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1165 HeapFree(GetProcessHeap(), 0, pOptionData
);
1169 switch(LOWORD(wParam
))
1171 case IDC_CHECK_POINTER_PRECISION
:
1172 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_PRECISION
))
1174 pOptionData
->ulMouseSpeed
= 0;
1175 pOptionData
->ulMouseThreshold1
= 0;
1176 pOptionData
->ulMouseThreshold2
= 0;
1177 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1181 pOptionData
->ulMouseSpeed
= 1;
1182 pOptionData
->ulMouseThreshold1
= 6;
1183 pOptionData
->ulMouseThreshold2
= 10;
1184 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1188 case IDC_CHECK_SNAP_TO
:
1189 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SNAP_TO
))
1191 pOptionData
->ulSnapToDefaultButton
= 0;
1192 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1196 pOptionData
->ulSnapToDefaultButton
= 1;
1197 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1201 case IDC_CHECK_POINTER_TRAIL
:
1202 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1203 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_TRAIL
))
1205 pOptionData
->ulMouseTrails
= 0;
1206 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1207 EnableWindow(hDlgCtrl
, FALSE
);
1211 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1212 EnableWindow(hDlgCtrl
, TRUE
);
1213 pOptionData
->ulMouseTrails
= (ULONG
)SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 2;
1217 case IDC_CHECK_SHOW_POINTER
:
1218 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_SHOW_POINTER
))
1220 pOptionData
->ulShowPointer
= 0;
1221 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1225 pOptionData
->ulShowPointer
= 1;
1226 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1230 case IDC_CHECK_HIDE_POINTER
:
1231 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_HIDE_POINTER
))
1233 pOptionData
->ulHidePointer
= 0;
1234 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1238 pOptionData
->ulHidePointer
= 1;
1239 SendMessage((HWND
)lParam
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1243 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1247 lppsn
= (LPPSHNOTIFY
)lParam
;
1248 if (lppsn
->hdr
.code
== PSN_APPLY
)
1250 /* set snap to default button */
1251 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON
, pOptionData
->ulSnapToDefaultButton
, 0, SPIF_SENDCHANGE
);
1254 /* set mouse trails */
1255 if(IsDlgButtonChecked(hwndDlg
, IDC_CHECK_POINTER_TRAIL
))
1257 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
);
1258 lResult
= SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 2;
1265 SystemParametersInfo(SPI_SETMOUSETRAILS
, (UINT
) lResult
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1272 /* calc pos and set mouse sensitivity */
1273 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
);
1274 lResult
= SendMessage(hDlgCtrl
, TBM_GETPOS
, 0, 0) + 1;
1275 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSensitivity
, SPIF_SENDCHANGE
);
1277 /* hide pointer while typing */
1278 SystemParametersInfo(SPI_SETMOUSEVANISH
, 0, (PVOID
)pOptionData
->ulHidePointer
, SPIF_SENDCHANGE
);
1280 /* show pointer with Ctrl-Key */
1281 SystemParametersInfo(SPI_SETMOUSESONAR
, 0, (PVOID
)pOptionData
->ulShowPointer
, SPIF_SENDCHANGE
);
1283 SetWindowLong(hwndDlg
, DWL_MSGRESULT
, PSNRET_NOERROR
);
1286 else if (lppsn
->hdr
.code
== PSN_RESET
)
1288 /* Set the original mouse speed */
1289 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulOrigMouseSensitivity
, SPIF_SENDCHANGE
);
1294 if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
))
1296 switch (LOWORD(wParam
))
1305 pOptionData
->ulMouseSensitivity
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_MOUSE_SENSITIVITY
, TBM_GETPOS
, 0, 0) + 1;
1306 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSensitivity
, SPIF_SENDCHANGE
);
1307 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1311 pOptionData
->ulMouseSensitivity
= (ULONG
)HIWORD(wParam
) + 1;
1312 SystemParametersInfo(SPI_SETMOUSESPEED
, 0, (PVOID
)pOptionData
->ulMouseSensitivity
, SPIF_SENDCHANGE
);
1313 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1318 else if ((HWND
)lParam
== GetDlgItem(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
))
1320 switch (LOWORD(wParam
))
1329 pOptionData
->ulMouseTrails
= (ULONG
)SendDlgItemMessage(hwndDlg
, IDC_SLIDER_POINTER_TRAIL
, TBM_GETPOS
, 0, 0) + 2;
1330 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->ulMouseTrails
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1331 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1335 pOptionData
->ulMouseTrails
= (ULONG
)HIWORD(wParam
) + 2;
1336 SystemParametersInfo(SPI_SETMOUSETRAILS
, pOptionData
->ulMouseTrails
, 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1337 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1349 ShowDialogWheelControls(HWND hwndDlg
, UINT uWheelScrollLines
, BOOL bInit
)
1353 if (uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1355 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1356 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1358 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1359 EnableWindow(hDlgCtrl
, TRUE
);
1361 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1362 EnableWindow(hDlgCtrl
, TRUE
);
1364 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1365 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1369 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_LINES
);
1370 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_UNCHECKED
, (LPARAM
)0);
1372 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
);
1373 EnableWindow(hDlgCtrl
, FALSE
);
1375 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
);
1376 EnableWindow(hDlgCtrl
, FALSE
);
1378 hDlgCtrl
= GetDlgItem(hwndDlg
, IDC_RADIO_WHEEL_SCROLL_PAGE
);
1379 SendMessage(hDlgCtrl
, BM_SETCHECK
, (WPARAM
)BST_CHECKED
, (LPARAM
)0);
1381 /* Set the default scroll lines value */
1383 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, DEFAULT_WHEEL_SCROLL_LINES
, FALSE
);
1388 static INT_PTR CALLBACK
1389 WheelProc(IN HWND hwndDlg
,
1395 PWHEEL_DATA pWheelData
;
1397 pWheelData
= (PWHEEL_DATA
)GetWindowLongPtr(hwndDlg
, DWLP_USER
);
1402 pWheelData
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(WHEEL_DATA
));
1403 SetWindowLongPtr(hwndDlg
, DWLP_USER
, (LONG_PTR
)pWheelData
);
1405 /* Get wheel scroll lines */
1406 if (!SystemParametersInfo(SPI_GETWHEELSCROLLLINES
, 0, &pWheelData
->uWheelScrollLines
, 0))
1408 pWheelData
->uWheelScrollLines
= DEFAULT_WHEEL_SCROLL_LINES
;
1411 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, TRUE
);
1412 SendDlgItemMessage(hwndDlg
, IDC_UPDOWN_WHEEL_SCROLL_LINES
, UDM_SETRANGE
, 0, MAKELONG((short)100, (short)0));
1413 if (pWheelData
->uWheelScrollLines
!= WHEEL_PAGESCROLL
)
1415 SetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, pWheelData
->uWheelScrollLines
, FALSE
);
1420 HeapFree(GetProcessHeap(), 0, pWheelData
);
1424 switch (LOWORD(wParam
))
1426 case IDC_RADIO_WHEEL_SCROLL_LINES
:
1427 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1428 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1429 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1432 case IDC_RADIO_WHEEL_SCROLL_PAGE
:
1433 pWheelData
->uWheelScrollLines
= WHEEL_PAGESCROLL
;
1434 ShowDialogWheelControls(hwndDlg
, pWheelData
->uWheelScrollLines
, FALSE
);
1435 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1438 case IDC_EDIT_WHEEL_SCROLL_LINES
:
1439 if (pWheelData
&& HIWORD(wParam
) == EN_CHANGE
)
1441 pWheelData
->uWheelScrollLines
= GetDlgItemInt(hwndDlg
, IDC_EDIT_WHEEL_SCROLL_LINES
, NULL
, FALSE
);
1442 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
1449 lppsn
= (LPPSHNOTIFY
)lParam
;
1450 if (lppsn
->hdr
.code
== PSN_APPLY
)
1452 SystemParametersInfo(SPI_SETWHEELSCROLLLINES
, pWheelData
->uWheelScrollLines
,
1453 0, SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
1464 MouseApplet(HWND hwnd
, UINT uMsg
, LONG lParam1
, LONG lParam2
)
1466 PROPSHEETPAGE psp
[5];
1467 PROPSHEETHEADER psh
;
1470 UNREFERENCED_PARAMETER(lParam1
);
1471 UNREFERENCED_PARAMETER(lParam2
);
1472 UNREFERENCED_PARAMETER(uMsg
);
1473 UNREFERENCED_PARAMETER(hwnd
);
1475 LoadString(hApplet
, IDS_CPLNAME_1
, Caption
, sizeof(Caption
) / sizeof(TCHAR
));
1477 ZeroMemory(&psh
, sizeof(PROPSHEETHEADER
));
1478 psh
.dwSize
= sizeof(PROPSHEETHEADER
);
1479 psh
.dwFlags
= PSH_PROPSHEETPAGE
| PSH_PROPTITLE
;
1480 psh
.hwndParent
= NULL
;
1481 psh
.hInstance
= hApplet
;
1482 psh
.hIcon
= LoadIcon(hApplet
, MAKEINTRESOURCE(IDC_CPLICON_1
));
1483 psh
.pszCaption
= Caption
;
1484 psh
.nPages
= sizeof(psp
) / sizeof(PROPSHEETPAGE
);
1488 InitPropSheetPage(&psp
[0], IDD_PAGE_BUTTON
, ButtonProc
);
1489 InitPropSheetPage(&psp
[1], IDD_PAGE_POINTER
, PointerProc
);
1490 InitPropSheetPage(&psp
[2], IDD_PAGE_OPTION
, OptionProc
);
1491 InitPropSheetPage(&psp
[3], IDD_PAGE_WHEEL
, WheelProc
);
1492 InitPropSheetPage(&psp
[4], IDD_HARDWARE
, MouseHardwareProc
);
1493 return (LONG
)(PropertySheet(&psh
) != -1);