Unlock cursor when opening console
authorShadowNinja <shadowninja@minetest.net>
Sat, 27 Feb 2016 20:51:09 +0000 (15:51 -0500)
committerShadowNinja <shadowninja@minetest.net>
Thu, 3 Mar 2016 04:23:31 +0000 (23:23 -0500)
src/game.cpp
src/guiChatConsole.cpp
src/guiChatConsole.h
src/mainmenumanager.h
src/modalMenu.h

index 3d5f86e216c2b01434fb6131bf682aac1c3a5395..6fba70df6c6c9c04f1386cae57773efdf026f3f5 100644 (file)
@@ -2175,7 +2175,7 @@ bool Game::initGui()
 
        // Chat backend and console
        gui_chat_console = new GUIChatConsole(guienv, guienv->getRootGUIElement(),
-                       -1, chat_backend, client);
+                       -1, chat_backend, client, &g_menumgr);
        if (!gui_chat_console) {
                *error_message = "Could not allocate memory for chat console";
                errorstream << *error_message << std::endl;
@@ -2809,7 +2809,6 @@ void Game::openConsole(float height, const wchar_t *line)
                        gui_chat_console->setCloseOnEnter(true);
                        gui_chat_console->replaceAndAddToHistory(line);
                }
-               guienv->setFocus(gui_chat_console);
        }
 }
 
index 4c0039e5ea827c96549ccc9c36e7769b7ea4d40b..4a084a8e5a7ef76da059f87b7b5b6526a6e13301 100644 (file)
@@ -46,12 +46,14 @@ GUIChatConsole::GUIChatConsole(
                gui::IGUIElement* parent,
                s32 id,
                ChatBackend* backend,
-               Client* client
+               Client* client,
+               IMenuManager* menumgr
 ):
        IGUIElement(gui::EGUIET_ELEMENT, env, parent, id,
                        core::rect<s32>(0,0,100,100)),
        m_chat_backend(backend),
        m_client(client),
+       m_menumgr(menumgr),
        m_screensize(v2u32(0,0)),
        m_animate_time_old(0),
        m_open(false),
@@ -120,6 +122,8 @@ void GUIChatConsole::openConsole(f32 height)
        m_desired_height_fraction = height;
        m_desired_height = height * m_screensize.Y;
        reformatConsole();
+       Environment->setFocus(this);
+       m_menumgr->createdMenu(this);
 }
 
 bool GUIChatConsole::isOpen() const
@@ -135,11 +139,13 @@ bool GUIChatConsole::isOpenInhibited() const
 void GUIChatConsole::closeConsole()
 {
        m_open = false;
+       Environment->removeFocus(this);
+       m_menumgr->deletingMenu(this);
 }
 
 void GUIChatConsole::closeConsoleAtOnce()
 {
-       m_open = false;
+       closeConsole();
        m_height = 0;
        recalculateConsolePosition();
 }
@@ -399,7 +405,6 @@ bool GUIChatConsole::OnEvent(const SEvent& event)
                if(KeyPress(event.KeyInput) == getKeySetting("keymap_console"))
                {
                        closeConsole();
-                       Environment->removeFocus(this);
 
                        // inhibit open so the_game doesn't reopen immediately
                        m_open_inhibited = 50;
@@ -409,7 +414,6 @@ bool GUIChatConsole::OnEvent(const SEvent& event)
                else if(event.KeyInput.Key == KEY_ESCAPE)
                {
                        closeConsoleAtOnce();
-                       Environment->removeFocus(this);
                        m_close_on_enter = false;
                        // inhibit open so the_game doesn't reopen immediately
                        m_open_inhibited = 1; // so the ESCAPE button doesn't open the "pause menu"
@@ -432,7 +436,6 @@ bool GUIChatConsole::OnEvent(const SEvent& event)
                        m_client->typeChatMessage(text);
                        if (m_close_on_enter) {
                                closeConsoleAtOnce();
-                               Environment->removeFocus(this);
                                m_close_on_enter = false;
                        }
                        return true;
index 7b9fc67328bec82f46b4a92511cc60ac20b9eb75..fe595f2849b6adc5d6acaf154788e9a4a3ee5f74 100644 (file)
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #define GUICHATCONSOLE_HEADER
 
 #include "irrlichttypes_extrabloated.h"
+#include "modalMenu.h"
 #include "chat.h"
 #include "config.h"
 
@@ -33,7 +34,8 @@ public:
                        gui::IGUIElement* parent,
                        s32 id,
                        ChatBackend* backend,
-                       Client* client);
+                       Client* client,
+                       IMenuManager* menumgr);
        virtual ~GUIChatConsole();
 
        // Open the console (height = desired fraction of screen size)
