315 changes: 182 additions & 133 deletions src/client/inputhandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,24 @@ class MyEventReceiver : public IEventReceiver
}

// Remember whether each key is down or up
// Get the Key that triggered the Event

if (event.EventType == irr::EET_KEY_INPUT_EVENT) {
if (event.KeyInput.PressedDown) {
bool down = event.KeyInput.PressedDown;

if (down) {
if (keyIsDown[event.KeyInput]) {
keyPressed.set(event.KeyInput);
}
keyDown.set(event.KeyInput);
keyIsDown.set(event.KeyInput);
keyWasDown.set(event.KeyInput);
} else {
keyIsDown.unset(event.KeyInput);
}
} else {
keyDown.unset(event.KeyInput);
keyIsDown.unset(event.KeyInput);
keyPressed.unset(event.KeyInput);
keyReleased.set(event.KeyInput);
}
}

#ifdef HAVE_TOUCHSCREENGUI
Expand All @@ -60,32 +71,59 @@ class MyEventReceiver : public IEventReceiver
#endif
// handle mouse events
if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) {
if (noMenuActive() == false) {
left_active = false;
middle_active = false;
right_active = false;
} else {
left_active = event.MouseInput.isLeftPressed();
middle_active = event.MouseInput.isMiddlePressed();
right_active = event.MouseInput.isRightPressed();

if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) {
leftclicked = true;
}
if (event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN) {
rightclicked = true;
}
if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) {
leftreleased = true;
}
if (event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP) {
rightreleased = true;
}
// handle mouse buttons
// left
if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) {
if (keyIsDown["KEY_LBUTTON"]) {
keyPressed.set("KEY_LBUTTON");
}
keyDown.set("KEY_LBUTTON");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is stuff like this really necessary?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I think so. To handle the mouse buttons I need to write the states of them into keyIsDown keyPressed and so on.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Zeno- I think we should let the PR as it is and make another pull request with a rework of the KeyList Class.

keyIsDown.set("KEY_LBUTTON");
keyWasDown.set("KEY_LBUTTON");
} else if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) {
keyDown.unset("KEY_LBUTTON");
keyIsDown.unset("KEY_LBUTTON");
keyPressed.unset("KEY_LBUTTON");
keyReleased.set("KEY_LBUTTON");
}

// right
else if (event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN) {
if (keyIsDown["KEY_RBUTTON"]) {
keyPressed.set("KEY_RBUTTON");
}
keyDown.set("KEY_RBUTTON");
keyIsDown.set("KEY_RBUTTON");
keyWasDown.set("KEY_RBUTTON");
} else if (event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP) {
keyDown.unset("KEY_RBUTTON");
keyIsDown.unset("KEY_RBUTTON");
keyPressed.unset("KEY_RBUTTON");
keyReleased.set("KEY_RBUTTON");
}

// middle
else if (event.MouseInput.Event == EMIE_MMOUSE_PRESSED_DOWN) {
if (keyIsDown["KEY_MBUTTON"]) {
keyPressed.set("KEY_MBUTTON");
}
keyDown.set("KEY_MBUTTON");
keyIsDown.set("KEY_MBUTTON");
keyWasDown.set("KEY_MBUTTON");
} else if (event.MouseInput.Event == EMIE_MMOUSE_LEFT_UP) {
keyDown.unset("KEY_MBUTTON");
keyIsDown.set("KEY_MBUTTON");
keyPressed.unset("KEY_MBUTTON");
keyReleased.set("KEY_MBUTTON");
}

else if (noMenuActive()) {
if (event.MouseInput.Event == EMIE_MOUSE_WHEEL) {
mouse_wheel += event.MouseInput.Wheel;
}
}
}

if (event.EventType == irr::EET_LOG_TEXT_EVENT) {
dstream << std::string("Irrlicht log: ") + std::string(event.LogEvent.Text)
<< std::endl;
Expand All @@ -97,7 +135,17 @@ class MyEventReceiver : public IEventReceiver

bool IsKeyDown(const KeyPress &keyCode) const
{
return keyIsDown[keyCode];
return keyDown[keyCode];
}

bool IsKeyActive(const KeyPress &keyCode) const
{
return keyPressed[keyCode] || keyIsDown[keyCode];
}

bool IsKeyReleased(const KeyPress &keyCode) const
{
return keyReleased[keyCode];
}

// Checks whether a key was down and resets the state
Expand All @@ -109,6 +157,16 @@ class MyEventReceiver : public IEventReceiver
return b;
}

