2 * PROJECT: ReactOS system libraries
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/syssetup/proppage.c
5 * PURPOSE: Property page providers
6 * PROGRAMMERS: Copyright 2018 Eric Kohl <eric.kohl@reactos.org>
14 typedef struct _MOUSE_INFO
17 DWORD dwSampleRateIndex
;
18 DWORD dwWheelDetection
;
19 DWORD dwInputBufferLength
;
21 } MOUSE_INFO
, *PMOUSE_INFO
;
23 DWORD MouseSampleRates
[] = {20, 40, 60, 80, 100, 200};
25 #define DEFAULT_SAMPLERATEINDEX 4
26 #define DEFAULT_WHEELDETECTION 2
27 #define DEFAULT_INPUTBUFFERSIZE 100
28 #define DEFAULT_MINBUFFERSIZE 100
29 #define DEFAULT_MAXBUFFERSIZE 300
36 CdromPropPageProvider(
37 _In_ PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest
,
38 _In_ LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc
,
41 DPRINT("CdromPropPageProvider(%p %p %lx)\n",
42 lpPropSheetPageRequest
, lpfnAddPropSheetPageProc
, lParam
);
53 _In_ PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest
,
54 _In_ LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc
,
57 DPRINT("DiskPropPageProvider(%p %p %lx)\n",
58 lpPropSheetPageRequest
, lpfnAddPropSheetPageProc
, lParam
);
68 EisaUpHalPropPageProvider(
69 _In_ PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest
,
70 _In_ LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc
,
73 DPRINT("EisaUpHalPropPageProvider(%p %p %lx)\n",
74 lpPropSheetPageRequest
, lpfnAddPropSheetPageProc
, lParam
);
84 LegacyDriverPropPageProvider(
85 _In_ PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest
,
86 _In_ LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc
,
89 DPRINT1("LegacyDriverPropPageProvider(%p %p %lx)\n",
90 lpPropSheetPageRequest
, lpfnAddPropSheetPageProc
, lParam
);
98 MouseGetSampleRateIndex(
103 for (i
= 0; i
< ARRAYSIZE(MouseSampleRates
); i
++)
105 if (MouseSampleRates
[i
] == dwSampleRate
)
109 return DEFAULT_SAMPLERATEINDEX
;
119 PMOUSE_INFO pMouseInfo
;
122 DWORD dwType
, dwSize
;
126 /* Get the pointer to the mouse info struct */
127 pMouseInfo
= (PMOUSE_INFO
)((LPPROPSHEETPAGE
)lParam
)->lParam
;
128 if (pMouseInfo
== NULL
)
131 /* Keep the pointer to the mouse info struct */
132 SetWindowLongPtr(hwndDlg
, GWLP_USERDATA
, (DWORD_PTR
)pMouseInfo
);
134 /* Add the sample rates */
135 for (i
= 0; i
< ARRAYSIZE(MouseSampleRates
); i
++)
137 wsprintf(szBuffer
, L
"%lu", MouseSampleRates
[i
]);
138 SendDlgItemMessageW(hwndDlg
,
139 IDC_PS2MOUSESAMPLERATE
,
145 /* Read the SampleRate parameter */
146 dwSize
= sizeof(DWORD
);
147 lError
= RegQueryValueExW(pMouseInfo
->hDeviceKey
,
151 (LPBYTE
)&dwSampleRate
,
153 if (lError
== ERROR_SUCCESS
&& dwType
== REG_DWORD
&& dwSize
== sizeof(DWORD
))
155 pMouseInfo
->dwSampleRateIndex
= MouseGetSampleRateIndex(dwSampleRate
);
159 /* Set the default sample rate (100 samples per second) */
160 pMouseInfo
->dwSampleRateIndex
= DEFAULT_SAMPLERATEINDEX
;
163 /* Set the sample rate */
164 SendDlgItemMessageW(hwndDlg
,
165 IDC_PS2MOUSESAMPLERATE
,
167 pMouseInfo
->dwSampleRateIndex
,
170 /* Add the detection options */
171 for (i
= IDS_DETECTIONDISABLED
; i
<= IDS_ASSUMEPRESENT
; i
++)
173 LoadStringW(hDllInstance
, i
, szBuffer
, ARRAYSIZE(szBuffer
));
174 SendDlgItemMessageW(hwndDlg
,
181 /* Read the EnableWheelDetection parameter */
182 dwSize
= sizeof(DWORD
);
183 lError
= RegQueryValueExW(pMouseInfo
->hDeviceKey
,
184 L
"EnableWheelDetection",
187 (LPBYTE
)&pMouseInfo
->dwWheelDetection
,
189 if (lError
!= ERROR_SUCCESS
|| dwType
!= REG_DWORD
|| dwSize
!= sizeof(DWORD
))
191 /* Set the default wheel detection parameter */
192 pMouseInfo
->dwWheelDetection
= DEFAULT_WHEELDETECTION
;
195 /* Set the wheel detection parameter */
196 SendDlgItemMessageW(hwndDlg
,
199 pMouseInfo
->dwWheelDetection
,
202 /* Set the input buffer length range: 100-300 */
203 SendDlgItemMessageW(hwndDlg
,
204 IDC_PS2MOUSEINPUTUPDN
,
206 DEFAULT_MINBUFFERSIZE
,
207 DEFAULT_MAXBUFFERSIZE
);
209 /* Read the MouseDataQueueSize parameter */
210 dwSize
= sizeof(DWORD
);
211 lError
= RegQueryValueExW(pMouseInfo
->hDeviceKey
,
212 L
"MouseDataQueueSize",
215 (LPBYTE
)&pMouseInfo
->dwInputBufferLength
,
217 if (lError
!= ERROR_SUCCESS
|| dwType
!= REG_DWORD
|| dwSize
!= sizeof(DWORD
))
219 /* Set the default input buffer length (100 packets) */
220 pMouseInfo
->dwInputBufferLength
= DEFAULT_INPUTBUFFERSIZE
;
223 /* Set the input buffer length */
224 SendDlgItemMessageW(hwndDlg
,
225 IDC_PS2MOUSEINPUTUPDN
,
228 pMouseInfo
->dwInputBufferLength
);
230 /* Read the MouseInitializePolled parameter */
231 dwSize
= sizeof(DWORD
);
232 lError
= RegQueryValueExW(pMouseInfo
->hDeviceKey
,
233 L
"MouseInitializePolled",
236 (LPBYTE
)&pMouseInfo
->dwInitPolled
,
238 if (lError
!= ERROR_SUCCESS
|| dwType
!= REG_DWORD
|| dwSize
!= sizeof(DWORD
))
240 /* Set the default init polled value (FALSE) */
241 pMouseInfo
->dwInitPolled
= 0;
244 /* Set the fast initialization option */
245 SendDlgItemMessage(hwndDlg
,
246 IDC_PS2MOUSEFASTINIT
,
248 (pMouseInfo
->dwInitPolled
== 0) ? BST_CHECKED
: 0,
262 switch (LOWORD(wParam
))
264 case IDC_PS2MOUSESAMPLERATE
:
265 case IDC_PS2MOUSEWHEEL
:
266 case IDC_PS2MOUSEINPUTLEN
:
267 case IDC_PS2MOUSEFASTINIT
:
268 if (HIWORD(wParam
) == CBN_SELCHANGE
||
269 HIWORD(wParam
) == CBN_EDITCHANGE
)
271 /* Enable the Apply button */
272 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
276 case IDC_PS2MOUSEDEFAULTS
:
277 if (HIWORD(wParam
) == BN_CLICKED
)
279 /* Sample rate: 100 */
280 SendDlgItemMessageW(hwndDlg
,
281 IDC_PS2MOUSESAMPLERATE
,
283 DEFAULT_SAMPLERATEINDEX
,
286 /* Wheel detection: Assume wheel present */
287 SendDlgItemMessageW(hwndDlg
,
290 DEFAULT_WHEELDETECTION
,
293 /* Input buffer length: 100 packets */
294 SendDlgItemMessageW(hwndDlg
,
295 IDC_PS2MOUSEINPUTUPDN
,
298 DEFAULT_INPUTBUFFERSIZE
);
300 /* Fast Initialization: Checked */
301 SendDlgItemMessage(hwndDlg
,
302 IDC_PS2MOUSEFASTINIT
,
307 /* Enable the Apply button */
308 PropSheet_Changed(GetParent(hwndDlg
), hwndDlg
);
323 PMOUSE_INFO pMouseInfo
;
324 DWORD dwSampleRateIndex
= 0;
325 DWORD dwSampleRate
, dwWheelDetection
;
326 DWORD dwInputBufferLength
;
332 pMouseInfo
= (PMOUSE_INFO
)GetWindowLongPtr(hwndDlg
, GWLP_USERDATA
);
334 /* Get the sample rate setting and store it if it was changed */
335 nIndex
= SendDlgItemMessageW(hwndDlg
, IDC_PS2MOUSESAMPLERATE
,
337 if (nIndex
== CB_ERR
)
338 dwSampleRateIndex
= DEFAULT_SAMPLERATEINDEX
;
340 dwSampleRateIndex
= (DWORD
)nIndex
;
342 if (dwSampleRateIndex
!= pMouseInfo
->dwSampleRateIndex
)
344 dwSampleRate
= MouseSampleRates
[dwSampleRateIndex
];
345 RegSetValueExW(pMouseInfo
->hDeviceKey
,
349 (LPBYTE
)&dwSampleRate
,
350 sizeof(dwSampleRate
));
353 /* Get the wheel detection setting and store it if it was changed */
354 nIndex
= SendDlgItemMessageW(hwndDlg
, IDC_PS2MOUSEWHEEL
,
356 if (nIndex
== CB_ERR
)
357 dwWheelDetection
= DEFAULT_WHEELDETECTION
;
359 dwWheelDetection
= (DWORD
)nIndex
;
361 if (dwWheelDetection
!= pMouseInfo
->dwWheelDetection
)
363 RegSetValueExW(pMouseInfo
->hDeviceKey
,
364 L
"EnableWheelDetection",
367 (LPBYTE
)&dwWheelDetection
,
368 sizeof(dwWheelDetection
));
371 /* Get the input buffer length setting and store it if it was changed */
372 uValue
= SendDlgItemMessageW(hwndDlg
,
373 IDC_PS2MOUSEINPUTUPDN
,
378 dwInputBufferLength
= DEFAULT_INPUTBUFFERSIZE
;
380 dwInputBufferLength
= (DWORD
)uValue
;
382 if (dwInputBufferLength
!= pMouseInfo
->dwInputBufferLength
)
384 RegSetValueExW(pMouseInfo
->hDeviceKey
,
385 L
"MouseDataQueueSize",
388 (LPBYTE
)&dwInputBufferLength
,
389 sizeof(dwInputBufferLength
));
392 /* Get the fast initialization setting and store it if it was changed */
393 uValue
= SendDlgItemMessage(hwndDlg
,
394 IDC_PS2MOUSEFASTINIT
,
398 dwInitPolled
= (uValue
== BST_CHECKED
) ? 0 : 1;
400 if (dwInitPolled
!= pMouseInfo
->dwInitPolled
)
402 RegSetValueExW(pMouseInfo
->hDeviceKey
,
403 L
"MouseInitializePolled",
406 (LPBYTE
)&dwInitPolled
,
407 sizeof(dwInitPolled
));
419 switch (((LPNMHDR
)lParam
)->code
)
422 if (((LPNMHDR
)lParam
)->idFrom
== IDC_PS2MOUSEINPUTUPDN
)
424 ((LPNMUPDOWN
)lParam
)->iDelta
*= 10;
430 MouseOnApply(hwndDlg
);
440 MouseOnCtrlColorStatic(
445 if ((HWND
)lParam
!= GetDlgItem(hwndDlg
, IDC_PS2MOUSEINPUTLEN
))
448 SetTextColor((HDC
)wParam
, GetSysColor(COLOR_WINDOWTEXT
));
449 SetBkColor((HDC
)wParam
, GetSysColor(COLOR_WINDOW
));
450 return (INT_PTR
)GetSysColorBrush(COLOR_WINDOW
);
463 DPRINT("MouseDlgProc\n");
468 return MouseOnDialogInit(hwndDlg
, lParam
);
471 MouseOnCommand(hwndDlg
, wParam
, lParam
);
475 return MouseOnNotify(hwndDlg
, wParam
, lParam
);
477 case WM_CTLCOLORSTATIC
:
478 return MouseOnCtrlColorStatic(hwndDlg
, wParam
, lParam
);
491 LPPROPSHEETPAGE ppsp
)
493 PMOUSE_INFO pMouseInfo
;
495 pMouseInfo
= (PMOUSE_INFO
)ppsp
->lParam
;
497 if (uMsg
== PSPCB_RELEASE
)
499 if (pMouseInfo
->hDeviceKey
!= NULL
)
500 RegCloseKey(pMouseInfo
->hDeviceKey
);
501 HeapFree(GetProcessHeap(), 0, pMouseInfo
);
513 PS2MousePropPageProvider(
514 _In_ PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest
,
515 _In_ LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc
,
518 PROPSHEETPAGEW PropSheetPage
;
519 HPROPSHEETPAGE hPropSheetPage
;
520 PMOUSE_INFO pMouseInfo
;
522 DPRINT("PS2MousePropPageProvider(%p %p %lx)\n",
523 lpPropSheetPageRequest
, lpfnAddPropSheetPageProc
, lParam
);
525 if (lpPropSheetPageRequest
->PageRequested
!= SPPSR_ENUM_ADV_DEVICE_PROPERTIES
)
528 pMouseInfo
= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(MOUSE_INFO
));
529 if (pMouseInfo
== NULL
)
532 pMouseInfo
->hDeviceKey
= SetupDiOpenDevRegKey(lpPropSheetPageRequest
->DeviceInfoSet
,
533 lpPropSheetPageRequest
->DeviceInfoData
,
538 if (pMouseInfo
->hDeviceKey
== INVALID_HANDLE_VALUE
)
540 DPRINT1("SetupDiOpenDevRegKey() failed (Error %lu)\n", GetLastError());
541 HeapFree(GetProcessHeap(), 0, pMouseInfo
);
545 PropSheetPage
.dwSize
= sizeof(PROPSHEETPAGEW
);
546 PropSheetPage
.dwFlags
= 0;
547 PropSheetPage
.hInstance
= hDllInstance
;
548 PropSheetPage
.pszTemplate
= MAKEINTRESOURCE(IDD_PS2MOUSEPROPERTIES
);
549 PropSheetPage
.pfnDlgProc
= MouseDlgProc
;
550 PropSheetPage
.lParam
= (LPARAM
)pMouseInfo
;
551 PropSheetPage
.pfnCallback
= MouseCallback
;
553 hPropSheetPage
= CreatePropertySheetPageW(&PropSheetPage
);
554 if (hPropSheetPage
== NULL
)
556 DPRINT1("CreatePropertySheetPageW() failed!\n");
557 HeapFree(GetProcessHeap(), 0, pMouseInfo
);
561 if (!(*lpfnAddPropSheetPageProc
)(hPropSheetPage
, lParam
))
563 DPRINT1("lpfnAddPropSheetPageProc() failed!\n");
564 DestroyPropertySheetPage(hPropSheetPage
);
565 HeapFree(GetProcessHeap(), 0, pMouseInfo
);
578 TapePropPageProvider(
579 _In_ PSP_PROPSHEETPAGE_REQUEST lpPropSheetPageRequest
,
580 _In_ LPFNADDPROPSHEETPAGE lpfnAddPropSheetPageProc
,
583 DPRINT("TapePropPageProvider(%p %p %lx)\n",
584 lpPropSheetPageRequest
, lpfnAddPropSheetPageProc
, lParam
);