fix compiling with gcc4
[reactos.git] / reactos / dll / cpl / main / mouse.c
1 /*
2 * ReactOS
3 * Copyright (C) 2004 ReactOS Team
4 *
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.
9 *
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.
14 *
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.
18 */
19 /* $Id$
20 *
21 * PROJECT: ReactOS Main Control Panel
22 * FILE: lib/cpl/main/mouse.c
23 * PURPOSE: Mouse Control Panel
24 * PROGRAMMER: Eric Kohl
25 * Johannes Anderwald
26 */
27
28 //TODO:
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
34 // add missing icons
35 // Options- pointer precision
36
37 #include <windows.h>
38 #include <winuser.h>
39 #include <devguid.h>
40 #include <commctrl.h>
41 #include <cpl.h>
42 #include <tchar.h>
43 #include <math.h>
44 #include <limits.h>
45
46 #include "main.h"
47 #include "resource.h"
48
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
57
58 ULONG g_Initialized = 0;
59
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;
65
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;
76
77
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];
94
95 TCHAR g_szNewScheme[MAX_PATH];
96
97 /* Property page dialog callback */
98 static INT_PTR CALLBACK
99 MouseHardwareProc(IN HWND hwndDlg,
100 IN UINT uMsg,
101 IN WPARAM wParam,
102 IN LPARAM lParam)
103 {
104 GUID Guids[1];
105 Guids[0] = GUID_DEVCLASS_MOUSE;
106
107 switch(uMsg)
108 {
109 case WM_INITDIALOG:
110 {
111 /* create the hardware page */
112 DeviceCreateHardwarePageEx(hwndDlg,
113 Guids,
114 sizeof(Guids) / sizeof(Guids[0]),
115 HWPD_STANDARDLIST);
116 break;
117 }
118 }
119
120 return FALSE;
121 }
122
123
124 BOOL InitializeMouse()
125 {
126 /* mouse trails */
127 SystemParametersInfo(SPI_GETMOUSETRAILS, 0, &g_MouseTrails, 0);
128
129 /* snap to default button */
130 SystemParametersInfo(SPI_GETSNAPTODEFBUTTON, 0, &g_SnapToDefaultButton, 0);
131
132 /* wheel scroll lines */
133 SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &g_WheelScrollLines, 0);
134
135 #if (WINVER >= 0x0500)
136 //FIXME
137 //pointer precision
138 // SPI_GETMOUSE?
139
140 /* mouse sensitivity */
141 SystemParametersInfo(SPI_GETMOUSESPEED, 0, &g_MouseSensitivity, 0);
142
143 /* hide pointer while typing */
144 SystemParametersInfo(SPI_GETMOUSEVANISH, 0, &g_HidePointer, 0);
145
146 /* click lock time */
147 SystemParametersInfo(SPI_GETMOUSECLICKLOCK, 0, &g_ClickLockEnabled, 0);
148 SystemParametersInfo(SPI_GETMOUSECLICKLOCKTIME, 0, &g_ClickLockTime, 0);
149
150 g_DoubleClickSpeed = GetDoubleClickTime();
151 g_SwapMouseButtons = GetSystemMetrics(SM_SWAPBUTTON);
152
153
154 /* show pointer with Ctrl-Key */
155 SystemParametersInfo(SPI_GETMOUSESONAR, 0, &g_ShowPointer, 0);
156 #endif
157
158 return TRUE;
159 }
160
161
162 static INT_PTR CALLBACK
163 ClickLockProc(IN HWND hwndDlg,
164 IN UINT uMsg,
165 IN WPARAM wParam,
166 IN LPARAM lParam)
167 {
168 HWND hDlgCtrl;
169 int pos;
170 switch(uMsg)
171 {
172 case WM_INITDIALOG:
173 {
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);
178 return TRUE;
179 }
180 case WM_COMMAND:
181 {
182 if (LOWORD(wParam) == IDOK)
183 {
184 hDlgCtrl = GetDlgItem(hwndDlg, IDC_SLIDER_CLICK_LOCK);
185 g_ClickLockTime = (SendMessage(hDlgCtrl, TBM_GETPOS, 0, 0) * 200) + 200;
186 EndDialog(hwndDlg, TRUE);
187 }
188 else if (LOWORD(wParam) == IDCANCEL)
189 {
190 EndDialog(hwndDlg, FALSE);
191 }
192 }
193 }
194
195 return FALSE;
196 }
197
198 static INT_PTR CALLBACK
199 ButtonProc(IN HWND hwndDlg,
200 IN UINT uMsg,
201 IN WPARAM wParam,
202 IN LPARAM lParam)
203 {
204 HWND hDlgCtrl;
205 LRESULT lResult;
206 float pos;
207 LPPSHNOTIFY lppsn;
208
209 switch(uMsg)
210 {
211 case WM_INITDIALOG:
212 {
213 if (InitializeMouse())
214 {
215 if (g_SwapMouseButtons)
216 {
217 hDlgCtrl = GetDlgItem(hwndDlg, IDC_SWAP_MOUSE_BUTTONS);
218 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
219 }
220 if (g_ClickLockEnabled)
221 {
222 hDlgCtrl = GetDlgItem(hwndDlg, IDC_CHECK_CLICK_LOCK);
223 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
224 }
225 else
226 {
227 hDlgCtrl = GetDlgItem(hwndDlg, IDC_BUTTON_CLICK_LOCK);
228 EnableWindow(hDlgCtrl, FALSE);
229 }
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);
233 pos /= (1.0f/11.0f);
234 SendMessage(hDlgCtrl, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)(INT)rintf(pos));
235
236
237 }
238 return TRUE;
239 }
240 case WM_COMMAND:
241 {
242 switch(LOWORD(wParam))
243 {
244 case IDC_SWAP_MOUSE_BUTTONS:
245 {
246 lResult = SendMessage((HWND)lParam, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
247 if (lResult == BST_CHECKED)
248 {
249 g_SwapMouseButtons = FALSE;
250 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, (LPARAM)0);
251 }
252 else if (lResult == BST_UNCHECKED)
253 {
254 g_SwapMouseButtons = TRUE;
255 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
256 }
257 break;
258 }
259 case IDC_CHECK_CLICK_LOCK:
260 {
261 lResult = SendMessage((HWND)lParam, BM_GETCHECK, (WPARAM)0, (LPARAM)0);
262 hDlgCtrl = GetDlgItem(hwndDlg, IDC_BUTTON_CLICK_LOCK);
263 if (lResult == BST_CHECKED)
264 {
265 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, (LPARAM)0);
266 g_ClickLockEnabled = FALSE;
267 EnableWindow(hDlgCtrl, FALSE);
268 }
269 else if (lResult == BST_UNCHECKED)
270 {
271 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
272 EnableWindow(hDlgCtrl, TRUE);
273 g_ClickLockEnabled = TRUE;
274 }
275 break;
276 }
277 case IDC_BUTTON_CLICK_LOCK:
278 {
279 lResult = DialogBox(hApplet, MAKEINTRESOURCE(IDD_CLICK_LOCK), hwndDlg, ClickLockProc);
280 if ((INT)lResult == FALSE)
281 return FALSE; // no need to enable apply button
282 break;
283 }
284 }
285 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
286 break;
287 }
288 case WM_NOTIFY:
289 {
290 lppsn = (LPPSHNOTIFY) lParam;
291 if (lppsn->hdr.code == PSN_APPLY)
292 {
293 SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, g_SwapMouseButtons, NULL, SPIF_SENDCHANGE);
294 SystemParametersInfo(SPI_SETDOUBLECLICKTIME, g_DoubleClickSpeed, NULL, SPIF_SENDCHANGE);
295
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);
300 #endif
301 SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
302 return TRUE;
303 }
304
305 }
306 case WM_DRAWITEM:
307 {
308 LPDRAWITEMSTRUCT drawItem;
309 drawItem = (LPDRAWITEMSTRUCT)lParam;
310 if(drawItem->CtlID == IDC_IMAGE_SWAP_MOUSE)
311 {
312 //FIXME
313 //show mouse with left/right button highlighted
314 // depending on val g_SwapMouseButtons
315 return TRUE;
316 }
317 else if (drawItem->CtlID == IDC_IMAGE_DOUBLE_CLICK_SPEED)
318 {
319 //FIXME
320 //measure click speed && draw item
321 }
322 break;
323 }
324 }
325 return FALSE;
326 }
327
328 BOOL ReadActiveCursorScheme()
329 {
330 HKEY hCuKey;
331 HKEY hCuCursorKey;
332 DWORD dwIndex;
333 TCHAR szValueName[MAX_PATH];
334 DWORD dwValueName;
335 TCHAR szValueData[2000];
336 DWORD dwValueData;
337 LONG dwResult;
338
339 if (RegOpenCurrentUser(KEY_READ, &hCuKey) != ERROR_SUCCESS)
340 return FALSE;
341
342 if (RegOpenKeyEx(hCuKey, _T("Control Panel\\Cursors"), 0, KEY_READ, &hCuCursorKey) != ERROR_SUCCESS)
343 {
344 RegCloseKey(hCuKey);
345 return FALSE;
346 }
347
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));
363
364 dwIndex = 0;
365 do
366 {
367 dwValueName = sizeof(szValueName) / sizeof(TCHAR);
368 dwValueData = sizeof(szValueData) / sizeof(TCHAR);
369 dwResult = RegEnumValue(hCuCursorKey, dwIndex, szValueName, &dwValueName, NULL, NULL, (LPBYTE)szValueData, &dwValueData);
370
371 if (dwResult == ERROR_NO_MORE_ITEMS)
372 break;
373
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);
404
405 dwIndex++;
406 }while(1);
407
408 RegCloseKey(hCuCursorKey);
409 RegCloseKey(hCuKey);
410
411 return TRUE;
412 }
413
414 BOOL EnumerateCursorSchemes(HWND hwndDlg)
415 {
416 HKEY hCuKey;
417 HKEY hCuCursorKey;
418 DWORD dwIndex;
419 TCHAR szValueName[MAX_PATH];
420 DWORD dwValueName;
421 TCHAR szSystemScheme[MAX_PATH];
422 TCHAR szValueData[2000];
423 DWORD dwValueData;
424 LONG dwResult;
425 HWND hDlgCtrl;
426 LRESULT lResult;
427 BOOL ProcessedHKLM = FALSE;
428
429 if (RegOpenCurrentUser(KEY_READ, &hCuKey) != ERROR_SUCCESS)
430 {
431 return FALSE;
432 }
433 if (RegOpenKeyEx(hCuKey, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ, &hCuCursorKey) != ERROR_SUCCESS)
434 {
435 RegCloseKey(hCuKey);
436 return FALSE;
437 }
438
439 hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMBO_CURSOR_SCHEME);
440 SendMessage(hDlgCtrl, CB_RESETCONTENT, 0, 0);
441 dwIndex = 0;
442
443 do
444 {
445 dwValueName = sizeof(szValueName) / sizeof(TCHAR);
446 dwValueData = sizeof(szValueData) / sizeof(TCHAR);
447 dwResult = RegEnumValue(hCuCursorKey, dwIndex, szValueName, &dwValueName, NULL, NULL, (LPBYTE)szValueData, &dwValueData);
448
449 if (dwResult == ERROR_NO_MORE_ITEMS)
450 {
451 if(!ProcessedHKLM)
452 {
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)
458 {
459 dwIndex = 0;
460 ProcessedHKLM = TRUE;
461 LoadString(hApplet, IDS_SYSTEM_SCHEME, szSystemScheme, MAX_PATH);
462 continue;
463 }
464 }
465 break;
466 }
467 if(_tcslen(szValueData) > 0)
468 {
469 TCHAR * copy = _tcsdup(szValueData);
470 if (ProcessedHKLM)
471 _tcscat(szValueName, szSystemScheme);
472 lResult = SendMessage(hDlgCtrl, CB_ADDSTRING, (WPARAM)0, (LPARAM)szValueName);
473 SendMessage(hDlgCtrl, CB_SETITEMDATA, (WPARAM)lResult, (LPARAM)copy);
474 }
475
476 dwIndex++;
477 }while(1);
478
479 RegCloseKey(hCuCursorKey);
480 RegCloseKey(hCuKey);
481
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);
485
486 return TRUE;
487 }
488
489
490 void RefreshCursorList(HWND hwndDlg)
491 {
492 TCHAR szCursorName[MAX_PATH];
493 HWND hDlgCtrl;
494 LV_ITEM listItem;
495 LV_COLUMN column;
496 INT index = 0;
497
498 hDlgCtrl = GetDlgItem(hwndDlg, IDC_LISTVIEW_CURSOR);
499 (void)ListView_DeleteAllItems(hDlgCtrl);
500
501 ZeroMemory(&column, sizeof(LV_COLUMN));
502 column.mask = LVCF_SUBITEM | LVCF_WIDTH;
503 column.iSubItem = 0;
504 column.cx = 200;
505
506 (void)ListView_InsertColumn(hDlgCtrl, 0, &column);
507
508
509 LoadString(hApplet, IDS_ARROW, szCursorName, MAX_PATH);
510
511 ZeroMemory(&listItem, sizeof(LV_ITEM));
512 listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE;
513 listItem.pszText = szCursorName;
514 listItem.state = 0;
515 listItem.iImage = -1;
516 listItem.iItem = index++;
517 listItem.lParam = 0;
518
519 (void)ListView_InsertItem(hDlgCtrl, &listItem);
520
521 LoadString(hApplet, IDS_HELP, szCursorName, MAX_PATH);
522 listItem.iItem = index++;
523 (void)ListView_InsertItem(hDlgCtrl, &listItem);
524
525 LoadString(hApplet, IDS_APPSTARTING, szCursorName, MAX_PATH);
526 listItem.iItem = index++;
527 (void)ListView_InsertItem(hDlgCtrl, &listItem);
528
529 LoadString(hApplet, IDS_WAIT, szCursorName, MAX_PATH);
530 listItem.iItem = index++;
531 (void)ListView_InsertItem(hDlgCtrl, &listItem);
532
533 LoadString(hApplet, IDS_CROSSHAIR, szCursorName, MAX_PATH);
534 listItem.iItem = index++;
535 (void)ListView_InsertItem(hDlgCtrl, &listItem);
536
537 LoadString(hApplet, IDS_IBEAM, szCursorName, MAX_PATH);
538 listItem.iItem = index++;
539 (void)ListView_InsertItem(hDlgCtrl, &listItem);
540
541 LoadString(hApplet, IDS_NWPEN, szCursorName, MAX_PATH);
542 listItem.iItem = index++;
543 (void)ListView_InsertItem(hDlgCtrl, &listItem);
544
545 LoadString(hApplet, IDS_NO, szCursorName, MAX_PATH);
546 listItem.iItem = index++;
547 (void)ListView_InsertItem(hDlgCtrl, &listItem);
548
549 LoadString(hApplet, IDS_SIZENS, szCursorName, MAX_PATH);
550 listItem.iItem = index++;
551 (void)ListView_InsertItem(hDlgCtrl, &listItem);
552
553
554 LoadString(hApplet, IDS_SIZENWSE, szCursorName, MAX_PATH);
555 listItem.iItem = index++;
556 (void)ListView_InsertItem(hDlgCtrl, &listItem);
557
558 LoadString(hApplet, IDS_SIZENESW, szCursorName, MAX_PATH);
559 listItem.iItem = index++;
560 (void)ListView_InsertItem(hDlgCtrl, &listItem);
561
562 LoadString(hApplet, IDS_SIZEALL, szCursorName, MAX_PATH);
563 listItem.iItem = index++;
564 (void)ListView_InsertItem(hDlgCtrl, &listItem);
565
566 LoadString(hApplet, IDS_UPARROW, szCursorName, MAX_PATH);
567 listItem.iItem = index++;
568 (void)ListView_InsertItem(hDlgCtrl, &listItem);
569
570 LoadString(hApplet, IDS_HAND, szCursorName, MAX_PATH);
571 listItem.iItem = index++;
572 (void)ListView_InsertItem(hDlgCtrl, &listItem);
573 }
574
575 BOOL DeleteUserCursorScheme(TCHAR * szScheme)
576 {
577 HKEY hCuKey;
578 HKEY hCuCursorKey;
579 LONG Result;
580 if (RegOpenCurrentUser(KEY_READ | KEY_SET_VALUE, &hCuKey) != ERROR_SUCCESS)
581 {
582 return FALSE;
583 }
584 if (RegOpenKeyEx(hCuKey, _T("Control Panel\\Cursors\\Schemes"), 0, KEY_READ | KEY_SET_VALUE, &hCuCursorKey) != ERROR_SUCCESS)
585 {
586 RegCloseKey(hCuKey);
587 return FALSE;
588 }
589 Result = RegDeleteValue(hCuCursorKey, szScheme);
590
591 RegCloseKey(hCuCursorKey);
592 RegCloseKey(hCuKey);
593 return (Result == ERROR_SUCCESS);
594 }
595
596 static INT_PTR CALLBACK
597 SaveSchemeProc(IN HWND hwndDlg,
598 IN UINT uMsg,
599 IN WPARAM wParam,
600 IN LPARAM lParam)
601 {
602 HWND hDlgCtrl;
603
604 switch(uMsg)
605 {
606 case WM_COMMAND:
607 {
608 if (LOWORD(wParam) == IDOK)
609 {
610 hDlgCtrl = GetDlgItem(hwndDlg, IDC_EDIT_SCHEME_NAME);
611 SendMessage(hDlgCtrl, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)g_szNewScheme);
612 EndDialog(hwndDlg, TRUE);
613 }
614 else if (LOWORD(wParam) == IDCANCEL)
615 {
616 EndDialog(hwndDlg, FALSE);
617 }
618 }
619 }
620
621 return FALSE;
622 }
623
624 BOOL BrowseCursor(TCHAR * szFileName, HWND hwndDlg)
625 {
626 //FIXME load text resources from string
627 OPENFILENAME ofn;
628 static TCHAR szFilter[] = _T("Cursors\0*.ani;*.cur\0Animated Cursors\0*.ani\0Static Cursors\0*.cur\0All Files\0*.*\0\0");
629
630 ZeroMemory(&ofn, sizeof(OPENFILENAME));
631
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;
641
642 if (GetOpenFileName(&ofn))
643 return TRUE;
644 else
645 return FALSE;
646 }
647
648
649 static INT_PTR CALLBACK
650 PointerProc(IN HWND hwndDlg,
651 IN UINT uMsg,
652 IN WPARAM wParam,
653 IN LPARAM lParam)
654 {
655 LPPSHNOTIFY lppsn;
656 TCHAR buffer[MAX_PATH];
657 TCHAR szSystemScheme[MAX_PATH];
658 HWND hDlgCtrl;
659 HDC memDC;
660 HCURSOR hCursor;
661 LRESULT lResult;
662
663 switch(uMsg)
664 {
665 case WM_INITDIALOG:
666 {
667 EnumerateCursorSchemes(hwndDlg);
668 RefreshCursorList(hwndDlg);
669 #if (WINVER >= 0x0500)
670 /* drop shadow */
671 SystemParametersInfo(SPI_GETDROPSHADOW, 0, &g_DropShadow, 0);
672 if (g_DropShadow)
673 {
674 hDlgCtrl = GetDlgItem(hwndDlg, IDC_CHECK_DROP_SHADOW);
675 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
676 }
677 #endif
678 if ((INT)wParam == IDC_LISTVIEW_CURSOR)
679 return TRUE;
680 else
681 return FALSE;
682 }
683 case WM_NOTIFY:
684 {
685 lppsn = (LPPSHNOTIFY) lParam;
686 if (lppsn->hdr.code == PSN_APPLY)
687 {
688 #if (WINVER >= 0x0500)
689 SystemParametersInfo(SPI_SETDROPSHADOW, 0, (PVOID)g_DropShadow, SPIF_SENDCHANGE);
690 #endif
691 SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
692 return TRUE;
693 }
694 break;
695 }
696 case WM_COMMAND:
697 {
698 switch(HIWORD(wParam))
699 {
700 case CBN_SELENDOK:
701 {
702 BOOL bEnable;
703 wParam = SendMessage((HWND)lParam, CB_GETCURSEL, 0, 0);
704 if(wParam == CB_ERR)
705 break;
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
709 bEnable = 0;
710 else
711 bEnable = 1;
712
713 /* delete button */
714 hDlgCtrl = GetDlgItem(hwndDlg, IDC_BUTTON_DELETE_SCHEME);
715 EnableWindow(hDlgCtrl, bEnable);
716
717 break;
718 }
719 }
720
721 switch(LOWORD(wParam))
722 {
723 case IDC_BUTTON_SAVEAS_SCHEME:
724 {
725 if(DialogBox(hApplet, MAKEINTRESOURCE(IDD_CURSOR_SCHEME_SAVEAS), hwndDlg, SaveSchemeProc))
726 {
727 //FIXME
728 //save cursor scheme
729
730 }
731 break;
732 }
733 case IDC_BUTTON_USE_DEFAULT_CURSOR:
734 {
735 hDlgCtrl = GetDlgItem(hwndDlg, IDC_LISTVIEW_CURSOR);
736 lResult = SendMessage(hDlgCtrl, CB_GETCURSEL, 0, 0);
737 if (lResult != CB_ERR)
738 {
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));
769 }
770 break;
771 }
772 case IDC_BUTTON_BROWSE_CURSOR:
773 {
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))
780 {
781
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);
812
813 //FIXME
814 //clear screen
815
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);
819 if (hCursor)
820 {
821 DrawIcon(memDC, 10, 10, (HICON)hCursor);
822 DestroyCursor(hCursor);
823 }
824 ReleaseDC(hDlgCtrl, memDC);
825 }
826 break;
827 }
828 case IDC_BUTTON_DELETE_SCHEME:
829 {
830 hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMBO_CURSOR_SCHEME);
831 wParam = SendMessage(hDlgCtrl, CB_GETCURSEL, 0, 0);
832 if(wParam == CB_ERR)
833 break;
834 SendMessage(hDlgCtrl, CB_GETLBTEXT, wParam, (LPARAM)buffer);
835 if (DeleteUserCursorScheme(buffer))
836 {
837 SendMessage(hDlgCtrl, CB_DELETESTRING, wParam, 0);
838 SendMessage(hDlgCtrl, CB_SETCURSEL, (WPARAM)0, (LPARAM)0);
839 }
840 break;
841 }
842 case IDC_CHECK_DROP_SHADOW:
843 {
844 if(IsDlgButtonChecked(hwndDlg, IDC_CHECK_DROP_SHADOW))
845 {
846 g_DropShadow = 0;
847 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, (LPARAM)0);
848 }
849 else
850 {
851 g_DropShadow = 1;
852 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
853 }
854 }
855 }
856 break;
857 }
858
859 }
860
861 return FALSE;
862 }
863
864 static INT_PTR CALLBACK
865 OptionProc(IN HWND hwndDlg,
866 IN UINT uMsg,
867 IN WPARAM wParam,
868 IN LPARAM lParam)
869 {
870 HWND hDlgCtrl;
871 LPPSHNOTIFY lppsn;
872 LRESULT lResult;
873
874 switch(uMsg)
875 {
876 case WM_INITDIALOG:
877 {
878 if (InitializeMouse())
879 {
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);
884
885 if (g_MouseSpeed)
886 {
887 hDlgCtrl = GetDlgItem(hwndDlg, IDC_CHECK_POINTER_PRECISION);
888 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
889 }
890
891 if (g_SnapToDefaultButton)
892 {
893 hDlgCtrl = GetDlgItem(hwndDlg, IDC_CHECK_SNAP_TO);
894 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
895 }
896
897 /* set mouse trail */
898 hDlgCtrl = GetDlgItem(hwndDlg, IDC_SLIDER_POINTER_TRAIL);
899 SendMessage(hDlgCtrl, TBM_SETRANGE, (WPARAM)TRUE, (LPARAM)MAKELONG(0, 5));
900 if (!g_MouseTrails)
901 EnableWindow(hDlgCtrl, FALSE);
902 else
903 SendMessage(hDlgCtrl, TBM_SETPOS, (WPARAM)TRUE, (LPARAM)g_MouseTrails-2);
904
905 if (g_ShowPointer)
906 {
907 hDlgCtrl = GetDlgItem(hwndDlg, IDC_CHECK_SHOW_POINTER);
908 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
909 }
910
911 if (g_HidePointer)
912 {
913 hDlgCtrl = GetDlgItem(hwndDlg, IDC_CHECK_HIDE_POINTER);
914 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
915 }
916
917 }
918
919 break;
920 }
921 case WM_COMMAND:
922 {
923 switch(LOWORD(wParam))
924 {
925 case IDC_CHECK_POINTER_PRECISION:
926 {
927 if(IsDlgButtonChecked(hwndDlg, IDC_CHECK_POINTER_PRECISION))
928 {
929 g_MouseSpeed = 0;
930 g_MouseThreshold1 = 0;
931 g_MouseThreshold2 = 0;
932 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, (LPARAM)0);
933 }
934 else
935 {
936 g_MouseSpeed = 1;
937 g_MouseThreshold1 = 6;
938 g_MouseThreshold2 = 10;
939 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
940 }
941 break;
942 }
943 case IDC_CHECK_SNAP_TO:
944 {
945 if(IsDlgButtonChecked(hwndDlg, IDC_CHECK_SNAP_TO))
946 {
947 g_SnapToDefaultButton = 0;
948 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, (LPARAM)0);
949 }
950 else
951 {
952 g_SnapToDefaultButton = 1;
953 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
954 }
955 break;
956 }
957 case IDC_CHECK_POINTER_TRAIL:
958 {
959 hDlgCtrl = GetDlgItem(hwndDlg, IDC_SLIDER_POINTER_TRAIL);
960 if(IsDlgButtonChecked(hwndDlg, IDC_CHECK_POINTER_TRAIL))
961 {
962 g_MouseTrails = 0;
963 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, (LPARAM)0);
964 EnableWindow(hDlgCtrl, FALSE);
965 }
966 else
967 {
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;
971 }
972 break;
973 }
974 case IDC_CHECK_SHOW_POINTER:
975 {
976 if(IsDlgButtonChecked(hwndDlg, IDC_CHECK_SHOW_POINTER))
977 {
978 g_ShowPointer = 0;
979 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, (LPARAM)0);
980 }
981 else
982 {
983 g_ShowPointer = 1;
984 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
985 }
986 break;
987 }
988 case IDC_CHECK_HIDE_POINTER:
989 {
990 if(IsDlgButtonChecked(hwndDlg, IDC_CHECK_HIDE_POINTER))
991 {
992 g_HidePointer = 0;
993 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_UNCHECKED, (LPARAM)0);
994 }
995 else
996 {
997 g_HidePointer = 1;
998 SendMessage((HWND)lParam, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
999 }
1000 break;
1001 }
1002 }
1003 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1004 break;
1005 }
1006 case WM_NOTIFY:
1007 {
1008 lppsn = (LPPSHNOTIFY) lParam;
1009 if (lppsn->hdr.code == PSN_APPLY)
1010 {
1011 /* set snap to default button */
1012 SystemParametersInfo(SPI_SETSNAPTODEFBUTTON, g_SnapToDefaultButton, 0, SPIF_SENDCHANGE);
1013
1014 /* set mouse trails */
1015 if(IsDlgButtonChecked(hwndDlg, IDC_CHECK_POINTER_TRAIL))
1016 {
1017 hDlgCtrl = GetDlgItem(hwndDlg, IDC_SLIDER_POINTER_TRAIL);
1018 lResult = SendMessage(hDlgCtrl, TBM_GETPOS, 0, 0);
1019 }
1020 else
1021 lResult = 0;
1022
1023 SystemParametersInfo(SPI_SETMOUSETRAILS, lResult, 0, SPIF_SENDCHANGE);
1024
1025 #if (WINVER >= 0x0500)
1026 //FIXME
1027 //pointer precision
1028 //SPI_SETMOUSE?
1029
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);
1034
1035
1036 /* hide pointer while typing */
1037 SystemParametersInfo(SPI_SETMOUSEVANISH, 0, (PVOID)g_HidePointer, SPIF_SENDCHANGE);
1038
1039 /* show pointer with Ctrl-Key */
1040 SystemParametersInfo(SPI_SETMOUSESONAR, 0, (PVOID)g_ShowPointer, SPIF_SENDCHANGE);
1041 #endif
1042
1043 SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
1044 return TRUE;
1045 }
1046
1047 }
1048
1049 }
1050 return FALSE;
1051 }
1052
1053 static void ShowDialogWheelControls(HWND hwndDlg)
1054 {
1055 HWND hDlgCtrl;
1056
1057 if (g_WheelScrollLines != -1)
1058 {
1059 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_WHEEL_SCROLL_LINES);
1060 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
1061
1062 hDlgCtrl = GetDlgItem(hwndDlg, IDC_EDIT_WHEEL_SCROLL_LINES);
1063 EnableWindow(hDlgCtrl, TRUE);
1064
1065 hDlgCtrl = GetDlgItem(hwndDlg, IDC_UPDOWN_WHEEL_SCROLL_LINES);
1066 EnableWindow(hDlgCtrl, TRUE);
1067
1068 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_WHEEL_SCROLL_PAGE);
1069 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, (LPARAM)0);
1070 }
1071 else
1072 {
1073 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_WHEEL_SCROLL_LINES);
1074 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_UNCHECKED, (LPARAM)0);
1075
1076 hDlgCtrl = GetDlgItem(hwndDlg, IDC_EDIT_WHEEL_SCROLL_LINES);
1077 EnableWindow(hDlgCtrl, FALSE);
1078
1079 hDlgCtrl = GetDlgItem(hwndDlg, IDC_UPDOWN_WHEEL_SCROLL_LINES);
1080 EnableWindow(hDlgCtrl, TRUE);
1081
1082 hDlgCtrl = GetDlgItem(hwndDlg, IDC_RADIO_WHEEL_SCROLL_PAGE);
1083 SendMessage(hDlgCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, (LPARAM)0);
1084 }
1085
1086 }
1087
1088 static INT_PTR CALLBACK
1089 WheelProc(IN HWND hwndDlg,
1090 IN UINT uMsg,
1091 IN WPARAM wParam,
1092 IN LPARAM lParam)
1093 {
1094 HWND hDlgCtrl;
1095 WCHAR buffer[MAX_PATH];
1096 LPPSHNOTIFY lppsn;
1097
1098 switch(uMsg)
1099 {
1100 case WM_INITDIALOG:
1101 {
1102 ShowDialogWheelControls(hwndDlg);
1103 if (g_WheelScrollLines != UINT_MAX)
1104 {
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);
1108 }
1109 return TRUE;
1110 }
1111 case WM_COMMAND:
1112 {
1113 switch(LOWORD(wParam))
1114 {
1115 case IDC_RADIO_WHEEL_SCROLL_LINES:
1116 {
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);
1121 break;
1122 }
1123 case IDC_RADIO_WHEEL_SCROLL_PAGE:
1124 {
1125 g_WheelScrollLines = -1;
1126 ShowDialogWheelControls(hwndDlg);
1127 break;
1128 }
1129 }
1130 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
1131 break;
1132 }
1133 case WM_NOTIFY:
1134 {
1135 lppsn = (LPPSHNOTIFY) lParam;
1136 if (lppsn->hdr.code == PSN_APPLY)
1137 {
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);
1142
1143 SetWindowLong(hwndDlg, DWL_MSGRESULT, PSNRET_NOERROR);
1144 return TRUE;
1145 }
1146
1147 }
1148
1149 }
1150
1151 return FALSE;
1152 }
1153
1154 LONG APIENTRY
1155 MouseApplet(HWND hwnd, UINT uMsg, LONG lParam1, LONG lParam2)
1156 {
1157 PROPSHEETPAGE psp[5];
1158 PROPSHEETHEADER psh;
1159 TCHAR Caption[256];
1160
1161 LoadString(hApplet, IDS_CPLNAME_1, Caption, sizeof(Caption) / sizeof(TCHAR));
1162
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);
1171 psh.nStartPage = 0;
1172 psh.ppsp = psp;
1173
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);
1180 }
1181
1182 /* EOF */