aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/common/hardware-key.h95
-rw-r--r--backends/common/keymap-manager.cpp14
-rw-r--r--backends/common/keymap-manager.h1
-rw-r--r--backends/common/keymap.h101
-rw-r--r--backends/common/keymapper.cpp31
-rw-r--r--backends/common/keymapper.h20
-rw-r--r--backends/common/user-action.h70
-rw-r--r--common/keyboard.h4
-rw-r--r--dists/msvc8/scummvm.vcproj12
9 files changed, 240 insertions, 108 deletions
diff --git a/backends/common/hardware-key.h b/backends/common/hardware-key.h
new file mode 100644
index 0000000000..de1984dc31
--- /dev/null
+++ b/backends/common/hardware-key.h
@@ -0,0 +1,95 @@
+#ifndef COMMON_HARDWAREKEY
+#define COMMON_HARDWAREKEY
+
+#include "backends/common/user-action.h"
+
+namespace Common {
+
+/**
+* Describes an available hardware key
+*/
+struct HardwareKey {
+ /** unique id used for saving/loading to config */
+ int32 id;
+ /** Human readable description */
+ String description;
+ /**
+ * The KeyState that is generated by the back-end
+ * when this hardware key is pressed.
+ */
+ KeyState key;
+
+ UserActionCategory preferredCategory;
+ UserActionType preferredType;
+ int16 group;
+
+ HardwareKey(KeyState ks = KeyState(), String des = "",
+ UserActionCategory cat = kGenericUserActionCategory,
+ UserActionType ty = kGenericUserActionType, int gr = 0) {
+ key = ks;
+ description = des;
+ preferredCategory = cat;
+ preferredType = ty;
+ group = gr;
+ }
+};
+
+
+/**
+ * Simple class to encapsulate a device's set of HardwareKeys.
+ * Each device should extend this and call addHardwareKey a number of times
+ * in its constructor to define the device's available keys.
+ */
+class HardwareKeySet {
+public:
+
+ HardwareKeySet() {}
+ ~HardwareKeySet() {
+ List<HardwareKey*>::iterator it;
+ for (it = _keys.begin(); it != _keys.end(); it++)
+ delete *it;
+ }
+
+ void addHardwareKey(HardwareKey *key) {
+ checkForKey(key);
+ _keys.push_back(key);
+ }
+
+ const HardwareKey *findHardwareKey(int32 id) const {
+ List<HardwareKey*>::iterator it;
+ for (it = _keys.begin(); it != _keys.end(); it++) {
+ if ((*it)->id == id)
+ return (*it);
+ }
+ return 0;
+ }
+
+ const HardwareKey *findHardwareKey(const KeyState& keystate) const {
+ List<HardwareKey*>::iterator it;
+ for (it = _keys.begin(); it != _keys.end(); it++) {
+ if ((*it)->key == keystate)
+ return (*it);
+ }
+ return 0;
+ }
+
+
+private:
+
+ void checkForKey(HardwareKey *key) {
+ List<HardwareKey*>::iterator it;
+ for (it = _keys.begin(); it != _keys.end(); it++) {
+ if ((*it)->id == key->id)
+ error("HardwareKey with id %d already given!\n", key->id);
+ else if ((*it)->key == key->key)
+ error("HardwareKey with same KeyState already given!\n");
+ }
+ }
+
+ List<HardwareKey*> _keys;
+};
+
+
+} // end of namespace Common
+
+#endif \ No newline at end of file
diff --git a/backends/common/keymap-manager.cpp b/backends/common/keymap-manager.cpp
index d52615faea..6f60018abe 100644
--- a/backends/common/keymap-manager.cpp
+++ b/backends/common/keymap-manager.cpp
@@ -1,15 +1,19 @@
#include "backends/common/keymap-manager.h"
-#define GLOBAL_ID "GLOBAL"
+#define GLOBAL_ID_STR "___GLOBAL"
namespace Common {
+KeymapManager::KeymapManager() {
+
+}
+
bool KeymapManager::registerSuperGlobalKeymap(const Keymap& map) {
- return registerKeymap(GLOBAL_ID, GLOBAL_ID, map);
+ return registerKeymap(GLOBAL_ID_STR, GLOBAL_ID_STR, map);
}
bool KeymapManager::registerGlobalKeymap(const String& name, const Keymap& map) {
- return registerKeymap(name, GLOBAL_ID, map);
+ return registerKeymap(name, GLOBAL_ID_STR, map);
}
bool KeymapManager::registerKeymap(const String& name, const String& domain, const Keymap& map) {
@@ -26,11 +30,11 @@ bool KeymapManager::registerKeymap(const String& name, const String& domain, con
}
bool KeymapManager::unregisterSuperGlobalKeymap() {
- return unregisterKeymap(GLOBAL_ID, GLOBAL_ID);
+ return unregisterKeymap(GLOBAL_ID_STR, GLOBAL_ID_STR);
}
bool KeymapManager::unregisterGlobalKeymap(const String& name) {
- return unregisterKeymap(name, GLOBAL_ID);
+ return unregisterKeymap(name, GLOBAL_ID_STR);
}
bool KeymapManager::unregisterKeymap(const String& name, const String& domain) {
diff --git a/backends/common/keymap-manager.h b/backends/common/keymap-manager.h
index f5878a2467..d9c97d7de1 100644
--- a/backends/common/keymap-manager.h
+++ b/backends/common/keymap-manager.h
@@ -2,6 +2,7 @@
#define COMMON_KEYMAP_MANAGER
#include "backends/common/keymap.h"
+#include "common/list.h"
namespace Common {
diff --git a/backends/common/keymap.h b/backends/common/keymap.h
index c03e2e03d5..a2e204827e 100644
--- a/backends/common/keymap.h
+++ b/backends/common/keymap.h
@@ -1,110 +1,15 @@
#ifndef COMMON_KEYMAP
#define COMMON_KEYMAP
+#include "backends/common/hardware-key.h"
+#include "backends/common/user-action.h"
#include "common/array.h"
-#include "common/events.h"
+#include "common/keyboard.h"
#include "common/func.h"
#include "common/hashmap.h"
-#include "common/list.h"
namespace Common {
-enum UserActionType {
- kGenericUserActionType,
-
- // common actions
- kDirectionUpUserAction,
- kDirectionDownUserAction,
- kDirectionLeftUserAction,
- kDirectionRightUserAction,
- kLeftClickUserAction,
- kRightClickUserAction,
- kSaveUserAction,
- kMenuUserAction,
-
- kUserActionTypeMax
-};
-
-enum UserActionCategory {
- kGenericUserActionCategory,
- // classes of action - probably need to be slightly more specific than this
- kInGameUserAction, // effects the actual gameplay
- kSystemUserAction, //show a menu / change volume / etc
-
- kUserActionCategoryMax
-};
-
-/**
-* Describes an available hardware key
-*/
-struct HardwareKey {
- /** unique id used for saving/loading to config */
- int32 id;
- /** Human readable description */
- String description;
- /**
- * The KeyState that is generated by the back-end
- * when this hardware key is pressed.
- */
- KeyState key;
-
- UserActionCategory preferredCategory;
- UserActionType preferredType;
- int16 group;
-
- HardwareKey(KeyState ks = KeyState(), String des = "",
- UserActionCategory cat = kGenericUserActionCategory,
- UserActionType ty = kGenericUserActionType, int gr = 0) {
- key = ks;
- description = des;
- preferredCategory = cat;
- preferredType = ty;
- group = gr;
- }
-};
-
-struct UserAction {
- /** unique id used for saving/loading to config */
- int32 id;
- /** Human readable description */
- String description;
- /** Events to be sent when mapped key is pressed */
- List<Event> events;
- UserActionCategory category;
- UserActionType type;
- int priority;
- int group;
- int flags;
-
- HardwareKey *hwKey;
-
- UserAction( String des = "",
- UserActionCategory cat = kGenericUserActionCategory,
- UserActionType ty = kGenericUserActionType,
- int pr = 0, int gr = 0, int fl = 0 ) {
- description = des;
- category = cat;
- type = ty;
- priority = pr;
- group = gr;
- flags = fl;
- hwKey = 0;
- }
-};
-
-/**
- * EqualTo function for KeyState
- */
-template<> struct EqualTo<KeyState>
- : public BinaryFunction<KeyState, KeyState, bool> {
-
- bool operator()(const KeyState &x, const KeyState &y) const {
- return (x.keycode == y.keycode)
- && (x.ascii == y.ascii)
- && (x.flags == y.flags);
- }
-};
-
/**
* Hash function for KeyState
*/
diff --git a/backends/common/keymapper.cpp b/backends/common/keymapper.cpp
new file mode 100644
index 0000000000..4edd64aa44
--- /dev/null
+++ b/backends/common/keymapper.cpp
@@ -0,0 +1,31 @@
+#include "backends/common/keymapper.h"
+#include "backends/common/keymap-manager.h"
+
+namespace Common {
+
+Keymapper::Keymapper(EventManager *evtMgr) {
+ _eventMan = evtMgr;
+ _keymapMan = new KeymapManager();
+ _currentMap = 0;
+ _hardwareKeys = 0;
+}
+
+void Keymapper::registerHardwareKeySet(HardwareKeySet *keys) {
+ if (_hardwareKeys)
+ error("Hardware key set already registered!\n");
+ _hardwareKeys = keys;
+}
+
+const HardwareKeySet *Keymapper::getHardwareKeySet() {
+ return _hardwareKeys;
+}
+
+void Keymapper::addGlobalKeyMap(const String& name, Keymap& keymap) {
+ _keymapMan->registerGlobalKeymap(name, keymap);
+}
+
+void Keymapper::addGameKeyMap(const String& gameid, const String& name, Keymap& keymap) {
+ _keymapMan->registerKeymap(name, gameid, keymap);
+}
+
+} // end of namespace Common
diff --git a/backends/common/keymapper.h b/backends/common/keymapper.h
index 1b3518c224..4f25ea37ff 100644
--- a/backends/common/keymapper.h
+++ b/backends/common/keymapper.h
@@ -1,23 +1,33 @@
#ifndef COMMON_KEYMAPPER
#define COMMON_KEYMAPPER
-#include "backends/common/keymap-manager.h"
+#include "backends/common/keymap.h"
+#include "common/list.h"
namespace Common {
+class KeymapManager;
+
class Keymapper {
public:
- Keymapper();
+ Keymapper(EventManager *eventMan);
- void addHardwareKey(const HardwareKey& key);
+ void registerHardwareKeySet(HardwareKeySet *keys);
+ const HardwareKeySet *getHardwareKeySet();
void addGlobalKeyMap(const String& name, Keymap& keymap);
+ void addGameKeyMap(const String& gameid, const String& name, Keymap& keymap);
private:
- KeymapManager _manager;
+ typedef List<HardwareKey*>::iterator Iterator;
+
+ EventManager *_eventMan;
+ KeymapManager *_keymapMan;
+
+ Keymap *_currentMap;
- List<HardwareKey*> _hardwareKeys;
+ const HardwareKeySet *_hardwareKeys;
};
diff --git a/backends/common/user-action.h b/backends/common/user-action.h
new file mode 100644
index 0000000000..31b5473708
--- /dev/null
+++ b/backends/common/user-action.h
@@ -0,0 +1,70 @@
+#ifndef COMMON_USERACTION
+#define COMMON_USERACTION
+
+#include "common/events.h"
+#include "common/list.h"
+#include "common/str.h"
+
+namespace Common {
+
+struct HardwareKey;
+
+enum UserActionType {
+ kGenericUserActionType,
+
+ // common actions
+ kDirectionUpUserAction,
+ kDirectionDownUserAction,
+ kDirectionLeftUserAction,
+ kDirectionRightUserAction,
+ kLeftClickUserAction,
+ kRightClickUserAction,
+ kSaveUserAction,
+ kMenuUserAction,
+
+ kUserActionTypeMax
+};
+
+enum UserActionCategory {
+ kGenericUserActionCategory,
+ // classes of action - probably need to be slightly more specific than this
+ kInGameUserAction, // effects the actual gameplay
+ kSystemUserAction, //show a menu / change volume / etc
+
+ kUserActionCategoryMax
+};
+
+struct UserAction {
+ /** unique id used for saving/loading to config */
+ int32 id;
+ /** Human readable description */
+ String description;
+ /** Events to be sent when mapped key is pressed */
+ List<Event> events;
+
+ UserActionCategory category;
+ UserActionType type;
+ int priority;
+ int group;
+ int flags;
+
+ /** Hardware key that is mapped to this UserAction */
+ HardwareKey *hwKey;
+
+ UserAction( String des = "",
+ UserActionCategory cat = kGenericUserActionCategory,
+ UserActionType ty = kGenericUserActionType,
+ int pr = 0, int gr = 0, int fl = 0 ) {
+ description = des;
+ category = cat;
+ type = ty;
+ priority = pr;
+ group = gr;
+ flags = fl;
+ hwKey = 0;
+ }
+};
+
+} // end of namespace Common
+
+#endif \ No newline at end of file
diff --git a/common/keyboard.h b/common/keyboard.h
index 93579cbed6..a0ae941a08 100644
--- a/common/keyboard.h
+++ b/common/keyboard.h
@@ -259,6 +259,10 @@ struct KeyState {
keycode = KEYCODE_INVALID;
ascii = flags = 0;
}
+
+ bool operator ==(const KeyState &x) const {
+ return keycode == x.keycode && ascii == x.ascii && flags == x.flags;
+ }
};
} // End of namespace Common
diff --git a/dists/msvc8/scummvm.vcproj b/dists/msvc8/scummvm.vcproj
index 60fe55dc1f..bab456e3d7 100644
--- a/dists/msvc8/scummvm.vcproj
+++ b/dists/msvc8/scummvm.vcproj
@@ -1057,6 +1057,10 @@
Name="common"
>
<File
+ RelativePath="..\..\backends\common\hardware-key.h"
+ >
+ </File>
+ <File
RelativePath="..\..\backends\common\keymap-manager.cpp"
>
</File>
@@ -1073,10 +1077,18 @@
>
</File>
<File
+ RelativePath="..\..\backends\common\keymapper.cpp"
+ >
+ </File>
+ <File
RelativePath="..\..\backends\common\keymapper.h"
>
</File>
<File
+ RelativePath="..\..\backends\common\user-action.h"
+ >
+ </File>
+ <File
RelativePath="..\..\backends\common\virtual-keyboard-parser.cpp"
>
</File>