diff --git a/src/preferences/keymap/Keymap.cpp b/src/preferences/keymap/Keymap.cpp index b30bb8e61f..a2ee53eb30 100644 --- a/src/preferences/keymap/Keymap.cpp +++ b/src/preferences/keymap/Keymap.cpp @@ -113,6 +113,7 @@ Keymap::Load(entry_ref &ref) if (err < B_OK) { fprintf(stderr, "error reading keymap chars: %s\n", strerror(err)); } + strlcpy(fName, ref.name, sizeof(fName)); return err; } @@ -149,6 +150,8 @@ Keymap::Save(entry_ref &ref) if ((err = file.Write(fChars, fCharsSize)) < (ssize_t)fCharsSize) return err; + + err = file.WriteAttr("keymap:name", B_STRING_TYPE, 0, fName, strlen(fName)); return B_OK; } diff --git a/src/preferences/keymap/Keymap.h b/src/preferences/keymap/Keymap.h index a3bd0ca19c..bdee872f83 100644 --- a/src/preferences/keymap/Keymap.h +++ b/src/preferences/keymap/Keymap.h @@ -29,6 +29,7 @@ private: char *fChars; key_map fKeys; uint32 fCharsSize; + char fName[B_FILE_NAME_LENGTH]; }; diff --git a/src/preferences/keymap/KeymapWindow.cpp b/src/preferences/keymap/KeymapWindow.cpp index 862853c0f3..41f682e7cd 100644 --- a/src/preferences/keymap/KeymapWindow.cpp +++ b/src/preferences/keymap/KeymapWindow.cpp @@ -220,6 +220,11 @@ KeymapWindow::AddMaps(BView *placeholderView) FillSystemMaps(); FillUserMaps(); + + // try and find the current map name in the two list views (if the name was read at all) + if (SelectCurrentMap(fSystemListView)) + if (!SelectCurrentMap(fUserListView)) + fUserListView->Select(0L); } @@ -443,6 +448,17 @@ KeymapWindow::FillUserMaps() fUserListView->AddItem(new KeymapListItem(ref, "(Current)")); + BNode node(&ref); + char name[B_FILE_NAME_LENGTH]; + name[0] = '\0'; + if (node.InitCheck() == B_OK) { + ssize_t readSize = node.ReadAttr("keymap:name", B_STRING_TYPE, 0, name, sizeof(name) - 1); + if (readSize > 0) { + name[readSize] = '\0'; + fCurrentMapName = name; + } + } + if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK) return; @@ -454,8 +470,25 @@ KeymapWindow::FillUserMaps() while( directory.GetNextRef(&ref) == B_OK ) { fUserListView->AddItem(new KeymapListItem(ref)); } - - fUserListView->Select(0); +} + + +bool +KeymapWindow::SelectCurrentMap(BListView *view) +{ + bool found = false; + if (fCurrentMapName.Length() > 0) { + for (int32 i = 0; i < view->CountItems(); i++) { + BStringItem *current = dynamic_cast(view->ItemAt(i)); + if (current && (fCurrentMapName == current->Text())) { + found = true; + view->Select(i); + view->ScrollToSelection(); + break; + } + } + } + return found; } diff --git a/src/preferences/keymap/KeymapWindow.h b/src/preferences/keymap/KeymapWindow.h index c1c8659c5c..6621f88a8c 100644 --- a/src/preferences/keymap/KeymapWindow.h +++ b/src/preferences/keymap/KeymapWindow.h @@ -14,10 +14,12 @@ #include #include #include -#include #include -#include "KeymapTextView.h" +#include +#include + #include "Keymap.h" +#include "KeymapTextView.h" class KeymapListItem; class BBitmap; @@ -82,7 +84,8 @@ protected: void FillSystemMaps(); void FillUserMaps(); - + + bool SelectCurrentMap(BListView *list); BListView *fSystemListView; BListView *fUserListView; @@ -97,6 +100,7 @@ protected: Keymap fPreviousMap; Keymap fAppliedMap; bool fFirstTime; + BString fCurrentMapName; BFilePanel *fOpenPanel; // the file panel to open BFilePanel *fSavePanel; // the file panel to save