* 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
KeymapApplication.cpp
KeymapListItem.cpp
KeymapMessageFilter.cpp
KeymapWindow.cpp
: 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
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;
}
+2
View File
@@ -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; }
@@ -1,74 +0,0 @@
/*
* Copyright 2009, Axel Dörfler, [email protected].
* 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, [email protected].
* 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 <ListView.h>
#include <MenuBar.h>
#include <MenuField.h>
#include <MenuItem.h>
#include <Path.h>
#include <PopUpMenu.h>
#include <Screen.h>
#include <ScrollView.h>
#include <StringView.h>
@@ -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 = "<none>";
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<KeymapListItem*>(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;
}
}
+2 -3
View File
@@ -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;