Skip to content
Permalink
Browse files

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
  • Loading branch information
est31 committed May 14, 2016
1 parent ef100f1 commit fa6b21a15b415cd82dce6896b94a5341b7dd76f0
Showing with 57 additions and 11 deletions.
  1. +0 −5 build/android/src/main/java/net.minetest.minetest/MtNativeActivity.java
  2. +32 −5 src/client/inputhandler.h
  3. +22 −1 src/game.cpp
  4. +3 −0 src/game.h
@@ -19,11 +19,6 @@ public void onCreate(Bundle savedInstanceState) {
public void onDestroy() {
super.onDestroy();
}

@Override
public void onBackPressed() {
}


public void copyAssets() {
Intent intent = new Intent(this, MinetestAssetCopy.class);
@@ -42,11 +42,15 @@ class MyEventReceiver : public IEventReceiver

// 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 @@ class MyEventReceiver : public IEventReceiver
return b;
}

void listenForKey(const KeyPress &keyCode)
{
keysListenedFor.set(keyCode);
}
void dontListenForKeys()
{
keysListenedFor.clear();
}

s32 getMouseWheel()
{
s32 a = mouse_wheel;
@@ -168,6 +181,12 @@ class MyEventReceiver : public IEventReceiver
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 @@ class RealInputHandler : public InputHandler
{
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()) {
@@ -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();

@@ -110,6 +110,9 @@ class InputHandler
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;

0 comments on commit fa6b21a

Please sign in to comment.
You can’t perform that action at this time.