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