Input: declare BString to get the Mouse Name

Change-Id: I3476f58839202a6fd8c93e325a15045963a9b7b2
Reviewed-on: https://review.haiku-os.org/c/haiku/+/3125
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
Preetpal Kaur
2020-09-10 17:15:09 +00:00
committed by Adrien Destugues
parent 37d793236c
commit 02ad22d6c8
11 changed files with 166 additions and 35 deletions
+62
View File
@@ -350,3 +350,65 @@
\since BeOS R3
*/
/*!
\fn status_t get_mouse_type(int32* type)
\brief Get the number of buttons of the mouse.
If there are multiple mouses connected, the number of buttons for one of
them picked at random will be returned.
*/
/*!
\fn status_t set_mouse_type(int32 type)
\brief Set the number of buttons of the mouse.
\deprecated use set_mouse_type_by_name instead.
*/
/*!
\fn status_t get_mouse_type_by_name(BString mouse_name, int32* type)
\brief Get the number of buttons for a specific mouse.
Mouse names can be known from BInputDevice.
*/
/*!
\fn status_t set_mouse_type_by_name(BString mouse_name, int32* type)
\brief Configure the number of buttons for a specific mouse.
The setting is saved and persists accross reboots.
*/
/*!
\fn status_t get_mouse_speed(int32* speed)
\brief Get the mouse speed
If there are multiple mouses connected, this function return the speed
from a random one.
*/
/*!
\fn status_t set_mouse_speed(int32 speed)
\brief Set the mouse speed
\deprecated use set_mouse_speed_by_name instead.
*/
/*!
\fn status_t get_mouse_speed_by_name(BString mouse_name, int32* speed)
\brief Get the mouse speed setting for a specific mouse
*/
/*!
\fn status_t set_mouse_speed_by_name(BString mouse_name, int32 speed)
\brief Set the mouse speed for a specific mouse.
The setting is saved and persists accross reboots.
*/
+2
View File
@@ -428,6 +428,8 @@ status_t get_click_speed(bigtime_t* speed);
status_t set_click_speed(bigtime_t speed);
status_t get_mouse_speed(int32* speed);
status_t set_mouse_speed(int32 speed);
status_t get_mouse_speed_by_name(BString mouse_name, int32* speed);
status_t set_mouse_speed_by_name(BString mouse_name, int32 speed);
status_t get_mouse_acceleration(int32* speed);
status_t set_mouse_acceleration(int32 speed);
@@ -515,7 +515,6 @@ void
MouseDevice::_UpdateSettings()
{
MD_CALLED();
// retrieve current values
if (get_mouse_map(&fSettings.map) != B_OK)
@@ -530,7 +529,7 @@ MouseDevice::_UpdateSettings()
else
ioctl(fDevice, MS_SET_CLICKSPEED, &fSettings.click_speed);
if (get_mouse_speed(&fSettings.accel.speed) != B_OK)
if (get_mouse_speed_by_name(fDeviceRef.name, &fSettings.accel.speed) != B_OK)
LOG_ERR("error when get_mouse_speed\n");
else {
if (get_mouse_acceleration(&fSettings.accel.accel_factor) != B_OK)
+34
View File
@@ -509,6 +509,8 @@ get_mouse_type_by_name(BString mouse_name, int32 *type)
{
BMessage command(IS_GET_MOUSE_TYPE);
BMessage reply;
command.AddString("mouse_name", mouse_name.String());
status_t err = _control_input_server_(&command, &reply);
if (err != B_OK)
@@ -624,6 +626,38 @@ set_mouse_speed(int32 speed)
}
status_t
get_mouse_speed_by_name(BString mouse_name, int32 *speed)
{
BMessage command(IS_GET_MOUSE_SPEED);
BMessage reply;
command.AddString("mouse_name", mouse_name.String());
status_t err = _control_input_server_(&command, &reply);
if (err != B_OK)
return err;
err = reply.FindInt32("speed", speed);
if (err != B_OK)
return err;
return B_OK;
}
status_t
set_mouse_speed_by_name(BString mouse_name, int32 speed)
{
BMessage command(IS_SET_MOUSE_SPEED);
BMessage reply;
command.AddString("mouse_name", mouse_name.String());
command.AddInt32("speed", speed);
return _control_input_server_(&command, &reply);
}
status_t
get_mouse_acceleration(int32 *speed)
{
+2
View File
@@ -94,6 +94,8 @@ InputMouse::MessageReceived(BMessage* message)
{
int32 type;
if (message->FindInt32("be:value", &type) == B_OK) {
if (type > 6)
debugger("Mouse type is invalid");
fSettings->SetMouseType(type);
fSettingsView->SetMouseType(type);
fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
+38 -23
View File
@@ -29,7 +29,9 @@ static const int32 kDefaultAccelerationFactor = 65536;
static const bool kDefaultAcceptFirstClick = true;
MouseSettings::MouseSettings()
MouseSettings::MouseSettings(BString name)
:
fName(name)
{
_RetrieveSettings();
@@ -40,10 +42,12 @@ MouseSettings::MouseSettings()
}
MouseSettings::MouseSettings(mouse_settings settings)
MouseSettings::MouseSettings(mouse_settings settings, BString name)
:
fSettings(settings)
{
fName = name;
#ifdef DEBUG
Dump();
#endif
@@ -72,39 +76,48 @@ MouseSettings::_GetSettingsPath(BPath &path)
}
void
status_t
MouseSettings::_RetrieveSettings()
{
// retrieve current values
if (get_mouse_map(&fSettings.map) != B_OK)
fprintf(stderr, "error when get_mouse_map\n");
return B_ERROR;
if (get_click_speed(&fSettings.click_speed) != B_OK)
fprintf(stderr, "error when get_click_speed\n");
if (get_mouse_speed(&fSettings.accel.speed) != B_OK)
fprintf(stderr, "error when get_mouse_speed\n");
return B_ERROR;
if (get_mouse_speed_by_name(fName, &fSettings.accel.speed) != B_OK)
return B_ERROR;
if (get_mouse_acceleration(&fSettings.accel.accel_factor) != B_OK)
fprintf(stderr, "error when get_mouse_acceleration\n");
if (get_mouse_type_by_name(fname, &fSettings.type) != B_OK)
fprintf(stderr, "error when get_multiple_mouse_type\n");
return B_ERROR;
if (get_mouse_type_by_name(fName, &fSettings.type) != B_OK)
return B_ERROR;
fMode = mouse_mode();
fFocusFollowsMouseMode = focus_follows_mouse_mode();
fAcceptFirstClick = accept_first_click();
// also try to load the window position from disk
return B_OK;
}
status_t
MouseSettings::_LoadLegacySettings()
{
BPath path;
if (_GetSettingsPath(path) < B_OK)
return;
return B_ERROR;
BFile file(path.Path(), B_READ_ONLY);
if (file.InitCheck() < B_OK)
return;
return B_ERROR;
// Read the settings from the file
file.Read((void*)&fSettings, sizeof(mouse_settings));
#ifdef DEBUG
Dump();
#endif
return B_OK;
}
@@ -113,9 +126,9 @@ void
MouseSettings::Dump()
{
printf("type:\t\t%" B_PRId32 " button mouse\n", fSettings.type);
printf("map:\t\tleft = %" B_PRIu32 " : middle = %" B_PRIu32 " : right = %"
B_PRIu32 "\n", fSettings.map.button[0], fSettings.map.button[2],
fSettings.map.button[1]);
for (int i = 0; i < 5; i++) {
printf("button[%d]: %" B_PRId32 "\n", i, fSettings.map.button[i]);
}
printf("click speed:\t%" B_PRId64 "\n", fSettings.click_speed);
printf("accel:\t\t%s\n", fSettings.accel.enabled ? "enabled" : "disabled");
printf("accel factor:\t%" B_PRId32 "\n", fSettings.accel.accel_factor);
@@ -238,7 +251,7 @@ MouseSettings::IsRevertable()
void
MouseSettings::SetMouseType(int32 type)
{
if (set_mouse_type_by_name(fname, type) == B_OK)
if (set_mouse_type_by_name(fName, type) == B_OK)
fSettings.type = type;
}
@@ -264,7 +277,7 @@ MouseSettings::SetClickSpeed(bigtime_t clickSpeed)
void
MouseSettings::SetMouseSpeed(int32 speed)
{
if (set_mouse_speed(speed) == B_OK)
if (set_mouse_speed_by_name(fName, speed) == B_OK)
fSettings.accel.speed = speed;
}
@@ -402,14 +415,15 @@ MultipleMouseSettings::RetrieveSettings()
while (message.FindString("mouseDevice", i, &deviceName) == B_OK) {
message.FindData("mouseSettings", B_ANY_TYPE, i,
(const void**)&settings, &size);
MouseSettings* mouseSettings = new MouseSettings(*settings);
MouseSettings* mouseSettings
= new MouseSettings(*settings, deviceName);
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 = new MouseSettings("");
fDeprecatedMouseSettings->_RetrieveSettings();
}
}
@@ -487,10 +501,11 @@ MultipleMouseSettings::AddMouseSettings(BString mouse_name)
(*fDeprecatedMouseSettings);
if (RetrievedSettings != NULL) {
RetrievedSettings->fName = mouse_name;
fMouseSettingsObject.insert(std::pair<BString, MouseSettings*>
(mouse_name, RetrievedSettings));
return RetrievedSettings;
return RetrievedSettings;
}
}
@@ -500,7 +515,7 @@ MultipleMouseSettings::AddMouseSettings(BString mouse_name)
if (itr != fMouseSettingsObject.end())
return GetMouseSettings(mouse_name);
MouseSettings* settings = new (std::nothrow) MouseSettings();
MouseSettings* settings = new (std::nothrow) MouseSettings(mouse_name);
if(settings !=NULL) {
fMouseSettingsObject.insert(std::pair<BString, MouseSettings*>
+10 -5
View File
@@ -18,6 +18,7 @@
#include <InterfaceDefs.h>
#include <Point.h>
#include <SupportDefs.h>
#include <String.h>
#include "kb_mouse_settings.h"
@@ -26,8 +27,8 @@ class BPath;
class MouseSettings {
public:
MouseSettings();
MouseSettings(mouse_settings settings);
MouseSettings(BString name);
MouseSettings(mouse_settings settings, BString name);
~MouseSettings();
void Revert();
@@ -63,17 +64,21 @@ public:
bool AcceptFirstClick() const { return fAcceptFirstClick; }
void SetAcceptFirstClick(bool accept_first_click);
void _RetrieveSettings();
status_t _RetrieveSettings();
status_t _LoadLegacySettings();
mouse_settings* GetSettings();
private:
static status_t _GetSettingsPath(BPath &path);
mode_mouse fMode, fOriginalMode;
private:
BString fName;
mode_mouse fMode, fOriginalMode;
mode_focus_follows_mouse fFocusFollowsMouseMode;
mode_focus_follows_mouse fOriginalFocusFollowsMouseMode;
bool fAcceptFirstClick, fOriginalAcceptFirstClick;
bool fAcceptFirstClick
bool fOriginalAcceptFirstClick;
mouse_settings fSettings, fOriginalSettings;
};
+2
View File
@@ -113,6 +113,8 @@ MouseView::MouseMapUpdated()
void
MouseView::UpdateFromSettings()
{
if (fSettings.MouseType() > 6)
debugger("Mouse type is invalid");
SetMouseType(fSettings.MouseType());
}
+4
View File
@@ -226,6 +226,8 @@ SettingsView::AttachedToWindow()
void
SettingsView::SetMouseType(int32 type)
{
if (type > 6)
debugger("Mouse type is invalid");
fMouseView->SetMouseType(type);
}
@@ -253,6 +255,8 @@ SettingsView::UpdateFromSettings()
fAccelerationSlider->SetValue(value);
fTypeMenu->SelectOptionFor(fSettings.MouseType());
if (fSettings.MouseType() > 6)
debugger("Mouse type is invalid");
fMouseView->SetMouseType(fSettings.MouseType());
BMenuItem* item = fFocusMenu->ItemAt(
+8 -5
View File
@@ -857,6 +857,7 @@ status_t
InputServer::HandleGetSetMouseSpeed(BMessage* message, BMessage* reply)
{
BString mouseName;
MouseSettings* settings = NULL;
if (message->FindString("mouse_name", &mouseName) == B_OK) {
settings = fMouseSettings.GetMouseSettings(mouseName);
@@ -869,9 +870,12 @@ InputServer::HandleGetSetMouseSpeed(BMessage* message, BMessage* reply)
if (settings != NULL)
settings->SetMouseSpeed(speed);
else {
// TODO if no mouse_name was specified, apply the setting to
// all mouses
return B_NOT_SUPPORTED;
std::map<BString, MouseSettings*>::iterator itr;
for (itr = fMouseSettingsObject.begin();
itr != fMouseSettingsObject.end(); ++itr) {
itr->second->SetMouseSpeed(speed);
}
return B_OK;
}
be_app_messenger.SendMessage(IS_SAVE_SETTINGS);
@@ -884,8 +888,7 @@ InputServer::HandleGetSetMouseSpeed(BMessage* message, BMessage* reply)
if (settings != NULL)
return reply->AddInt32("speed", settings->MouseSpeed());
else {
// TODO return type of the "first" mouse?
return B_NOT_SUPPORTED;
return B_OK;
}
}
+3
View File
@@ -241,6 +241,9 @@ class InputServer : public BApplication {
team_id fAppServerTeam;
area_id fCursorArea;
shared_cursor* fCursorBuffer;
typedef std::map<BString, MouseSettings*> mouse_settings_object;
mouse_settings_object fMouseSettingsObject;
};
extern InputServer* gInputServer;