* Copyright 2019, Haiku, Inc.
* Distributed under the terms of the MIT License.
*
* Author:
* Preetpal Kaur <preetpalok123@gmail.com>
*/
#include "MouseSettings.h"
#include <File.h>
#include <FindDirectory.h>
#include <Path.h>
#include <String.h>
#include <View.h>
#include <stdio.h>
MouseSettings::MouseSettings(BString name)
:
fName(name)
{
if (_RetrieveSettings() != B_OK)
Defaults();
fOriginalSettings = fSettings;
fOriginalMode = fMode;
fOriginalFocusFollowsMouseMode = fFocusFollowsMouseMode;
fOriginalAcceptFirstClick = fAcceptFirstClick;
}
MouseSettings::~MouseSettings()
{
}
status_t
MouseSettings::_RetrieveSettings()
{
if (get_mouse_map(fName, &fSettings.map) != B_OK)
return B_ERROR;
if (get_click_speed(fName, &fSettings.click_speed) != B_OK)
return B_ERROR;
if (get_mouse_speed(fName, &fSettings.accel.speed) != B_OK)
return B_ERROR;
if (get_mouse_acceleration(fName, &fSettings.accel.accel_factor) != B_OK)
return B_ERROR;
if (get_mouse_type(fName, &fSettings.type) != B_OK)
return B_ERROR;
fMode = mouse_mode();
fFocusFollowsMouseMode = focus_follows_mouse_mode();
fAcceptFirstClick = accept_first_click();
return B_OK;
}
void
MouseSettings::Defaults()
{
SetClickSpeed(kDefaultClickSpeed);
SetMouseSpeed(kDefaultMouseSpeed);
SetMouseType(kDefaultMouseType);
SetAccelerationFactor(kDefaultAccelerationFactor);
SetMouseMode(B_NORMAL_MOUSE);
SetFocusFollowsMouseMode(B_NORMAL_FOCUS_FOLLOWS_MOUSE);
SetAcceptFirstClick(kDefaultAcceptFirstClick);
mouse_map map;
for (int i = 0; i < B_MAX_MOUSE_BUTTONS; i++)
map.button[i] = B_MOUSE_BUTTON(i + 1);
SetMapping(map);
}
bool
MouseSettings::IsDefaultable() const
{
return fSettings.click_speed != kDefaultClickSpeed
|| fSettings.accel.speed != kDefaultMouseSpeed
|| fSettings.type != kDefaultMouseType
|| fSettings.accel.accel_factor != kDefaultAccelerationFactor
|| fMode != B_NORMAL_MOUSE
|| fFocusFollowsMouseMode != B_NORMAL_FOCUS_FOLLOWS_MOUSE
|| fAcceptFirstClick != kDefaultAcceptFirstClick
|| fSettings.map.button[0] != B_PRIMARY_MOUSE_BUTTON
|| fSettings.map.button[1] != B_SECONDARY_MOUSE_BUTTON
|| fSettings.map.button[2] != B_TERTIARY_MOUSE_BUTTON
|| fSettings.map.button[3] != B_MOUSE_BUTTON(4)
|| fSettings.map.button[4] != B_MOUSE_BUTTON(5)
|| fSettings.map.button[5] != B_MOUSE_BUTTON(6);
}
void
MouseSettings::Revert()
{
SetClickSpeed(fOriginalSettings.click_speed);
SetMouseSpeed(fOriginalSettings.accel.speed);
SetMouseType(fOriginalSettings.type);
SetAccelerationFactor(fOriginalSettings.accel.accel_factor);
SetMouseMode(fOriginalMode);
SetFocusFollowsMouseMode(fOriginalFocusFollowsMouseMode);
SetAcceptFirstClick(fOriginalAcceptFirstClick);
SetMapping(fOriginalSettings.map);
}
bool
MouseSettings::IsRevertable() const
{
return fSettings.click_speed != fOriginalSettings.click_speed
|| fSettings.accel.speed != fOriginalSettings.accel.speed
|| fSettings.type != fOriginalSettings.type
|| fSettings.accel.accel_factor != fOriginalSettings.accel.accel_factor
|| fMode != fOriginalMode
|| fFocusFollowsMouseMode != fOriginalFocusFollowsMouseMode
|| fAcceptFirstClick != fOriginalAcceptFirstClick
|| fSettings.map.button[0] != fOriginalSettings.map.button[0]
|| fSettings.map.button[1] != fOriginalSettings.map.button[1]
|| fSettings.map.button[2] != fOriginalSettings.map.button[2]
|| fSettings.map.button[3] != fOriginalSettings.map.button[3]
|| fSettings.map.button[4] != fOriginalSettings.map.button[4]
|| fSettings.map.button[5] != fOriginalSettings.map.button[5];
}
void
MouseSettings::SetMouseType(int32 type)
{
if (set_mouse_type(fName, type) == B_OK)
fSettings.type = type;
}
bigtime_t
MouseSettings::ClickSpeed() const
{
return fSettings.click_speed;
}
void
MouseSettings::SetClickSpeed(bigtime_t clickSpeed)
{
if (set_click_speed(fName, clickSpeed) == B_OK)
fSettings.click_speed = clickSpeed;
}
void
MouseSettings::SetMouseSpeed(int32 speed)
{
if (set_mouse_speed(fName, speed) == B_OK)
fSettings.accel.speed = speed;
}
void
MouseSettings::SetAccelerationFactor(int32 factor)
{
if (set_mouse_acceleration(fName, factor) == B_OK)
fSettings.accel.accel_factor = factor;
}
uint32
MouseSettings::Mapping(int32 index) const
{
return fSettings.map.button[index];
}
void
MouseSettings::Mapping(mouse_map& map) const
{
map = fSettings.map;
}
void
MouseSettings::SetMapping(int32 index, uint32 button)
{
fSettings.map.button[index] = button;
set_mouse_map(fName, &fSettings.map);
}
void
MouseSettings::SetMapping(mouse_map& map)
{
if (set_mouse_map(fName, &map) == B_OK)
fSettings.map = map;
}
void
MouseSettings::SetMouseMode(mode_mouse mode)
{
set_mouse_mode(mode);
fMode = mode;
}
void
MouseSettings::SetFocusFollowsMouseMode(mode_focus_follows_mouse mode)
{
set_focus_follows_mouse_mode(mode);
fFocusFollowsMouseMode = mode;
}
void
MouseSettings::SetAcceptFirstClick(bool accept_first_click)
{
set_accept_first_click(accept_first_click);
fAcceptFirstClick = accept_first_click;
}
mouse_settings*
MouseSettings::GetSettings()
{
return &fSettings;
}
MultipleMouseSettings::MultipleMouseSettings()
{
}
MultipleMouseSettings::~MultipleMouseSettings()
{
std::map<BString, MouseSettings*>::iterator itr;
for (itr = fMouseSettingsObject.begin(); itr != fMouseSettingsObject.end(); ++itr)
delete itr->second;
}
MouseSettings*
MultipleMouseSettings::AddMouseSettings(BString mouse_name)
{
std::map<BString, MouseSettings*>::iterator itr;
itr = fMouseSettingsObject.find(mouse_name);
if (itr != fMouseSettingsObject.end())
return itr->second;
MouseSettings* settings = new(std::nothrow) MouseSettings(mouse_name);
if (settings == NULL)
return NULL;
fMouseSettingsObject.insert(
std::pair<BString, MouseSettings*>(mouse_name, settings));
return settings;
}