summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game.cpp55
-rw-r--r--src/inputmanager.cpp66
-rw-r--r--src/inputmanager.h4
3 files changed, 70 insertions, 55 deletions
diff --git a/src/game.cpp b/src/game.cpp
index 5c4785ef0..670188038 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -958,65 +958,14 @@ void Game::handleInput()
updateHistory(event);
checkKeys();
- if (event.type == SDL_KEYDOWN)
- {
- if (setupWindow && setupWindow->isVisible() &&
- keyboard.getNewKeyIndex() > keyboard.KEY_NO_VALUE)
- {
- keyboard.setNewKey(event);
- keyboard.callbackNewKey();
- keyboard.setNewKeyIndex(keyboard.KEY_NO_VALUE);
- return;
- }
-
- // send straight to gui for certain windows
- if (quitDialog || TextDialog::isActive() ||
- NpcPostDialog::isActive())
- {
- try
- {
- if (guiInput)
- guiInput->pushInput(event);
- if (gui)
- gui->handleInput();
- }
- catch (const gcn::Exception &e)
- {
- const char* err = e.getMessage().c_str();
- logger->log("Warning: guichan input exception: %s", err);
- }
- return;
- }
- }
-
- try
- {
- if (guiInput)
- guiInput->pushInput(event);
- }
- catch (const gcn::Exception &e)
- {
- const char *err = e.getMessage().c_str();
- logger->log("Warning: guichan input exception: %s", err);
- }
- if (gui)
- {
- bool res = gui->handleInput();
- if (res && event.type == SDL_KEYDOWN)
- return;
- }
+ if (inputManager.handleEvent(event))
+ return;
if (event.type == SDL_VIDEORESIZE)
{
// Let the client deal with this one (it'll pass down from there)
Client::resize(event.resize.w, event.resize.h);
}
- // Keyboard events (for discontinuous keys)
- else if (event.type == SDL_KEYDOWN)
- {
- if (inputManager.handleKeyEvent(event))
- return;
- }
// Active event
else if (event.type == SDL_ACTIVEEVENT)
{
diff --git a/src/inputmanager.cpp b/src/inputmanager.cpp
index f57a48b30..5e30f3894 100644
--- a/src/inputmanager.cpp
+++ b/src/inputmanager.cpp
@@ -28,20 +28,84 @@
#include "gui/gui.h"
#include "gui/inventorywindow.h"
#include "gui/npcdialog.h"
+#include "gui/npcpostdialog.h"
#include "gui/setup.h"
+#include "gui/textdialog.h"
#include "gui/tradewindow.h"
+#include <guichan/exception.hpp>
#include <guichan/focushandler.hpp>
#include "debug.h"
InputManager inputManager;
+extern QuitDialog *quitDialog;
+
InputManager::InputManager()
{
}
-bool InputManager::handleKeyEvent(SDL_Event &event)
+bool InputManager::handleEvent(const SDL_Event &event)
+{
+ if (event.type == SDL_KEYDOWN)
+ {
+ if (setupWindow && setupWindow->isVisible() &&
+ keyboard.getNewKeyIndex() > keyboard.KEY_NO_VALUE)
+ {
+ keyboard.setNewKey(event);
+ keyboard.callbackNewKey();
+ keyboard.setNewKeyIndex(keyboard.KEY_NO_VALUE);
+ return true;
+ }
+
+ // send straight to gui for certain windows
+ if (quitDialog || TextDialog::isActive() ||
+ NpcPostDialog::isActive())
+ {
+ try
+ {
+ if (guiInput)
+ guiInput->pushInput(event);
+ if (gui)
+ gui->handleInput();
+ }
+ catch (const gcn::Exception &e)
+ {
+ const char* err = e.getMessage().c_str();
+ logger->log("Warning: guichan input exception: %s", err);
+ }
+ return true;
+ }
+ }
+
+ try
+ {
+ if (guiInput)
+ guiInput->pushInput(event);
+ }
+ catch (const gcn::Exception &e)
+ {
+ const char *err = e.getMessage().c_str();
+ logger->log("Warning: guichan input exception: %s", err);
+ }
+ if (gui)
+ {
+ bool res = gui->handleInput();
+ if (res && event.type == SDL_KEYDOWN)
+ return true;
+ }
+
+ if (event.type == SDL_KEYDOWN)
+ {
+ if (handleKeyEvent(event))
+ return true;
+ }
+
+ return false;
+}
+
+bool InputManager::handleKeyEvent(const SDL_Event &event)
{
return keyboard.triggerAction(event);
}
diff --git a/src/inputmanager.h b/src/inputmanager.h
index 3276e979b..7a6ac6d05 100644
--- a/src/inputmanager.h
+++ b/src/inputmanager.h
@@ -50,7 +50,9 @@ class InputManager
public:
InputManager();
- bool handleKeyEvent(SDL_Event &event);
+ bool handleEvent(const SDL_Event &event);
+
+ bool handleKeyEvent(const SDL_Event &event);
int getInputConditionMask();