CmRenderWindowManager.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "CmRenderWindowManager.h"
  2. #include "CmPlatform.h"
  3. namespace CamelotFramework
  4. {
  5. RenderWindowManager::RenderWindowManager()
  6. :mWindowInFocus(nullptr), mNewWindowInFocus(nullptr)
  7. {
  8. Platform::onWindowFocusReceived.connect(boost::bind(&RenderWindowManager::windowFocusReceived, this, _1));
  9. Platform::onWindowFocusLost.connect(boost::bind(&RenderWindowManager::windowFocusLost, this, _1));
  10. Platform::onWindowMovedOrResized.connect(boost::bind(&RenderWindowManager::windowMovedOrResized, this, _1));
  11. }
  12. RenderWindowPtr RenderWindowManager::create(RENDER_WINDOW_DESC& desc, RenderWindowPtr parentWindow)
  13. {
  14. RenderWindowPtr renderWindow = createImpl(desc, parentWindow);
  15. renderWindow->setThisPtr(renderWindow);
  16. renderWindow->initialize();
  17. {
  18. CM_LOCK_MUTEX(mWindowMutex);
  19. mCreatedWindows.push_back(renderWindow.get());
  20. }
  21. return renderWindow;
  22. }
  23. void RenderWindowManager::windowDestroyed(RenderWindow* window)
  24. {
  25. {
  26. CM_LOCK_MUTEX(mWindowMutex);
  27. auto iterFind = std::find(begin(mCreatedWindows), end(mCreatedWindows), window);
  28. if(iterFind == mCreatedWindows.end())
  29. CM_EXCEPT(InternalErrorException, "Trying to destroy a window that is not in the created windows list.");
  30. mCreatedWindows.erase(iterFind);
  31. }
  32. }
  33. void RenderWindowManager::windowFocusReceived(RenderWindow* window)
  34. {
  35. window->_windowFocusReceived();
  36. CM_LOCK_MUTEX(mWindowMutex);
  37. mNewWindowInFocus = window;
  38. }
  39. void RenderWindowManager::windowFocusLost(RenderWindow* window)
  40. {
  41. window->_windowFocusLost();
  42. CM_LOCK_MUTEX(mWindowMutex);
  43. mNewWindowInFocus = nullptr;
  44. }
  45. void RenderWindowManager::windowMovedOrResized(RenderWindow* window)
  46. {
  47. window->_windowMovedOrResized();
  48. CM_LOCK_MUTEX(mWindowMutex);
  49. auto iterFind = std::find(begin(mMovedOrResizedWindows), end(mMovedOrResizedWindows), window);
  50. if(iterFind == end(mMovedOrResizedWindows))
  51. mMovedOrResizedWindows.push_back(window);
  52. }
  53. void RenderWindowManager::update()
  54. {
  55. RenderWindow* newWinInFocus = nullptr;
  56. Vector<RenderWindow*>::type movedOrResizedWindows;
  57. {
  58. CM_LOCK_MUTEX(mWindowMutex);
  59. newWinInFocus = mNewWindowInFocus;
  60. movedOrResizedWindows = mMovedOrResizedWindows;
  61. mMovedOrResizedWindows.clear();
  62. }
  63. if(mWindowInFocus != newWinInFocus)
  64. {
  65. if(mWindowInFocus != nullptr)
  66. {
  67. if(!onFocusLost.empty())
  68. onFocusLost(*mWindowInFocus);
  69. }
  70. if(newWinInFocus != nullptr)
  71. {
  72. if(!onFocusGained.empty())
  73. onFocusGained(*newWinInFocus);
  74. }
  75. mWindowInFocus = newWinInFocus;
  76. }
  77. for(auto& window : movedOrResizedWindows)
  78. {
  79. if(!window->onResized.empty())
  80. window->onResized();
  81. }
  82. }
  83. Vector<RenderWindow*>::type RenderWindowManager::getRenderWindows() const
  84. {
  85. CM_LOCK_MUTEX(mWindowMutex);
  86. return mCreatedWindows;
  87. }
  88. }