1 // Copyright 2020 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 5 #include "content/browser/screen_enumeration/screen_change_monitor.h" 6 7 #include "build/build_config.h" 8 #include "ui/display/screen.h" 9 10 namespace content { 11 ScreenChangeMonitor(base::RepeatingCallback<void (bool)> callback)12ScreenChangeMonitor::ScreenChangeMonitor( 13 base::RepeatingCallback<void(bool)> callback) 14 : callback_(callback) { 15 // TODO(crbug.com/1071233): Investigate test failures (crashes?) on Fuchsia. 16 #if !defined(OS_FUCHSIA) 17 if (display::Screen* screen = display::Screen::GetScreen()) { 18 cached_displays_ = screen->GetAllDisplays(); 19 screen->AddObserver(this); 20 } 21 #endif // !OS_FUCHSIA 22 } 23 ~ScreenChangeMonitor()24ScreenChangeMonitor::~ScreenChangeMonitor() { 25 if (display::Screen* screen = display::Screen::GetScreen()) 26 screen->RemoveObserver(this); 27 } 28 OnScreensChange()29void ScreenChangeMonitor::OnScreensChange() { 30 if (display::Screen* screen = display::Screen::GetScreen()) { 31 const auto& displays = screen->GetAllDisplays(); 32 if (cached_displays_ == displays) 33 return; 34 35 const bool is_multi_screen_changed = 36 (cached_displays_.size() > 1) != (displays.size() > 1); 37 cached_displays_ = displays; 38 callback_.Run(is_multi_screen_changed); 39 } 40 } 41 OnDisplayAdded(const display::Display & new_display)42void ScreenChangeMonitor::OnDisplayAdded(const display::Display& new_display) { 43 OnScreensChange(); 44 } 45 OnDisplayRemoved(const display::Display & old_display)46void ScreenChangeMonitor::OnDisplayRemoved( 47 const display::Display& old_display) { 48 OnScreensChange(); 49 } 50 OnDisplayMetricsChanged(const display::Display & display,uint32_t changed_metrics)51void ScreenChangeMonitor::OnDisplayMetricsChanged( 52 const display::Display& display, 53 uint32_t changed_metrics) { 54 // TODO(msw): Use the |changed_metrics| parameter to disregard some changes. 55 OnScreensChange(); 56 } 57 58 } // namespace content 59