diff --git a/src/servers/input/MouseSettings.cpp b/src/servers/input/MouseSettings.cpp index 1383a839cf..7a64db9d80 100644 --- a/src/servers/input/MouseSettings.cpp +++ b/src/servers/input/MouseSettings.cpp @@ -30,10 +30,9 @@ static const bool kDefaultAcceptFirstClick = true; MouseSettings::MouseSettings() { Defaults(); - RetrieveSettings(); #ifdef DEBUG - Dump(); + Dump(); #endif fOriginalSettings = fSettings; @@ -43,9 +42,27 @@ MouseSettings::MouseSettings() } +MouseSettings::MouseSettings(mouse_settings* originalSettings) +{ + Defaults(); + fMode = mouse_mode(); + fAcceptFirstClick = accept_first_click(); + + fOriginalSettings = *originalSettings; + fSettings = *originalSettings; + +#ifdef DEBUG + Dump(); +#endif + + fOriginalMode = fMode; + fOriginalFocusFollowsMouseMode = fFocusFollowsMouseMode; + fOriginalAcceptFirstClick = fAcceptFirstClick; +} + + MouseSettings::~MouseSettings() { - SaveSettings(); } @@ -92,31 +109,6 @@ MouseSettings::RetrieveSettings() } -status_t -MouseSettings::SaveSettings() -{ -#ifdef DEBUG - Dump(); -#endif - - BPath path; - status_t status = GetSettingsPath(path); - if (status < B_OK) - return status; - - BFile file(path.Path(), B_READ_WRITE | B_CREATE_FILE); - status = file.InitCheck(); - if (status != B_OK) - return status; - - file.Write(&fSettings, sizeof(fSettings)); - - // who is responsible for saving the mouse mode and accept_first_click? - - return B_OK; -} - - #ifdef DEBUG void MouseSettings::Dump() @@ -270,3 +262,186 @@ MouseSettings::SetAcceptFirstClick(bool acceptFirstClick) } +/* MultiMouseSettings functions */ + +MultipleMouseSettings::MultipleMouseSettings() +{ + fDeprecatedMouseSettings = NULL; + RetrieveSettings(); + +#ifdef DEBUG + Dump(); +#endif +} + + +MultipleMouseSettings::~MultipleMouseSettings() +{ + SaveSettings(); + +#ifdef DEBUG + Dump(); +#endif + + std::map::iterator itr; + for (itr = fMouseSettingsObject.begin(); itr != fMouseSettingsObject.end(); + ++itr) + delete itr->second; + + delete fDeprecatedMouseSettings; +} + + +status_t +MultipleMouseSettings::GetSettingsPath(BPath &path) +{ + status_t status = find_directory(B_USER_SETTINGS_DIRECTORY, &path); + if (status < B_OK) + return status; + + path.Append(mouse_settings_file); + return B_OK; +} + + +void +MultipleMouseSettings::RetrieveSettings() +{ + BPath path; + if (GetSettingsPath(path) < B_OK) + return; + + BFile file(path.Path(), B_READ_ONLY); + if (file.InitCheck() < B_OK) + return; + + BMessage message; + + if (message.Unflatten(&file) == B_OK) { + int i = 0; + BString deviceName; + mouse_settings* settings; + ssize_t size = 0; + + while (message.FindString("mouseDevice", i, &deviceName) == B_OK) { + message.FindData("mouseSettings", B_ANY_TYPE, i, + (const void**)&settings, &size); + MouseSettings* mouseSettings = new MouseSettings(settings); + fMouseSettingsObject.insert(std::pair + (deviceName, mouseSettings)); + i++; + } + } else { + fDeprecatedMouseSettings = new MouseSettings(); + fDeprecatedMouseSettings->RetrieveSettings(); + } +} + + +status_t +MultipleMouseSettings::Archive(BMessage* into, bool deep) const +{ + std::map::const_iterator itr; + for (itr = fMouseSettingsObject.begin(); itr != fMouseSettingsObject.end(); + ++itr) { + into->AddString("mouseDevice", itr->first); + into->AddData("mouseSettings", B_ANY_TYPE, itr->second->GetSettings(), + sizeof(*(itr->second->GetSettings()))); + } + + return B_OK; +} + + +status_t +MultipleMouseSettings::SaveSettings() +{ + BPath path; + status_t status = GetSettingsPath(path); + if (status < B_OK) + return status; + + BFile file(path.Path(), B_WRITE_ONLY | B_CREATE_FILE | B_ERASE_FILE); + status = file.InitCheck(); + if (status != B_OK) + return status; + + BMessage message; + Archive(&message, true); + message.Flatten(&file); + + return B_OK; +} + + +void +MultipleMouseSettings::Defaults() +{ + std::map::iterator itr; + for (itr = fMouseSettingsObject.begin(); itr != fMouseSettingsObject.end(); + ++itr) { + itr->second->Defaults(); + } +} + + +#ifdef DEBUG +void +MultipleMouseSettings::Dump() +{ + std::map::iterator itr; + for (itr = fMultipleMouseSettings.begin(); + itr != fMultipleMouseSettings.end(); ++itr) { + printf("mouse_name:\t%ld\n", itr->first); + itr->second->Dump(); + printf("\n"); + } + +} +#endif + + +MouseSettings* +MultipleMouseSettings::AddMouseSettings(BString mouse_name) +{ + if(fDeprecatedMouseSettings != NULL) { + MouseSettings* RetrievedSettings = new (std::nothrow) MouseSettings + (*fDeprecatedMouseSettings); + + if (RetrievedSettings != NULL) { + fMouseSettingsObject.insert(std::pair + (mouse_name, RetrievedSettings)); + + return RetrievedSettings; + } + } + + std::map::iterator itr; + itr = fMouseSettingsObject.find(mouse_name); + + if (itr != fMouseSettingsObject.end()) + return GetMouseSettings(mouse_name); + + MouseSettings* settings = new (std::nothrow) MouseSettings(); + + if(settings !=NULL) { + fMouseSettingsObject.insert(std::pair + (mouse_name, settings)); + return settings; + } + return B_OK; +} + + +MouseSettings* +MultipleMouseSettings::GetMouseSettings(BString mouse_name) +{ + std::map::iterator itr; + itr = fMouseSettingsObject.find(mouse_name); + + if (itr != fMouseSettingsObject.end()) + return itr->second; + return NULL; + } + + diff --git a/src/servers/input/MouseSettings.h b/src/servers/input/MouseSettings.h index c1a385bd30..f944068cb7 100644 --- a/src/servers/input/MouseSettings.h +++ b/src/servers/input/MouseSettings.h @@ -18,15 +18,20 @@ #ifndef MOUSE_SETTINGS_H_ #define MOUSE_SETTINGS_H_ +#include #include #include #include +#include #include +#include + class MouseSettings { public: MouseSettings(); + MouseSettings(mouse_settings* originalSettings); ~MouseSettings(); void Defaults(); @@ -60,13 +65,18 @@ class MouseSettings { bool AcceptFirstClick() const { return fAcceptFirstClick; } void SetAcceptFirstClick(bool acceptFirstClick); + void RetrieveSettings(); status_t SaveSettings(); + const mouse_settings* GetSettings() { return &fSettings; } + private: static status_t GetSettingsPath(BPath &path); - void RetrieveSettings(); mouse_settings fSettings, fOriginalSettings; + + // FIXME all these extra settings are not specific to each mouse. + // They should be moved into MultipleMouseSettings directly mode_mouse fMode, fOriginalMode; mode_focus_follows_mouse fFocusFollowsMouseMode; mode_focus_follows_mouse fOriginalFocusFollowsMouseMode; @@ -74,4 +84,30 @@ class MouseSettings { bool fOriginalAcceptFirstClick; }; -#endif + +class MultipleMouseSettings: public BArchivable { + public: + MultipleMouseSettings(); + ~MultipleMouseSettings(); + + status_t Archive(BMessage* into, bool deep = false) const; + + void Defaults(); + void Dump(); + status_t SaveSettings(); + + + MouseSettings* AddMouseSettings(BString mouse_name); + MouseSettings* GetMouseSettings(BString mouse_name); + + private: + static status_t GetSettingsPath(BPath &path); + void RetrieveSettings(); + + MouseSettings* fDeprecatedMouseSettings; + + typedef std::map mouse_settings_object; + mouse_settings_object fMouseSettingsObject; +}; + +#endif // MOUSE_SETTINGS_H