BsRenderWindowManager.cpp 3.5 KB

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