* 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
This commit is contained in:
Axel Dörfler 2009-03-25 23:11:18 +00:00
parent c26731ec52
commit 0a39e39616
4 changed files with 81 additions and 37 deletions

View File

@ -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"

View File

@ -8,6 +8,7 @@
#include <map>
#include <Entry.h>
#include <ObjectList.h>
#include <Point.h>
#include <Rect.h>
@ -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, ...);

View File

@ -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<KeymapListItem*>(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()
{

View File

@ -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;