@@ -86,11 +88,9 @@ private:
        void drawPrompt();
 
 private:
-       // pointer to the chat backend
        ChatBackend* m_chat_backend;
-
-       // pointer to the client
        Client* m_client;
+       IMenuManager* m_menumgr;
 
        // current screen size
        v2u32 m_screensize;
index 6f8aa91376ffcf8a350eea80f42b04f212bdc4c0..17133b1642253a8a022c4e095f9e72a45be09bb9 100644 (file)
@@ -47,9 +47,9 @@ extern gui::IGUIStaticText *guiroot;
 class MainMenuManager : public IMenuManager
 {
 public:
-       virtual void createdMenu(GUIModalMenu *menu)
+       virtual void createdMenu(gui::IGUIElement *menu)
        {
-               for(std::list<GUIModalMenu*>::iterator
+               for(std::list<gui::IGUIElement*>::iterator
                                i = m_stack.begin();
                                i != m_stack.end(); ++i)
                {
@@ -61,13 +61,13 @@ public:
                m_stack.push_back(menu);
        }
 
-       virtual void deletingMenu(GUIModalMenu *menu)
+       virtual void deletingMenu(gui::IGUIElement *menu)
        {
                // Remove all entries if there are duplicates
                bool removed_entry;
                do{
                        removed_entry = false;
-                       for(std::list<GUIModalMenu*>::iterator
+                       for(std::list<gui::IGUIElement*>::iterator
                                        i = m_stack.begin();
                                        i != m_stack.end(); ++i)
                        {
@@ -91,10 +91,10 @@ public:
        // Returns true to prevent further processing
        virtual bool preprocessEvent(const SEvent& event)
        {
-               if(!m_stack.empty())
-                       return m_stack.back()->preprocessEvent(event);
-               else
+               if (m_stack.empty())
                        return false;
+               GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(m_stack.back());
+               return mm && mm->preprocessEvent(event);
        }
 
        u32 menuCount()
@@ -104,16 +104,17 @@ public:
 
        bool pausesGame()
        {
-               for(std::list<GUIModalMenu*>::iterator
+               for(std::list<gui::IGUIElement*>::iterator
                                i = m_stack.begin(); i != m_stack.end(); ++i)
                {
-                       if((*i)->pausesGame())
+                       GUIModalMenu *mm = dynamic_cast<GUIModalMenu*>(*i);
+                       if (mm && mm->pausesGame())
                                return true;
                }
                return false;
        }
 
-       std::list<GUIModalMenu*> m_stack;
+       std::list<gui::IGUIElement*> m_stack;
 };
 
 extern MainMenuManager g_menumgr;
index d5e975a87d5242b429fba5fb6fc6c475a28a2cd7..43bb8e1b805ca6d8ff411064e41a4ee825f40d7a 100644 (file)
@@ -31,8 +31,8 @@ class IMenuManager
 {
 public:
        // A GUIModalMenu calls these when this class is passed as a parameter
-       virtual void createdMenu(GUIModalMenu *menu) = 0;
-       virtual void deletingMenu(GUIModalMenu *menu) = 0;
+       virtual void createdMenu(gui::IGUIElement *menu) = 0;
+       virtual void deletingMenu(gui::IGUIElement *menu) = 0;
 };
 
 /*