diff --git a/src/preferences/keymap/Keymap.cpp b/src/preferences/keymap/Keymap.cpp index e2225f9be4..0816da3de6 100644 --- a/src/preferences/keymap/Keymap.cpp +++ b/src/preferences/keymap/Keymap.cpp @@ -17,6 +17,8 @@ #include #include +#include +#include #include @@ -336,6 +338,23 @@ Keymap::SetDeadKeyTrigger(dead_key_index deadKeyIndex, const BString& trigger) } +status_t +Keymap::RestoreSystemDefault() +{ + BPath path; + status_t status = find_directory(B_USER_SETTINGS_DIRECTORY, &path); + if (status != B_OK) + return status; + + path.Append("Key_map"); + + BEntry entry(path.Path()); + entry.Remove(); + + return Use(); +} + + //! We make our input server use the map in /boot/home/config/settings/Keymap status_t Keymap::Use() diff --git a/src/preferences/keymap/Keymap.h b/src/preferences/keymap/Keymap.h index d604fcd47c..48e4349db2 100644 --- a/src/preferences/keymap/Keymap.h +++ b/src/preferences/keymap/Keymap.h @@ -48,6 +48,7 @@ public: void SetDeadKeyTrigger(dead_key_index deadKeyIndex, const BString& trigger); + status_t RestoreSystemDefault(); status_t Use(); void SetKey(uint32 keyCode, uint32 modifiers, diff --git a/src/preferences/keymap/KeymapWindow.cpp b/src/preferences/keymap/KeymapWindow.cpp index de078ef4f3..a9beba24c7 100644 --- a/src/preferences/keymap/KeymapWindow.cpp +++ b/src/preferences/keymap/KeymapWindow.cpp @@ -55,6 +55,7 @@ static const uint32 kMsgMenuFontChanged = 'mMFC'; static const uint32 kMsgSystemMapSelected = 'SmST'; static const uint32 kMsgUserMapSelected = 'UmST'; +static const uint32 kMsgDefaultKeymap = 'Dflt'; static const uint32 kMsgRevertKeymap = 'Rvrt'; static const uint32 kMsgKeymapUpdated = 'kMup'; @@ -67,6 +68,7 @@ static const uint32 kMsgDeadKeyTildeChanged = 'dkTc'; static const char* kDeadKeyTriggerNone = ""; static const char* kCurrentKeymapName = "(Current)"; +static const char* kDefaultKeymapName = "US-International"; KeymapWindow::KeymapWindow() @@ -85,9 +87,6 @@ KeymapWindow::KeymapWindow() fSwitchShortcutsButton = new BButton("switch", "", new BMessage(kMsgSwitchShortcuts)); - fRevertButton = new BButton("revertButton", B_TRANSLATE("Revert"), - new BMessage(kMsgRevertKeymap)); - // controls pane AddChild(BGroupLayoutBuilder(B_VERTICAL) .Add(_CreateMenu()) @@ -103,8 +102,12 @@ KeymapWindow::KeymapWindow() .Add(fTextControl) .AddGlue(0.0) .Add(BGroupLayoutBuilder(B_HORIZONTAL, 10) - .AddGlue(0.0) - .Add(fRevertButton))) + .Add(fDefaultsButton = new BButton("defaultsButton", + B_TRANSLATE("Defaults"), + new BMessage(kMsgDefaultKeymap))) + .Add(fRevertButton = new BButton("revertButton", + B_TRANSLATE("Revert"), new BMessage(kMsgRevertKeymap))) + .AddGlue())) .SetInsets(10, 10, 10, 10))); fKeyboardLayoutView->SetTarget(fTextControl->TextView()); @@ -292,6 +295,11 @@ KeymapWindow::MessageReceived(BMessage* message) break; } + case kMsgDefaultKeymap: + _DefaultKeymap(); + _UpdateButtons(); + break; + case kMsgRevertKeymap: _RevertKeymap(); _UpdateButtons(); @@ -735,6 +743,8 @@ KeymapWindow::_UpdateButtons() _UseKeymap(); } + fDefaultsButton->SetEnabled( + fCurrentMapName.ICompare(kDefaultKeymapName) != 0); fRevertButton->SetEnabled(fCurrentMap != fPreviousMap); _UpdateDeadKeyMenu(); @@ -763,6 +773,20 @@ KeymapWindow::_SwitchShortcutKeys() } +//! Restores the default keymap. +void +KeymapWindow::_DefaultKeymap() +{ + fCurrentMap.RestoreSystemDefault(); + fAppliedMap = fCurrentMap; + + fKeyboardLayoutView->SetKeymap(&fCurrentMap); + + fCurrentMapName = _GetActiveKeymapName(); + _SelectCurrentMap(); +} + + //! Saves previous map to the "Key_map" file. void KeymapWindow::_RevertKeymap() diff --git a/src/preferences/keymap/KeymapWindow.h b/src/preferences/keymap/KeymapWindow.h index a61f23b6a5..5796fe6d04 100644 --- a/src/preferences/keymap/KeymapWindow.h +++ b/src/preferences/keymap/KeymapWindow.h @@ -51,6 +51,7 @@ protected: void _SwitchShortcutKeys(); void _UseKeymap(); + void _DefaultKeymap(); void _RevertKeymap(); BMenuField* _CreateDeadKeyMenuField(); @@ -74,6 +75,7 @@ protected: private: BListView* fSystemListView; BListView* fUserListView; + BButton* fDefaultsButton; BButton* fRevertButton; BMenu* fLayoutMenu; BMenu* fFontMenu;