screen_ozone.cc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/aura/screen_ozone.h"
  5. #include <memory>
  6. #include "ui/aura/client/screen_position_client.h"
  7. #include "ui/aura/window.h"
  8. #include "ui/aura/window_tree_host.h"
  9. #include "ui/display/display.h"
  10. #include "ui/ozone/public/ozone_platform.h"
  11. #include "ui/ozone/public/platform_screen.h"
  12. namespace aura {
  13. ScreenOzone::ScreenOzone() {
  14. DCHECK(!display::Screen::HasScreen());
  15. display::Screen::SetScreenInstance(this);
  16. }
  17. ScreenOzone::~ScreenOzone() {
  18. display::Screen::SetScreenInstance(nullptr);
  19. }
  20. void ScreenOzone::Initialize() {
  21. auto* platform = ui::OzonePlatform::GetInstance();
  22. platform_screen_ = platform->CreateScreen();
  23. if (platform_screen_) {
  24. // Gives a chance to the derived classes to do pre-early initialization.
  25. OnBeforePlatformScreenInit();
  26. // Separate `CreateScreen` from `InitScreen` so that synchronous observers
  27. // that call into `Screen` functions below have a valid `platform_screen_`.
  28. platform->InitScreen(platform_screen_.get());
  29. } else {
  30. NOTREACHED()
  31. << "PlatformScreen is not implemented for this ozone platform.";
  32. }
  33. }
  34. // static
  35. bool ScreenOzone::IsOzoneInitialized() {
  36. return ui::OzonePlatform::IsInitialized();
  37. }
  38. gfx::Point ScreenOzone::GetCursorScreenPoint() {
  39. return platform_screen_->GetCursorScreenPoint();
  40. }
  41. bool ScreenOzone::IsWindowUnderCursor(gfx::NativeWindow window) {
  42. DCHECK(platform_screen_);
  43. gfx::AcceleratedWidget widget = GetAcceleratedWidgetForWindow(window);
  44. return platform_screen_->IsAcceleratedWidgetUnderCursor(widget);
  45. }
  46. gfx::NativeWindow ScreenOzone::GetWindowAtScreenPoint(const gfx::Point& point) {
  47. DCHECK(platform_screen_);
  48. return GetNativeWindowFromAcceleratedWidget(
  49. platform_screen_->GetAcceleratedWidgetAtScreenPoint(point));
  50. }
  51. gfx::NativeWindow ScreenOzone::GetLocalProcessWindowAtPoint(
  52. const gfx::Point& point,
  53. const std::set<gfx::NativeWindow>& ignore) {
  54. DCHECK(platform_screen_);
  55. std::set<gfx::AcceleratedWidget> ignore_top_level;
  56. for (auto* const window : ignore)
  57. ignore_top_level.emplace(window->GetHost()->GetAcceleratedWidget());
  58. return GetNativeWindowFromAcceleratedWidget(
  59. platform_screen_->GetLocalProcessWidgetAtPoint(point, ignore_top_level));
  60. }
  61. int ScreenOzone::GetNumDisplays() const {
  62. return GetAllDisplays().size();
  63. }
  64. const std::vector<display::Display>& ScreenOzone::GetAllDisplays() const {
  65. return platform_screen_->GetAllDisplays();
  66. }
  67. display::Display ScreenOzone::GetDisplayNearestWindow(
  68. gfx::NativeWindow window) const {
  69. DCHECK(platform_screen_);
  70. gfx::AcceleratedWidget widget = GetAcceleratedWidgetForWindow(window);
  71. if (!widget)
  72. return GetPrimaryDisplay();
  73. return platform_screen_->GetDisplayForAcceleratedWidget(widget);
  74. }
  75. display::Display ScreenOzone::GetDisplayNearestView(
  76. gfx::NativeView view) const {
  77. return GetDisplayNearestWindow(view);
  78. }
  79. display::Display ScreenOzone::GetDisplayNearestPoint(
  80. const gfx::Point& point) const {
  81. return platform_screen_->GetDisplayNearestPoint(point);
  82. }
  83. display::Display ScreenOzone::GetDisplayMatching(
  84. const gfx::Rect& match_rect) const {
  85. return platform_screen_->GetDisplayMatching(match_rect);
  86. }
  87. display::Display ScreenOzone::GetPrimaryDisplay() const {
  88. return platform_screen_->GetPrimaryDisplay();
  89. }
  90. #if BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
  91. ScreenOzone::ScreenSaverSuspenderOzone::ScreenSaverSuspenderOzone(
  92. std::unique_ptr<ui::PlatformScreen::PlatformScreenSaverSuspender> suspender)
  93. : suspender_(std::move(suspender)) {}
  94. ScreenOzone::ScreenSaverSuspenderOzone::~ScreenSaverSuspenderOzone() = default;
  95. std::unique_ptr<display::Screen::ScreenSaverSuspender>
  96. ScreenOzone::SuspendScreenSaver() {
  97. return std::make_unique<ScreenSaverSuspenderOzone>(
  98. platform_screen_->SuspendScreenSaver());
  99. }
  100. #endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX)
  101. bool ScreenOzone::IsScreenSaverActive() const {
  102. return platform_screen_->IsScreenSaverActive();
  103. }
  104. base::TimeDelta ScreenOzone::CalculateIdleTime() const {
  105. return platform_screen_->CalculateIdleTime();
  106. }
  107. void ScreenOzone::AddObserver(display::DisplayObserver* observer) {
  108. platform_screen_->AddObserver(observer);
  109. }
  110. void ScreenOzone::RemoveObserver(display::DisplayObserver* observer) {
  111. platform_screen_->RemoveObserver(observer);
  112. }
  113. std::string ScreenOzone::GetCurrentWorkspace() {
  114. return platform_screen_->GetCurrentWorkspace();
  115. }
  116. base::Value::List ScreenOzone::GetGpuExtraInfo(
  117. const gfx::GpuExtraInfo& gpu_extra_info) {
  118. return platform_screen_->GetGpuExtraInfo(gpu_extra_info);
  119. }
  120. gfx::NativeWindow ScreenOzone::GetNativeWindowFromAcceleratedWidget(
  121. gfx::AcceleratedWidget widget) const {
  122. return nullptr;
  123. }
  124. gfx::AcceleratedWidget ScreenOzone::GetAcceleratedWidgetForWindow(
  125. aura::Window* window) const {
  126. if (!window)
  127. return gfx::kNullAcceleratedWidget;
  128. aura::WindowTreeHost* host = window->GetHost();
  129. if (!host)
  130. return gfx::kNullAcceleratedWidget;
  131. return host->GetAcceleratedWidget();
  132. }
  133. void ScreenOzone::OnBeforePlatformScreenInit() {}
  134. ScopedScreenOzone::ScopedScreenOzone(const base::Location& location)
  135. : ScopedNativeScreen(/*call_maybe_init=*/false, location) {
  136. MaybeInit();
  137. }
  138. ScopedScreenOzone::~ScopedScreenOzone() = default;
  139. display::Screen* ScopedScreenOzone::CreateScreen() {
  140. auto* screen = new ScreenOzone();
  141. screen->Initialize();
  142. return screen;
  143. }
  144. } // namespace aura