window_list.cc 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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 "base/no_destructor.h"
  8. #include "shell/browser/native_window.h"
  9. #include "shell/browser/window_list_observer.h"
  10. namespace {
  11. template <typename T>
  12. std::vector<base::WeakPtr<T>> ConvertToWeakPtrVector(std::vector<T*> raw_ptrs) {
  13. std::vector<base::WeakPtr<T>> converted_to_weak;
  14. converted_to_weak.reserve(raw_ptrs.size());
  15. for (auto* raw_ptr : raw_ptrs) {
  16. converted_to_weak.push_back(raw_ptr->GetWeakPtr());
  17. }
  18. return converted_to_weak;
  19. }
  20. } // namespace
  21. namespace electron {
  22. // static
  23. WindowList* WindowList::instance_ = nullptr;
  24. // static
  25. WindowList* WindowList::GetInstance() {
  26. if (!instance_)
  27. instance_ = new WindowList;
  28. return instance_;
  29. }
  30. // static
  31. WindowList::WindowVector WindowList::GetWindows() {
  32. return GetInstance()->windows_;
  33. }
  34. // static
  35. bool WindowList::IsEmpty() {
  36. return GetInstance()->windows_.empty();
  37. }
  38. // static
  39. void WindowList::AddWindow(NativeWindow* window) {
  40. DCHECK(window);
  41. // Push |window| on the appropriate list instance.
  42. WindowVector& windows = GetInstance()->windows_;
  43. windows.push_back(window);
  44. for (WindowListObserver& observer : GetObservers())
  45. observer.OnWindowAdded(window);
  46. }
  47. // static
  48. void WindowList::RemoveWindow(NativeWindow* window) {
  49. WindowVector& windows = GetInstance()->windows_;
  50. windows.erase(std::remove(windows.begin(), windows.end(), window),
  51. windows.end());
  52. for (WindowListObserver& observer : GetObservers())
  53. observer.OnWindowRemoved(window);
  54. if (windows.empty()) {
  55. for (WindowListObserver& observer : GetObservers())
  56. observer.OnWindowAllClosed();
  57. }
  58. }
  59. // static
  60. void WindowList::WindowCloseCancelled(NativeWindow* window) {
  61. for (WindowListObserver& observer : GetObservers())
  62. observer.OnWindowCloseCancelled(window);
  63. }
  64. // static
  65. void WindowList::AddObserver(WindowListObserver* observer) {
  66. GetObservers().AddObserver(observer);
  67. }
  68. // static
  69. void WindowList::RemoveObserver(WindowListObserver* observer) {
  70. GetObservers().RemoveObserver(observer);
  71. }
  72. // static
  73. void WindowList::CloseAllWindows() {
  74. std::vector<base::WeakPtr<NativeWindow>> weak_windows =
  75. ConvertToWeakPtrVector(GetInstance()->windows_);
  76. #if BUILDFLAG(IS_MAC)
  77. std::reverse(weak_windows.begin(), weak_windows.end());
  78. #endif
  79. for (const auto& window : weak_windows) {
  80. if (window && !window->IsClosed())
  81. window->Close();
  82. }
  83. }
  84. // static
  85. void WindowList::DestroyAllWindows() {
  86. std::vector<base::WeakPtr<NativeWindow>> weak_windows =
  87. ConvertToWeakPtrVector(GetInstance()->windows_);
  88. for (const auto& window : weak_windows) {
  89. if (window && !window->IsClosed())
  90. window->CloseImmediately();
  91. }
  92. }
  93. WindowList::WindowList() = default;
  94. WindowList::~WindowList() = default;
  95. // static
  96. base::ObserverList<WindowListObserver>& WindowList::GetObservers() {
  97. static base::NoDestructor<base::ObserverList<WindowListObserver>> instance;
  98. return *instance;
  99. }
  100. } // namespace electron