* removed KeymapMessageFilter, as it is no longer needed

* fixed a couple of issues with respect to internal/external naming of 
  keymaps and the respective files, hopefully such that there's always one
  keymap active in the view: either one that has been selected or (Current)
  if any changes have been applied
* replaced the dead-key-menubar with a menufield (thanks Axel, looking much
  better)
cleanup:
* removed remnants of Use-button (message constant and switch-case)
* dropped 'Save' menu item, as it wasn't implemented anyway and would now
  never be enabled
* removed fFirstTime, as it caused problems, but did not serve any purpose
  anymore


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30734 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Oliver Tappe
2009-05-12 22:58:09 +00:00
parent 6f7f87a2ac
commit aa0f32cfbd
7 changed files with 48 additions and 147 deletions
-1
View File
@@ -10,7 +10,6 @@ Preference Keymap :
Keymap.cpp Keymap.cpp
KeymapApplication.cpp KeymapApplication.cpp
KeymapListItem.cpp KeymapListItem.cpp
KeymapMessageFilter.cpp
KeymapWindow.cpp KeymapWindow.cpp
: be tracker $(TARGET_LIBSTDC++) : be tracker $(TARGET_LIBSTDC++)
+15 -1
View File
@@ -84,6 +84,13 @@ Keymap::SetTarget(BMessenger target, BMessage* modificationMessage)
} }
void
Keymap::SetName(const char* name)
{
strlcpy(fName, name, sizeof(fName));
}
void void
Keymap::DumpKeymap() Keymap::DumpKeymap()
{ {
@@ -151,7 +158,14 @@ Keymap::Load(entry_ref &ref)
if (err < B_OK) { if (err < B_OK) {
fprintf(stderr, "error reading keymap chars: %s\n", strerror(err)); 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; return err;
} }
+2
View File
@@ -64,6 +64,8 @@ public:
int8 deadKey, const char* bytes, int8 deadKey, const char* bytes,
int32 numBytes = -1); int32 numBytes = -1);
void SetName(const char* name);
const key_map& Map() const { return fKeys; } const key_map& Map() const { return fKeys; }
key_map& Map() { return fKeys; } key_map& Map() { return fKeys; }
@@ -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 <AppDefs.h>
#include <Message.h>
#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;
}
@@ -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 <MessageFilter.h>
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
+29 -38
View File
@@ -21,8 +21,10 @@
#include <GroupLayoutBuilder.h> #include <GroupLayoutBuilder.h>
#include <ListView.h> #include <ListView.h>
#include <MenuBar.h> #include <MenuBar.h>
#include <MenuField.h>
#include <MenuItem.h> #include <MenuItem.h>
#include <Path.h> #include <Path.h>
#include <PopUpMenu.h>
#include <Screen.h> #include <Screen.h>
#include <ScrollView.h> #include <ScrollView.h>
#include <StringView.h> #include <StringView.h>
@@ -31,11 +33,9 @@
#include "KeyboardLayoutView.h" #include "KeyboardLayoutView.h"
#include "KeymapApplication.h" #include "KeymapApplication.h"
#include "KeymapListItem.h" #include "KeymapListItem.h"
#include "KeymapMessageFilter.h"
static const uint32 kMsgMenuFileOpen = 'mMFO'; static const uint32 kMsgMenuFileOpen = 'mMFO';
static const uint32 kMsgMenuFileSave = 'mMFS';
static const uint32 kMsgMenuFileSaveAs = 'mMFA'; static const uint32 kMsgMenuFileSaveAs = 'mMFA';
static const uint32 kChangeKeyboardLayout = 'cKyL'; static const uint32 kChangeKeyboardLayout = 'cKyL';
@@ -47,7 +47,6 @@ static const uint32 kMsgMenuFontChanged = 'mMFC';
static const uint32 kMsgSystemMapSelected = 'SmST'; static const uint32 kMsgSystemMapSelected = 'SmST';
static const uint32 kMsgUserMapSelected = 'UmST'; static const uint32 kMsgUserMapSelected = 'UmST';
static const uint32 kMsgUseKeymap = 'UkyM';
static const uint32 kMsgRevertKeymap = 'Rvrt'; static const uint32 kMsgRevertKeymap = 'Rvrt';
static const uint32 kMsgKeymapUpdated = 'upkM'; static const uint32 kMsgKeymapUpdated = 'upkM';
@@ -59,11 +58,12 @@ static const uint32 kMsgDeadKeyTildeChanged = 'dkTc';
static const char* kDeadKeyTriggerNone = "<none>"; static const char* kDeadKeyTriggerNone = "<none>";
static const char* kCurrentKeymapName = "(Current)";
KeymapWindow::KeymapWindow() KeymapWindow::KeymapWindow()
: BWindow(BRect(80, 50, 880, 380), "Keymap", B_TITLED_WINDOW, : BWindow(BRect(80, 50, 880, 380), "Keymap", B_TITLED_WINDOW,
B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS), B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS)
fFirstTime(true)
{ {
SetLayout(new BGroupLayout(B_VERTICAL)); SetLayout(new BGroupLayout(B_VERTICAL));
@@ -87,7 +87,7 @@ KeymapWindow::KeymapWindow()
.Add(fKeyboardLayoutView) .Add(fKeyboardLayoutView)
//.Add(new BStringView("text label", "Sample and Clipboard:")) //.Add(new BStringView("text label", "Sample and Clipboard:"))
.Add(BGroupLayoutBuilder(B_HORIZONTAL, 10) .Add(BGroupLayoutBuilder(B_HORIZONTAL, 10)
.Add(_CreateDeadKeyMenu(), 0.0) .Add(_CreateDeadKeyMenuField(), 0.0)
.AddGlue() .AddGlue()
.Add(fSwitchShortcutsButton)) .Add(fSwitchShortcutsButton))
.Add(fTextControl) .Add(fTextControl)
@@ -99,8 +99,6 @@ KeymapWindow::KeymapWindow()
fKeyboardLayoutView->SetTarget(fTextControl->TextView()); fKeyboardLayoutView->SetTarget(fTextControl->TextView());
fTextControl->MakeFocus(); fTextControl->MakeFocus();
fTextControl->TextView()->AddFilter(new KeymapMessageFilter(
B_PROGRAMMED_DELIVERY, B_ANY_SOURCE, &fCurrentMap));
_UpdateButtons(); _UpdateButtons();
@@ -194,6 +192,7 @@ KeymapWindow::MessageReceived(BMessage* message)
int32 i = 0; int32 i = 0;
while (message->FindRef("refs", i++, &ref) == B_OK) { while (message->FindRef("refs", i++, &ref) == B_OK) {
fCurrentMap.Load(ref); fCurrentMap.Load(ref);
fAppliedMap = fCurrentMap;
} }
fKeyboardLayoutView->SetKeymap(&fCurrentMap); fKeyboardLayoutView->SetKeymap(&fCurrentMap);
fSystemListView->DeselectAll(); fSystemListView->DeselectAll();
@@ -210,9 +209,12 @@ KeymapWindow::MessageReceived(BMessage* message)
BDirectory directory(&ref); BDirectory directory(&ref);
BEntry entry(&directory, name); BEntry entry(&directory, name);
entry.GetRef(&ref); entry.GetRef(&ref);
fCurrentMap.SetName(name);
fCurrentMap.Save(ref); fCurrentMap.Save(ref);
fAppliedMap = fCurrentMap;
_FillUserMaps(); _FillUserMaps();
fCurrentMapName = name;
_SelectCurrentMap();
} }
break; break;
} }
@@ -220,8 +222,6 @@ KeymapWindow::MessageReceived(BMessage* message)
case kMsgMenuFileOpen: case kMsgMenuFileOpen:
fOpenPanel->Show(); fOpenPanel->Show();
break; break;
case kMsgMenuFileSave:
break;
case kMsgMenuFileSaveAs: case kMsgMenuFileSaveAs:
fSavePanel->Show(); fSavePanel->Show();
break; break;
@@ -267,7 +267,6 @@ KeymapWindow::MessageReceived(BMessage* message)
BListView* otherListView; BListView* otherListView;
if (message->what == kMsgSystemMapSelected) { if (message->what == kMsgSystemMapSelected) {
fUserListView->DeselectAll();
listView = fSystemListView; listView = fSystemListView;
otherListView = fUserListView; otherListView = fUserListView;
} else { } else {
@@ -290,21 +289,15 @@ KeymapWindow::MessageReceived(BMessage* message)
KeymapListItem* item KeymapListItem* item
= static_cast<KeymapListItem*>(listView->ItemAt(index)); = static_cast<KeymapListItem*>(listView->ItemAt(index));
if (item != NULL) { if (item != NULL) {
if (!fFirstTime) fCurrentMap.Load(item->EntryRef());
fCurrentMap.Load(item->EntryRef()); fAppliedMap = fCurrentMap;
else
fFirstTime = false;
fKeyboardLayoutView->SetKeymap(&fCurrentMap); fKeyboardLayoutView->SetKeymap(&fCurrentMap);
_UseKeymap();
_UpdateButtons(); _UpdateButtons();
} }
break; break;
} }
case kMsgUseKeymap:
_UseKeymap();
_UpdateButtons();
break;
case kMsgRevertKeymap: case kMsgRevertKeymap:
_RevertKeymap(); _RevertKeymap();
_UpdateButtons(); _UpdateButtons();
@@ -399,9 +392,6 @@ KeymapWindow::_CreateMenu()
menu->AddItem(new BMenuItem("Open" B_UTF8_ELLIPSIS, menu->AddItem(new BMenuItem("Open" B_UTF8_ELLIPSIS,
new BMessage(kMsgMenuFileOpen), 'O')); new BMessage(kMsgMenuFileOpen), 'O'));
menu->AddSeparatorItem(); 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, menu->AddItem(new BMenuItem("Save As" B_UTF8_ELLIPSIS,
new BMessage(kMsgMenuFileSaveAs))); new BMessage(kMsgMenuFileSaveAs)));
menu->AddSeparatorItem(); menu->AddSeparatorItem();
@@ -446,12 +436,10 @@ KeymapWindow::_CreateMenu()
} }
BMenuBar* BMenuField*
KeymapWindow::_CreateDeadKeyMenu() KeymapWindow::_CreateDeadKeyMenuField()
{ {
BMenuBar* menuBar = new BMenuBar("deadkeymenubar"); BPopUpMenu* deadKeyMenu = new BPopUpMenu("Select Dead Keys", false, false);
fDeadKeyMenu = new BMenu("Select Dead Keys");
menuBar->AddItem(fDeadKeyMenu);
fAcuteMenu = new BMenu("Acute Trigger"); fAcuteMenu = new BMenu("Acute Trigger");
fAcuteMenu->SetRadioMode(true); fAcuteMenu->SetRadioMode(true);
@@ -461,7 +449,7 @@ KeymapWindow::_CreateDeadKeyMenu()
new BMessage(kMsgDeadKeyAcuteChanged))); new BMessage(kMsgDeadKeyAcuteChanged)));
fAcuteMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone, fAcuteMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone,
new BMessage(kMsgDeadKeyAcuteChanged))); new BMessage(kMsgDeadKeyAcuteChanged)));
fDeadKeyMenu->AddItem(fAcuteMenu); deadKeyMenu->AddItem(fAcuteMenu);
fCircumflexMenu = new BMenu("Circumflex Trigger"); fCircumflexMenu = new BMenu("Circumflex Trigger");
fCircumflexMenu->SetRadioMode(true); fCircumflexMenu->SetRadioMode(true);
@@ -469,7 +457,7 @@ KeymapWindow::_CreateDeadKeyMenu()
new BMessage(kMsgDeadKeyCircumflexChanged))); new BMessage(kMsgDeadKeyCircumflexChanged)));
fCircumflexMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone, fCircumflexMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone,
new BMessage(kMsgDeadKeyCircumflexChanged))); new BMessage(kMsgDeadKeyCircumflexChanged)));
fDeadKeyMenu->AddItem(fCircumflexMenu); deadKeyMenu->AddItem(fCircumflexMenu);
fDiaeresisMenu = new BMenu("Diaeresis Trigger"); fDiaeresisMenu = new BMenu("Diaeresis Trigger");
fDiaeresisMenu->SetRadioMode(true); fDiaeresisMenu->SetRadioMode(true);
@@ -479,7 +467,7 @@ KeymapWindow::_CreateDeadKeyMenu()
new BMessage(kMsgDeadKeyDiaeresisChanged))); new BMessage(kMsgDeadKeyDiaeresisChanged)));
fDiaeresisMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone, fDiaeresisMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone,
new BMessage(kMsgDeadKeyDiaeresisChanged))); new BMessage(kMsgDeadKeyDiaeresisChanged)));
fDeadKeyMenu->AddItem(fDiaeresisMenu); deadKeyMenu->AddItem(fDiaeresisMenu);
fGraveMenu = new BMenu("Grave Trigger"); fGraveMenu = new BMenu("Grave Trigger");
fGraveMenu->SetRadioMode(true); fGraveMenu->SetRadioMode(true);
@@ -487,7 +475,7 @@ KeymapWindow::_CreateDeadKeyMenu()
new BMessage(kMsgDeadKeyGraveChanged))); new BMessage(kMsgDeadKeyGraveChanged)));
fGraveMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone, fGraveMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone,
new BMessage(kMsgDeadKeyGraveChanged))); new BMessage(kMsgDeadKeyGraveChanged)));
fDeadKeyMenu->AddItem(fGraveMenu); deadKeyMenu->AddItem(fGraveMenu);
fTildeMenu = new BMenu("Tilde Trigger"); fTildeMenu = new BMenu("Tilde Trigger");
fTildeMenu->SetRadioMode(true); fTildeMenu->SetRadioMode(true);
@@ -495,9 +483,9 @@ KeymapWindow::_CreateDeadKeyMenu()
new BMessage(kMsgDeadKeyTildeChanged))); new BMessage(kMsgDeadKeyTildeChanged)));
fTildeMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone, fTildeMenu->AddItem(new BMenuItem(kDeadKeyTriggerNone,
new BMessage(kMsgDeadKeyTildeChanged))); new BMessage(kMsgDeadKeyTildeChanged)));
fDeadKeyMenu->AddItem(fTildeMenu); deadKeyMenu->AddItem(fTildeMenu);
return menuBar; return new BMenuField(NULL, deadKeyMenu);
} }
@@ -633,8 +621,10 @@ KeymapWindow::_UpdateDeadKeyMenu()
void void
KeymapWindow::_UpdateButtons() KeymapWindow::_UpdateButtons()
{ {
if (!fCurrentMap.Equals(fAppliedMap)) if (!fCurrentMap.Equals(fAppliedMap)) {
fCurrentMap.SetName(kCurrentKeymapName);
_UseKeymap(); _UseKeymap();
}
fRevertButton->SetEnabled(!fCurrentMap.Equals(fPreviousMap)); fRevertButton->SetEnabled(!fCurrentMap.Equals(fPreviousMap));
@@ -688,6 +678,7 @@ KeymapWindow::_RevertKeymap()
} }
//! Saves current map to the "Key_map" file.
void void
KeymapWindow::_UseKeymap() KeymapWindow::_UseKeymap()
{ {
@@ -704,6 +695,7 @@ KeymapWindow::_UseKeymap()
fAppliedMap.Load(ref); fAppliedMap.Load(ref);
fCurrentMapName = _GetActiveKeymapName(); fCurrentMapName = _GetActiveKeymapName();
_SelectCurrentMap();
} }
@@ -792,7 +784,7 @@ KeymapWindow::_GetCurrentKeymap(entry_ref& ref)
BString BString
KeymapWindow::_GetActiveKeymapName() KeymapWindow::_GetActiveKeymapName()
{ {
BString mapName = "(Current)"; // safe default BString mapName = kCurrentKeymapName; // safe default
entry_ref ref; entry_ref ref;
_GetCurrentKeymap(ref); _GetCurrentKeymap(ref);
@@ -832,6 +824,5 @@ KeymapWindow::_SelectCurrentMap()
&& !_SelectCurrentMap(fUserListView)) { && !_SelectCurrentMap(fUserListView)) {
// Select the "(Current)" entry if no name matches // Select the "(Current)" entry if no name matches
fUserListView->Select(0L); fUserListView->Select(0L);
fFirstTime = false;
} }
} }
+2 -3
View File
@@ -21,6 +21,7 @@
class BMenu; class BMenu;
class BMenuBar; class BMenuBar;
class BMenuField;
class BTextControl; class BTextControl;
class KeyboardLayoutView; class KeyboardLayoutView;
class KeymapListItem; class KeymapListItem;
@@ -46,7 +47,7 @@ protected:
void _UseKeymap(); void _UseKeymap();
void _RevertKeymap(); void _RevertKeymap();
BMenuBar* _CreateDeadKeyMenu(); BMenuField* _CreateDeadKeyMenuField();
void _UpdateDeadKeyMenu(); void _UpdateDeadKeyMenu();
void _FillSystemMaps(); void _FillSystemMaps();
@@ -66,7 +67,6 @@ protected:
KeyboardLayoutView* fKeyboardLayoutView; KeyboardLayoutView* fKeyboardLayoutView;
BTextControl* fTextControl; BTextControl* fTextControl;
BButton* fSwitchShortcutsButton; BButton* fSwitchShortcutsButton;
BMenu* fDeadKeyMenu;
BMenu* fAcuteMenu; BMenu* fAcuteMenu;
BMenu* fCircumflexMenu; BMenu* fCircumflexMenu;
BMenu* fDiaeresisMenu; BMenu* fDiaeresisMenu;
@@ -76,7 +76,6 @@ protected:
Keymap fCurrentMap; Keymap fCurrentMap;
Keymap fPreviousMap; Keymap fPreviousMap;
Keymap fAppliedMap; Keymap fAppliedMap;
bool fFirstTime;
BString fCurrentMapName; BString fCurrentMapName;
BFilePanel* fOpenPanel; BFilePanel* fOpenPanel;