diff --git a/docs/user/interface/InterfaceDefs.dox b/docs/user/interface/InterfaceDefs.dox index cc220ff8d6..ec08aea1b7 100644 --- a/docs/user/interface/InterfaceDefs.dox +++ b/docs/user/interface/InterfaceDefs.dox @@ -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. +*/ diff --git a/headers/os/interface/InterfaceDefs.h b/headers/os/interface/InterfaceDefs.h index 3e2875af80..40210d9d50 100644 --- a/headers/os/interface/InterfaceDefs.h +++ b/headers/os/interface/InterfaceDefs.h @@ -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); diff --git a/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp b/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp index 049ceaf4e7..fa37131e0f 100644 --- a/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp +++ b/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp @@ -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) diff --git a/src/kits/interface/InterfaceDefs.cpp b/src/kits/interface/InterfaceDefs.cpp index 7d30ed28b9..af2943534a 100644 --- a/src/kits/interface/InterfaceDefs.cpp +++ b/src/kits/interface/InterfaceDefs.cpp @@ -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) { diff --git a/src/preferences/input/InputMouse.cpp b/src/preferences/input/InputMouse.cpp index 99c678bdfc..26cda7ead9 100644 --- a/src/preferences/input/InputMouse.cpp +++ b/src/preferences/input/InputMouse.cpp @@ -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()); diff --git a/src/preferences/input/MouseSettings.cpp b/src/preferences/input/MouseSettings.cpp index 429af23155..cbe630978c 100644 --- a/src/preferences/input/MouseSettings.cpp +++ b/src/preferences/input/MouseSettings.cpp @@ -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 (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 (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 diff --git a/src/preferences/input/MouseSettings.h b/src/preferences/input/MouseSettings.h index dc0e9c357b..ee724075c6 100644 --- a/src/preferences/input/MouseSettings.h +++ b/src/preferences/input/MouseSettings.h @@ -18,6 +18,7 @@ #include #include #include +#include #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; }; diff --git a/src/preferences/input/MouseView.cpp b/src/preferences/input/MouseView.cpp index edef4ab9fb..2049e5a7cd 100644 --- a/src/preferences/input/MouseView.cpp +++ b/src/preferences/input/MouseView.cpp @@ -113,6 +113,8 @@ MouseView::MouseMapUpdated() void MouseView::UpdateFromSettings() { + if (fSettings.MouseType() > 6) + debugger("Mouse type is invalid"); SetMouseType(fSettings.MouseType()); } diff --git a/src/preferences/input/SettingsView.cpp b/src/preferences/input/SettingsView.cpp index bdf3812af8..647e8e37dd 100644 --- a/src/preferences/input/SettingsView.cpp +++ b/src/preferences/input/SettingsView.cpp @@ -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( diff --git a/src/servers/input/InputServer.cpp b/src/servers/input/InputServer.cpp index 46f531298d..734035bd03 100644 --- a/src/servers/input/InputServer.cpp +++ b/src/servers/input/InputServer.cpp @@ -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::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; } } diff --git a/src/servers/input/InputServer.h b/src/servers/input/InputServer.h index bef9fba0fa..8c2e3ebcd6 100644 --- a/src/servers/input/InputServer.h +++ b/src/servers/input/InputServer.h @@ -241,6 +241,9 @@ class InputServer : public BApplication { team_id fAppServerTeam; area_id fCursorArea; shared_cursor* fCursorBuffer; + + typedef std::map mouse_settings_object; + mouse_settings_object fMouseSettingsObject; }; extern InputServer* gInputServer;