blob: 42d76cc0ebceb78088f8641ab0f4e6edd2cc9af5 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/panels/display_settings_provider.h"
#include "base/bind.h"
#include "base/logging.h"
#include "chrome/browser/fullscreen.h"
#include "ui/gfx/screen.h"
namespace {
// The polling interval to check any display settings change, like full-screen
// mode changes.
const int kFullScreenModeCheckIntervalMs = 1000;
} // namespace
DisplaySettingsProvider::DisplaySettingsProvider()
: is_full_screen_(false) {
}
DisplaySettingsProvider::~DisplaySettingsProvider() {
}
void DisplaySettingsProvider::AddDisplayObserver(DisplayObserver* observer) {
display_observers_.AddObserver(observer);
}
void DisplaySettingsProvider::RemoveDisplayObserver(DisplayObserver* observer) {
display_observers_.RemoveObserver(observer);
}
void DisplaySettingsProvider::AddDesktopBarObserver(
DesktopBarObserver* observer) {
desktop_bar_observers_.AddObserver(observer);
}
void DisplaySettingsProvider::RemoveDesktopBarObserver(
DesktopBarObserver* observer) {
desktop_bar_observers_.RemoveObserver(observer);
}
void DisplaySettingsProvider::AddFullScreenObserver(
FullScreenObserver* observer) {
is_full_screen_ = IsFullScreen();
bool already_started = full_screen_observers_.might_have_observers();
full_screen_observers_.AddObserver(observer);
if (!already_started && NeedsPeriodicFullScreenCheck()) {
full_screen_mode_timer_.Start(FROM_HERE,
base::TimeDelta::FromMilliseconds(kFullScreenModeCheckIntervalMs),
base::Bind(&DisplaySettingsProvider::CheckFullScreenMode,
base::Unretained(this),
PERFORM_FULLSCREEN_CHECK));
}
}
void DisplaySettingsProvider::RemoveFullScreenObserver(
FullScreenObserver* observer) {
full_screen_observers_.RemoveObserver(observer);
if (!full_screen_observers_.might_have_observers())
full_screen_mode_timer_.Stop();
}
// TODO(scottmg): This should be moved to ui/.
gfx::Rect DisplaySettingsProvider::GetPrimaryDisplayArea() const {
// TODO(scottmg): NativeScreen is wrong. http://crbug.com/133312
return gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().bounds();
}
gfx::Rect DisplaySettingsProvider::GetPrimaryWorkArea() const {
#if defined(OS_MACOSX)
// On OSX, panels should be dropped all the way to the bottom edge of the
// screen (and overlap Dock). And we also want to exclude the system menu
// area. Note that the rect returned from gfx::Screen util functions is in
// platform-independent screen coordinates with (0, 0) as the top-left corner.
// TODO(scottmg): NativeScreen is wrong. http://crbug.com/133312
gfx::Display display = gfx::Screen::GetNativeScreen()->GetPrimaryDisplay();
gfx::Rect display_area = display.bounds();
gfx::Rect work_area = display.work_area();
int system_menu_height = work_area.y() - display_area.y();
if (system_menu_height > 0) {
display_area.set_y(display_area.y() + system_menu_height);
display_area.set_height(display_area.height() - system_menu_height);
}
return display_area;
#else
// TODO(scottmg): NativeScreen is wrong. http://crbug.com/133312
return gfx::Screen::GetNativeScreen()->GetPrimaryDisplay().work_area();
#endif
}
gfx::Rect DisplaySettingsProvider::GetDisplayAreaMatching(
const gfx::Rect& bounds) const {
// TODO(scottmg): NativeScreen is wrong. http://crbug.com/133312
return gfx::Screen::GetNativeScreen()->GetDisplayMatching(bounds).bounds();
}
gfx::Rect DisplaySettingsProvider::GetWorkAreaMatching(
const gfx::Rect& bounds) const {
// TODO(scottmg): NativeScreen is wrong. http://crbug.com/133312
gfx::Screen* screen = gfx::Screen::GetNativeScreen();
gfx::Display display = screen->GetDisplayMatching(bounds);
if (display.bounds() == screen->GetPrimaryDisplay().bounds())
return GetPrimaryWorkArea();
return display.work_area();
}
void DisplaySettingsProvider::OnDisplaySettingsChanged() {
FOR_EACH_OBSERVER(DisplayObserver, display_observers_, OnDisplayChanged());
}
bool DisplaySettingsProvider::IsAutoHidingDesktopBarEnabled(
DesktopBarAlignment alignment) {
return false;
}
int DisplaySettingsProvider::GetDesktopBarThickness(
DesktopBarAlignment alignment) const {
return 0;
}
DisplaySettingsProvider::DesktopBarVisibility
DisplaySettingsProvider::GetDesktopBarVisibility(
DesktopBarAlignment alignment) const {
return DESKTOP_BAR_VISIBLE;
}
bool DisplaySettingsProvider::NeedsPeriodicFullScreenCheck() const {
return true;
}
void DisplaySettingsProvider::CheckFullScreenMode(
FullScreenCheckMode check_mode) {
bool is_full_screen = false;
switch (check_mode) {
case ASSUME_FULLSCREEN_ON:
is_full_screen = true;
break;
case ASSUME_FULLSCREEN_OFF:
is_full_screen = false;
break;
case PERFORM_FULLSCREEN_CHECK:
is_full_screen = IsFullScreen();
break;
default:
NOTREACHED();
break;
}
if (is_full_screen == is_full_screen_)
return;
is_full_screen_ = is_full_screen;
FOR_EACH_OBSERVER(FullScreenObserver,
full_screen_observers_,
OnFullScreenModeChanged(is_full_screen_));
}
bool DisplaySettingsProvider::IsFullScreen() {
return IsFullScreenMode();
}
#if defined(USE_AURA)
// static
DisplaySettingsProvider* DisplaySettingsProvider::Create() {
return new DisplaySettingsProvider();
}
#endif