CmRenderWindowManager.cpp 2.3 KB

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