Synchronize with trunk r58528.
[reactos.git] / dll / cpl / access / mouse.c
1 /*
2 * PROJECT: ReactOS Accessibility Control Panel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/access/mouse.c
5 * PURPOSE: Mouse-related accessibility settings
6 * COPYRIGHT: Copyright 2004 Johannes Anderwald (j_anderw@sbox.tugraz.at)
7 * Copyright 2007 Eric Kohl
8 */
9
10 #include "access.h"
11
12
13 #define SPEEDTICKS 9
14 #define ACCELTICKS 9
15
16 static UINT nSpeedArray[SPEEDTICKS] = {10, 20, 30, 40, 60, 80, 120, 180, 360};
17
18
19 INT_PTR CALLBACK
20 MouseKeysDlgProc(HWND hwndDlg,
21 UINT uMsg,
22 WPARAM wParam,
23 LPARAM lParam)
24 {
25 PGLOBAL_DATA pGlobalData;
26 INT i;
27
28 pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
29
30 switch (uMsg)
31 {
32 case WM_INITDIALOG:
33 pGlobalData = (PGLOBAL_DATA)lParam;
34 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
35
36 CheckDlgButton(hwndDlg,
37 IDC_MOUSEKEYS_ACTIVATE_CHECK,
38 pGlobalData->mouseKeys.dwFlags & MKF_HOTKEYACTIVE ? BST_CHECKED : BST_UNCHECKED);
39
40 /* Set the number of ticks for the speed trackbar */
41 SendDlgItemMessage(hwndDlg, IDC_MOUSEKEYS_SPEED_TRACK, TBM_SETRANGE,
42 TRUE, MAKELONG(0, SPEEDTICKS - 1));
43
44 /* Calculate the matching tick */
45 for (i = 0; i < SPEEDTICKS; i++)
46 {
47 if (pGlobalData->mouseKeys.iMaxSpeed <= nSpeedArray[i])
48 break;
49 }
50
51 /* Set the thumb */
52 SendDlgItemMessage(hwndDlg, IDC_MOUSEKEYS_SPEED_TRACK, TBM_SETPOS, TRUE, i);
53
54 /* Set the number of ticks for the accelleration trackbar */
55 SendDlgItemMessage(hwndDlg, IDC_MOUSEKEYS_ACCEL_TRACK, TBM_SETRANGE,
56 TRUE, MAKELONG(0, ACCELTICKS - 1));
57
58 /* Calculate the matching tick */
59 i = (ACCELTICKS + 1) - pGlobalData->mouseKeys.iTimeToMaxSpeed / 500;
60 if (i > ACCELTICKS - 1)
61 i = ACCELTICKS - 1;
62
63 if (i < 0)
64 i = 0;
65
66 /* Set the thumb */
67 SendDlgItemMessage(hwndDlg, IDC_MOUSEKEYS_ACCEL_TRACK, TBM_SETPOS, TRUE, i);
68
69 CheckDlgButton(hwndDlg,
70 IDC_MOUSEKEYS_SPEED_CHECK,
71 pGlobalData->mouseKeys.dwFlags & MKF_MODIFIERS ? BST_CHECKED : BST_UNCHECKED);
72
73 CheckRadioButton(hwndDlg,
74 IDC_MOUSEKEYS_ON_RADIO,
75 IDC_MOUSEKEYS_OFF_RADIO,
76 pGlobalData->mouseKeys.dwFlags & MKF_REPLACENUMBERS ? IDC_MOUSEKEYS_ON_RADIO : IDC_MOUSEKEYS_OFF_RADIO);
77
78 CheckDlgButton(hwndDlg,
79 IDC_MOUSEKEYS_STATUS_CHECK,
80 pGlobalData->mouseKeys.dwFlags & MKF_INDICATOR ? BST_CHECKED : BST_UNCHECKED);
81 break;
82
83 case WM_HSCROLL:
84 switch (GetWindowLongPtr((HWND) lParam, GWL_ID))
85 {
86 case IDC_MOUSEKEYS_SPEED_TRACK:
87 i = SendDlgItemMessage(hwndDlg, IDC_MOUSEKEYS_SPEED_TRACK, TBM_GETPOS, 0, 0);
88 if (i >= 0 && i < SPEEDTICKS)
89 pGlobalData->mouseKeys.iMaxSpeed = nSpeedArray[i];
90 break;
91
92 case IDC_MOUSEKEYS_ACCEL_TRACK:
93 i = SendDlgItemMessage(hwndDlg, IDC_MOUSEKEYS_ACCEL_TRACK, TBM_GETPOS, 0, 0);
94 if (i >= 0 && i < ACCELTICKS)
95 pGlobalData->mouseKeys.iTimeToMaxSpeed = (ACCELTICKS + 1 - i) * 500;
96 break;
97 }
98 break;
99
100 case WM_COMMAND:
101 switch (LOWORD(wParam))
102 {
103 case IDC_MOUSEKEYS_ACTIVATE_CHECK:
104 pGlobalData->mouseKeys.dwFlags ^= MKF_HOTKEYACTIVE;
105 break;
106
107 case IDC_MOUSEKEYS_SPEED_CHECK:
108 pGlobalData->mouseKeys.dwFlags ^= MKF_MODIFIERS;
109 break;
110
111 case IDC_MOUSEKEYS_ON_RADIO:
112 pGlobalData->mouseKeys.dwFlags |= MKF_REPLACENUMBERS;
113 break;
114
115 case IDC_MOUSEKEYS_OFF_RADIO:
116 pGlobalData->mouseKeys.dwFlags &= ~MKF_REPLACENUMBERS;
117 break;
118
119 case IDC_MOUSEKEYS_STATUS_CHECK:
120 pGlobalData->mouseKeys.dwFlags ^= MKF_INDICATOR;
121 break;
122
123 case IDOK:
124 EndDialog(hwndDlg, TRUE);
125 break;
126
127 case IDCANCEL:
128 EndDialog(hwndDlg, FALSE);
129 break;
130
131 default:
132 break;
133 }
134 break;
135 }
136
137 return FALSE;
138 }
139
140
141 /* Property page dialog callback */
142 INT_PTR CALLBACK
143 MousePageProc(HWND hwndDlg,
144 UINT uMsg,
145 WPARAM wParam,
146 LPARAM lParam)
147 {
148 PGLOBAL_DATA pGlobalData;
149 LPPSHNOTIFY lppsn;
150
151 pGlobalData = (PGLOBAL_DATA)GetWindowLongPtr(hwndDlg, DWLP_USER);
152
153 switch (uMsg)
154 {
155 case WM_INITDIALOG:
156 pGlobalData = (PGLOBAL_DATA)((LPPROPSHEETPAGE)lParam)->lParam;
157 if (pGlobalData == NULL)
158 return FALSE;
159
160 SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pGlobalData);
161
162 /* Set the checkbox */
163 CheckDlgButton(hwndDlg,
164 IDC_MOUSE_BOX,
165 pGlobalData->mouseKeys.dwFlags & MKF_MOUSEKEYSON ? BST_CHECKED : BST_UNCHECKED);
166 return TRUE;
167
168
169 case WM_COMMAND:
170 switch (LOWORD(wParam))
171 {
172 case IDC_MOUSE_BOX:
173 pGlobalData->mouseKeys.dwFlags ^= MKF_MOUSEKEYSON;
174 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
175 break;
176
177 case IDC_MOUSE_BUTTON:
178 if (DialogBoxParam(hApplet,
179 MAKEINTRESOURCE(IDD_MOUSEKEYSOPTIONS),
180 hwndDlg,
181 (DLGPROC)MouseKeysDlgProc,
182 (LPARAM)pGlobalData))
183 PropSheet_Changed(GetParent(hwndDlg), hwndDlg);
184 break;
185
186 default:
187 break;
188 }
189 break;
190
191 case WM_NOTIFY:
192 lppsn = (LPPSHNOTIFY)lParam;
193 if (lppsn->hdr.code == PSN_APPLY)
194 {
195 SystemParametersInfo(SPI_SETMOUSEKEYS,
196 sizeof(MOUSEKEYS),
197 &pGlobalData->mouseKeys,
198 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE /*0*/);
199 return TRUE;
200 }
201 break;
202 }
203
204 return FALSE;
205 }