瀏覽代碼

Added window callbacks to Platform instead of calling RenderWindow methods directly

Marko Pintera 12 年之前
父節點
當前提交
9b36b5e7ea

+ 1 - 0
CamelotCore/Include/CmRenderWindowManager.h

@@ -41,6 +41,7 @@ namespace CamelotFramework
 
 		void windowDestroyed(RenderWindow* window);
 		void windowFocusReceived(RenderWindow* window);
+		void windowFocusLost(RenderWindow* window);
 		void windowMovedOrResized(RenderWindow* window);
 	};
 }

+ 7 - 0
CamelotCore/Include/Win32/CmPlatformImpl.h

@@ -58,6 +58,9 @@ namespace CamelotFramework
 		static boost::signal<void(const Int2&)> onMouseMoved;
 		static boost::signal<void(float)> onMouseWheelScrolled;
 		static boost::signal<void(UINT32)> onCharInput;
+		static boost::signal<void(RenderWindow*)> onWindowFocusReceived;
+		static boost::signal<void(RenderWindow*)> onWindowFocusLost;
+		static boost::signal<void(RenderWindow*)> onWindowMovedOrResized;
 	protected:
 		static bool mIsCursorHidden;
 		static NativeCursorData mCursor;
@@ -65,5 +68,9 @@ namespace CamelotFramework
 
 		static void win32ShowCursor();
 		static void win32HideCursor();
+
+		static void windowFocusReceived(RenderWindow* window);
+		static void windowFocusLost(RenderWindow* window);
+		static void windowMovedOrResized(RenderWindow* window);
 	};
 }

+ 5 - 5
CamelotCore/Source/CmPlatformWndProc.cpp

@@ -28,12 +28,12 @@ namespace CamelotFramework
 					win->setActive(true);
 
 					if(!win->hasFocus())
-						win->_windowFocusReceived();
+						windowFocusReceived(win);
 				}
 				else
 				{
 					if(win->hasFocus())
-						win->_windowFocusLost();
+						windowFocusLost(win);
 				}
 
 				break;
@@ -69,13 +69,13 @@ namespace CamelotFramework
 		case WM_EXITSIZEMOVE:
 			break;
 		case WM_MOVE:
-			win->_windowMovedOrResized();
+			windowMovedOrResized(win);
 			break;
 		case WM_DISPLAYCHANGE:
-			win->_windowMovedOrResized();
+			windowMovedOrResized(win);
 			break;
 		case WM_SIZE:
-			win->_windowMovedOrResized();
+			windowMovedOrResized(win);
 			break;
 		case WM_SETCURSOR:
 			if(isCursorHidden())

+ 0 - 4
CamelotCore/Source/CmRenderWindow.cpp

@@ -59,8 +59,6 @@ namespace CamelotFramework
 
 		if(!onMovedOrResized.empty())
 			onMovedOrResized(this);
-
-		RenderWindowManager::instance().windowMovedOrResized(this);
 	}
 
 	void RenderWindow::_windowFocusReceived()
@@ -68,8 +66,6 @@ namespace CamelotFramework
 		THROW_IF_NOT_CORE_THREAD;
 
 		mHasFocus = true;
-
-		RenderWindowManager::instance().windowFocusReceived(this);
 	}
 
 	void RenderWindow::_windowFocusLost()

+ 13 - 1
CamelotCore/Source/CmRenderWindowManager.cpp

@@ -1,11 +1,14 @@
 #include "CmRenderWindowManager.h"
+#include "CmPlatform.h"
 
 namespace CamelotFramework
 {
 	RenderWindowManager::RenderWindowManager()
 		:mWindowInFocus(nullptr), mNewWindowInFocus(nullptr)
 	{
-
+		Platform::onWindowFocusReceived.connect(boost::bind(&RenderWindowManager::windowFocusReceived, this, _1));
+		Platform::onWindowFocusLost.connect(boost::bind(&RenderWindowManager::windowFocusLost, this, _1));
+		Platform::onWindowMovedOrResized.connect(boost::bind(&RenderWindowManager::windowMovedOrResized, this, _1));
 	}
 
 	RenderWindowPtr RenderWindowManager::create(RENDER_WINDOW_DESC& desc, RenderWindowPtr parentWindow)
@@ -39,12 +42,21 @@ namespace CamelotFramework
 
 	void RenderWindowManager::windowFocusReceived(RenderWindow* window)
 	{
+		window->_windowFocusReceived();
+
 		CM_LOCK_MUTEX(mWindowMutex);
 		mNewWindowInFocus = window;
 	}
 
+	void RenderWindowManager::windowFocusLost(RenderWindow* window)
+	{
+		window->_windowFocusLost();
+	}
+
 	void RenderWindowManager::windowMovedOrResized(RenderWindow* window)
 	{
+		window->_windowMovedOrResized();
+
 		CM_LOCK_MUTEX(mWindowMutex);
 
 		auto iterFind = std::find(begin(mMovedOrResizedWindows), end(mMovedOrResizedWindows), window);

+ 22 - 0
CamelotCore/Source/Win32/CmPlatformImpl.cpp

@@ -16,6 +16,10 @@ namespace CamelotFramework
 	boost::signal<void(float)> Platform::onMouseWheelScrolled;
 	boost::signal<void(UINT32)> Platform::onCharInput;
 
+	boost::signal<void(RenderWindow*)> Platform::onWindowFocusReceived;
+	boost::signal<void(RenderWindow*)> Platform::onWindowFocusLost;
+	boost::signal<void(RenderWindow*)> Platform::onWindowMovedOrResized;
+
 	struct NativeCursorData::Pimpl
 	{
 		HCURSOR cursor;
@@ -247,6 +251,24 @@ namespace CamelotFramework
 		}
 	}
 
+	void Platform::windowFocusReceived(RenderWindow* window)
+	{
+		if(!onWindowFocusReceived.empty())
+			onWindowFocusReceived(window);
+	}
+
+	void Platform::windowFocusLost(RenderWindow* window)
+	{
+		if(!onWindowFocusLost.empty())
+			onWindowFocusLost(window);
+	}
+	
+	void Platform::windowMovedOrResized(RenderWindow* window)
+	{
+		if(!onWindowMovedOrResized.empty())
+			onWindowMovedOrResized(window);
+	}
+
 	void Platform::win32ShowCursor()
 	{
 		SetCursor(mCursor.data->cursor);