From: ShadowNinja <shadowninja@minetest.net>
Date: Sat, 27 Feb 2016 20:51:09 +0000 (-0500)
Subject: Unlock cursor when opening console
X-Git-Tag: 0.4.14~210
X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=3edb7575a1ccca631994c0f5515b770b7a3e20d2;p=oweals%2Fminetest.git

Unlock cursor when opening console
---

diff --git a/src/game.cpp b/src/game.cpp
index 3d5f86e21..6fba70df6 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -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);
 	}
 }
 
diff --git a/src/guiChatConsole.cpp b/src/guiChatConsole.cpp
index 4c0039e5e..4a084a8e5 100644
--- a/src/guiChatConsole.cpp
+++ b/src/guiChatConsole.cpp
@@ -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;
diff --git a/src/guiChatConsole.h b/src/guiChatConsole.h
index 7b9fc6732..fe595f284 100644
--- a/src/guiChatConsole.h
+++ b/src/guiChatConsole.h
@@ -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;
diff --git a/src/mainmenumanager.h b/src/mainmenumanager.h
index 6f8aa9137..17133b164 100644
--- a/src/mainmenumanager.h
+++ b/src/mainmenumanager.h
@@ -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;
diff --git a/src/modalMenu.h b/src/modalMenu.h
index d5e975a87..43bb8e1b8 100644
--- a/src/modalMenu.h
+++ b/src/modalMenu.h
@@ -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;
 };
 
 /*