diff options
author | Andrei Karas <akaras@inbox.ru> | 2012-04-03 01:29:22 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2012-04-03 01:29:22 +0300 |
commit | 5e4a1bf239d76a5525a4409dc7a2094fbffe0eb3 (patch) | |
tree | 2563cd7dd22fb1370b0311e9b7b45b8657f9ecdf /src/gui | |
parent | a56d6c4d316551940982d622e9b0e3b0f1ad1863 (diff) | |
download | mv-5e4a1bf239d76a5525a4409dc7a2094fbffe0eb3.tar.gz mv-5e4a1bf239d76a5525a4409dc7a2094fbffe0eb3.tar.bz2 mv-5e4a1bf239d76a5525a4409dc7a2094fbffe0eb3.tar.xz mv-5e4a1bf239d76a5525a4409dc7a2094fbffe0eb3.zip |
Put gui input logic before most game input logic.
This solving game and gui shortcuts conflicts.
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/gui.cpp | 90 | ||||
-rw-r--r-- | src/gui/gui.h | 4 |
2 files changed, 93 insertions, 1 deletions
diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 9d111141b..19361cf2d 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -259,7 +259,95 @@ void Gui::logic() Palette::advanceGradients(); - gcn::Gui::logic(); + if (!mTop) + return; + + handleModalFocus(); + handleModalMouseInputFocus(); + + if (mInput) + { +// mInput->_pollInput(); + handleMouseInput(); + } + + mTop->logic(); +} + +bool Gui::handleInput() +{ + if (mInput) + return handleKeyInput2(); + else + return false; +} + +bool Gui::handleKeyInput2() +{ + bool consumed(false); + + while (!mInput->isKeyQueueEmpty()) + { + gcn::KeyInput keyInput = mInput->dequeueKeyInput(); + + // Save modifiers state + mShiftPressed = keyInput.isShiftPressed(); + mMetaPressed = keyInput.isMetaPressed(); + mControlPressed = keyInput.isControlPressed(); + mAltPressed = keyInput.isAltPressed(); + + gcn::KeyEvent keyEventToGlobalKeyListeners(nullptr, + mShiftPressed, mControlPressed, mAltPressed, mMetaPressed, + keyInput.getType(), keyInput.isNumericPad(), keyInput.getKey()); + + distributeKeyEventToGlobalKeyListeners( + keyEventToGlobalKeyListeners); + + // If a global key listener consumes the event it will not be + // sent further to the source of the event. + if (keyEventToGlobalKeyListeners.isConsumed()) + { + consumed = true; + continue; + } + + bool keyEventConsumed = false; + + if (mFocusHandler) + { + // Send key inputs to the focused widgets + if (mFocusHandler->getFocused()) + { + gcn::KeyEvent keyEvent(getKeyEventSource(), + mShiftPressed, mControlPressed, mAltPressed, mMetaPressed, + keyInput.getType(), keyInput.isNumericPad(), + keyInput.getKey()); + + if (!mFocusHandler->getFocused()->isFocusable()) + mFocusHandler->focusNone(); + else + distributeKeyEvent(keyEvent); + + keyEventConsumed = keyEvent.isConsumed(); + if (keyEventConsumed) + consumed = true; + } + + // If the key event hasn't been consumed and + // tabbing is enable check for tab press and + // change focus. + if (!keyEventConsumed && mTabbing + && keyInput.getKey().getValue() == Key::TAB + && keyInput.getType() == gcn::KeyInput::PRESSED) + { + if (keyInput.isShiftPressed()) + mFocusHandler->tabPrevious(); + else + mFocusHandler->tabNext(); + } + } + } // end while + return consumed; } void Gui::draw() diff --git a/src/gui/gui.h b/src/gui/gui.h index 5ace42323..33940ba5e 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -116,6 +116,10 @@ class Gui : public gcn::Gui void updateFonts(); + bool handleInput(); + + bool handleKeyInput2(); + /** * Cursors are in graphic order from left to right. * CURSOR_POINTER should be left untouched. |