void resetKeyClicked(const KeyPress &keyCode)
{
keyDown.unset(keyCode);
}

void resetKeyReleased(const KeyPress &keyCode)
{
keyReleased.unset(keyCode);
}

s32 getMouseWheel()
{
s32 a = mouse_wheel;
Expand All @@ -118,17 +176,11 @@ class MyEventReceiver : public IEventReceiver

void clearInput()
{
keyDown.clear();
keyIsDown.clear();
keyWasDown.clear();

leftclicked = false;
rightclicked = false;
leftreleased = false;
rightreleased = false;

left_active = false;
middle_active = false;
right_active = false;
keyReleased.clear();
keyPressed.clear();

mouse_wheel = 0;
}
Expand All @@ -141,15 +193,6 @@ class MyEventReceiver : public IEventReceiver
#endif
}

bool leftclicked;
bool rightclicked;
bool leftreleased;
bool rightreleased;

bool left_active;
bool middle_active;
bool right_active;

s32 mouse_wheel;

#ifdef HAVE_TOUCHSCREENGUI
Expand All @@ -158,7 +201,10 @@ class MyEventReceiver : public IEventReceiver

private:
// The current state of keys
KeyList keyDown;
KeyList keyIsDown;
KeyList keyPressed;
KeyList keyReleased;
// Whether a key has been pressed or not
KeyList keyWasDown;
};
Expand All @@ -185,68 +231,40 @@ class RealInputHandler : public InputHandler
{
return m_receiver->WasKeyDown(keyCode);
}
virtual bool getKeyState(const KeyPress &keyCode)
{
return m_receiver->IsKeyActive(keyCode);
}
virtual bool getKeyReleased(const KeyPress &keyCode)
{
return m_receiver->IsKeyReleased(keyCode);
}
virtual void resetKeyClicked(const KeyPress &keyCode)
{
m_receiver->resetKeyClicked(keyCode);
}
virtual void resetKeyReleased(const KeyPress &keyCode)
{
m_receiver->resetKeyReleased(keyCode);
}

virtual v2s32 getMousePos()
{
if (m_device->getCursorControl()) {
return m_device->getCursorControl()->getPosition();
}
else {
} else {
return m_mousepos;
}
}
virtual void setMousePos(s32 x, s32 y)
{
if (m_device->getCursorControl()) {
m_device->getCursorControl()->setPosition(x, y);
}
else {
} else {
m_mousepos = v2s32(x,y);
}
}

virtual bool getLeftState()
{
return m_receiver->left_active;
}
virtual bool getRightState()
{
return m_receiver->right_active;
}

virtual bool getLeftClicked()
{
return m_receiver->leftclicked;
}
virtual bool getRightClicked()
{
return m_receiver->rightclicked;
}
virtual void resetLeftClicked()
{
m_receiver->leftclicked = false;
}
virtual void resetRightClicked()
{
m_receiver->rightclicked = false;
}

virtual bool getLeftReleased()
{
return m_receiver->leftreleased;
}
virtual bool getRightReleased()
{
return m_receiver->rightreleased;
}
virtual void resetLeftReleased()
{
m_receiver->leftreleased = false;
}
virtual void resetRightReleased()
{
m_receiver->rightreleased = false;
}

