From ddbe13e5694230b889a6d5606cc36e3a3098b1c1 Mon Sep 17 00:00:00 2001
From: scrawl <scrawl@baseoftrash.de>
Date: Thu, 3 Jan 2013 01:07:17 +0100
Subject: [PATCH] Workaround for http://bugs.openmw.org/issues/475

---
 apps/openmw/mwinput/inputmanagerimp.cpp | 9 ++++++++-
 apps/openmw/mwinput/inputmanagerimp.hpp | 1 +
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp
index 6a1c3aa9b..995da8f34 100644
--- a/apps/openmw/mwinput/inputmanagerimp.cpp
+++ b/apps/openmw/mwinput/inputmanagerimp.cpp
@@ -40,6 +40,7 @@ namespace MWInput
         , mMouseLookEnabled(true)
         , mMouseX(ogre.getWindow()->getWidth ()/2.f)
         , mMouseY(ogre.getWindow()->getHeight ()/2.f)
+        , mMouseWheel(0)
         , mUserFile(userFile)
         , mDragDrop(false)
         , mGuiCursorEnabled(false)
@@ -242,6 +243,11 @@ namespace MWInput
         mKeyboard->capture();
         mMouse->capture();
 
+        // inject some fake mouse movement to force updating MyGUI's widget states
+        // this shouldn't do any harm since we're moving back to the original position afterwards
+        MyGUI::InputManager::getInstance().injectMouseMove( int(mMouseX+1), int(mMouseY+1), mMouseWheel);
+        MyGUI::InputManager::getInstance().injectMouseMove( int(mMouseX), int(mMouseY), mMouseWheel);
+
         // update values of channels (as a result of pressed keys)
         if (!loading)
             mInputCtrl->update(dt);
@@ -486,8 +492,9 @@ namespace MWInput
             mMouseY += float(arg.state.Y.rel) * mUISensitivity * mUIYMultiplier;
             mMouseX = std::max(0.f, std::min(mMouseX, float(viewSize.width)));
             mMouseY = std::max(0.f, std::min(mMouseY, float(viewSize.height)));
+            mMouseWheel = arg.state.Z.abs;
 
-            MyGUI::InputManager::getInstance().injectMouseMove( int(mMouseX), int(mMouseY), arg.state.Z.abs);
+            MyGUI::InputManager::getInstance().injectMouseMove( int(mMouseX), int(mMouseY), mMouseWheel);
         }
 
         if (mMouseLookEnabled)
diff --git a/apps/openmw/mwinput/inputmanagerimp.hpp b/apps/openmw/mwinput/inputmanagerimp.hpp
index 718d6b76f..9deed1f28 100644
--- a/apps/openmw/mwinput/inputmanagerimp.hpp
+++ b/apps/openmw/mwinput/inputmanagerimp.hpp
@@ -147,6 +147,7 @@ namespace MWInput
 
         float mMouseX;
         float mMouseY;
+        int mMouseWheel;
 
         std::map<std::string, bool> mControlSwitch;