1 // Copyright (c) 2012 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 "chrome/browser/ui/panels/display_settings_provider.h"
6
7 #include "base/bind.h"
8 #include "base/logging.h"
9 #include "chrome/browser/fullscreen.h"
10 #include "ui/gfx/screen.h"
11
12 namespace {
13 // The polling interval to check any display settings change, like full-screen
14 // mode changes.
15 const int kFullScreenModeCheckIntervalMs = 1000;
16 } // namespace
17
DisplaySettingsProvider()18 DisplaySettingsProvider::DisplaySettingsProvider()
19 : is_full_screen_(false) {
20 }
21
~DisplaySettingsProvider()22 DisplaySettingsProvider::~DisplaySettingsProvider() {
23 }
24
AddDisplayObserver(DisplayObserver * observer)25 void DisplaySettingsProvider::AddDisplayObserver(DisplayObserver* observer) {
26 display_observers_.AddObserver(observer);
27 }
28
RemoveDisplayObserver(DisplayObserver * observer)29 void DisplaySettingsProvider::RemoveDisplayObserver(DisplayObserver* observer) {
30 display_observers_.RemoveObserver(observer);
31 }
32
AddDesktopBarObserver(DesktopBarObserver * observer)33 void DisplaySettingsProvider::AddDesktopBarObserver(
34 DesktopBarObserver* observer) {
35 desktop_bar_observers_.AddObserver(observer);
36 }
37
RemoveDesktopBarObserver(DesktopBarObserver * observer)38 void DisplaySettingsProvider::RemoveDesktopBarObserver(
39 DesktopBarObserver* observer) {
40 desktop_bar_observers_.RemoveObserver(observer);
41 }
42
AddFullScreenObserver(FullScreenObserver * observer)43 void DisplaySettingsProvider::AddFullScreenObserver(
44 FullScreenObserver* observer) {
45 is_full_screen_ = IsFullScreen();
46 bool already_started = full_screen_observers_.might_have_observers();
47 full_screen_observers_.AddObserver(observer);
48
49 if (!already_started && NeedsPeriodicFullScreenCheck()) {
50 full_screen_mode_timer_.Start(FROM_HERE,
51 base::TimeDelta::FromMilliseconds(kFullScreenModeCheckIntervalMs),
52 base::Bind(&DisplaySettingsProvider::CheckFullScreenMode,
53 base::Unretained(this),
54 PERFORM_FULLSCREEN_CHECK));
55 }
56 }
57
RemoveFullScreenObserver(FullScreenObserver * observer)58 void DisplaySettingsProvider::RemoveFullScreenObserver(
59 FullScreenObserver* observer) {
60 full_screen_observers_.RemoveObserver(observer);
61
62 if (!full_screen_observers_.might_have_observers())
63 full_screen_mode_timer_.Stop();
64 }
65
66 // TODO(scottmg): This should be moved to ui/.
GetPrimaryDisplayArea() const67 gfx::Rect DisplaySettingsProvider::GetPrimaryDisplayArea() const {
68 // TODO(scottmg): NativeScreen is wrong. http://crbug.com/133312
69 return gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().bounds();
70 }
71
GetPrimaryWorkArea() const72 gfx::Rect DisplaySettingsProvider::GetPrimaryWorkArea() const {
73 #if defined(OS_MACOSX)
74 // On OSX, panels should be dropped all the way to the bottom edge of the
75 // screen (and overlap Dock). And we also want to exclude the system menu
76 // area. Note that the rect returned from gfx::Screen util functions is in
77 // platform-independent screen coordinates with (0, 0) as the top-left corner.
78 // TODO(scottmg): NativeScreen is wrong. http://crbug.com/133312
79 gfx::Display display = gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
80 gfx::Rect display_area = display.bounds();
81 gfx::Rect work_area = display.work_area();
82 int system_menu_height = work_area.y() - display_area.y();
83 if (system_menu_height > 0) {
84 display_area.set_y(display_area.y() + system_menu_height);
85 display_area.set_height(display_area.height() - system_menu_height);
86 }
87 return display_area;
88 #else
89 // TODO(scottmg): NativeScreen is wrong. http://crbug.com/133312
90 return gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area();
91 #endif
92 }
93
GetDisplayAreaMatching(const gfx::Rect & bounds) const94 gfx::Rect DisplaySettingsProvider::GetDisplayAreaMatching(
95 const gfx::Rect& bounds) const {
96 // TODO(scottmg): NativeScreen is wrong. http://crbug.com/133312
97 return gfx::Screen::GetNativeScreen()->GetDisplayMatching(bounds).bounds();
98 }
99
GetWorkAreaMatching(const gfx::Rect & bounds) const100 gfx::Rect DisplaySettingsProvider::GetWorkAreaMatching(
101 const gfx::Rect& bounds) const {
102 // TODO(scottmg): NativeScreen is wrong. http://crbug.com/133312
103 gfx::Screen* screen = gfx::Screen::GetNativeScreen();
104 gfx::Display display = screen->GetDisplayMatching(bounds);
105 if (display.bounds() == screen->GetPrimaryDisplay().bounds())
106 return GetPrimaryWorkArea();
107 return display.work_area();
108 }
109
OnDisplaySettingsChanged()110 void DisplaySettingsProvider::OnDisplaySettingsChanged() {
111 FOR_EACH_OBSERVER(DisplayObserver, display_observers_, OnDisplayChanged());
112 }
113
IsAutoHidingDesktopBarEnabled(DesktopBarAlignment alignment)114 bool DisplaySettingsProvider::IsAutoHidingDesktopBarEnabled(
115 DesktopBarAlignment alignment) {
116 return false;
117 }
118
GetDesktopBarThickness(DesktopBarAlignment alignment) const119 int DisplaySettingsProvider::GetDesktopBarThickness(
120 DesktopBarAlignment alignment) const {
121 return 0;
122 }
123
124 DisplaySettingsProvider::DesktopBarVisibility
GetDesktopBarVisibility(DesktopBarAlignment alignment) const125 DisplaySettingsProvider::GetDesktopBarVisibility(
126 DesktopBarAlignment alignment) const {
127 return DESKTOP_BAR_VISIBLE;
128 }
129
NeedsPeriodicFullScreenCheck() const130 bool DisplaySettingsProvider::NeedsPeriodicFullScreenCheck() const {
131 return true;
132 }
133
CheckFullScreenMode(FullScreenCheckMode check_mode)134 void DisplaySettingsProvider::CheckFullScreenMode(
135 FullScreenCheckMode check_mode) {
136 bool is_full_screen = false;
137 switch (check_mode) {
138 case ASSUME_FULLSCREEN_ON:
139 is_full_screen = true;
140 break;
141 case ASSUME_FULLSCREEN_OFF:
142 is_full_screen = false;
143 break;
144 case PERFORM_FULLSCREEN_CHECK:
145 is_full_screen = IsFullScreen();
146 break;
147 default:
148 NOTREACHED();
149 break;
150 }
151 if (is_full_screen == is_full_screen_)
152 return;
153 is_full_screen_ = is_full_screen;
154
155 FOR_EACH_OBSERVER(FullScreenObserver,
156 full_screen_observers_,
157 OnFullScreenModeChanged(is_full_screen_));
158 }
159
IsFullScreen()160 bool DisplaySettingsProvider::IsFullScreen() {
161 return IsFullScreenMode();
162 }
163
164 #if defined(USE_AURA)
165 // static
Create()166 DisplaySettingsProvider* DisplaySettingsProvider::Create() {
167 return new DisplaySettingsProvider();
168 }
169 #endif
170