virtual s32 getMouseWheel()
{
return m_receiver->getMouseWheel();
Expand All @@ -269,72 +287,88 @@ class RandomInputHandler : public InputHandler
{
leftdown = false;
rightdown = false;
middledown = false;
leftclicked = false;
rightclicked = false;
middleclicked = false;
leftreleased = false;
rightreleased = false;
middlereleased = false;
keydown.clear();
}
virtual bool isKeyDown(const KeyPress &keyCode)
{
if (keyCode == getKeySetting("keymap_dig")) {
return leftclicked;
}
else if (keyCode == getKeySetting("keymap_place")) {
return rightclicked;
} /*else if (keyCode == getKeySetting("keymap_middle")) {
return middleclicked;
}*/
return keydown[keyCode];
}
virtual bool wasKeyDown(const KeyPress &keyCode)
{
return false;
}
virtual v2s32 getMousePos()
{
return mousepos;
}
virtual void setMousePos(s32 x, s32 y)
{
mousepos = v2s32(x, y);
}

virtual bool getLeftState()
{
return leftdown;
}
virtual bool getRightState()
virtual bool getKeyState(const KeyPress &keyCode)
{
return rightdown;
}

virtual bool getLeftClicked()
{
return leftclicked;
}
virtual bool getRightClicked()
{
return rightclicked;
if (keyCode == getKeySetting("keymap_dig")) {
return leftdown;
} else if (keyCode == getKeySetting("keymap_place")) {
return rightdown;
} /*else if (keyCode == getKeySetting("keymap_middle")) {
return middledown;
}*/
return false;
}
virtual void resetLeftClicked()
virtual bool getKeyReleased(const KeyPress &keyCode)
{
leftclicked = false;
if (keyCode == getKeySetting("keymap_dig")) {
return leftreleased;
} else if (keyCode == getKeySetting("keymap_place")) {
return rightreleased;
} /*else if (keyCode == getKeySetting("keymap_middle")) {
return middlereleased;
}*/
return false;
}
virtual void resetRightClicked()
{
rightclicked = false;
virtual void resetKeyClicked(const KeyPress &keyCode)
{
if (keyCode == getKeySetting("keymap_dig")) {
leftclicked = false;
return;
} else if (keyCode == getKeySetting("keymap_place")) {
rightclicked = false;
return;
} /*else if (keyCode == getKeySetting("keymap_middle")) {
middleclicked = false;
return;
}*/
}
virtual void resetKeyReleased(const KeyPress &keyCode)
{
if (keyCode == getKeySetting("keymap_dig")) {
leftreleased = false;
return;
} else if (keyCode == getKeySetting("keymap_place")) {
rightreleased = false;
return;
} /*else if (keyCode == getKeySetting("keymap_middle")) {
middlereleased = false;
return;
}*/
}

virtual bool getLeftReleased()
{
return leftreleased;
}
virtual bool getRightReleased()
{
return rightreleased;
}
virtual void resetLeftReleased()
virtual v2s32 getMousePos()
{
leftreleased = false;
return mousepos;
}
virtual void resetRightReleased()
virtual void setMousePos(s32 x, s32 y)
{
rightreleased = false;
mousepos = v2s32(x, y);
}

virtual s32 getMouseWheel()
{
return 0;
Expand Down Expand Up @@ -406,6 +440,18 @@ class RandomInputHandler : public InputHandler
rightreleased = true;
}
}
{
static float counter1 = 0;
counter1 -= dtime;
if (counter1 < 0.0) {
counter1 = 0.1 * Rand(1, 45);
middledown = !middledown;
if (middledown)
middleclicked = true;
if (!middledown)
middlereleased = true;
}
}
mousepos += mousespeed;
}

Expand All @@ -419,10 +465,13 @@ class RandomInputHandler : public InputHandler
v2s32 mousespeed;
bool leftdown;
bool rightdown;
bool middledown;
bool leftclicked;
bool rightclicked;
bool middleclicked;
bool leftreleased;
bool rightreleased;
bool middlereleased;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

middle* are currently not used - what will happen with them?

};

#endif
2 changes: 2 additions & 0 deletions src/defaultsettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ void set_default_settings(Settings *settings)

