diff --git a/src/preferences/keymap/Jamfile b/src/preferences/keymap/Jamfile index 3b9ea00293..2121210e82 100644 --- a/src/preferences/keymap/Jamfile +++ b/src/preferences/keymap/Jamfile @@ -10,7 +10,6 @@ Preference Keymap : Keymap.cpp KeymapApplication.cpp KeymapListItem.cpp - KeymapMessageFilter.cpp KeymapWindow.cpp : be tracker $(TARGET_LIBSTDC++) diff --git a/src/preferences/keymap/Keymap.cpp b/src/preferences/keymap/Keymap.cpp index 79541d4f9e..cba8c84a6c 100644 --- a/src/preferences/keymap/Keymap.cpp +++ b/src/preferences/keymap/Keymap.cpp @@ -84,6 +84,13 @@ Keymap::SetTarget(BMessenger target, BMessage* modificationMessage) } +void +Keymap::SetName(const char* name) +{ + strlcpy(fName, name, sizeof(fName)); +} + + void Keymap::DumpKeymap() { @@ -151,7 +158,14 @@ 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)); + + // fetch name from attribute and fall back to filename + ssize_t bytesRead + = file.ReadAttr("keymap:name", B_STRING_TYPE, 0, fName, sizeof(fName)); + if (bytesRead > 0) + fName[bytesRead] = '\0'; + else + strlcpy(fName, ref.name, sizeof(fName)); return err; } diff --git a/src/preferences/keymap/Keymap.h b/src/preferences/keymap/Keymap.h index 5ae3fa3dd6..659d590d3b 100644 --- a/src/preferences/keymap/Keymap.h +++ b/src/preferences/keymap/Keymap.h @@ -64,6 +64,8 @@ public: int8 deadKey, const char* bytes, int32 numBytes = -1); + void SetName(const char* name); + const key_map& Map() const { return fKeys; } key_map& Map() { return fKeys; } diff --git a/src/preferences/keymap/KeymapMessageFilter.cpp b/src/preferences/keymap/KeymapMessageFilter.cpp deleted file mode 100644 index e26ee09fc2..0000000000 --- a/src/preferences/keymap/KeymapMessageFilter.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2009, Axel Dörfler, axeld@pinc-software.de. - * Distributed under the terms of the MIT License. - */ - -/*! This class implements a filter that applies a certain keymap to - the keyboard input. - It's used to be able to make keymap changes live within the - application. -*/ - -#include "KeymapMessageFilter.h" - -#include -#include - -#include "Keymap.h" - - -KeymapMessageFilter::KeymapMessageFilter(message_delivery delivery, - message_source source, Keymap* keymap) - : BMessageFilter(delivery, source), - fKeymap(keymap) -{ -} - - -KeymapMessageFilter::~KeymapMessageFilter() -{ -} - - -void -KeymapMessageFilter::SetKeymap(Keymap* keymap) -{ - fKeymap = keymap; -} - - -filter_result -KeymapMessageFilter::Filter(BMessage* message, BHandler** /*_target*/) -{ - if (fKeymap == NULL || message->what != B_KEY_DOWN) - return B_DISPATCH_MESSAGE; - - void* keymap; - if (message->FindPointer("keymap", &keymap) == B_OK && keymap == fKeymap) - return B_DISPATCH_MESSAGE; - - // TODO: add dead key handling! - - int32 modifiers; - int32 key; - if (message->FindInt32("modifiers", &modifiers) == B_OK - && message->FindInt32("key", &key) == B_OK) { - // replace "bytes", and "raw_char"/"byte" - char* string; - int32 numBytes; - fKeymap->GetChars(key, modifiers, 0, &string, &numBytes); - if (string != NULL) { - message->ReplaceString("bytes", string); - delete[] string; - } - - fKeymap->GetChars(key, 0, 0, &string, &numBytes); - if (string != NULL) { - message->ReplaceInt32("raw_char", string[0]); - message->ReplaceInt8("byte", string[0]); - delete[] string; - } - } - - return B_DISPATCH_MESSAGE; -} diff --git a/src/preferences/keymap/KeymapMessageFilter.h b/src/preferences/keymap/KeymapMessageFilter.h deleted file mode 100644 index 45d5b77894..0000000000 --- a/src/preferences/keymap/KeymapMessageFilter.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2009, Axel Dörfler, axeld@pinc-software.de. - * Distributed under the terms of the MIT License. - */ -#ifndef KEYMAP_MESSAGE_FILTER_H -#define KEYMAP_MESSAGE_FILTER_H - - -#include - -class Keymap; - - -class KeymapMessageFilter : public BMessageFilter { -public: - KeymapMessageFilter( - message_delivery delivery = B_ANY_DELIVERY, - message_source source = B_ANY_SOURCE, - Keymap* keymap = NULL); - virtual ~KeymapMessageFilter(); - - void SetKeymap(Keymap* keymap); - - virtual filter_result Filter(BMessage* message, BHandler** _target); - -private: - Keymap* fKeymap; -}; - -#endif // KEYMAP_MESSAGE_FILTER_H diff --git a/src/preferences/keymap/KeymapWindow.cpp b/src/preferences/keymap/KeymapWindow.cpp index 424994722b..4bd17a973a 100644 --- a/src/preferences/keymap/KeymapWindow.cpp +++ b/src/preferences/keymap/KeymapWindow.cpp @@ -21,8 +21,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -31,11 +33,9 @@ #include "KeyboardLayoutView.h" #include "KeymapApplication.h" #include "KeymapListItem.h" -#include "KeymapMessageFilter.h" static const uint32 kMsgMenuFileOpen = 'mMFO'; -static const uint32 kMsgMenuFileSave = 'mMFS'; static const uint32 kMsgMenuFileSaveAs = 'mMFA'; static const uint32 kChangeKeyboardLayout = 'cKyL'; @@ -47,7 +47,6 @@ static const uint32 kMsgMenuFontChanged = 'mMFC'; static const uint32 kMsgSystemMapSelected = 'SmST'; static const uint32 kMsgUserMapSelected = 'UmST'; -static const uint32 kMsgUseKeymap = 'UkyM'; static const uint32 kMsgRevertKeymap = 'Rvrt'; static const uint32 kMsgKeymapUpdated = 'upkM'; @@ -59,11 +58,12 @@ static const uint32 kMsgDeadKeyTildeChanged = 'dkTc'; static const char* kDeadKeyTriggerNone = ""; +static const char* kCurrentKeymapName = "(Current)"; + KeymapWindow::KeymapWindow() : BWindow(BRect(80, 50, 880, 380), "Keymap", B_TITLED_WINDOW, - B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS), - fFirstTime(true) + B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS) { SetLayout(new BGroupLayout(B_VERTICAL)); @@ -87,7 +87,7 @@ KeymapWindow::KeymapWindow() .Add(fKeyboardLayoutView) //.Add(new BStringView("text label", "Sample and Clipboard:")) .Add(BGroupLayoutBuilder(B_HORIZONTAL, 10) - .Add(_CreateDeadKeyMenu(), 0.0) + .Add(_CreateDeadKeyMenuField(), 0.0) .AddGlue() .Add(fSwitchShortcutsButton)) .Add(fTextControl) @@ -99,8 +99,6 @@ KeymapWindow::KeymapWindow() fKeyboardLayoutView->SetTarget(fTextControl->TextView()); fTextControl->MakeFocus(); - fTextControl->TextView()->AddFilter(new KeymapMessageFilter( - B_PROGRAMMED_DELIVERY, B_ANY_SOURCE, &fCurrentMap)); _UpdateButtons(); @@ -194,6 +192,7 @@ KeymapWindow::MessageReceived(BMessage* message) int32 i = 0; while (message->FindRef("refs", i++, &ref) == B_OK) { fCurrentMap.Load(ref); + fAppliedMap = fCurrentMap; } fKeyboardLayoutView->SetKeymap(&fCurrentMap); fSystemListView->DeselectAll(); @@ -210,9 +209,12 @@ KeymapWindow::MessageReceived(BMessage* message) BDirectory directory(&ref); BEntry entry(&directory, name); entry.GetRef(&ref); + fCurrentMap.SetName(name); fCurrentMap.Save(ref); - + fAppliedMap = fCurrentMap; _FillUserMaps(); + fCurrentMapName = name; + _SelectCurrentMap(); } break; } @@ -220,8 +222,6 @@ KeymapWindow::MessageReceived(BMessage* message) case kMsgMenuFileOpen: fOpenPanel->Show(); break; - case kMsgMenuFileSave: - break; case kMsgMenuFileSaveAs: fSavePanel->Show(); break; @@ -267,7 +267,6 @@ KeymapWindow::MessageReceived(BMessage* message) BListView* otherListView; if (message->what == kMsgSystemMapSelected) { - fUserListView->DeselectAll(); listView = fSystemListView; otherListView = fUserListView; } else { @@ -290,21 +289,15 @@ KeymapWindow::MessageReceived(BMessage* message) KeymapListItem* item = static_cast(listView->ItemAt(index)); if (item != NULL) { - if (!fFirstTime) - fCurrentMap.Load(item->EntryRef()); - else - fFirstTime = false; - + fCurrentMap.Load(item->EntryRef()); + fAppliedMap = fCurrentMap; fKeyboardLayoutView->SetKeymap(&fCurrentMap); + _UseKeymap(); _UpdateButtons(); } break; } - case kMsgUseKeymap: - _UseKeymap(); - _UpdateButtons(); - break; case kMsgRevertKeymap: _RevertKeymap(); _UpdateButtons(); @@ -399,9 +392,6 @@ KeymapWindow::_CreateMenu() menu->AddItem(new BMenuItem("Open" B_UTF8_ELLIPSIS, new BMessage(kMsgMenuFileOpen), 'O')); menu->AddSeparatorItem(); - item = new BMenuItem("Save", new BMessage(kMsgMenuFileSave), 'S'); - item->SetEnabled(false); - menu->AddItem(item); menu->AddItem(new BMenuItem("Save As" B_UTF8_ELLIPSIS, new BMessage(kMsgMenuFileSaveAs))); menu->AddSeparatorItem(); @@ -446,12 +436,10 @@ KeymapWindow::_CreateMenu() } -BMenuBar* -KeymapWindow::_CreateDeadKeyMenu() +BMenuField* +KeymapWindow::_CreateDeadKeyMenuField() { - BMenuBar* menuBar = new BMenuBar("deadkeymenubar"); - fDeadKeyMenu = new BMenu("Select Dead Keys"); - menuBar->AddItem(fDeadKeyMenu); + BPopUpMenu* deadKeyMenu = new BPopUpMenu("Select Dead Keys", false, false); fAcuteMenu = new BMenu("Acute Trigger"); fAcuteMenu->SetRadioMode(true); @@ -461,7 +449,7 @@ KeymapWindow::_CreateDeadKeyMenu() new BMessage(kMsgDeadKeyAcuteChanged))); fAcuteMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone, new BMessage(kMsgDeadKeyAcuteChanged))); - fDeadKeyMenu->AddItem(fAcuteMenu); + deadKeyMenu->AddItem(fAcuteMenu); fCircumflexMenu = new BMenu("Circumflex Trigger"); fCircumflexMenu->SetRadioMode(true); @@ -469,7 +457,7 @@ KeymapWindow::_CreateDeadKeyMenu() new BMessage(kMsgDeadKeyCircumflexChanged))); fCircumflexMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone, new BMessage(kMsgDeadKeyCircumflexChanged))); - fDeadKeyMenu->AddItem(fCircumflexMenu); + deadKeyMenu->AddItem(fCircumflexMenu); fDiaeresisMenu = new BMenu("Diaeresis Trigger"); fDiaeresisMenu->SetRadioMode(true); @@ -479,7 +467,7 @@ KeymapWindow::_CreateDeadKeyMenu() new BMessage(kMsgDeadKeyDiaeresisChanged))); fDiaeresisMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone, new BMessage(kMsgDeadKeyDiaeresisChanged))); - fDeadKeyMenu->AddItem(fDiaeresisMenu); + deadKeyMenu->AddItem(fDiaeresisMenu); fGraveMenu = new BMenu("Grave Trigger"); fGraveMenu->SetRadioMode(true); @@ -487,7 +475,7 @@ KeymapWindow::_CreateDeadKeyMenu() new BMessage(kMsgDeadKeyGraveChanged))); fGraveMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone, new BMessage(kMsgDeadKeyGraveChanged))); - fDeadKeyMenu->AddItem(fGraveMenu); + deadKeyMenu->AddItem(fGraveMenu); fTildeMenu = new BMenu("Tilde Trigger"); fTildeMenu->SetRadioMode(true); @@ -495,9 +483,9 @@ KeymapWindow::_CreateDeadKeyMenu() new BMessage(kMsgDeadKeyTildeChanged))); fTildeMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone, new BMessage(kMsgDeadKeyTildeChanged))); - fDeadKeyMenu->AddItem(fTildeMenu); + deadKeyMenu->AddItem(fTildeMenu); - return menuBar; + return new BMenuField(NULL, deadKeyMenu); } @@ -633,8 +621,10 @@ KeymapWindow::_UpdateDeadKeyMenu() void KeymapWindow::_UpdateButtons() { - if (!fCurrentMap.Equals(fAppliedMap)) + if (!fCurrentMap.Equals(fAppliedMap)) { + fCurrentMap.SetName(kCurrentKeymapName); _UseKeymap(); + } fRevertButton->SetEnabled(!fCurrentMap.Equals(fPreviousMap)); @@ -688,6 +678,7 @@ KeymapWindow::_RevertKeymap() } +//! Saves current map to the "Key_map" file. void KeymapWindow::_UseKeymap() { @@ -704,6 +695,7 @@ KeymapWindow::_UseKeymap() fAppliedMap.Load(ref); fCurrentMapName = _GetActiveKeymapName(); + _SelectCurrentMap(); } @@ -792,7 +784,7 @@ KeymapWindow::_GetCurrentKeymap(entry_ref& ref) BString KeymapWindow::_GetActiveKeymapName() { - BString mapName = "(Current)"; // safe default + BString mapName = kCurrentKeymapName; // safe default entry_ref ref; _GetCurrentKeymap(ref); @@ -832,6 +824,5 @@ KeymapWindow::_SelectCurrentMap() && !_SelectCurrentMap(fUserListView)) { // Select the "(Current)" entry if no name matches fUserListView->Select(0L); - fFirstTime = false; } } diff --git a/src/preferences/keymap/KeymapWindow.h b/src/preferences/keymap/KeymapWindow.h index 0c2488cde0..c6477f8006 100644 --- a/src/preferences/keymap/KeymapWindow.h +++ b/src/preferences/keymap/KeymapWindow.h @@ -21,6 +21,7 @@ class BMenu; class BMenuBar; +class BMenuField; class BTextControl; class KeyboardLayoutView; class KeymapListItem; @@ -46,7 +47,7 @@ protected: void _UseKeymap(); void _RevertKeymap(); - BMenuBar* _CreateDeadKeyMenu(); + BMenuField* _CreateDeadKeyMenuField(); void _UpdateDeadKeyMenu(); void _FillSystemMaps(); @@ -66,7 +67,6 @@ protected: KeyboardLayoutView* fKeyboardLayoutView; BTextControl* fTextControl; BButton* fSwitchShortcutsButton; - BMenu* fDeadKeyMenu; BMenu* fAcuteMenu; BMenu* fCircumflexMenu; BMenu* fDiaeresisMenu; @@ -76,7 +76,6 @@ protected: Keymap fCurrentMap; Keymap fPreviousMap; Keymap fAppliedMap; - bool fFirstTime; BString fCurrentMapName; BFilePanel* fOpenPanel;