Mouse Preferences: store settings for multiple mouses.
Use a BMessage for the mouse settings. Store an array of mouse_setting and an array of names for the corresponding mouses. The input preferences can load the settings in both the old and new format. If in the old format, the settings are applied to all mouses. In this commit, input_server is not modified yet to use the new settings format, leading to unusable mouse. Change-Id: I37dd27cfa3ac55c6956cc4fb7fc8fabc85a59448 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2953 Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
committed by
Adrien Destugues
parent
8f5c207181
commit
82430c4028
@@ -36,21 +36,17 @@
|
|||||||
#undef B_TRANSLATION_CONTEXT
|
#undef B_TRANSLATION_CONTEXT
|
||||||
#define B_TRANSLATION_CONTEXT "InputMouse"
|
#define B_TRANSLATION_CONTEXT "InputMouse"
|
||||||
|
|
||||||
static const bigtime_t kDefaultClickSpeed = 500000;
|
|
||||||
static const int32 kDefaultMouseSpeed = 65536;
|
|
||||||
static const int32 kDefaultMouseType = 3; // 3 button mouse
|
|
||||||
static const int32 kDefaultAccelerationFactor = 65536;
|
|
||||||
static const bool kDefaultAcceptFirstClick = true;
|
|
||||||
|
|
||||||
|
InputMouse::InputMouse(BInputDevice* dev, MouseSettings* settings)
|
||||||
InputMouse::InputMouse(BInputDevice* dev)
|
|
||||||
: BView("InputMouse", B_WILL_DRAW)
|
: BView("InputMouse", B_WILL_DRAW)
|
||||||
{
|
{
|
||||||
fSettingsView = new SettingsView(fSettings);
|
fSettings = settings;
|
||||||
|
|
||||||
|
fSettingsView = new SettingsView(*fSettings);
|
||||||
|
|
||||||
fDefaultsButton = new BButton(B_TRANSLATE("Defaults"),
|
fDefaultsButton = new BButton(B_TRANSLATE("Defaults"),
|
||||||
new BMessage(kMsgDefaults));
|
new BMessage(kMsgDefaults));
|
||||||
fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
|
fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
|
||||||
|
|
||||||
fRevertButton = new BButton(B_TRANSLATE("Revert"),
|
fRevertButton = new BButton(B_TRANSLATE("Revert"),
|
||||||
new BMessage(kMsgRevert));
|
new BMessage(kMsgRevert));
|
||||||
@@ -76,19 +72,19 @@ InputMouse::MessageReceived(BMessage* message)
|
|||||||
{
|
{
|
||||||
switch (message->what) {
|
switch (message->what) {
|
||||||
case kMsgDefaults: {
|
case kMsgDefaults: {
|
||||||
fSettings.Defaults();
|
fSettings->Defaults();
|
||||||
fSettingsView->UpdateFromSettings();
|
fSettingsView->UpdateFromSettings();
|
||||||
|
|
||||||
fDefaultsButton->SetEnabled(false);
|
fDefaultsButton->SetEnabled(false);
|
||||||
fRevertButton->SetEnabled(fSettings.IsRevertable());
|
fRevertButton->SetEnabled(fSettings->IsRevertable());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case kMsgRevert: {
|
case kMsgRevert: {
|
||||||
fSettings.Revert();
|
fSettings->Revert();
|
||||||
fSettingsView->UpdateFromSettings();
|
fSettingsView->UpdateFromSettings();
|
||||||
|
|
||||||
fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
|
fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
|
||||||
fRevertButton->SetEnabled(false);
|
fRevertButton->SetEnabled(false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -98,10 +94,10 @@ InputMouse::MessageReceived(BMessage* message)
|
|||||||
{
|
{
|
||||||
int32 type;
|
int32 type;
|
||||||
if (message->FindInt32("be:value", &type) == B_OK) {
|
if (message->FindInt32("be:value", &type) == B_OK) {
|
||||||
fSettings.SetMouseType(type);
|
fSettings->SetMouseType(type);
|
||||||
fSettingsView->SetMouseType(type);
|
fSettingsView->SetMouseType(type);
|
||||||
fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
|
fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
|
||||||
fRevertButton->SetEnabled(fSettings.IsRevertable());
|
fRevertButton->SetEnabled(fSettings->IsRevertable());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -110,9 +106,9 @@ InputMouse::MessageReceived(BMessage* message)
|
|||||||
{
|
{
|
||||||
int32 mode;
|
int32 mode;
|
||||||
if (message->FindInt32("mode", &mode) == B_OK) {
|
if (message->FindInt32("mode", &mode) == B_OK) {
|
||||||
fSettings.SetMouseMode((mode_mouse)mode);
|
fSettings->SetMouseMode((mode_mouse)mode);
|
||||||
fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
|
fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
|
||||||
fRevertButton->SetEnabled(fSettings.IsRevertable());
|
fRevertButton->SetEnabled(fSettings->IsRevertable());
|
||||||
fSettingsView->fFocusFollowsMouseMenu->SetEnabled(
|
fSettingsView->fFocusFollowsMouseMenu->SetEnabled(
|
||||||
mode == B_FOCUS_FOLLOWS_MOUSE);
|
mode == B_FOCUS_FOLLOWS_MOUSE);
|
||||||
fSettingsView->fAcceptFirstClickBox->SetEnabled(
|
fSettingsView->fAcceptFirstClickBox->SetEnabled(
|
||||||
@@ -126,10 +122,10 @@ InputMouse::MessageReceived(BMessage* message)
|
|||||||
int32 mode;
|
int32 mode;
|
||||||
if (message->FindInt32("mode_focus_follows_mouse", &mode)
|
if (message->FindInt32("mode_focus_follows_mouse", &mode)
|
||||||
== B_OK) {
|
== B_OK) {
|
||||||
fSettings.SetFocusFollowsMouseMode(
|
fSettings->SetFocusFollowsMouseMode(
|
||||||
(mode_focus_follows_mouse)mode);
|
(mode_focus_follows_mouse)mode);
|
||||||
fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
|
fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
|
||||||
fRevertButton->SetEnabled(fSettings.IsRevertable());
|
fRevertButton->SetEnabled(fSettings->IsRevertable());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -145,9 +141,9 @@ InputMouse::MessageReceived(BMessage* message)
|
|||||||
if (acceptFirstClickBox)
|
if (acceptFirstClickBox)
|
||||||
acceptFirstClick = acceptFirstClickBox->Value()
|
acceptFirstClick = acceptFirstClickBox->Value()
|
||||||
== B_CONTROL_ON;
|
== B_CONTROL_ON;
|
||||||
fSettings.SetAcceptFirstClick(acceptFirstClick);
|
fSettings->SetAcceptFirstClick(acceptFirstClick);
|
||||||
fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
|
fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
|
||||||
fRevertButton->SetEnabled(fSettings.IsRevertable());
|
fRevertButton->SetEnabled(fSettings->IsRevertable());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -157,9 +153,9 @@ InputMouse::MessageReceived(BMessage* message)
|
|||||||
int32 value;
|
int32 value;
|
||||||
if (message->FindInt32("be:value", &value) == B_OK) {
|
if (message->FindInt32("be:value", &value) == B_OK) {
|
||||||
// slow = 1000000, fast = 0
|
// slow = 1000000, fast = 0
|
||||||
fSettings.SetClickSpeed(value * 1000);
|
fSettings->SetClickSpeed(value * 1000);
|
||||||
fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
|
fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
|
||||||
fRevertButton->SetEnabled(fSettings.IsRevertable());
|
fRevertButton->SetEnabled(fSettings->IsRevertable());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -169,10 +165,10 @@ InputMouse::MessageReceived(BMessage* message)
|
|||||||
int32 value;
|
int32 value;
|
||||||
if (message->FindInt32("be:value", &value) == B_OK) {
|
if (message->FindInt32("be:value", &value) == B_OK) {
|
||||||
// slow = 8192, fast = 524287
|
// slow = 8192, fast = 524287
|
||||||
fSettings.SetMouseSpeed((int32)pow(2,
|
fSettings->SetMouseSpeed((int32)pow(2,
|
||||||
value * 6.0 / 1000) * 8192);
|
value * 6.0 / 1000) * 8192);
|
||||||
fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
|
fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
|
||||||
fRevertButton->SetEnabled(fSettings.IsRevertable());
|
fRevertButton->SetEnabled(fSettings->IsRevertable());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -182,10 +178,10 @@ InputMouse::MessageReceived(BMessage* message)
|
|||||||
int32 value;
|
int32 value;
|
||||||
if (message->FindInt32("be:value", &value) == B_OK) {
|
if (message->FindInt32("be:value", &value) == B_OK) {
|
||||||
// slow = 0, fast = 262144
|
// slow = 0, fast = 262144
|
||||||
fSettings.SetAccelerationFactor((int32)pow(
|
fSettings->SetAccelerationFactor((int32)pow(
|
||||||
value * 4.0 / 1000, 2) * 16384);
|
value * 4.0 / 1000, 2) * 16384);
|
||||||
fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
|
fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
|
||||||
fRevertButton->SetEnabled(fSettings.IsRevertable());
|
fRevertButton->SetEnabled(fSettings->IsRevertable());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -197,9 +193,9 @@ InputMouse::MessageReceived(BMessage* message)
|
|||||||
if (message->FindInt32("index", &index) == B_OK
|
if (message->FindInt32("index", &index) == B_OK
|
||||||
&& message->FindInt32("button", &button) == B_OK) {
|
&& message->FindInt32("button", &button) == B_OK) {
|
||||||
int32 mapping = B_MOUSE_BUTTON(index + 1);
|
int32 mapping = B_MOUSE_BUTTON(index + 1);
|
||||||
fSettings.SetMapping(button, mapping);
|
fSettings->SetMapping(button, mapping);
|
||||||
fDefaultsButton->SetEnabled(fSettings.IsDefaultable());
|
fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
|
||||||
fRevertButton->SetEnabled(fSettings.IsRevertable());
|
fRevertButton->SetEnabled(fSettings->IsRevertable());
|
||||||
fSettingsView->MouseMapUpdated();
|
fSettingsView->MouseMapUpdated();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ class DeviceListView;
|
|||||||
|
|
||||||
class InputMouse : public BView {
|
class InputMouse : public BView {
|
||||||
public:
|
public:
|
||||||
InputMouse(BInputDevice* dev);
|
InputMouse(BInputDevice* dev, MouseSettings* settings);
|
||||||
virtual ~InputMouse();
|
virtual ~InputMouse();
|
||||||
void SetMouseType(int32 type);
|
void SetMouseType(int32 type);
|
||||||
void MessageReceived(BMessage* message);
|
void MessageReceived(BMessage* message);
|
||||||
@@ -46,9 +46,7 @@ private:
|
|||||||
MouseView* fMouseView;
|
MouseView* fMouseView;
|
||||||
BButton* fDefaultsButton;
|
BButton* fDefaultsButton;
|
||||||
BButton* fRevertButton;
|
BButton* fRevertButton;
|
||||||
MouseSettings fSettings;
|
MouseSettings* fSettings;
|
||||||
|
|
||||||
mouse_settings fMouseSettings, fOriginalSettings;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* INPUT_MOUSE_H */
|
#endif /* INPUT_MOUSE_H */
|
||||||
|
|||||||
@@ -185,21 +185,26 @@ InputWindow::AddDevice(BInputDevice* dev)
|
|||||||
|
|
||||||
if (dev->Type() == B_POINTING_DEVICE
|
if (dev->Type() == B_POINTING_DEVICE
|
||||||
&& name.FindFirst("Touchpad") >= 0) {
|
&& name.FindFirst("Touchpad") >= 0) {
|
||||||
|
|
||||||
TouchpadPrefView* view = new TouchpadPrefView(dev);
|
TouchpadPrefView* view = new TouchpadPrefView(dev);
|
||||||
fCardView->AddChild(view);
|
fCardView->AddChild(view);
|
||||||
|
|
||||||
DeviceListItemView* touchpad = new DeviceListItemView(
|
DeviceListItemView* touchpad = new DeviceListItemView(
|
||||||
name, TOUCHPAD_TYPE);
|
name, TOUCHPAD_TYPE);
|
||||||
fDeviceListView->AddItem(touchpad);
|
fDeviceListView->AddItem(touchpad);
|
||||||
} else if (dev->Type() == B_POINTING_DEVICE) {
|
} else if (dev->Type() == B_POINTING_DEVICE) {
|
||||||
InputMouse* view = new InputMouse(dev);
|
MouseSettings* settings;
|
||||||
|
settings = fMultipleMouseSettings.AddMouseSettings(name);
|
||||||
|
|
||||||
|
InputMouse* view = new InputMouse(dev, settings);
|
||||||
fCardView->AddChild(view);
|
fCardView->AddChild(view);
|
||||||
|
|
||||||
DeviceListItemView* mouse = new DeviceListItemView(
|
DeviceListItemView* mouse = new DeviceListItemView(
|
||||||
name, MOUSE_TYPE);
|
name, MOUSE_TYPE);
|
||||||
fDeviceListView->AddItem(mouse);
|
fDeviceListView->AddItem(mouse);
|
||||||
} else if (dev->Type() == B_KEYBOARD_DEVICE) {
|
} else if (dev->Type() == B_KEYBOARD_DEVICE) {
|
||||||
InputKeyboard* view = new InputKeyboard(dev);
|
InputKeyboard* view = new InputKeyboard(dev);
|
||||||
fCardView->AddChild(view);
|
fCardView->AddChild(view);
|
||||||
|
|
||||||
DeviceListItemView* keyboard = new DeviceListItemView(
|
DeviceListItemView* keyboard = new DeviceListItemView(
|
||||||
name, KEYBOARD_TYPE);
|
name, KEYBOARD_TYPE);
|
||||||
fDeviceListView->AddItem(keyboard);
|
fDeviceListView->AddItem(keyboard);
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ class DeviceName;
|
|||||||
class InputDevices;
|
class InputDevices;
|
||||||
class InputKeyboard;
|
class InputKeyboard;
|
||||||
class InputMouse;
|
class InputMouse;
|
||||||
|
class MultipleMouseSettings;
|
||||||
class TouchpadPrefView;
|
class TouchpadPrefView;
|
||||||
class TouchpadPref;
|
class TouchpadPref;
|
||||||
class TouchpadView;
|
class TouchpadView;
|
||||||
@@ -56,10 +57,12 @@ public:
|
|||||||
private:
|
private:
|
||||||
status_t FindDevice();
|
status_t FindDevice();
|
||||||
void AddDevice(BInputDevice* device);
|
void AddDevice(BInputDevice* device);
|
||||||
private:
|
|
||||||
|
|
||||||
|
private:
|
||||||
BListView* fDeviceListView;
|
BListView* fDeviceListView;
|
||||||
BCardView* fCardView;
|
BCardView* fCardView;
|
||||||
|
|
||||||
|
MultipleMouseSettings fMultipleMouseSettings;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* INPUT_WINDOW_H */
|
#endif /* INPUT_WINDOW_H */
|
||||||
|
|||||||
@@ -30,8 +30,6 @@ static const bool kDefaultAcceptFirstClick = true;
|
|||||||
|
|
||||||
|
|
||||||
MouseSettings::MouseSettings()
|
MouseSettings::MouseSettings()
|
||||||
:
|
|
||||||
fWindowPosition(-1, -1)
|
|
||||||
{
|
{
|
||||||
_RetrieveSettings();
|
_RetrieveSettings();
|
||||||
|
|
||||||
@@ -42,9 +40,23 @@ MouseSettings::MouseSettings()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MouseSettings::MouseSettings(mouse_settings settings)
|
||||||
|
:
|
||||||
|
fSettings(settings)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG
|
||||||
|
Dump();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fOriginalSettings = fSettings;
|
||||||
|
fOriginalMode = fMode;
|
||||||
|
fOriginalFocusFollowsMouseMode = fFocusFollowsMouseMode;
|
||||||
|
fOriginalAcceptFirstClick = fAcceptFirstClick;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
MouseSettings::~MouseSettings()
|
MouseSettings::~MouseSettings()
|
||||||
{
|
{
|
||||||
_SaveSettings();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -90,56 +102,12 @@ MouseSettings::_RetrieveSettings()
|
|||||||
if (file.InitCheck() < B_OK)
|
if (file.InitCheck() < B_OK)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
#if R5_COMPATIBLE
|
|
||||||
const off_t kOffset = sizeof(mouse_settings) - sizeof(mouse_map)
|
|
||||||
+ sizeof(int32) * 3;
|
|
||||||
// we have to do this because mouse_map counts 16 buttons in OBOS
|
|
||||||
#else
|
|
||||||
const off_t kOffset = sizeof(mouse_settings);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (file.ReadAt(kOffset, &fWindowPosition, sizeof(BPoint))
|
|
||||||
!= sizeof(BPoint)) {
|
|
||||||
// set default window position (invalid positions will be
|
|
||||||
// corrected by the application; the window will be centered
|
|
||||||
// in this case)
|
|
||||||
fWindowPosition.x = -1;
|
|
||||||
fWindowPosition.y = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Dump();
|
Dump();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
|
||||||
MouseSettings::_SaveSettings()
|
|
||||||
{
|
|
||||||
BPath path;
|
|
||||||
status_t status = _GetSettingsPath(path);
|
|
||||||
if (status < B_OK)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
BFile file(path.Path(), B_READ_WRITE | B_CREATE_FILE);
|
|
||||||
status = file.InitCheck();
|
|
||||||
if (status < B_OK)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
#if R5_COMPATIBLE
|
|
||||||
const off_t kOffset = sizeof(mouse_settings) - sizeof(mouse_map)
|
|
||||||
+ sizeof(int32) * 3;
|
|
||||||
// we have to do this because mouse_map counts 16 buttons in OBOS
|
|
||||||
#else
|
|
||||||
const off_t kOffset = sizeof(mouse_settings);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
file.WriteAt(kOffset, &fWindowPosition, sizeof(BPoint));
|
|
||||||
|
|
||||||
return B_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
void
|
void
|
||||||
MouseSettings::Dump()
|
MouseSettings::Dump()
|
||||||
@@ -267,20 +235,11 @@ MouseSettings::IsRevertable()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
MouseSettings::SetWindowPosition(BPoint corner)
|
|
||||||
{
|
|
||||||
fWindowPosition = corner;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MouseSettings::SetMouseType(int32 type)
|
MouseSettings::SetMouseType(int32 type)
|
||||||
{
|
{
|
||||||
if (set_mouse_type(type) == B_OK)
|
if (set_mouse_type(type) == B_OK)
|
||||||
fSettings.type = type;
|
fSettings.type = type;
|
||||||
else
|
|
||||||
fprintf(stderr, "error when set_mouse_type\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -299,8 +258,6 @@ MouseSettings::SetClickSpeed(bigtime_t clickSpeed)
|
|||||||
|
|
||||||
if (set_click_speed(clickSpeed) == B_OK)
|
if (set_click_speed(clickSpeed) == B_OK)
|
||||||
fSettings.click_speed = clickSpeed;
|
fSettings.click_speed = clickSpeed;
|
||||||
else
|
|
||||||
fprintf(stderr, "error when set_click_speed\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -309,8 +266,6 @@ MouseSettings::SetMouseSpeed(int32 speed)
|
|||||||
{
|
{
|
||||||
if (set_mouse_speed(speed) == B_OK)
|
if (set_mouse_speed(speed) == B_OK)
|
||||||
fSettings.accel.speed = speed;
|
fSettings.accel.speed = speed;
|
||||||
else
|
|
||||||
fprintf(stderr, "error when set_mouse_speed\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -319,8 +274,6 @@ MouseSettings::SetAccelerationFactor(int32 factor)
|
|||||||
{
|
{
|
||||||
if (set_mouse_acceleration(factor) == B_OK)
|
if (set_mouse_acceleration(factor) == B_OK)
|
||||||
fSettings.accel.accel_factor = factor;
|
fSettings.accel.accel_factor = factor;
|
||||||
else
|
|
||||||
fprintf(stderr, "error when set_mouse_acceleration\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -342,8 +295,7 @@ void
|
|||||||
MouseSettings::SetMapping(int32 index, uint32 button)
|
MouseSettings::SetMapping(int32 index, uint32 button)
|
||||||
{
|
{
|
||||||
fSettings.map.button[index] = button;
|
fSettings.map.button[index] = button;
|
||||||
if (set_mouse_map(&fSettings.map) != B_OK)
|
set_mouse_map(&fSettings.map);
|
||||||
fprintf(stderr, "error when set_mouse_map\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -352,8 +304,6 @@ MouseSettings::SetMapping(mouse_map &map)
|
|||||||
{
|
{
|
||||||
if (set_mouse_map(&map) == B_OK)
|
if (set_mouse_map(&map) == B_OK)
|
||||||
fSettings.map = map;
|
fSettings.map = map;
|
||||||
else
|
|
||||||
fprintf(stderr, "error when set_mouse_map\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -379,3 +329,196 @@ MouseSettings::SetAcceptFirstClick(bool accept_first_click)
|
|||||||
set_accept_first_click(accept_first_click);
|
set_accept_first_click(accept_first_click);
|
||||||
fAcceptFirstClick = accept_first_click;
|
fAcceptFirstClick = accept_first_click;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
mouse_settings*
|
||||||
|
MouseSettings::GetSettings() {
|
||||||
|
return &fSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MultipleMouseSettings::MultipleMouseSettings()
|
||||||
|
{
|
||||||
|
fDeprecatedMouseSettings = NULL;
|
||||||
|
RetrieveSettings();
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
Dump();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MultipleMouseSettings::~MultipleMouseSettings()
|
||||||
|
{
|
||||||
|
SaveSettings();
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
Dump();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
std::map<BString, MouseSettings*>::iterator itr;
|
||||||
|
for (itr = fMouseSettingsObject.begin(); itr != fMouseSettingsObject.end();
|
||||||
|
++itr)
|
||||||
|
delete itr->second;
|
||||||
|
|
||||||
|
delete fDeprecatedMouseSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
MultipleMouseSettings::GetSettingsPath(BPath &path)
|
||||||
|
{
|
||||||
|
status_t status = find_directory(B_USER_SETTINGS_DIRECTORY, &path);
|
||||||
|
if (status < B_OK)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
path.Append(mouse_settings_file);
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
MultipleMouseSettings::RetrieveSettings()
|
||||||
|
{
|
||||||
|
// retrieve current values
|
||||||
|
// also try to load the window position from disk
|
||||||
|
|
||||||
|
BPath path;
|
||||||
|
if (GetSettingsPath(path) < B_OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
BFile file(path.Path(), B_READ_ONLY);
|
||||||
|
if (file.InitCheck() < B_OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
BMessage message;
|
||||||
|
|
||||||
|
if (message.Unflatten(&file) == B_OK) {
|
||||||
|
int i = 0;
|
||||||
|
BString deviceName;
|
||||||
|
mouse_settings* settings;
|
||||||
|
ssize_t size = 0;
|
||||||
|
|
||||||
|
while (message.FindString("mouseDevice", i, &deviceName) == B_OK) {
|
||||||
|
message.FindData("mouseSettings", B_ANY_TYPE, i,
|
||||||
|
(const void**)&settings, &size);
|
||||||
|
MouseSettings* mouseSettings = new MouseSettings(*settings);
|
||||||
|
fMouseSettingsObject.insert(std::pair<BString, MouseSettings*>
|
||||||
|
(deviceName, mouseSettings));
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Does not look like a BMessage, try loading using the old format
|
||||||
|
fDeprecatedMouseSettings = new MouseSettings();
|
||||||
|
fDeprecatedMouseSettings->_RetrieveSettings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
MultipleMouseSettings::Archive(BMessage* into, bool deep) const
|
||||||
|
{
|
||||||
|
std::map<BString, MouseSettings*>::const_iterator itr;
|
||||||
|
for (itr = fMouseSettingsObject.begin(); itr != fMouseSettingsObject.end();
|
||||||
|
++itr) {
|
||||||
|
into->AddString("mouseDevice", itr->first);
|
||||||
|
into->AddData("mouseSettings", B_ANY_TYPE, itr->second->GetSettings(),
|
||||||
|
sizeof(*(itr->second->GetSettings())));
|
||||||
|
}
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
MultipleMouseSettings::SaveSettings()
|
||||||
|
{
|
||||||
|
BPath path;
|
||||||
|
status_t status = GetSettingsPath(path);
|
||||||
|
if (status < B_OK)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
BFile file(path.Path(), B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE);
|
||||||
|
status = file.InitCheck();
|
||||||
|
if (status != B_OK)
|
||||||
|
return status;
|
||||||
|
|
||||||
|
BMessage message;
|
||||||
|
Archive(&message, true);
|
||||||
|
message.Flatten(&file);
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
MultipleMouseSettings::Defaults()
|
||||||
|
{
|
||||||
|
std::map<BString, MouseSettings*>::iterator itr;
|
||||||
|
for (itr = fMouseSettingsObject.begin(); itr != fMouseSettingsObject.end();
|
||||||
|
++itr) {
|
||||||
|
itr->second->Defaults();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
void
|
||||||
|
MultipleMouseSettings::Dump()
|
||||||
|
{
|
||||||
|
std::map<BString, MouseSettings*>::iterator itr;
|
||||||
|
for (itr = fMouseSettingsObject.begin(); itr != fMouseSettingsObject.end();
|
||||||
|
++itr) {
|
||||||
|
printf("mouse_name:\t%s\n", itr->first.String());
|
||||||
|
itr->second->Dump();
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
MouseSettings*
|
||||||
|
MultipleMouseSettings::AddMouseSettings(BString mouse_name)
|
||||||
|
{
|
||||||
|
if(fDeprecatedMouseSettings != NULL) {
|
||||||
|
MouseSettings* RetrievedSettings = new (std::nothrow) MouseSettings
|
||||||
|
(*fDeprecatedMouseSettings);
|
||||||
|
|
||||||
|
if (RetrievedSettings != NULL) {
|
||||||
|
fMouseSettingsObject.insert(std::pair<BString, MouseSettings*>
|
||||||
|
(mouse_name, RetrievedSettings));
|
||||||
|
|
||||||
|
return RetrievedSettings;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::map<BString, MouseSettings*>::iterator itr;
|
||||||
|
itr = fMouseSettingsObject.find(mouse_name);
|
||||||
|
|
||||||
|
if (itr != fMouseSettingsObject.end())
|
||||||
|
return GetMouseSettings(mouse_name);
|
||||||
|
|
||||||
|
MouseSettings* settings = new (std::nothrow) MouseSettings();
|
||||||
|
|
||||||
|
if(settings !=NULL) {
|
||||||
|
fMouseSettingsObject.insert(std::pair<BString, MouseSettings*>
|
||||||
|
(mouse_name, settings));
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MouseSettings*
|
||||||
|
MultipleMouseSettings::GetMouseSettings(BString mouse_name)
|
||||||
|
{
|
||||||
|
std::map<BString, MouseSettings*>::iterator itr;
|
||||||
|
itr = fMouseSettingsObject.find(mouse_name);
|
||||||
|
|
||||||
|
if (itr != fMouseSettingsObject.end())
|
||||||
|
return itr->second;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|||||||
@@ -11,6 +11,9 @@
|
|||||||
#define MOUSE_SETTINGS_H
|
#define MOUSE_SETTINGS_H
|
||||||
|
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
#include <Archivable.h>
|
||||||
#include <Input.h>
|
#include <Input.h>
|
||||||
#include <InterfaceDefs.h>
|
#include <InterfaceDefs.h>
|
||||||
#include <Point.h>
|
#include <Point.h>
|
||||||
@@ -24,6 +27,7 @@ class BPath;
|
|||||||
class MouseSettings {
|
class MouseSettings {
|
||||||
public:
|
public:
|
||||||
MouseSettings();
|
MouseSettings();
|
||||||
|
MouseSettings(mouse_settings settings);
|
||||||
~MouseSettings();
|
~MouseSettings();
|
||||||
|
|
||||||
void Revert();
|
void Revert();
|
||||||
@@ -32,9 +36,6 @@ public:
|
|||||||
bool IsDefaultable();
|
bool IsDefaultable();
|
||||||
void Dump();
|
void Dump();
|
||||||
|
|
||||||
BPoint WindowPosition() const { return fWindowPosition; }
|
|
||||||
void SetWindowPosition(BPoint corner);
|
|
||||||
|
|
||||||
int32 MouseType() const { return fSettings.type; }
|
int32 MouseType() const { return fSettings.type; }
|
||||||
void SetMouseType(int32 type);
|
void SetMouseType(int32 type);
|
||||||
|
|
||||||
@@ -62,18 +63,48 @@ public:
|
|||||||
|
|
||||||
bool AcceptFirstClick() const { return fAcceptFirstClick; }
|
bool AcceptFirstClick() const { return fAcceptFirstClick; }
|
||||||
void SetAcceptFirstClick(bool accept_first_click);
|
void SetAcceptFirstClick(bool accept_first_click);
|
||||||
|
void _RetrieveSettings();
|
||||||
|
|
||||||
|
mouse_settings* GetSettings();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static status_t _GetSettingsPath(BPath &path);
|
static status_t _GetSettingsPath(BPath &path);
|
||||||
void _RetrieveSettings();
|
|
||||||
status_t _SaveSettings();
|
|
||||||
|
|
||||||
mouse_settings fSettings, fOriginalSettings;
|
|
||||||
mode_mouse fMode, fOriginalMode;
|
mode_mouse fMode, fOriginalMode;
|
||||||
mode_focus_follows_mouse fFocusFollowsMouseMode;
|
mode_focus_follows_mouse fFocusFollowsMouseMode;
|
||||||
mode_focus_follows_mouse fOriginalFocusFollowsMouseMode;
|
mode_focus_follows_mouse fOriginalFocusFollowsMouseMode;
|
||||||
bool fAcceptFirstClick, fOriginalAcceptFirstClick;
|
bool fAcceptFirstClick, fOriginalAcceptFirstClick;
|
||||||
BPoint fWindowPosition;
|
|
||||||
|
mouse_settings fSettings, fOriginalSettings;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class MultipleMouseSettings: public BArchivable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MultipleMouseSettings();
|
||||||
|
~MultipleMouseSettings();
|
||||||
|
|
||||||
|
status_t Archive(BMessage* into, bool deep = false) const;
|
||||||
|
|
||||||
|
void Defaults();
|
||||||
|
void Dump();
|
||||||
|
status_t SaveSettings();
|
||||||
|
|
||||||
|
/** Get or create settings for the given mouse */
|
||||||
|
MouseSettings* AddMouseSettings(BString mouse_name);
|
||||||
|
/** Get the existing settings, or return NULL */
|
||||||
|
MouseSettings* GetMouseSettings(BString mouse_name);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static status_t GetSettingsPath(BPath &path);
|
||||||
|
void RetrieveSettings();
|
||||||
|
|
||||||
|
private:
|
||||||
|
MouseSettings* fDeprecatedMouseSettings;
|
||||||
|
|
||||||
|
typedef std::map<BString, MouseSettings*> mouse_settings_object;
|
||||||
|
mouse_settings_object fMouseSettingsObject;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MOUSE_SETTINGS_H
|
#endif // MOUSE_SETTINGS_H
|
||||||
|
|||||||
Reference in New Issue
Block a user