input_server: handle empty-named mouse settings requests

When reading data, return it from one of the connected devices, or from
defaults if there's none. When changing data, do it for all connected
devices.

Fixes: #16617
Change-Id: I36e0f9929c833905d146d19b02be136a3588026a
Reviewed-on: https://review.haiku-os.org/c/haiku/+/7837
Haiku-Format: Haiku-format Bot <[email protected]>
Tested-by: Commit checker robot <[email protected]>
Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
Máximo Castañeda
2024-07-29 17:30:39 +00:00
committed by waddlesplash
parent 85e84ddefb
commit df803c0f3f
2 changed files with 160 additions and 116 deletions
+155 -113
View File
@@ -625,82 +625,6 @@ InputServer::HandleSetMethod(BMessage* message)
}
status_t
InputServer::HandleGetSetMouseType(BMessage* message, BMessage* reply)
{
BString mouseName;
MouseSettings* settings = NULL;
if (message->FindString("mouse_name", &mouseName) == B_OK) {
settings = fMouseSettings.GetMouseSettings(mouseName);
if (settings == NULL)
return B_NAME_NOT_FOUND;
}
int32 type;
if (message->FindInt32("mouse_type", &type) == B_OK) {
if (settings != NULL)
settings->SetMouseType(type);
else {
// TODO if no mouse_name was specified, apply the setting to
// all mouses
return B_NOT_SUPPORTED;
}
be_app_messenger.SendMessage(IS_SAVE_SETTINGS);
BMessage msg(IS_CONTROL_DEVICES);
msg.AddInt32("type", B_POINTING_DEVICE);
msg.AddInt32("code", B_MOUSE_TYPE_CHANGED);
return fAddOnManager->PostMessage(&msg);
}
if (settings != NULL) {
return reply->AddInt32("mouse_type",
settings->MouseType());
} else {
// TODO return type of the "first" mouse?
return B_NOT_SUPPORTED;
}
}
status_t
InputServer::HandleGetSetMouseAcceleration(BMessage* message,
BMessage* reply)
{
BString mouseName;
MouseSettings* settings = NULL;
if (message->FindString("mouse_name", &mouseName) == B_OK) {
settings = fMouseSettings.GetMouseSettings(mouseName);
if (settings == NULL)
return B_NAME_NOT_FOUND;
}
int32 factor;
if (message->FindInt32("speed", &factor) == B_OK) {
if (settings != NULL)
settings->SetAccelerationFactor(factor);
else {
// TODO if no mouse_name was specified, apply the setting to
// all mouses
return B_NOT_SUPPORTED;
}
be_app_messenger.SendMessage(IS_SAVE_SETTINGS);
BMessage msg(IS_CONTROL_DEVICES);
msg.AddInt32("type", B_POINTING_DEVICE);
msg.AddInt32("code", B_MOUSE_ACCELERATION_CHANGED);
return fAddOnManager->PostMessage(&msg);
}
if (settings != NULL)
return reply->AddInt32("speed", settings->AccelerationFactor());
else {
// TODO return type of the "first" mouse?
return B_NOT_SUPPORTED;
}
}
status_t
InputServer::HandleGetSetKeyRepeatDelay(BMessage* message, BMessage* reply)
{
@@ -850,26 +774,127 @@ InputServer::HandleSetKeyboardLocks(BMessage* message, BMessage* reply)
// #pragma mark - Mouse settings
/** This method does all possible efforts to return some settings.
*
* The settings will be created if they do not exist. If a mouse name is
* specified, the settings for that mouse are created and used. Otherwise,
* default settings are returned.
*/
status_t
InputServer::_PostMouseControlMessage(int32 code, const BString& mouseName)
{
BMessage message(IS_CONTROL_DEVICES);
message.AddInt32("code", code);
if (mouseName.IsEmpty())
message.AddInt32("type", B_POINTING_DEVICE);
else
message.AddString("device", mouseName);
return fAddOnManager->PostMessage(&message);
}
MouseSettings*
InputServer::_RunningMouseSettings()
{
BAutolock lock(fInputDeviceListLocker);
int32 count = fInputDeviceList.CountItems();
for (int32 i = 0; i < count; i++) {
InputDeviceListItem* item = (InputDeviceListItem*)fInputDeviceList.ItemAt(i);
if (item == NULL)
continue;
if (item->Type() == B_POINTING_DEVICE && item->Running())
return _GetSettingsForMouse(item->Name());
}
return &fDefaultMouseSettings;
}
void
InputServer::_RunningMiceSettings(BList& settings)
{
BAutolock lock(fInputDeviceListLocker);
int32 count = fInputDeviceList.CountItems();
for (int32 i = 0; i < count; i++) {
InputDeviceListItem* item = (InputDeviceListItem*)fInputDeviceList.ItemAt(i);
if (item == NULL)
continue;
if (item->Type() == B_POINTING_DEVICE && item->Running())
settings.AddItem(_GetSettingsForMouse(item->Name()));
}
}
MouseSettings*
InputServer::_GetSettingsForMouse(BString mouseName)
{
// If no mouse name is specified, use the first one found in settings
if (mouseName == "") {
std::map<BString, MouseSettings*>::iterator itr
= fMouseSettingsObject.begin();
if (itr != fMouseSettingsObject.end())
return itr->second;
// We need something different for get and set requests when no mouse name
// is specified, so leave that to the caller.
if (mouseName.IsEmpty())
return NULL;
return fMouseSettings.AddMouseSettings(mouseName);
}
status_t
InputServer::HandleGetSetMouseType(BMessage* message, BMessage* reply)
{
BString mouseName;
message->FindString("mouse_name", &mouseName);
MouseSettings* settings = _GetSettingsForMouse(mouseName);
int32 type;
if (message->FindInt32("mouse_type", &type) == B_OK) {
if (settings == NULL) {
BList allSettings;
_RunningMiceSettings(allSettings);
int count = allSettings.CountItems();
for (int i = 0; i < count; i++)
static_cast<MouseSettings*>(allSettings.ItemAt(i))->SetMouseType(type);
} else {
settings->SetMouseType(type);
}
be_app_messenger.SendMessage(IS_SAVE_SETTINGS);
return _PostMouseControlMessage(B_MOUSE_TYPE_CHANGED, mouseName);
}
// If a mouse name is specified or there are no settings yet, get or create
// some
return fMouseSettings.AddMouseSettings(mouseName);
if (settings == NULL)
settings = _RunningMouseSettings();
return reply->AddInt32("mouse_type", settings->MouseType());
}
status_t
InputServer::HandleGetSetMouseAcceleration(BMessage* message, BMessage* reply)
{
BString mouseName;
message->FindString("mouse_name", &mouseName);
MouseSettings* settings = _GetSettingsForMouse(mouseName);
int32 factor;
if (message->FindInt32("speed", &factor) == B_OK) {
if (settings == NULL) {
BList allSettings;
_RunningMiceSettings(allSettings);
int count = allSettings.CountItems();
for (int i = 0; i < count; i++)
static_cast<MouseSettings*>(allSettings.ItemAt(i))->SetAccelerationFactor(factor);
} else {
settings->SetAccelerationFactor(factor);
}
be_app_messenger.SendMessage(IS_SAVE_SETTINGS);
return _PostMouseControlMessage(B_MOUSE_ACCELERATION_CHANGED, mouseName);
}
if (settings == NULL)
settings = _RunningMouseSettings();
return reply->AddInt32("speed", settings->AccelerationFactor());
}
@@ -881,20 +906,25 @@ InputServer::HandleGetSetMouseSpeed(BMessage* message, BMessage* reply)
MouseSettings* settings = _GetSettingsForMouse(mouseName);
if (settings == NULL)
return B_NO_MEMORY;
int32 speed;
if (message->FindInt32("speed", &speed) == B_OK) {
settings->SetMouseSpeed(speed);
if (settings == NULL) {
BList allSettings;
_RunningMiceSettings(allSettings);
int count = allSettings.CountItems();
for (int i = 0; i < count; i++)
static_cast<MouseSettings*>(allSettings.ItemAt(i))->SetMouseSpeed(speed);
} else {
settings->SetMouseSpeed(speed);
}
be_app_messenger.SendMessage(IS_SAVE_SETTINGS);
BMessage msg(IS_CONTROL_DEVICES);
msg.AddInt32("type", B_POINTING_DEVICE);
msg.AddInt32("code", B_MOUSE_SPEED_CHANGED);
return fAddOnManager->PostMessage(&msg);
return _PostMouseControlMessage(B_MOUSE_SPEED_CHANGED, mouseName);
}
if (settings == NULL)
settings = _RunningMouseSettings();
return reply->AddInt32("speed", settings->MouseSpeed());
}
@@ -906,21 +936,27 @@ InputServer::HandleGetSetMouseMap(BMessage* message, BMessage* reply)
message->FindString("mouse_name", &mouseName);
MouseSettings* settings = _GetSettingsForMouse(mouseName);
if (settings == NULL)
return B_NO_MEMORY;
mouse_map *map;
ssize_t size;
if (message->FindData("mousemap", B_RAW_TYPE, (const void**)&map, &size) == B_OK) {
settings->SetMapping(*map);
if (settings == NULL) {
BList allSettings;
_RunningMiceSettings(allSettings);
int count = allSettings.CountItems();
for (int i = 0; i < count; i++)
static_cast<MouseSettings*>(allSettings.ItemAt(i))->SetMapping(*map);
} else {
settings->SetMapping(*map);
}
be_app_messenger.SendMessage(IS_SAVE_SETTINGS);
BMessage msg(IS_CONTROL_DEVICES);
msg.AddInt32("type", B_POINTING_DEVICE);
msg.AddInt32("code", B_MOUSE_MAP_CHANGED);
return fAddOnManager->PostMessage(&msg);
return _PostMouseControlMessage(B_MOUSE_MAP_CHANGED, mouseName);
}
if (settings == NULL)
settings = _RunningMouseSettings();
mouse_map getmap;
settings->Mapping(getmap);
return reply->AddData("mousemap", B_RAW_TYPE, &getmap, sizeof(mouse_map));
@@ -934,20 +970,26 @@ InputServer::HandleGetSetClickSpeed(BMessage* message, BMessage* reply)
message->FindString("mouse_name", &mouseName);
MouseSettings* settings = _GetSettingsForMouse(mouseName);
if (settings == NULL)
return B_NO_MEMORY;
bigtime_t clickSpeed;
if (message->FindInt64("speed", &clickSpeed) == B_OK) {
settings->SetClickSpeed(clickSpeed);
if (settings == NULL) {
BList allSettings;
_RunningMiceSettings(allSettings);
int count = allSettings.CountItems();
for (int i = 0; i < count; i++)
static_cast<MouseSettings*>(allSettings.ItemAt(i))->SetClickSpeed(clickSpeed);
} else {
settings->SetClickSpeed(clickSpeed);
}
be_app_messenger.SendMessage(IS_SAVE_SETTINGS);
BMessage msg(IS_CONTROL_DEVICES);
msg.AddInt32("type", B_POINTING_DEVICE);
msg.AddInt32("code", B_CLICK_SPEED_CHANGED);
return fAddOnManager->PostMessage(&msg);
return _PostMouseControlMessage(B_CLICK_SPEED_CHANGED, mouseName);
}
if (settings == NULL)
settings = _RunningMouseSettings();
return reply->AddInt64("speed", settings->ClickSpeed());
}
+5 -3
View File
@@ -187,7 +187,11 @@ class InputServer : public BApplication {
status_t _LoadSystemKeymap();
status_t _SaveKeymap(bool isDefault = false);
void _InitKeyboardMouseStates();
MouseSettings* _RunningMouseSettings();
void _RunningMiceSettings(BList& settings);
MouseSettings* _GetSettingsForMouse(BString mouseName);
status_t _PostMouseControlMessage(int32 code, const BString& mouseName);
status_t _StartEventLoop();
void _EventLoop();
@@ -214,6 +218,7 @@ class InputServer : public BApplication {
KeyboardSettings fKeyboardSettings;
MultipleMouseSettings fMouseSettings;
MouseSettings fDefaultMouseSettings;
BPoint fMousePos; // current mouse position
key_info fKeyInfo; // current key info
@@ -242,9 +247,6 @@ 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;