CmRenderWindowManager.cpp 3.3 KB

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