diff options
author | Eugene Sandulenko | 2009-05-10 22:05:04 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2009-05-10 22:05:04 +0000 |
commit | 665e472ef0bf9cd38c92ebe58975cbda74241a07 (patch) | |
tree | 38fb4c993d827b9250441b315ae2940e73298eeb | |
parent | 7604301c30553828cae69ea69acf8fde057ac5c2 (diff) | |
download | scummvm-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.cpp | 10 | ||||
-rw-r--r-- | backends/platform/sdl/events.cpp | 51 | ||||
-rw-r--r-- | backends/platform/sdl/sdl.cpp | 5 | ||||
-rw-r--r-- | backends/platform/sdl/sdl.h | 3 | ||||
-rw-r--r-- | base/main.cpp | 45 | ||||
-rw-r--r-- | common/system.h | 10 | ||||
-rw-r--r-- | gui/GuiManager.cpp | 36 | ||||
-rw-r--r-- | gui/GuiManager.h | 2 |
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(); |