aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Sandulenko2009-05-10 22:05:04 +0000
committerEugene Sandulenko2009-05-10 22:05:04 +0000
commit665e472ef0bf9cd38c92ebe58975cbda74241a07 (patch)
tree38fb4c993d827b9250441b315ae2940e73298eeb
parent7604301c30553828cae69ea69acf8fde057ac5c2 (diff)
downloadscummvm-rg350-665e472ef0bf9cd38c92ebe58975cbda74241a07.tar.gz
scummvm-rg350-665e472ef0bf9cd38c92ebe58975cbda74241a07.tar.bz2
scummvm-rg350-665e472ef0bf9cd38c92ebe58975cbda74241a07.zip
Keymapper:
- Introduced new OSystem method getHardwareKeySet() with default implementation - Moved global keymap creation to base/main.cpp - Moved GUI keymap creation to gui/GuiManager.cpp - Added various safeguard checks to various keymapper methods Now it is really possible to add keymapper to all backends. svn-id: r40439
-rw-r--r--backends/keymapper/keymapper.cpp10
-rw-r--r--backends/platform/sdl/events.cpp51
-rw-r--r--backends/platform/sdl/sdl.cpp5
-rw-r--r--backends/platform/sdl/sdl.h3
-rw-r--r--base/main.cpp45
-rw-r--r--common/system.h10
-rw-r--r--gui/GuiManager.cpp36
-rw-r--r--gui/GuiManager.h2
8 files changed, 109 insertions, 53 deletions
diff --git a/backends/keymapper/keymapper.cpp b/backends/keymapper/keymapper.cpp
index 25a8a64301..4668d34421 100644
--- a/backends/keymapper/keymapper.cpp
+++ b/backends/keymapper/keymapper.cpp
@@ -71,6 +71,11 @@ void Keymapper::registerHardwareKeySet(HardwareKeySet *keys) {
if (_hardwareKeys)
error("Hardware key set already registered!");
+ if (!keys) {
+ warning("No hardware keys are supplied");
+ return;
+ }
+
_hardwareKeys = keys;
}
@@ -93,6 +98,11 @@ void Keymapper::addGameKeymap(Keymap *keymap) {
}
void Keymapper::initKeymap(Domain &domain, Keymap *map) {
+ if (!_hardwareKeys) {
+ warning("No hardware keys were registered yet (%s)", map->getName().c_str());
+ return;
+ }
+
map->setConfigDomain(domain.getConfigDomain());
map->loadMappings(_hardwareKeys);
diff --git a/backends/platform/sdl/events.cpp b/backends/platform/sdl/events.cpp
index e4f7188b23..7b0349536b 100644
--- a/backends/platform/sdl/events.cpp
+++ b/backends/platform/sdl/events.cpp
@@ -50,8 +50,7 @@
-static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode)
-{
+static int mapKey(SDLKey key, SDLMod mod, Uint16 unicode) {
if (key >= SDLK_F1 && key <= SDLK_F9) {
return key - SDLK_F1 + Common::ASCII_F1;
} else if (key >= SDLK_KP0 && key <= SDLK_KP9) {
@@ -522,10 +521,9 @@ bool OSystem_SDL::remapKey(SDL_Event &ev, Common::Event &event) {
return false;
}
-void OSystem_SDL::setupKeymapper() {
+Common::HardwareKeySet *OSystem_SDL::getHardwareKeySet() {
#ifdef ENABLE_KEYMAPPER
using namespace Common;
- Keymapper *mapper = getEventManager()->getKeymapper();
HardwareKeySet *keySet = new HardwareKeySet();
keySet->addHardwareKey(new HardwareKey( "a", KeyState(KEYCODE_a), "a", kActionKeyType ));
@@ -536,49 +534,10 @@ void OSystem_SDL::setupKeymapper() {
keySet->addHardwareKey(new HardwareKey( "m", KeyState(KEYCODE_m), "m (remap)", kTriggerRightKeyType, kKeyRemapActionType ));
keySet->addHardwareKey(new HardwareKey( "[", KeyState(KEYCODE_LEFTBRACKET), "[ (select)", kSelectKeyType ));
keySet->addHardwareKey(new HardwareKey( "]", KeyState(KEYCODE_RIGHTBRACKET), "] (start)", kStartKeyType ));
- mapper->registerHardwareKeySet(keySet);
- Keymap *globalMap = new Keymap("global");
- Action *act;
+ return keySet;
- act = new Action(globalMap, "MENU", "Menu", kGenericActionType, kSelectKeyType);
- act->addKeyEvent(KeyState(KEYCODE_F5, ASCII_F5, 0));
-
- act = new Action(globalMap, "SKCT", "Skip", kGenericActionType, kActionKeyType);
- act->addKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE, 0));
-
- act = new Action(globalMap, "PAUS", "Pause", kGenericActionType, kStartKeyType);
- act->addKeyEvent(KeyState(KEYCODE_SPACE, ' ', 0));
-
- act = new Action(globalMap, "SKLI", "Skip line", kGenericActionType, kActionKeyType);
- act->addKeyEvent(KeyState(KEYCODE_PERIOD, '.', 0));
-
- act = new Action(globalMap, "VIRT", "Display keyboard", kVirtualKeyboardActionType);
- act->addKeyEvent(KeyState(KEYCODE_F7, ASCII_F7, 0));
-
- act = new Action(globalMap, "REMP", "Remap keys", kKeyRemapActionType);
- act->addKeyEvent(KeyState(KEYCODE_F8, ASCII_F8, 0));
-
- mapper->addGlobalKeymap(globalMap);
-
-
- Keymap *guiMap = new Keymap("gui");
-
- act = new Action(guiMap, "CLOS", "Close", kGenericActionType, kStartKeyType);
- act->addKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE, 0));
-
- act = new Action(guiMap, "CLIK", "Mouse click");
- act->addLeftClickEvent();
-
- act = new Action(guiMap, "VIRT", "Display keyboard", kVirtualKeyboardActionType);
- act->addKeyEvent(KeyState(KEYCODE_F7, ASCII_F7, 0));
-
- act = new Action(guiMap, "REMP", "Remap keys", kKeyRemapActionType);
- act->addKeyEvent(KeyState(KEYCODE_F8, ASCII_F8, 0));
-
- mapper->addGlobalKeymap(guiMap);
-
- mapper->pushKeymap("global");
+#else
+ return 0;
#endif
}
-
diff --git a/backends/platform/sdl/sdl.cpp b/backends/platform/sdl/sdl.cpp
index c4e376fe54..d4f634e62f 100644
--- a/backends/platform/sdl/sdl.cpp
+++ b/backends/platform/sdl/sdl.cpp
@@ -170,11 +170,6 @@ void OSystem_SDL::initBackend() {
setupMixer();
}
- // Setup the keymapper with backend's set of keys
- // NOTE: must be done before creating TimerManager
- // to avoid race conditions in creating EventManager
- setupKeymapper();
-
// Create and hook up the timer manager, if none exists yet (we check for
// this to allow subclasses to provide their own).
if (_timer == 0) {
diff --git a/backends/platform/sdl/sdl.h b/backends/platform/sdl/sdl.h
index 48662dfa58..95efaae258 100644
--- a/backends/platform/sdl/sdl.h
+++ b/backends/platform/sdl/sdl.h
@@ -136,8 +136,7 @@ public:
// Returns true if an event was retrieved.
virtual bool pollEvent(Common::Event &event); // overloaded by CE backend
- // Sets up the keymapper with the backends hardware key set
- virtual void setupKeymapper();
+ Common::HardwareKeySet *getHardwareKeySet();
// Set function that generates samples
virtual void setupMixer();
diff --git a/base/main.cpp b/base/main.cpp
index cdc8ddd73c..1c14e20f76 100644
--- a/base/main.cpp
+++ b/base/main.cpp
@@ -47,6 +47,8 @@
#include "gui/GuiManager.h"
#include "gui/message.h"
+#include "backends/keymapper/keymapper.h"
+
#if defined(_WIN32_WCE)
#include "backends/platform/wince/CELauncherDialog.h"
#elif defined(__DC__)
@@ -234,6 +236,46 @@ static void setupGraphics(OSystem &system) {
system.fillScreen(0);
}
+static void setupKeymapper(OSystem &system) {
+
+#ifdef ENABLE_KEYMAPPER
+ using namespace Common;
+
+ Keymapper *mapper = system.getEventManager()->getKeymapper();
+ Keymap *globalMap = new Keymap("global");
+ Action *act;
+ HardwareKeySet *keySet;
+
+ keySet = system.getHardwareKeySet();
+
+ // Query backend for hardware keys and register them
+ mapper->registerHardwareKeySet(keySet);
+
+ // Now create the global keymap
+ act = new Action(globalMap, "MENU", "Menu", kGenericActionType, kSelectKeyType);
+ act->addKeyEvent(KeyState(KEYCODE_F5, ASCII_F5, 0));
+
+ act = new Action(globalMap, "SKCT", "Skip", kGenericActionType, kActionKeyType);
+ act->addKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE, 0));
+
+ act = new Action(globalMap, "PAUS", "Pause", kGenericActionType, kStartKeyType);
+ act->addKeyEvent(KeyState(KEYCODE_SPACE, ' ', 0));
+
+ act = new Action(globalMap, "SKLI", "Skip line", kGenericActionType, kActionKeyType);
+ act->addKeyEvent(KeyState(KEYCODE_PERIOD, '.', 0));
+
+ act = new Action(globalMap, "VIRT", "Display keyboard", kVirtualKeyboardActionType);
+ act->addKeyEvent(KeyState(KEYCODE_F7, ASCII_F7, 0));
+
+ act = new Action(globalMap, "REMP", "Remap keys", kKeyRemapActionType);
+ act->addKeyEvent(KeyState(KEYCODE_F8, ASCII_F8, 0));
+
+ mapper->addGlobalKeymap(globalMap);
+
+ mapper->pushKeymap("global");
+#endif
+
+}
extern "C" int scummvm_main(int argc, const char * const argv[]) {
Common::String specialDebug;
@@ -295,6 +337,9 @@ extern "C" int scummvm_main(int argc, const char * const argv[]) {
// take place after the backend is initiated and the screen has been setup
system.getEventManager()->init();
+ // Now as the event manager is created, setup the keymapper
+ setupKeymapper(system);
+
// Unless a game was specified, show the launcher dialog
if (0 == ConfMan.getActiveDomain())
launcherDialog();
diff --git a/common/system.h b/common/system.h
index fc5535a4dc..cadc035501 100644
--- a/common/system.h
+++ b/common/system.h
@@ -48,6 +48,7 @@ namespace Common {
class TimerManager;
class SeekableReadStream;
class WriteStream;
+ class HardwareKeySet;
}
class FilesystemFactory;
@@ -744,6 +745,15 @@ public:
*/
virtual Common::EventManager *getEventManager() = 0;
+ /**
+ * Register hardware keys with keymapper
+ *
+ * @return HardwareKeySet with all keys and recommended mappings
+ *
+ * See keymapper documentation for further reference.
+ */
+ virtual Common::HardwareKeySet *getHardwareKeySet() { return 0; }
+
//@}
diff --git a/gui/GuiManager.cpp b/gui/GuiManager.cpp
index f3954c112d..6f31ff9658 100644
--- a/gui/GuiManager.cpp
+++ b/gui/GuiManager.cpp
@@ -79,6 +79,36 @@ GuiManager::~GuiManager() {
delete _theme;
}
+#ifdef ENABLE_KEYMAPPER
+void GuiManager::initKeymap() {
+ using namespace Common;
+
+ bool tmp;
+ Keymapper *mapper = _system->getEventManager()->getKeymapper();
+
+ // Do not try to recreate same keymap over again
+ if (mapper->getKeymap("gui", tmp) != 0)
+ return;
+
+ Action *act;
+ Keymap *guiMap = new Keymap("gui");
+
+ act = new Action(guiMap, "CLOS", "Close", kGenericActionType, kStartKeyType);
+ act->addKeyEvent(KeyState(KEYCODE_ESCAPE, ASCII_ESCAPE, 0));
+
+ act = new Action(guiMap, "CLIK", "Mouse click");
+ act->addLeftClickEvent();
+
+ act = new Action(guiMap, "VIRT", "Display keyboard", kVirtualKeyboardActionType);
+ act->addKeyEvent(KeyState(KEYCODE_F7, ASCII_F7, 0));
+
+ act = new Action(guiMap, "REMP", "Remap keys", kKeyRemapActionType);
+ act->addKeyEvent(KeyState(KEYCODE_F8, ASCII_F8, 0));
+
+ mapper->addGlobalKeymap(guiMap);
+}
+#endif
+
bool GuiManager::loadNewTheme(Common::String id, ThemeEngine::GraphicsMode gfx) {
// If we are asked to reload the currently active theme, just do nothing
// FIXME: Actually, why? It might be desirable at times to force a theme reload...
@@ -213,6 +243,12 @@ void GuiManager::runLoop() {
const uint32 waitTime = 1000 / 45;
#ifdef ENABLE_KEYMAPPER
+ // Due to circular reference with event manager and GUI
+ // we cannot init keymap on the GUI creation. Thus, let's
+ // try to do it on every launch, checking whether the
+ // map is already existing
+ initKeymap();
+
eventMan->getKeymapper()->pushKeymap("gui");
#endif
diff --git a/gui/GuiManager.h b/gui/GuiManager.h
index 12c9a25f62..102d612699 100644
--- a/gui/GuiManager.h
+++ b/gui/GuiManager.h
@@ -124,6 +124,8 @@ protected:
bool _themeChange;
+ void initKeymap();
+
void saveState();
void restoreState();