From 0a39e396165111d63ef438482bf60125a3903663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 25 Mar 2009 23:11:18 +0000 Subject: [PATCH] * Add capability to load other keyboard layouts from disk. It even works :-) git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29714 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/preferences/keymap/KeyboardLayout.cpp | 16 +++- src/preferences/keymap/KeyboardLayout.h | 7 +- src/preferences/keymap/KeymapWindow.cpp | 93 +++++++++++++++-------- src/preferences/keymap/KeymapWindow.h | 2 + 4 files changed, 81 insertions(+), 37 deletions(-) diff --git a/src/preferences/keymap/KeyboardLayout.cpp b/src/preferences/keymap/KeyboardLayout.cpp index e04e52b34e..f91d7907a3 100644 --- a/src/preferences/keymap/KeyboardLayout.cpp +++ b/src/preferences/keymap/KeyboardLayout.cpp @@ -31,7 +31,7 @@ KeyboardLayout::KeyboardLayout() fKeyCapacity(0), fIndicators(5, true) { - _SetDefault(); + SetDefault(); } @@ -102,9 +102,19 @@ KeyboardLayout::IndexForModifier(int32 modifier) status_t KeyboardLayout::Load(const char* path) +{ + entry_ref ref; + get_ref_for_path(path, &ref); + + return Load(ref); +} + + +status_t +KeyboardLayout::Load(entry_ref& ref) { BFile file; - status_t status = file.SetTo(path, B_READ_ONLY); + status_t status = file.SetTo(&ref, B_READ_ONLY); if (status != B_OK) return status; @@ -142,7 +152,7 @@ KeyboardLayout::Load(const char* path) void -KeyboardLayout::_SetDefault() +KeyboardLayout::SetDefault() { #if 1 static const char* kDefaultLayout104 = "name = Generic 104-key\n" diff --git a/src/preferences/keymap/KeyboardLayout.h b/src/preferences/keymap/KeyboardLayout.h index 1f86732c6a..47fe7e962b 100644 --- a/src/preferences/keymap/KeyboardLayout.h +++ b/src/preferences/keymap/KeyboardLayout.h @@ -8,6 +8,7 @@ #include +#include #include #include #include @@ -55,7 +56,10 @@ public: int32 IndexForModifier(int32 modifier); status_t Load(const char* path); - + status_t Load(entry_ref& ref); + + void SetDefault(); + private: enum parse_mode { kPairs, @@ -69,7 +73,6 @@ private: int32 line; }; - void _SetDefault(); void _FreeKeys(); void _Error(const parse_state& state, const char* reason, ...); diff --git a/src/preferences/keymap/KeymapWindow.cpp b/src/preferences/keymap/KeymapWindow.cpp index db8647b87c..6cd19be941 100644 --- a/src/preferences/keymap/KeymapWindow.cpp +++ b/src/preferences/keymap/KeymapWindow.cpp @@ -37,7 +37,7 @@ static const uint32 kMsgMenuFileOpen = 'mMFO'; static const uint32 kMsgMenuFileSave = 'mMFS'; static const uint32 kMsgMenuFileSaveAs = 'mMFA'; -static const uint32 kMsgMenuEditUndo = 'mMEU'; +static const uint32 kChangeKeyboardLayout = 'cKyL'; static const uint32 kMsgMenuFontChanged = 'mMFC'; @@ -211,6 +211,24 @@ KeymapWindow::MessageReceived(BMessage* message) fSavePanel->Show(); break; + case kChangeKeyboardLayout: + { + entry_ref ref; + if (message->FindRef("ref", &ref) == B_OK + && fKeyboardLayoutView->GetKeyboardLayout()->Load(ref) + == B_OK) { + fKeyboardLayoutView->SetKeyboardLayout( + fKeyboardLayoutView->GetKeyboardLayout()); + } else { + fKeyboardLayoutView->GetKeyboardLayout()->SetDefault(); + fLayoutMenu->ItemAt(0)->SetMarked(true); + } + + fKeyboardLayoutView->SetKeyboardLayout( + fKeyboardLayoutView->GetKeyboardLayout()); + break; + } + case kMsgMenuFontChanged: { BMenuItem *item = fFontMenu->FindMarked(); @@ -308,32 +326,15 @@ KeymapWindow::_CreateMenu() menuBar->AddItem(menu); // Create keyboard layout menu - menu = new BMenu("Layout"); - menu->AddItem(item = new BMenuItem( - fKeyboardLayoutView->GetKeyboardLayout()->Name(), NULL)); + fLayoutMenu = new BMenu("Layout"); + fLayoutMenu->SetRadioMode(true); + fLayoutMenu->AddItem(item = new BMenuItem( + fKeyboardLayoutView->GetKeyboardLayout()->Name(), + new BMessage(kChangeKeyboardLayout))); item->SetMarked(true); - menuBar->AddItem(menu); -#if 0 - // Create the Edit menu - menu = new BMenu("Edit"); - currentItem = new BMenuItem("Undo", - new BMessage(kMsgMenuEditUndo), 'Z'); - currentItem->SetEnabled(false); - menu->AddItem(currentItem); - menu->AddSeparatorItem(); - menu->AddItem(new BMenuItem( "Cut", - new BMessage(kMsgMenuEditCut), 'X')); - menu->AddItem(new BMenuItem( "Copy", - new BMessage(kMsgMenuEditCopy), 'C')); - menu->AddItem(new BMenuItem( "Paste", - new BMessage(kMsgMenuEditPaste), 'V')); - menu->AddItem(new BMenuItem( "Clear", - new BMessage(kMsgMenuEditClear))); - menu->AddSeparatorItem(); - menu->AddItem(new BMenuItem( "Select All", - new BMessage(kMsgMenuEditSelectAll), 'A')); - menuBar->AddItem(menu); -#endif + + _AddKeyboardLayouts(fLayoutMenu); + menuBar->AddItem(fLayoutMenu); // Create the Font menu fFontMenu = new BMenu("Font"); @@ -377,12 +378,6 @@ KeymapWindow::_CreateMapLists() BScrollView* userScroller = new BScrollView("userScrollList", fUserListView, 0, false, true); - // '(Current)' - KeymapListItem* currentKeymapItem - = static_cast(fUserListView->FirstItem()); - if (currentKeymapItem != NULL) - fUserListView->AddItem(currentKeymapItem); - // Saved keymaps _FillSystemMaps(); @@ -399,6 +394,40 @@ KeymapWindow::_CreateMapLists() } +void +KeymapWindow::_AddKeyboardLayouts(BMenu* menu) +{ + directory_which dataDirectories[] = { + B_USER_DATA_DIRECTORY, + B_COMMON_DATA_DIRECTORY, + B_BEOS_DATA_DIRECTORY + }; + + for (uint32 i = 0; + i < sizeof(dataDirectories) / sizeof(dataDirectories[0]); i++) { + BPath path; + if (find_directory(dataDirectories[i], &path) != B_OK) + continue; + + path.Append("KeyboardLayouts"); + + BDirectory directory; + if (directory.SetTo(path.Path()) == B_OK) { + entry_ref ref; + while (directory.GetNextRef(&ref) == B_OK) { + if (menu->FindItem(ref.name) != NULL) + continue; + + BMessage* message = new BMessage(kChangeKeyboardLayout); + message->AddRef("ref", &ref); + + menu->AddItem(new BMenuItem(ref.name, message)); + } + } + } +} + + void KeymapWindow::_UpdateButtons() { diff --git a/src/preferences/keymap/KeymapWindow.h b/src/preferences/keymap/KeymapWindow.h index 1bd9bc4390..746c5467ae 100644 --- a/src/preferences/keymap/KeymapWindow.h +++ b/src/preferences/keymap/KeymapWindow.h @@ -37,6 +37,7 @@ public: protected: BMenuBar* _CreateMenu(); BView* _CreateMapLists(); + void _AddKeyboardLayouts(BMenu* menu); void _UpdateButtons(); @@ -56,6 +57,7 @@ protected: BListView* fUserListView; BButton* fUseButton; BButton* fRevertButton; + BMenu* fLayoutMenu; BMenu* fFontMenu; KeyboardLayoutView* fKeyboardLayoutView; BTextControl* fTextControl;