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