aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorest31 <MTest31@outlook.com>2016-05-14 16:25:57 +0200
committerest31 <MTest31@outlook.com>2016-05-26 20:33:33 +0200
commitfa6b21a15b415cd82dce6896b94a5341b7dd76f0 (patch)
tree1fc68b1ebb2ce52c81b33e816b0f8f8f827d47a7
parentef100f12a1346f7bfd2a05dc606cb22e97179c02 (diff)
downloadminetest-fa6b21a15b415cd82dce6896b94a5341b7dd76f0.tar.gz
minetest-fa6b21a15b415cd82dce6896b94a5341b7dd76f0.tar.bz2
minetest-fa6b21a15b415cd82dce6896b94a5341b7dd76f0.zip
Tell irrlicht if we handle a key or not.
We can remove the function in MtNativeActivity now as it serves precisely that purpose: to tell irrlicht that we handled the esc key. TODO for later: * Perhaps try to find a more performant container than KeyList
-rw-r--r--build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java5
-rw-r--r--src/client/inputhandler.h37
-rw-r--r--src/game.cpp23
-rw-r--r--src/game.h3
4 files changed, 57 insertions, 11 deletions
diff --git a/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java b/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java
index 3173a71f4..159521a50 100644
--- a/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java
+++ b/build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java
@@ -19,11 +19,6 @@ public class MtNativeActivity extends NativeActivity {
public void onDestroy() {
super.onDestroy();
}
-
- @Override
- public void onBackPressed() {
- }
-
public void copyAssets() {
Intent intent = new Intent(this, MinetestAssetCopy.class);
diff --git a/src/client/inputhandler.h b/src/client/inputhandler.h
index 69e4b25fa..73e507fdc 100644
--- a/src/client/inputhandler.h
+++ b/src/client/inputhandler.h
@@ -42,11 +42,15 @@ public:
// Remember whether each key is down or up
if (event.EventType == irr::EET_KEY_INPUT_EVENT) {
- if (event.KeyInput.PressedDown) {
- keyIsDown.set(event.KeyInput);
- keyWasDown.set(event.KeyInput);
- } else {
- keyIsDown.unset(event.KeyInput);
+ const KeyPress &keyCode = event.KeyInput;
+ if (keysListenedFor[keyCode]) {
+ if (event.KeyInput.PressedDown) {
+ keyIsDown.set(keyCode);
+ keyWasDown.set(keyCode);
+ } else {
+ keyIsDown.unset(keyCode);
+ }
+ return true;
}
}
@@ -116,6 +120,15 @@ public:
return b;
}
+ void listenForKey(const KeyPress &keyCode)
+ {
+ keysListenedFor.set(keyCode);
+ }
+ void dontListenForKeys()
+ {
+ keysListenedFor.clear();
+ }
+
s32 getMouseWheel()
{
s32 a = mouse_wheel;
@@ -168,6 +181,12 @@ private:
KeyList keyIsDown;
// Whether a key has been pressed or not
KeyList keyWasDown;
+ // List of keys we listen for
+ // TODO perhaps the type of this is not really
+ // performant as KeyList is designed for few but
+ // often changing keys, and keysListenedFor is expected
+ // to change seldomly but contain lots of keys.
+ KeyList keysListenedFor;
};
@@ -192,6 +211,14 @@ public:
{
return m_receiver->WasKeyDown(keyCode);
}
+ virtual void listenForKey(const KeyPress &keyCode)
+ {
+ m_receiver->listenForKey(keyCode);
+ }
+ virtual void dontListenForKeys()
+ {
+ m_receiver->dontListenForKeys();
+ }
virtual v2s32 getMousePos()
{
if (m_device->getCursorControl()) {
diff --git a/src/game.cpp b/src/game.cpp
index 23f261cfd..c5211a042 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -1297,7 +1297,11 @@ static void updateChat(Client &client, f32 dtime, bool show_debug,
*/
struct KeyCache {
- KeyCache() { populate(); }
+ KeyCache()
+ {
+ handler = NULL;
+ populate();
+ }
enum {
// Player movement
@@ -1349,6 +1353,7 @@ struct KeyCache {
void populate();
KeyPress key[KEYMAP_INTERNAL_ENUM_COUNT];
+ InputHandler *handler;
};
void KeyCache::populate()
@@ -1399,6 +1404,19 @@ void KeyCache::populate()
key[KEYMAP_ID_QUICKTUNE_DEC] = getKeySetting("keymap_quicktune_dec");
key[KEYMAP_ID_DEBUG_STACKS] = getKeySetting("keymap_print_debug_stacks");
+
+ if (handler) {
+ // First clear all keys, then re-add the ones we listen for
+ handler->dontListenForKeys();
+ for (size_t i = 0; i < KEYMAP_INTERNAL_ENUM_COUNT; i++) {
+ handler->listenForKey(key[i]);
+ }
+ handler->listenForKey(EscapeKey);
+ handler->listenForKey(CancelKey);
+ for (size_t i = 0; i < 10; i++) {
+ handler->listenForKey(NumberKey[i]);
+ }
+ }
}
@@ -1829,6 +1847,9 @@ bool Game::startup(bool *kill,
this->chat_backend = chat_backend;
this->simple_singleplayer_mode = simple_singleplayer_mode;
+ keycache.handler = input;
+ keycache.populate();
+
driver = device->getVideoDriver();
smgr = device->getSceneManager();
diff --git a/src/game.h b/src/game.h
index e1f4e9346..5465ecdc6 100644
--- a/src/game.h
+++ b/src/game.h
@@ -110,6 +110,9 @@ public:
virtual bool isKeyDown(const KeyPress &keyCode) = 0;
virtual bool wasKeyDown(const KeyPress &keyCode) = 0;
+ virtual void listenForKey(const KeyPress &keyCode) {}
+ virtual void dontListenForKeys() {}
+
virtual v2s32 getMousePos() = 0;
virtual void setMousePos(s32 x, s32 y) = 0;