• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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