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 status_t
InputServer::HandleGetSetKeyRepeatDelay(BMessage* message, BMessage* reply) InputServer::HandleGetSetKeyRepeatDelay(BMessage* message, BMessage* reply)
{ {
@@ -850,26 +774,127 @@ InputServer::HandleSetKeyboardLocks(BMessage* message, BMessage* reply)
// #pragma mark - Mouse settings // #pragma mark - Mouse settings
/** This method does all possible efforts to return some settings. status_t
* InputServer::_PostMouseControlMessage(int32 code, const BString& mouseName)
* 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, BMessage message(IS_CONTROL_DEVICES);
* default settings are returned. 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* MouseSettings*
InputServer::_GetSettingsForMouse(BString mouseName) InputServer::_GetSettingsForMouse(BString mouseName)
{ {
// If no mouse name is specified, use the first one found in settings // We need something different for get and set requests when no mouse name
if (mouseName == "") { // is specified, so leave that to the caller.
std::map<BString, MouseSettings*>::iterator itr if (mouseName.IsEmpty())
= fMouseSettingsObject.begin(); return NULL;
if (itr != fMouseSettingsObject.end())
return itr->second; 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 if (settings == NULL)
// some settings = _RunningMouseSettings();
return fMouseSettings.AddMouseSettings(mouseName); 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); MouseSettings* settings = _GetSettingsForMouse(mouseName);
if (settings == NULL)
return B_NO_MEMORY;
int32 speed; int32 speed;
if (message->FindInt32("speed", &speed) == B_OK) { 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); be_app_messenger.SendMessage(IS_SAVE_SETTINGS);
BMessage msg(IS_CONTROL_DEVICES); return _PostMouseControlMessage(B_MOUSE_SPEED_CHANGED, mouseName);
msg.AddInt32("type", B_POINTING_DEVICE);
msg.AddInt32("code", B_MOUSE_SPEED_CHANGED);
return fAddOnManager->PostMessage(&msg);
} }
if (settings == NULL)
settings = _RunningMouseSettings();
return reply->AddInt32("speed", settings->MouseSpeed()); return reply->AddInt32("speed", settings->MouseSpeed());
} }
@@ -906,21 +936,27 @@ InputServer::HandleGetSetMouseMap(BMessage* message, BMessage* reply)
message->FindString("mouse_name", &mouseName); message->FindString("mouse_name", &mouseName);
MouseSettings* settings = _GetSettingsForMouse(mouseName); MouseSettings* settings = _GetSettingsForMouse(mouseName);
if (settings == NULL)
return B_NO_MEMORY;
mouse_map *map; mouse_map *map;
ssize_t size; ssize_t size;
if (message->FindData("mousemap", B_RAW_TYPE, (const void**)&map, &size) == B_OK) { 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); be_app_messenger.SendMessage(IS_SAVE_SETTINGS);
BMessage msg(IS_CONTROL_DEVICES); return _PostMouseControlMessage(B_MOUSE_MAP_CHANGED, mouseName);
msg.AddInt32("type", B_POINTING_DEVICE);
msg.AddInt32("code", B_MOUSE_MAP_CHANGED);
return fAddOnManager->PostMessage(&msg);
} }
if (settings == NULL)
settings = _RunningMouseSettings();
mouse_map getmap; mouse_map getmap;
settings->Mapping(getmap); settings->Mapping(getmap);
return reply->AddData("mousemap", B_RAW_TYPE, &getmap, sizeof(mouse_map)); 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); message->FindString("mouse_name", &mouseName);
MouseSettings* settings = _GetSettingsForMouse(mouseName); MouseSettings* settings = _GetSettingsForMouse(mouseName);
if (settings == NULL)
return B_NO_MEMORY;
bigtime_t clickSpeed; bigtime_t clickSpeed;
if (message->FindInt64("speed", &clickSpeed) == B_OK) { 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); be_app_messenger.SendMessage(IS_SAVE_SETTINGS);
BMessage msg(IS_CONTROL_DEVICES); return _PostMouseControlMessage(B_CLICK_SPEED_CHANGED, mouseName);
msg.AddInt32("type", B_POINTING_DEVICE);
msg.AddInt32("code", B_CLICK_SPEED_CHANGED);
return fAddOnManager->PostMessage(&msg);
} }
if (settings == NULL)
settings = _RunningMouseSettings();
return reply->AddInt64("speed", settings->ClickSpeed()); return reply->AddInt64("speed", settings->ClickSpeed());
} }
+5 -3
View File
@@ -187,7 +187,11 @@ class InputServer : public BApplication {
status_t _LoadSystemKeymap(); status_t _LoadSystemKeymap();
status_t _SaveKeymap(bool isDefault = false); status_t _SaveKeymap(bool isDefault = false);
void _InitKeyboardMouseStates(); void _InitKeyboardMouseStates();
MouseSettings* _RunningMouseSettings();
void _RunningMiceSettings(BList& settings);
MouseSettings* _GetSettingsForMouse(BString mouseName); MouseSettings* _GetSettingsForMouse(BString mouseName);
status_t _PostMouseControlMessage(int32 code, const BString& mouseName);
status_t _StartEventLoop(); status_t _StartEventLoop();
void _EventLoop(); void _EventLoop();
@@ -214,6 +218,7 @@ class InputServer : public BApplication {
KeyboardSettings fKeyboardSettings; KeyboardSettings fKeyboardSettings;
MultipleMouseSettings fMouseSettings; MultipleMouseSettings fMouseSettings;
MouseSettings fDefaultMouseSettings;
BPoint fMousePos; // current mouse position BPoint fMousePos; // current mouse position
key_info fKeyInfo; // current key info key_info fKeyInfo; // current key info
@@ -242,9 +247,6 @@ class InputServer : public BApplication {
team_id fAppServerTeam; team_id fAppServerTeam;
area_id fCursorArea; area_id fCursorArea;
shared_cursor* fCursorBuffer; shared_cursor* fCursorBuffer;
typedef std::map<BString, MouseSettings*> mouse_settings_object;
mouse_settings_object fMouseSettingsObject;
}; };
extern InputServer* gInputServer; extern InputServer* gInputServer;