* 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:
@@ -10,7 +10,6 @@ Preference Keymap :
|
||||
Keymap.cpp
|
||||
KeymapApplication.cpp
|
||||
KeymapListItem.cpp
|
||||
KeymapMessageFilter.cpp
|
||||
KeymapWindow.cpp
|
||||
|
||||
: be tracker $(TARGET_LIBSTDC++)
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user