From 57f22c77c00b59a27dcc825524a55fa6e75b2bb4 Mon Sep 17 00:00:00 2001
From: Glorf <michal1.bien@gmail.com>
Date: Fri, 3 May 2013 12:44:27 +0200
Subject: [PATCH] Bugfix #732 part 1

---
 apps/openmw/mwbase/windowmanager.hpp    |  2 ++
 apps/openmw/mwgui/messagebox.cpp        | 14 ++++++++++++--
 apps/openmw/mwgui/messagebox.hpp        |  4 +++-
 apps/openmw/mwgui/settingswindow.cpp    |  4 +++-
 apps/openmw/mwgui/windowmanagerimp.cpp  | 10 ++++++++++
 apps/openmw/mwgui/windowmanagerimp.hpp  |  2 ++
 apps/openmw/mwinput/inputmanagerimp.cpp |  4 ++++
 7 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/apps/openmw/mwbase/windowmanager.hpp b/apps/openmw/mwbase/windowmanager.hpp
index 976d7d84c..1832bf542 100644
--- a/apps/openmw/mwbase/windowmanager.hpp
+++ b/apps/openmw/mwbase/windowmanager.hpp
@@ -201,6 +201,8 @@ namespace MWBase
             ///< Hides dialog and schedules dialog to be deleted.
 
             virtual void messageBox (const std::string& message, const std::vector<std::string>& buttons = std::vector<std::string>()) = 0;
+            virtual void staticMessageBox(const std::string& message) = 0;
+            virtual void removeStaticMessageBox() = 0;
 
             virtual void enterPressed () = 0;
             virtual int readPressedButton() = 0;
diff --git a/apps/openmw/mwgui/messagebox.cpp b/apps/openmw/mwgui/messagebox.cpp
index 876fb3522..2fc50f257 100644
--- a/apps/openmw/mwgui/messagebox.cpp
+++ b/apps/openmw/mwgui/messagebox.cpp
@@ -13,6 +13,7 @@ namespace MWGui
         // defines
         mMessageBoxSpeed = 0.1;
         mInterMessageBoxe = NULL;
+        mStaticMessageBox = NULL;
     }
 
     void MessageBoxManager::onFrame (float frameDuration)
@@ -68,11 +69,14 @@ namespace MWGui
         }
     }
 
-    void MessageBoxManager::createMessageBox (const std::string& message)
+    void MessageBoxManager::createMessageBox (const std::string& message, bool stat)
     {
         MessageBox *box = new MessageBox(*this, message);
 
-        removeMessageBox(message.length()*mMessageBoxSpeed, box);
+        if(stat)
+            mStaticMessageBox = box;
+        else
+            removeMessageBox(message.length()*mMessageBoxSpeed, box);
 
         mMessageBoxes.push_back(box);
         std::vector<MessageBox*>::iterator it;
@@ -90,6 +94,12 @@ namespace MWGui
         }
     }
 
