window_list.cc 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. std::erase(windows, window);
  51. for (WindowListObserver& observer : GetObservers())
  52. observer.OnWindowRemoved(window);
  53. if (windows.empty()) {
  54. for (WindowListObserver& observer : GetObservers())
  55. observer.OnWindowAllClosed();
  56. }
  57. }
  58. // static
  59. void WindowList::WindowCloseCancelled(NativeWindow* window) {
  60. for (WindowListObserver& observer : GetObservers())
  61. observer.OnWindowCloseCancelled(window);
  62. }
  63. // static
  64. void WindowList::AddObserver(WindowListObserver* observer) {
  65. GetObservers().AddObserver(observer);
  66. }
  67. // static
  68. void WindowList::RemoveObserver(WindowListObserver* observer) {
  69. GetObservers().RemoveObserver(observer);
  70. }
  71. // static
  72. void WindowList::CloseAllWindows() {
  73. std::vector<base::WeakPtr<NativeWindow>> weak_windows =
  74. ConvertToWeakPtrVector(GetInstance()->windows_);
  75. #if BUILDFLAG(IS_MAC)
  76. std::reverse(weak_windows.begin(), weak_windows.end());
  77. #endif
  78. for (const auto& window : weak_windows) {
  79. if (window && !window->IsClosed())
  80. window->Close();
  81. }
  82. }
  83. // static
  84. void WindowList::DestroyAllWindows() {
  85. std::vector<base::WeakPtr<NativeWindow>> weak_windows =
  86. ConvertToWeakPtrVector(GetInstance()->windows_);
  87. for (const auto& window : weak_windows) {
  88. if (window && !window->IsClosed())
  89. window->CloseImmediately();
  90. }
  91. }
  92. WindowList::WindowList() = default;
  93. WindowList::~WindowList() = default;
  94. // static
  95. base::ObserverList<WindowListObserver>& WindowList::GetObservers() {
  96. static base::NoDestructor<base::ObserverList<WindowListObserver>> instance;
  97. return *instance;
  98. }
  99. } // namespace electron