window_list.cc 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // Copyright (c) 2013 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #include "shell/browser/window_list.h"
  5. #include <algorithm>
  6. #include "base/logging.h"
  7. #include "shell/browser/native_window.h"
  8. #include "shell/browser/window_list_observer.h"
  9. namespace {
  10. template <typename T>
  11. std::vector<base::WeakPtr<T>> ConvertToWeakPtrVector(std::vector<T*> raw_ptrs) {
  12. std::vector<base::WeakPtr<T>> converted_to_weak;
  13. converted_to_weak.reserve(raw_ptrs.size());
  14. for (auto* raw_ptr : raw_ptrs) {
  15. converted_to_weak.push_back(raw_ptr->GetWeakPtr());
  16. }
  17. return converted_to_weak;
  18. }
  19. } // namespace
  20. namespace electron {
  21. // static
  22. base::LazyInstance<base::ObserverList<WindowListObserver>>::Leaky
  23. WindowList::observers_ = LAZY_INSTANCE_INITIALIZER;
  24. // static
  25. WindowList* WindowList::instance_ = nullptr;
  26. // static
  27. WindowList* WindowList::GetInstance() {
  28. if (!instance_)
  29. instance_ = new WindowList;
  30. return instance_;
  31. }
  32. // static
  33. WindowList::WindowVector WindowList::GetWindows() {
  34. return GetInstance()->windows_;
  35. }
  36. // static
  37. bool WindowList::IsEmpty() {
  38. return GetInstance()->windows_.empty();
  39. }
  40. // static
  41. void WindowList::AddWindow(NativeWindow* window) {
  42. DCHECK(window);
  43. // Push |window| on the appropriate list instance.
  44. WindowVector& windows = GetInstance()->windows_;
  45. windows.push_back(window);
  46. for (WindowListObserver& observer : observers_.Get())
  47. observer.OnWindowAdded(window);
  48. }
  49. // static
  50. void WindowList::RemoveWindow(NativeWindow* window) {
  51. WindowVector& windows = GetInstance()->windows_;
  52. windows.erase(std::remove(windows.begin(), windows.end(), window),
  53. windows.end());
  54. for (WindowListObserver& observer : observers_.Get())
  55. observer.OnWindowRemoved(window);
  56. if (windows.empty()) {
  57. for (WindowListObserver& observer : observers_.Get())
  58. observer.OnWindowAllClosed();
  59. }
  60. }
  61. // static
  62. void WindowList::WindowCloseCancelled(NativeWindow* window) {
  63. for (WindowListObserver& observer : observers_.Get())
  64. observer.OnWindowCloseCancelled(window);
  65. }
  66. // static
  67. void WindowList::AddObserver(WindowListObserver* observer) {
  68. observers_.Get().AddObserver(observer);
  69. }
  70. // static
  71. void WindowList::RemoveObserver(WindowListObserver* observer) {
  72. observers_.Get().RemoveObserver(observer);
  73. }
  74. // static
  75. void WindowList::CloseAllWindows() {
  76. std::vector<base::WeakPtr<NativeWindow>> weak_windows =
  77. ConvertToWeakPtrVector(GetInstance()->windows_);
  78. #if defined(OS_MACOSX)
  79. std::reverse(weak_windows.begin(), weak_windows.end());
  80. #endif
  81. for (const auto& window : weak_windows) {
  82. if (window && !window->IsClosed())
  83. window->Close();
  84. }
  85. }
  86. // static
  87. void WindowList::DestroyAllWindows() {
  88. std::vector<base::WeakPtr<NativeWindow>> weak_windows =
  89. ConvertToWeakPtrVector(GetInstance()->windows_);
  90. for (const auto& window : weak_windows) {
  91. if (window)
  92. window->CloseImmediately();
  93. }
  94. }
  95. WindowList::WindowList() {}
  96. WindowList::~WindowList() {}
  97. } // namespace electron