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)12 ScreenChangeMonitor::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()24 ScreenChangeMonitor::~ScreenChangeMonitor() {
25   if (display::Screen* screen = display::Screen::GetScreen())
26     screen->RemoveObserver(this);
27 }
28 
OnScreensChange()29 void 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)42 void ScreenChangeMonitor::OnDisplayAdded(const display::Display& new_display) {
43   OnScreensChange();
44 }
45 
OnDisplayRemoved(const display::Display & old_display)46 void ScreenChangeMonitor::OnDisplayRemoved(
47     const display::Display& old_display) {
48   OnScreensChange();
49 }
50 
OnDisplayMetricsChanged(const display::Display & display,uint32_t changed_metrics)51 void 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