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:
committed by
waddlesplash
parent
85e84ddefb
commit
df803c0f3f
+155
-113
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user