aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/events/default/default-events.cpp12
-rw-r--r--backends/events/default/default-events.h2
-rw-r--r--backends/keymapper/keymapper.h15
-rw-r--r--backends/keymapper/remap-dialog.cpp161
-rw-r--r--backends/keymapper/remap-dialog.h3
-rw-r--r--backends/platform/sdl/events.cpp4
6 files changed, 121 insertions, 76 deletions
diff --git a/backends/events/default/default-events.cpp b/backends/events/default/default-events.cpp
index ccea12dad6..af8f9fa231 100644
--- a/backends/events/default/default-events.cpp
+++ b/backends/events/default/default-events.cpp
@@ -198,6 +198,7 @@ DefaultEventManager::DefaultEventManager(OSystem *boss) :
_vk = new Common::VirtualKeyboard();
_keymapper = new Common::Keymapper(this);
+ _remap = false;
}
DefaultEventManager::~DefaultEventManager() {
@@ -429,8 +430,15 @@ bool DefaultEventManager::pollEvent(Common::Event &event) {
result = false;
}
} else if (event.kbd.keycode == Common::KEYCODE_F7 && event.kbd.flags == 0) {
- Common::RemapDialog dialog;
- dialog.runModal();
+ if (!_remap) {
+ _remap = true;
+ Common::RemapDialog _remapDialog;
+ bool isPaused = (g_engine) ? g_engine->isPaused() : true;
+ if (!isPaused) g_engine->pauseEngine(true);
+ _remapDialog.runModal();
+ if (!isPaused) g_engine->pauseEngine(false);
+ _remap = false;
+ }
}
break;
diff --git a/backends/events/default/default-events.h b/backends/events/default/default-events.h
index 8e24120ad0..81387d8d98 100644
--- a/backends/events/default/default-events.h
+++ b/backends/events/default/default-events.h
@@ -31,6 +31,7 @@
#include "common/savefile.h"
namespace Common {
+ class Keymapper;
class VirtualKeyboard;
}
@@ -51,6 +52,7 @@ class DefaultEventManager : public Common::EventManager {
Common::VirtualKeyboard *_vk;
Common::Keymapper *_keymapper;
+ bool _remap;
Common::Queue<Common::Event> _artificialEventQueue;
int _artificialEventCounter;
diff --git a/backends/keymapper/keymapper.h b/backends/keymapper/keymapper.h
index b5985470fe..7ef2ef96cb 100644
--- a/backends/keymapper/keymapper.h
+++ b/backends/keymapper/keymapper.h
@@ -36,9 +36,12 @@
namespace Common {
class Keymapper {
- friend class RemapDialog;
-
public:
+
+ struct MapRecord {
+ Keymap* keymap;
+ bool inherit;
+ };
Keymapper(EventManager *eventMan);
~Keymapper();
@@ -105,6 +108,9 @@ public:
void setEnabled(bool enabled) { _enabled = enabled; }
+ KeymapManager *getManager() { return _keymapMan; }
+ Stack<MapRecord>& getActiveStack() { return _activeMaps; }
+
private:
void pushKeymap(Keymap *newMap, bool inherit);
@@ -116,11 +122,6 @@ private:
bool _enabled;
- struct MapRecord {
- Keymap* keymap;
- bool inherit;
- };
-
Stack<MapRecord> _activeMaps;
};
diff --git a/backends/keymapper/remap-dialog.cpp b/backends/keymapper/remap-dialog.cpp
index 456d7a2f8e..ef9846f34e 100644
--- a/backends/keymapper/remap-dialog.cpp
+++ b/backends/keymapper/remap-dialog.cpp
@@ -35,39 +35,49 @@ enum {
};
RemapDialog::RemapDialog()
- : Dialog("remap"), _activeRemapAction(0), _topAction(0), _remapTimeout(0) {
+ : Dialog("remap"), _keymapTable(0), _activeRemapAction(0), _topAction(0), _remapTimeout(0) {
const int screenW = g_system->getOverlayWidth();
const int screenH = g_system->getOverlayHeight();
_keymapper = g_system->getEventManager()->getKeymapper();
assert(_keymapper);
- _activeKeymaps = &_keymapper->_activeMaps;
+ int labelWidth = g_gui.evaluator()->getVar("remap_popup_labelW");
+ _kmPopUp = new GUI::PopUpWidget(this, "remap_popup", "Keymap: ", labelWidth);
+
+ _scrollBar = new GUI::ScrollBarWidget(this, 0, 0, 0, 0);
+}
+
+RemapDialog::~RemapDialog() {
+ if (_keymapTable) free(_keymapTable);
+}
- KeymapManager::Domain *_globalKeymaps = &_keymapper->_keymapMan->getGlobalDomain();
+void RemapDialog::open() {
+ _activeKeymaps = &_keymapper->getActiveStack();
+ if (_activeKeymaps->size() > 0) {
+ _kmPopUp->appendEntry(_activeKeymaps->top().keymap->getName() + " (Active)");
+ }
+
+ KeymapManager::Domain *_globalKeymaps = &_keymapper->getManager()->getGlobalDomain();
KeymapManager::Domain *_gameKeymaps = 0;
+
int keymapCount = 0;
- if (_globalKeymaps->count() == 0) {
+ if (_globalKeymaps->count() == 0)
_globalKeymaps = 0;
- } else {
+ else
keymapCount += _globalKeymaps->count();
- }
+
if (ConfMan.getActiveDomain() != 0) {
- _gameKeymaps = &_keymapper->_keymapMan->getGameDomain();
- if (_gameKeymaps->count() == 0) {
+ _gameKeymaps = &_keymapper->getManager()->getGameDomain();
+ if (_gameKeymaps->count() == 0)
_gameKeymaps = 0;
- } else {
+ else
keymapCount += _gameKeymaps->count();
- }
}
+
_keymapTable = (Keymap**)malloc(sizeof(Keymap*) * keymapCount);
- int labelWidth = g_gui.evaluator()->getVar("remap_popup_labelW");
- _kmPopUp = new GUI::PopUpWidget(this, "remap_popup", "Keymap: ", labelWidth);
- if (_activeKeymaps->size() > 0) {
- _kmPopUp->appendEntry(_activeKeymaps->top().keymap->getName() + " (Active)");
- }
KeymapManager::Domain::iterator it;
uint32 idx = 0;
if (_globalKeymaps) {
@@ -85,20 +95,81 @@ RemapDialog::RemapDialog()
}
}
- setupWidgets();
-}
-
-RemapDialog::~RemapDialog() {
- free(_keymapTable);
-}
-
-void RemapDialog::open() {
Dialog::open();
_kmPopUp->setSelected(0);
loadKeymap();
}
+void RemapDialog::close() {
+ _kmPopUp->clearEntries();
+ if (_keymapTable) {
+ free(_keymapTable);
+ _keymapTable = 0;
+ }
+ Dialog::close();
+}
+
+void RemapDialog::reflowLayout() {
+ int labelWidth = g_gui.evaluator()->getVar("remap_popup_labelW");
+ _kmPopUp->changeLabelWidth(labelWidth);
+
+ int scrollbarWidth, buttonHeight;
+ if (g_gui.getWidgetSize() == GUI::kBigWidgetSize) {
+ buttonHeight = GUI::kBigButtonHeight;
+ scrollbarWidth = GUI::kBigScrollBarWidth;
+ } else {
+ buttonHeight = GUI::kButtonHeight;
+ scrollbarWidth = GUI::kNormalScrollBarWidth;
+ }
+ int areaX = g_gui.evaluator()->getVar("remap_keymap_area.x");
+ int areaY = g_gui.evaluator()->getVar("remap_keymap_area.y");
+ int areaW = g_gui.evaluator()->getVar("remap_keymap_area.w");
+ int areaH = g_gui.evaluator()->getVar("remap_keymap_area.h");
+ int spacing = g_gui.evaluator()->getVar("remap_spacing");
+ _colCount = g_gui.evaluator()->getVar("remap_col_count");
+ if (_colCount <= 0)
+ error("remap_col_count must be >= 0");
+ _rowCount = (areaH + spacing) / (buttonHeight + spacing);
+ if (_rowCount <= 0)
+ error("Remap dialog too small to display any keymaps!");
+ int colWidth = (areaW - scrollbarWidth - _colCount * spacing) / _colCount;
+
+ _scrollBar->resize(areaX + areaW - scrollbarWidth, areaY, scrollbarWidth, areaH);
+ _scrollBar->_entriesPerPage = _rowCount;
+ _scrollBar->_numEntries = 1;
+ _scrollBar->recalc();
+
+ uint textYOff = (buttonHeight - kLineHeight) / 2;
+ uint oldSize = _keymapWidgets.size();
+ uint newSize = _rowCount * _colCount;
+ _keymapWidgets.reserve(newSize);
+ for (uint i = 0; i < newSize; i++) {
+ ActionWidgets widg;
+ if (i >= _keymapWidgets.size()) {
+ widg.actionText =
+ new GUI::StaticTextWidget(this, 0, 0, 0, 0, "", Graphics::kTextAlignRight);
+ widg.keyButton =
+ new GUI::ButtonWidget(this, 0, 0, 0, 0, "", kRemapCmd + i);
+ _keymapWidgets.push_back(widg);
+ } else {
+ widg = _keymapWidgets[i];
+ }
+ uint x = areaX + (i % _colCount) * (colWidth + spacing);
+ uint y = areaY + (i / _colCount) * (buttonHeight + spacing);
+ widg.actionText->resize(x, y + textYOff, colWidth / 2, kLineHeight);
+ widg.keyButton->resize(x + colWidth / 2, y, colWidth / 2, buttonHeight);
+ }
+ while (oldSize > newSize) {
+ ActionWidgets widg = _keymapWidgets.remove_at(--oldSize);
+ removeWidget(widg.actionText);
+ delete widg.actionText;
+ removeWidget(widg.keyButton);
+ delete widg.keyButton;
+ }
+ Dialog::reflowLayout();
+}
+
void RemapDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) {
if (cmd >= kRemapCmd && cmd < kRemapCmd + _keymapWidgets.size()) {
startRemapping(cmd - kRemapCmd);
@@ -155,7 +226,7 @@ void RemapDialog::handleTickle() {
void RemapDialog::loadKeymap() {
_currentActions.clear();
if (_activeKeymaps->size() > 0 && _kmPopUp->getSelected() == 0) {
- List<const HardwareKey*> freeKeys (_keymapper->_keymapMan->getHardwareKeySet()->getHardwareKeys());
+ List<const HardwareKey*> freeKeys (_keymapper->getManager()->getHardwareKeySet()->getHardwareKeys());
// add most active keymap's keys
Keymapper::MapRecord top = _activeKeymaps->top();
@@ -242,47 +313,5 @@ void RemapDialog::refreshKeymap() {
draw();
}
-void RemapDialog::setupWidgets() {
-
- int scrollbarWidth, buttonHeight;
- if (g_gui.getWidgetSize() == GUI::kBigWidgetSize) {
- buttonHeight = GUI::kBigButtonHeight;
- scrollbarWidth = GUI::kBigScrollBarWidth;
- } else {
- buttonHeight = GUI::kButtonHeight;
- scrollbarWidth = GUI::kNormalScrollBarWidth;
- }
- int areaX = g_gui.evaluator()->getVar("remap_keymap_area.x");
- int areaY = g_gui.evaluator()->getVar("remap_keymap_area.y");
- int areaW = g_gui.evaluator()->getVar("remap_keymap_area.w");
- int areaH = g_gui.evaluator()->getVar("remap_keymap_area.h");
- int spacing = g_gui.evaluator()->getVar("remap_spacing");
-
- _colCount = g_gui.evaluator()->getVar("remap_col_count");
- _rowCount = (areaH + spacing) / (buttonHeight + spacing);
- int colWidth = (areaW - scrollbarWidth - _colCount * spacing) / _colCount;
-
- //_container = new GUI::ContainerWidget(this, areaX, areaY, areaW, areaH);
- //_container->setHints(GUI::THEME_HINT_USE_SHADOW);
-
- _scrollBar = new GUI::ScrollBarWidget(this,
- areaX + areaW - scrollbarWidth, areaY, scrollbarWidth, areaH);
- _scrollBar->_entriesPerPage = _rowCount;
- _scrollBar->_numEntries = 1;
- _scrollBar->recalc();
-
- uint textYOff = (buttonHeight - kLineHeight) / 2;
- int n = _rowCount * _colCount;
- for (int i = 0; i < n; i++) {
- uint x = areaX + (i % _colCount) * (colWidth + spacing);
- uint y = areaY + (i / _colCount) * (buttonHeight + spacing);
- ActionWidgets widg;
- widg.actionText = new GUI::StaticTextWidget(this, x, y + textYOff,
- colWidth / 2, kLineHeight, "", Graphics::kTextAlignRight);
- widg.keyButton = new GUI::ButtonWidget(this, x + colWidth / 2,
- y, colWidth / 2, buttonHeight, "", kRemapCmd + i);
- _keymapWidgets.push_back(widg);
- }
-}
} // end of namespace Common
diff --git a/backends/keymapper/remap-dialog.h b/backends/keymapper/remap-dialog.h
index a9680a0f7a..0bcfee0d29 100644
--- a/backends/keymapper/remap-dialog.h
+++ b/backends/keymapper/remap-dialog.h
@@ -40,6 +40,8 @@ public:
RemapDialog();
virtual ~RemapDialog();
virtual void open();
+ virtual void close();
+ virtual void reflowLayout();
virtual void handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data);
virtual void handleKeyUp(Common::KeyState state);
virtual void handleMouseDown(int x, int y, int button, int clickCount);
@@ -58,7 +60,6 @@ protected:
void loadKeymap();
void refreshKeymap();
- void setupWidgets();
void startRemapping(uint i);
void stopRemapping();
diff --git a/backends/platform/sdl/events.cpp b/backends/platform/sdl/events.cpp
index 4731ae59c9..ad62ddb6f5 100644
--- a/backends/platform/sdl/events.cpp
+++ b/backends/platform/sdl/events.cpp
@@ -566,6 +566,10 @@ void OSystem_SDL::setupKeymapper() {
ADD_KEYDOWN_EVENT(KEYCODE_d, 'd', 0);
specific->addAction(act);
+ act = new Action('RUN_', "Run");
+ ADD_KEYDOWN_EVENT(KEYCODE_r, 'r', 0);
+ specific->addAction(act);
+
#undef ADD_KEYDOWN_EVENT
mapper->addGlobalKeymap(global);