1 /*
2 * Copyright 2019, Haiku, Inc.
3 * Distributed under the terms of the MIT License.
4 *
5 * Author:
6 * Preetpal Kaur <preetpalok123@gmail.com>
7 */
8
9
10 #include "MouseSettings.h"
11
12 #include <File.h>
13 #include <FindDirectory.h>
14 #include <Path.h>
15 #include <String.h>
16 #include <View.h>
17
18 #include <stdio.h>
19
20
MouseSettings(BString name)21 MouseSettings::MouseSettings(BString name)
22 :
23 fName(name)
24 {
25 if (_RetrieveSettings() != B_OK)
26 Defaults();
27
28 fOriginalSettings = fSettings;
29 fOriginalMode = fMode;
30 fOriginalFocusFollowsMouseMode = fFocusFollowsMouseMode;
31 fOriginalAcceptFirstClick = fAcceptFirstClick;
32 }
33
34
~MouseSettings()35 MouseSettings::~MouseSettings()
36 {
37 }
38
39
40 status_t
_RetrieveSettings()41 MouseSettings::_RetrieveSettings()
42 {
43 // retrieve current values
44 if (get_mouse_map(fName, &fSettings.map) != B_OK)
45 return B_ERROR;
46 if (get_click_speed(fName, &fSettings.click_speed) != B_OK)
47 return B_ERROR;
48 if (get_mouse_speed(fName, &fSettings.accel.speed) != B_OK)
49 return B_ERROR;
50 if (get_mouse_acceleration(fName, &fSettings.accel.accel_factor) != B_OK)
51 return B_ERROR;
52 if (get_mouse_type(fName, &fSettings.type) != B_OK)
53 return B_ERROR;
54
55 fMode = mouse_mode();
56 fFocusFollowsMouseMode = focus_follows_mouse_mode();
57 fAcceptFirstClick = accept_first_click();
58
59 return B_OK;
60 }
61
62
63 // Resets the settings to the system defaults
64 void
Defaults()65 MouseSettings::Defaults()
66 {
67 SetClickSpeed(kDefaultClickSpeed);
68 SetMouseSpeed(kDefaultMouseSpeed);
69 SetMouseType(kDefaultMouseType);
70 SetAccelerationFactor(kDefaultAccelerationFactor);
71 SetMouseMode(B_NORMAL_MOUSE);
72 SetFocusFollowsMouseMode(B_NORMAL_FOCUS_FOLLOWS_MOUSE);
73 SetAcceptFirstClick(kDefaultAcceptFirstClick);
74
75 mouse_map map;
76 for (int i = 0; i < B_MAX_MOUSE_BUTTONS; i++)
77 map.button[i] = B_MOUSE_BUTTON(i + 1);
78 SetMapping(map);
79 }
80
81
82 // Checks if the settings are different then the system defaults
83 bool
IsDefaultable() const84 MouseSettings::IsDefaultable() const
85 {
86 return fSettings.click_speed != kDefaultClickSpeed
87 || fSettings.accel.speed != kDefaultMouseSpeed
88 || fSettings.type != kDefaultMouseType
89 || fSettings.accel.accel_factor != kDefaultAccelerationFactor
90 || fMode != B_NORMAL_MOUSE
91 || fFocusFollowsMouseMode != B_NORMAL_FOCUS_FOLLOWS_MOUSE
92 || fAcceptFirstClick != kDefaultAcceptFirstClick
93 || fSettings.map.button[0] != B_PRIMARY_MOUSE_BUTTON
94 || fSettings.map.button[1] != B_SECONDARY_MOUSE_BUTTON
95 || fSettings.map.button[2] != B_TERTIARY_MOUSE_BUTTON
96 || fSettings.map.button[3] != B_MOUSE_BUTTON(4)
97 || fSettings.map.button[4] != B_MOUSE_BUTTON(5)
98 || fSettings.map.button[5] != B_MOUSE_BUTTON(6);
99 }
100
101
102 // Reverts to the active settings at program startup
103 void
Revert()104 MouseSettings::Revert()
105 {
106 SetClickSpeed(fOriginalSettings.click_speed);
107 SetMouseSpeed(fOriginalSettings.accel.speed);
108 SetMouseType(fOriginalSettings.type);
109 SetAccelerationFactor(fOriginalSettings.accel.accel_factor);
110 SetMouseMode(fOriginalMode);
111 SetFocusFollowsMouseMode(fOriginalFocusFollowsMouseMode);
112 SetAcceptFirstClick(fOriginalAcceptFirstClick);
113
114 SetMapping(fOriginalSettings.map);
115 }
116
117
118 // Checks if the settings are different then the original settings
119 bool
IsRevertable() const120 MouseSettings::IsRevertable() const
121 {
122 return fSettings.click_speed != fOriginalSettings.click_speed
123 || fSettings.accel.speed != fOriginalSettings.accel.speed
124 || fSettings.type != fOriginalSettings.type
125 || fSettings.accel.accel_factor != fOriginalSettings.accel.accel_factor
126 || fMode != fOriginalMode
127 || fFocusFollowsMouseMode != fOriginalFocusFollowsMouseMode
128 || fAcceptFirstClick != fOriginalAcceptFirstClick
129 || fSettings.map.button[0] != fOriginalSettings.map.button[0]
130 || fSettings.map.button[1] != fOriginalSettings.map.button[1]
131 || fSettings.map.button[2] != fOriginalSettings.map.button[2]
132 || fSettings.map.button[3] != fOriginalSettings.map.button[3]
133 || fSettings.map.button[4] != fOriginalSettings.map.button[4]
134 || fSettings.map.button[5] != fOriginalSettings.map.button[5];
135 }
136
137
138 void
SetMouseType(int32 type)139 MouseSettings::SetMouseType(int32 type)
140 {
141 if (set_mouse_type(fName, type) == B_OK)
142 fSettings.type = type;
143 }
144
145
146 bigtime_t
ClickSpeed() const147 MouseSettings::ClickSpeed() const
148 {
149 return fSettings.click_speed;
150 }
151
152
153 void
SetClickSpeed(bigtime_t clickSpeed)154 MouseSettings::SetClickSpeed(bigtime_t clickSpeed)
155 {
156 if (set_click_speed(fName, clickSpeed) == B_OK)
157 fSettings.click_speed = clickSpeed;
158 }
159
160
161 void
SetMouseSpeed(int32 speed)162 MouseSettings::SetMouseSpeed(int32 speed)
163 {
164 if (set_mouse_speed(fName, speed) == B_OK)
165 fSettings.accel.speed = speed;
166 }
167
168
169 void
SetAccelerationFactor(int32 factor)170 MouseSettings::SetAccelerationFactor(int32 factor)
171 {
172 if (set_mouse_acceleration(fName, factor) == B_OK)
173 fSettings.accel.accel_factor = factor;
174 }
175
176
177 uint32
Mapping(int32 index) const178 MouseSettings::Mapping(int32 index) const
179 {
180 return fSettings.map.button[index];
181 }
182
183
184 void
Mapping(mouse_map & map) const185 MouseSettings::Mapping(mouse_map& map) const
186 {
187 map = fSettings.map;
188 }
189
190
191 void
SetMapping(int32 index,uint32 button)192 MouseSettings::SetMapping(int32 index, uint32 button)
193 {
194 fSettings.map.button[index] = button;
195 set_mouse_map(fName, &fSettings.map);
196 }
197
198
199 void
SetMapping(mouse_map & map)200 MouseSettings::SetMapping(mouse_map& map)
201 {
202 if (set_mouse_map(fName, &map) == B_OK)
203 fSettings.map = map;
204 }
205
206
207 void
SetMouseMode(mode_mouse mode)208 MouseSettings::SetMouseMode(mode_mouse mode)
209 {
210 set_mouse_mode(mode);
211 fMode = mode;
212 }
213
214
215 void
SetFocusFollowsMouseMode(mode_focus_follows_mouse mode)216 MouseSettings::SetFocusFollowsMouseMode(mode_focus_follows_mouse mode)
217 {
218 set_focus_follows_mouse_mode(mode);
219 fFocusFollowsMouseMode = mode;
220 }
221
222
223 void
SetAcceptFirstClick(bool accept_first_click)224 MouseSettings::SetAcceptFirstClick(bool accept_first_click)
225 {
226 set_accept_first_click(accept_first_click);
227 fAcceptFirstClick = accept_first_click;
228 }
229
230
231 mouse_settings*
GetSettings()232 MouseSettings::GetSettings()
233 {
234 return &fSettings;
235 }
236
237
MultipleMouseSettings()238 MultipleMouseSettings::MultipleMouseSettings()
239 {
240 }
241
242
~MultipleMouseSettings()243 MultipleMouseSettings::~MultipleMouseSettings()
244 {
245 std::map<BString, MouseSettings*>::iterator itr;
246 for (itr = fMouseSettingsObject.begin(); itr != fMouseSettingsObject.end(); ++itr)
247 delete itr->second;
248 }
249
250
251 MouseSettings*
AddMouseSettings(BString mouse_name)252 MultipleMouseSettings::AddMouseSettings(BString mouse_name)
253 {
254 std::map<BString, MouseSettings*>::iterator itr;
255 itr = fMouseSettingsObject.find(mouse_name);
256
257 if (itr != fMouseSettingsObject.end())
258 return itr->second;
259
260 MouseSettings* settings = new(std::nothrow) MouseSettings(mouse_name);
261 if (settings == NULL)
262 return NULL;
263
264 fMouseSettingsObject.insert(
265 std::pair<BString, MouseSettings*>(mouse_name, settings));
266 return settings;
267 }
268