aboutsummaryrefslogtreecommitdiff
path: root/backends/events/default
diff options
context:
space:
mode:
authorEugene Sandulenko2009-01-11 00:20:27 +0000
committerEugene Sandulenko2009-01-11 00:20:27 +0000
commit83972e2001e0654e057b5a4930cd2cbc05165786 (patch)
tree1137fef4016651c2ad56aa44024649c80d0a939f /backends/events/default
parent326df55debb696f73c33450569af4a6d0c60b0fd (diff)
parentfe39d4f5075cc723945ca813142d02983069d0d5 (diff)
downloadscummvm-rg350-83972e2001e0654e057b5a4930cd2cbc05165786.tar.gz
scummvm-rg350-83972e2001e0654e057b5a4930cd2cbc05165786.tar.bz2
scummvm-rg350-83972e2001e0654e057b5a4930cd2cbc05165786.zip
Merge in Virtual Keybpard & KeyMapper branch,
- Merge is perfromed in order to not let rotting the code - Makefile modifications were avoided Stuff to resolve: - Circular dependency of common/vkeybd from graphics/ - Make it compilable (?) - Add some keyboards - Decide on the key bindings svn-id: r35813
Diffstat (limited to 'backends/events/default')
-rw-r--r--backends/events/default/default-events.cpp73
-rw-r--r--backends/events/default/default-events.h29
2 files changed, 99 insertions, 3 deletions
diff --git a/backends/events/default/default-events.cpp b/backends/events/default/default-events.cpp
index d1e836ac59..feed4b0c62 100644
--- a/backends/events/default/default-events.cpp
+++ b/backends/events/default/default-events.cpp
@@ -28,6 +28,9 @@
#include "common/system.h"
#include "common/config-manager.h"
#include "backends/events/default/default-events.h"
+#include "backends/keymapper/keymapper.h"
+#include "backends/keymapper/remap-dialog.h"
+#include "backends/vkeybd/virtual-keyboard.h"
#include "engines/engine.h"
#include "gui/message.h"
@@ -193,9 +196,23 @@ DefaultEventManager::DefaultEventManager(OSystem *boss) :
_hasPlaybackEvent = false;
}
+
+#ifdef ENABLE_VKEYBD
+ _vk = new Common::VirtualKeyboard();
+#endif
+#ifdef ENABLE_KEYMAPPER
+ _keymapper = new Common::Keymapper(this);
+ _remap = false;
+#endif
}
DefaultEventManager::~DefaultEventManager() {
+#ifdef ENABLE_KEYMAPPER
+ delete _keymapper;
+#endif
+#ifdef ENABLE_VKEYBD
+ delete _vk;
+#endif
_boss->lockMutex(_timeMutex);
_boss->lockMutex(_recorderMutex);
_recordMode = kPassthrough;
@@ -254,6 +271,16 @@ DefaultEventManager::~DefaultEventManager() {
_boss->deleteMutex(_recorderMutex);
}
+void DefaultEventManager::init() {
+#ifdef ENABLE_VKEYBD
+ if (ConfMan.hasKey("vkeybd_pack_name")) {
+ _vk->loadKeyboardPack(ConfMan.get("vkeybd_pack_name"));
+ } else {
+ _vk->loadKeyboardPack("vkeybd");
+ }
+#endif
+}
+
bool DefaultEventManager::playback(Common::Event &event) {
if (!_hasPlaybackEvent) {
@@ -357,9 +384,25 @@ bool DefaultEventManager::pollEvent(Common::Event &event) {
if (!artificialEventQueue.empty()) {
event = artificialEventQueue.pop();
result = true;
- } else
+ } else {
result = _boss->pollEvent(event);
+#ifdef ENABLE_KEYMAPPER
+ if (result) {
+ // send key press events to keymapper
+ if (event.type == Common::EVENT_KEYDOWN) {
+ if (_keymapper->mapKeyDown(event.kbd)) {
+ result = false;
+ }
+ } else if (event.type == Common::EVENT_KEYUP) {
+ if (_keymapper->mapKeyUp(event.kbd)) {
+ result = false;
+ }
+ }
+ }
+#endif
+ }
+
if (_recordMode != kPassthrough) {
_boss->lockMutex(_recorderMutex);
@@ -425,6 +468,32 @@ bool DefaultEventManager::pollEvent(Common::Event &event) {
event.type = Common::EVENT_RTL;
}
}
+#ifdef ENABLE_VKEYBD
+ else if (event.kbd.keycode == Common::KEYCODE_F7 && event.kbd.flags == 0) {
+ if (_vk->isDisplaying()) {
+ _vk->close(true);
+ } else {
+ bool isPaused = (g_engine) ? g_engine->isPaused() : true;
+ if (!isPaused) g_engine->pauseEngine(true);
+ _vk->show();
+ if (!isPaused) g_engine->pauseEngine(false);
+ result = false;
+ }
+ }
+#endif
+#ifdef ENABLE_KEYMAPPER
+ else if (event.kbd.keycode == Common::KEYCODE_F8 && event.kbd.flags == 0) {
+ 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;
+ }
+ }
+#endif
break;
case Common::EVENT_KEYUP:
@@ -520,7 +589,7 @@ bool DefaultEventManager::pollEvent(Common::Event &event) {
return result;
}
-void DefaultEventManager::pushEvent(Common::Event event) {
+void DefaultEventManager::pushEvent(const Common::Event &event) {
// If already received an EVENT_QUIT, don't add another one
if (event.type == Common::EVENT_QUIT) {
diff --git a/backends/events/default/default-events.h b/backends/events/default/default-events.h
index 89846da1ae..1aeab4d68b 100644
--- a/backends/events/default/default-events.h
+++ b/backends/events/default/default-events.h
@@ -29,9 +29,20 @@
#include "common/events.h"
#include "common/savefile.h"
#include "common/mutex.h"
+#include "common/queue.h"
class OSystem;
+namespace Common {
+#ifdef ENABLE_KEYMAPPER
+ class Keymapper;
+#endif
+#ifdef ENABLE_VKEYBD
+ class VirtualKeyboard;
+#endif
+}
+
+
/*
At some point we will remove pollEvent from OSystem and change
DefaultEventManager to use a "boss" derived from this class:
@@ -47,6 +58,17 @@ use a subclass of EventProvider.
class DefaultEventManager : public Common::EventManager {
OSystem *_boss;
+#ifdef ENABLE_VKEYBD
+ Common::VirtualKeyboard *_vk;
+#endif
+
+#ifdef ENABLE_KEYMAPPER
+ Common::Keymapper *_keymapper;
+ bool _remap;
+#endif
+
+ Common::Queue<Common::Event> _artificialEventQueue;
+
Common::Point _mousePos;
int _buttonState;
int _modifierState;
@@ -111,8 +133,9 @@ public:
DefaultEventManager(OSystem *boss);
~DefaultEventManager();
+ virtual void init();
virtual bool pollEvent(Common::Event &event);
- virtual void pushEvent(Common::Event event);
+ virtual void pushEvent(const Common::Event &event);
virtual void registerRandomSource(Common::RandomSource &rnd, const char *name);
virtual void processMillis(uint32 &millis);
@@ -122,6 +145,10 @@ public:
virtual int shouldQuit() const { return _shouldQuit; }
virtual int shouldRTL() const { return _shouldRTL; }
virtual void resetRTL() { _shouldRTL = false; }
+
+#ifdef ENABLE_KEYMAPPER
+ virtual Common::Keymapper *getKeymapper() { return _keymapper; }
+#endif
};
#endif