+    void MessageBoxManager::removeStaticMessageBox ()
+    {
+        removeMessageBox(mStaticMessageBox);
+        mStaticMessageBox = NULL;
+    }
+
     bool MessageBoxManager::createInteractiveMessageBox (const std::string& message, const std::vector<std::string>& buttons)
     {
         if(mInterMessageBoxe != NULL) {
diff --git a/apps/openmw/mwgui/messagebox.hpp b/apps/openmw/mwgui/messagebox.hpp
index 0df6f3544..0e47b0323 100644
--- a/apps/openmw/mwgui/messagebox.hpp
+++ b/apps/openmw/mwgui/messagebox.hpp
@@ -31,7 +31,8 @@ namespace MWGui
         public:
             MessageBoxManager ();
             void onFrame (float frameDuration);
-            void createMessageBox (const std::string& message);
+            void createMessageBox (const std::string& message, bool stat = false);
+            void removeStaticMessageBox ();
             bool createInteractiveMessageBox (const std::string& message, const std::vector<std::string>& buttons);
             bool isInteractiveMessageBox ();
 
@@ -52,6 +53,7 @@ namespace MWGui
         private:
             std::vector<MessageBox*> mMessageBoxes;
             InteractiveMessageBox* mInterMessageBoxe;
+            MessageBox* mStaticMessageBox;
             std::vector<MessageBoxManagerTimer> mTimers;
             float mMessageBoxSpeed;
     };
diff --git a/apps/openmw/mwgui/settingswindow.cpp b/apps/openmw/mwgui/settingswindow.cpp
index 39ee4e01d..413171dd4 100644
--- a/apps/openmw/mwgui/settingswindow.cpp
+++ b/apps/openmw/mwgui/settingswindow.cpp
@@ -551,6 +551,8 @@ namespace MWGui
         while (mControlsBox->getChildCount())
             MyGUI::Gui::getInstance().destroyWidget(mControlsBox->getChildAt(0));
 
+        MWBase::Environment::get().getWindowManager ()->removeStaticMessageBox();
+
         std::vector<int> actions = MWBase::Environment::get().getInputManager()->getActionSorting ();
 
         const int h = 18;
@@ -585,7 +587,7 @@ namespace MWGui
 
         static_cast<MyGUI::Button*>(_sender)->setCaptionWithReplacing("#{sNone}");
 
-        MWBase::Environment::get().getWindowManager ()->messageBox ("#{sControlsMenu3}");
+        MWBase::Environment::get().getWindowManager ()->staticMessageBox ("#{sControlsMenu3}");
         MWBase::Environment::get().getWindowManager ()->disallowMouse();
 
         MWBase::Environment::get().getInputManager ()->enableDetectingBindingMode (actionId);
diff --git a/apps/openmw/mwgui/windowmanagerimp.cpp b/apps/openmw/mwgui/windowmanagerimp.cpp
index ff83f5f67..be947cb8a 100644
--- a/apps/openmw/mwgui/windowmanagerimp.cpp
+++ b/apps/openmw/mwgui/windowmanagerimp.cpp
@@ -600,6 +600,16 @@ namespace MWGui
         }
     }
 
+    void WindowManager::staticMessageBox(const std::string& message)
+    {
+        mMessageBoxManager->createMessageBox(message, true);
+    }
+
+    void WindowManager::removeStaticMessageBox()
+    {
+        mMessageBoxManager->removeStaticMessageBox();
+    }
+
     void WindowManager::enterPressed ()
     {
         mMessageBoxManager->enterPressed();
diff --git a/apps/openmw/mwgui/windowmanagerimp.hpp b/apps/openmw/mwgui/windowmanagerimp.hpp
index acac77bf3..f3413ca2f 100644
--- a/apps/openmw/mwgui/windowmanagerimp.hpp
+++ b/apps/openmw/mwgui/windowmanagerimp.hpp
@@ -192,6 +192,8 @@ namespace MWGui
     virtual void removeDialog(OEngine::GUI::Layout* dialog); ///< Hides dialog and schedules dialog to be deleted.
 
     virtual void messageBox (const std::string& message, const std::vector<std::string>& buttons = std::vector<std::string>());
+    virtual void staticMessageBox(const std::string& message);
+    virtual void removeStaticMessageBox();
     virtual void enterPressed ();
     virtual int readPressedButton (); ///< returns the index of the pressed button or -1 if no button was pressed (->MessageBoxmanager->InteractiveMessageBox)
 
diff --git a/apps/openmw/mwinput/inputmanagerimp.cpp b/apps/openmw/mwinput/inputmanagerimp.cpp
index 1cd716413..01ef36177 100644
--- a/apps/openmw/mwinput/inputmanagerimp.cpp
+++ b/apps/openmw/mwinput/inputmanagerimp.cpp
@@ -917,6 +917,10 @@ namespace MWInput
     void InputManager::keyBindingDetected(ICS::InputControlSystem* ICS, ICS::Control* control
         , OIS::KeyCode key, ICS::Control::ControlChangingDirection direction)
     {
+        //Disallow binding escape key
+        if(key==OIS::KC_ESCAPE)
+            return
+
         clearAllBindings(control);
         ICS::DetectingBindingListener::keyBindingDetected (ICS, control, key, direction);
         MWBase::Environment::get().getWindowManager ()->notifyInputActionBound ();