// Client stuff
settings->setDefault("remote_port", "30000");
settings->setDefault("keymap_dig", "KEY_LBUTTON");
settings->setDefault("keymap_place", "KEY_RBUTTON");
settings->setDefault("keymap_forward", "KEY_KEY_W");
settings->setDefault("keymap_backward", "KEY_KEY_S");
settings->setDefault("keymap_left", "KEY_KEY_A");
Expand Down
47 changes: 27 additions & 20 deletions src/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1220,6 +1220,10 @@ struct KeyCache {
KeyCache() { populate(); }

enum {
// Player interaction
KEYMAP_ID_DIG,
KEYMAP_ID_PLACE,

// Player movement
KEYMAP_ID_FORWARD,
KEYMAP_ID_BACKWARD,
Expand Down Expand Up @@ -1271,6 +1275,9 @@ struct KeyCache {

void KeyCache::populate()
{
key[KEYMAP_ID_DIG] = getKeySetting("keymap_dig");
key[KEYMAP_ID_PLACE] = getKeySetting("keymap_place");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The equal signs should be on the same level, just like below.


key[KEYMAP_ID_FORWARD] = getKeySetting("keymap_forward");
key[KEYMAP_ID_BACKWARD] = getKeySetting("keymap_backward");
key[KEYMAP_ID_LEFT] = getKeySetting("keymap_left");
Expand Down Expand Up @@ -2964,8 +2971,8 @@ void Game::updatePlayerControl(const CameraOrientation &cam)
input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_JUMP]),
input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SPECIAL1]),
input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SNEAK]),
input->getLeftState(),
input->getRightState(),
input->getKeyState(keycache.key[KeyCache::KEYMAP_ID_DIG]),
input->getKeyState(keycache.key[KeyCache::KEYMAP_ID_PLACE]),
cam.camera_pitch,
cam.camera_yaw
);
Expand All @@ -2978,8 +2985,8 @@ void Game::updatePlayerControl(const CameraOrientation &cam)
( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_JUMP]) & 0x1) << 4) |
( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SPECIAL1]) & 0x1) << 5) |
( (u32)(input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_SNEAK]) & 0x1) << 6) |
( (u32)(input->getLeftState() & 0x1) << 7) |
( (u32)(input->getRightState() & 0x1) << 8
( (u32)(input->getKeyState(keycache.key[KeyCache::KEYMAP_ID_DIG]) & 0x1) << 7) |
( (u32)(input->getKeyState(keycache.key[KeyCache::KEYMAP_ID_PLACE]) & 0x1) << 8
);

#ifdef ANDROID
Expand Down Expand Up @@ -3404,7 +3411,7 @@ void Game::processPlayerInteraction(std::vector<aabb3f> &highlight_boxes,
- pointing away from node
*/
if (runData->digging) {
if (input->getLeftReleased()) {
if (input->getKeyReleased(keycache.key[KeyCache::KEYMAP_ID_DIG])) {
infostream << "Left button released"
<< " (stopped digging)" << std::endl;
runData->digging = false;
Expand All @@ -3429,21 +3436,21 @@ void Game::processPlayerInteraction(std::vector<aabb3f> &highlight_boxes,
}
}

if (!runData->digging && runData->ldown_for_dig && !input->getLeftState()) {
if (!runData->digging && runData->ldown_for_dig && !input->getKeyState(keycache.key[KeyCache::KEYMAP_ID_DIG])) {
runData->ldown_for_dig = false;
}

runData->left_punch = false;

soundmaker->m_player_leftpunch_sound.name = "";

if (input->getRightState())
if (input->getKeyState(keycache.key[KeyCache::KEYMAP_ID_PLACE]))
runData->repeat_rightclick_timer += dtime;
else
runData->repeat_rightclick_timer = 0;

if (playeritem_def.usable && input->getLeftState()) {
if (input->getLeftClicked())
if (playeritem_def.usable && input->getKeyState(keycache.key[KeyCache::KEYMAP_ID_DIG])) {
if (input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_DIG]))
client->interact(4, pointed);
} else if (pointed.type == POINTEDTHING_NODE) {
ToolCapabilities playeritem_toolcap =
Expand All @@ -3453,21 +3460,21 @@ void Game::processPlayerInteraction(std::vector<aabb3f> &highlight_boxes,
} else if (pointed.type == POINTEDTHING_OBJECT) {
handlePointingAtObject(runData, pointed, playeritem,
player_position, show_debug);
} else if (input->getLeftState()) {
} else if (input->getKeyState(keycache.key[KeyCache::KEYMAP_ID_DIG])) {
// When button is held down in air, show continuous animation
runData->left_punch = true;
}

runData->pointed_old = pointed;

if (runData->left_punch || input->getLeftClicked())
if (runData->left_punch || input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_DIG]))
camera->setDigging(0); // left click animation

input->resetLeftClicked();
input->resetRightClicked();
input->resetKeyClicked(keycache.key[KeyCache::KEYMAP_ID_DIG]);
input->resetKeyClicked(keycache.key[KeyCache::KEYMAP_ID_PLACE]);

input->resetLeftReleased();
input->resetRightReleased();
input->resetKeyReleased(keycache.key[KeyCache::KEYMAP_ID_DIG]);
input->resetKeyReleased(keycache.key[KeyCache::KEYMAP_ID_PLACE]);
}


Expand Down Expand Up @@ -3496,12 +3503,12 @@ void Game::handlePointingAtNode(GameRunData *runData,
}
}

if (runData->nodig_delay_timer <= 0.0 && input->getLeftState()
if (runData->nodig_delay_timer <= 0.0 && input->getKeyState(keycache.key[KeyCache::KEYMAP_ID_DIG])
&& client->checkPrivilege("interact")) {
handleDigging(runData, pointed, nodepos, playeritem_toolcap, dtime);
}

if ((input->getRightClicked() ||
if ((input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_PLACE]) ||
runData->repeat_rightclick_timer >= m_repeat_right_click_time) &&
client->checkPrivilege("interact")) {
runData->repeat_rightclick_timer = 0;
Expand Down Expand Up @@ -3564,7 +3571,7 @@ void Game::handlePointingAtObject(GameRunData *runData,
infotext = narrow_to_wide(runData->selected_object->debugInfoText());
}

if (input->getLeftState()) {
if (input->getKeyState(keycache.key[KeyCache::KEYMAP_ID_DIG])) {
bool do_punch = false;
bool do_punch_damage = false;

Expand All @@ -3574,7 +3581,7 @@ void Game::handlePointingAtObject(GameRunData *runData,
runData->object_hit_delay_timer = object_hit_delay;
}

if (input->getLeftClicked())
if (input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_DIG]))
do_punch = true;

if (do_punch) {
Expand All @@ -3594,7 +3601,7 @@ void Game::handlePointingAtObject(GameRunData *runData,
if (!disable_send)
client->interact(0, pointed);
}
} else if (input->getRightClicked()) {
} else if (input->isKeyDown(keycache.key[KeyCache::KEYMAP_ID_PLACE])) {
infostream << "Right-clicked object" << std::endl;
client->interact(3, pointed); // place
}
Expand Down
17 changes: 4 additions & 13 deletions src/game.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,23 +109,14 @@ class InputHandler

virtual bool isKeyDown(const KeyPress &keyCode) = 0;
virtual bool wasKeyDown(const KeyPress &keyCode) = 0;
virtual bool getKeyState(const KeyPress &keyCode) = 0;
virtual bool getKeyReleased(const KeyPress &keyCode) = 0;
virtual void resetKeyClicked(const KeyPress &keyCode) = 0;
virtual void resetKeyReleased(const KeyPress &keyCode) = 0;

virtual v2s32 getMousePos() = 0;
virtual void setMousePos(s32 x, s32 y) = 0;

virtual bool getLeftState() = 0;
virtual bool getRightState() = 0;

virtual bool getLeftClicked() = 0;
virtual bool getRightClicked() = 0;
virtual void resetLeftClicked() = 0;
virtual void resetRightClicked() = 0;

virtual bool getLeftReleased() = 0;
virtual bool getRightReleased() = 0;
virtual void resetLeftReleased() = 0;
virtual void resetRightReleased() = 0;

virtual s32 getMouseWheel() = 0;

virtual void step(float dtime) {}
Expand Down
111 changes: 57 additions & 54 deletions src/guiKeyChangeMenu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ enum
{
GUI_ID_BACK_BUTTON = 101, GUI_ID_ABORT_BUTTON, GUI_ID_SCROLL_BAR,
// buttons
GUI_ID_KEY_DIG,
GUI_ID_KEY_PLACE,
GUI_ID_KEY_FORWARD_BUTTON,
GUI_ID_KEY_BACKWARD_BUTTON,
GUI_ID_KEY_LEFT_BUTTON,
Expand Down Expand Up @@ -93,14 +95,12 @@ void GUIKeyChangeMenu::removeChildren()
{
const core::list<gui::IGUIElement*> &children = getChildren();
core::list<gui::IGUIElement*> children_copy;
for (core::list<gui::IGUIElement*>::ConstIterator i = children.begin(); i
!= children.end(); i++)
{
for (core::list<gui::IGUIElement*>::ConstIterator i = children.begin();
i != children.end(); i++) {
children_copy.push_back(*i);
}
for (core::list<gui::IGUIElement*>::Iterator i = children_copy.begin(); i
!= children_copy.end(); i++)
{
for (core::list<gui::IGUIElement*>::Iterator i = children_copy.begin();
i != children_copy.end(); i++) {
(*i)->remove();
}
}
Expand Down Expand Up @@ -134,8 +134,7 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize)

v2s32 offset(25, 60);

for(size_t i = 0; i < key_settings.size(); i++)
{
for (size_t i = 0; i < key_settings.size(); i++) {
key_setting *k = key_settings.at(i);
{
core::rect < s32 > rect(0, 0, 110, 20);
Expand All @@ -150,7 +149,7 @@ void GUIKeyChangeMenu::regenerateGui(v2u32 screensize)
k->button = Environment->addButton(rect, this, k->id, text);
delete[] text;
}
if(i + 1 == KMaxButtonPerColumns)
if (i + 1 == KMaxButtonPerColumns)
offset = v2s32(260, 60);
else
offset += v2s32(0, 25);
Expand Down Expand Up @@ -224,19 +223,19 @@ void GUIKeyChangeMenu::drawMenu()

bool GUIKeyChangeMenu::acceptInput()
{
for(size_t i = 0; i < key_settings.size(); i++)
for (size_t i = 0; i < key_settings.size(); i++)
{
key_setting *k = key_settings.at(i);
g_settings->set(k->setting_name, k->key.sym());
}
{
gui::IGUIElement *e = getElementFromId(GUI_ID_CB_AUX1_DESCENDS);
if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
if (e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
g_settings->setBool("aux1_descends", ((gui::IGUICheckBox*)e)->isChecked());
}
{
gui::IGUIElement *e = getElementFromId(GUI_ID_CB_DOUBLETAP_JUMP);
if(e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
if (e != NULL && e->getType() == gui::EGUIET_CHECK_BOX)
g_settings->setBool("doubletap_jump", ((gui::IGUICheckBox*)e)->isChecked());
}

Expand All @@ -249,13 +248,10 @@ bool GUIKeyChangeMenu::acceptInput()

bool GUIKeyChangeMenu::resetMenu()
{
if (activeKey >= 0)
{
for(size_t i = 0; i < key_settings.size(); i++)
{
if (activeKey >= 0) {
for(size_t i = 0; i < key_settings.size(); i++) {
key_setting *k = key_settings.at(i);
if(k->id == activeKey)
{
if (k->id == activeKey) {
const wchar_t *text = wgettext(k->key.name());
k->button->setText(text);
delete[] text;
Expand All @@ -269,29 +265,42 @@ bool GUIKeyChangeMenu::resetMenu()
}
bool GUIKeyChangeMenu::OnEvent(const SEvent& event)
{
if (event.EventType == EET_KEY_INPUT_EVENT && activeKey >= 0
&& event.KeyInput.PressedDown)
{
bool prefer_character = shift_down;
KeyPress kp(event.KeyInput, prefer_character);

bool shift_went_down = false;
if(!shift_down &&
bool prefer_character = shift_down;
bool shift_went_down = false;
bool new_key = false;
KeyPress kp;
if (event.EventType == EET_KEY_INPUT_EVENT
&& event.KeyInput.PressedDown && activeKey >= 0) {
kp = KeyPress(event.KeyInput, prefer_character);
new_key = true;
if (!shift_down &&
(event.KeyInput.Key == irr::KEY_SHIFT ||
event.KeyInput.Key == irr::KEY_LSHIFT ||
event.KeyInput.Key == irr::KEY_RSHIFT))
shift_went_down = true;

}
else if (event.EventType == EET_MOUSE_INPUT_EVENT && activeKey >= 0) {
if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) {
kp = KeyPress("KEY_LBUTTON");
new_key = true;
} else if (event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN) {
kp = KeyPress("KEY_RBUTTON");
new_key = true;
} else if (event.MouseInput.Event == EMIE_MMOUSE_PRESSED_DOWN) {
kp = KeyPress("KEY_MBUTTON");
new_key = true;
} else if (new_key && !shift_down && event.MouseInput.Shift) {
shift_went_down = true;
}
}
if (new_key) {
// Remove Key already in use message
if(this->key_used_text)
{
if (this->key_used_text) {
this->key_used_text->remove();
this->key_used_text = NULL;
}
// Display Key already in use message
if (std::find(this->key_used.begin(), this->key_used.end(), kp) != this->key_used.end())
{
if (std::find(this->key_used.begin(), this->key_used.end(), kp) != this->key_used.end()) {
core::rect < s32 > rect(0, 0, 600, 40);
rect += v2s32(0, 0) + v2s32(25, 30);
const wchar_t *text = wgettext("Key already in use");
Expand All @@ -304,10 +313,8 @@ bool GUIKeyChangeMenu::OnEvent(const SEvent& event)
// But go on
{
key_setting *k = NULL;
for(size_t i = 0; i < key_settings.size(); i++)
{
if(key_settings.at(i)->id == activeKey)
{
for (size_t i = 0; i < key_settings.size(); i++) {
if (key_settings.at(i)->id == activeKey) {
k = key_settings.at(i);
break;
}
Expand All @@ -321,45 +328,39 @@ bool GUIKeyChangeMenu::OnEvent(const SEvent& event)
this->key_used.push_back(kp);

// Allow characters made with shift
if(shift_went_down){
if (shift_went_down) {
shift_down = true;
return false;
}else{
}
else {
activeKey = -1;
return true;
}
}
}
if (event.EventType == EET_GUI_EVENT)
{
if (event.EventType == EET_GUI_EVENT) {
if (event.GUIEvent.EventType == gui::EGET_ELEMENT_FOCUS_LOST
&& isVisible())
{
if (!canTakeFocus(event.GUIEvent.Element))
{
&& isVisible()) {
if (!canTakeFocus(event.GUIEvent.Element)) {
dstream << "GUIMainMenu: Not allowing focus change."
<< std::endl;
// Returning true disables focus change
return true;
}
}
if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED)
{
switch (event.GUIEvent.Caller->getID())
{
case GUI_ID_BACK_BUTTON: //back
if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) {
switch (event.GUIEvent.Caller->getID()) {
case GUI_ID_BACK_BUTTON: // back
acceptInput();
quitMenu();
return true;
case GUI_ID_ABORT_BUTTON: //abort
case GUI_ID_ABORT_BUTTON: // abort
quitMenu();
return true;
default:
key_setting *k = NULL;
for(size_t i = 0; i < key_settings.size(); i++)
{
if(key_settings.at(i)->id == event.GUIEvent.Caller->getID())
{
for (size_t i = 0; i < key_settings.size(); i++) {
if (key_settings.at(i)->id == event.GUIEvent.Caller->getID()) {
k = key_settings.at(i);
break;
}
Expand Down Expand Up @@ -399,6 +400,8 @@ void GUIKeyChangeMenu::init_keys()
this->add_key(GUI_ID_KEY_BACKWARD_BUTTON, wgettext("Backward"), "keymap_backward");
this->add_key(GUI_ID_KEY_LEFT_BUTTON, wgettext("Left"), "keymap_left");
this->add_key(GUI_ID_KEY_RIGHT_BUTTON, wgettext("Right"), "keymap_right");
this->add_key(GUI_ID_KEY_DIG, wgettext("Dig"), "keymap_dig");
this->add_key(GUI_ID_KEY_PLACE, wgettext("Place/Interact"), "keymap_place");
this->add_key(GUI_ID_KEY_USE_BUTTON, wgettext("Use"), "keymap_special1");
this->add_key(GUI_ID_KEY_JUMP_BUTTON, wgettext("Jump"), "keymap_jump");
this->add_key(GUI_ID_KEY_SNEAK_BUTTON, wgettext("Sneak"), "keymap_sneak");
Expand Down