summaryrefslogtreecommitdiffstats
path: root/chromium/ash/wm/solo_window_tracker.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/wm/solo_window_tracker.cc')
-rw-r--r--chromium/ash/wm/solo_window_tracker.cc210
1 files changed, 0 insertions, 210 deletions
diff --git a/chromium/ash/wm/solo_window_tracker.cc b/chromium/ash/wm/solo_window_tracker.cc
deleted file mode 100644
index 633d3bd450e..00000000000
--- a/chromium/ash/wm/solo_window_tracker.cc
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright 2013 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 "ash/wm/solo_window_tracker.h"
-
-#include <algorithm>
-
-#include "ash/ash_constants.h"
-#include "ash/root_window_controller.h"
-#include "ash/shell.h"
-#include "ash/shell_window_ids.h"
-#include "ash/wm/window_state.h"
-#include "ash/wm/window_state_observer.h"
-#include "ui/aura/client/aura_constants.h"
-#include "ui/aura/root_window.h"
-#include "ui/aura/window.h"
-
-namespace ash {
-
-namespace {
-
-// A flag to enable/disable the solo window header across all root windows.
-bool g_solo_header_enabled = true;
-
-// Returns the containers from which a solo window is chosen.
-std::vector<aura::Window*> GetContainers(aura::RootWindow* root_window) {
- int kContainerIds[] = {
- internal::kShellWindowId_DefaultContainer,
- internal::kShellWindowId_AlwaysOnTopContainer,
- // Docked windows never use the solo header, but regular windows move to the
- // docked container when dragged.
- internal::kShellWindowId_DockedContainer,
- };
- std::vector<aura::Window*> containers;
- for (size_t i = 0; i < arraysize(kContainerIds); ++i) {
- containers.push_back(
- Shell::GetContainer(root_window->window(), kContainerIds[i]));
- }
- return containers;
-}
-
-// Returns true if |child| and all of its ancestors are visible and neither
-// |child| nor any its ancestors is animating hidden.
-bool GetTargetVisibility(aura::Window* child) {
- for (aura::Window* window = child; window; window = window->parent()) {
- if (!window->TargetVisibility())
- return false;
- }
- return true;
-}
-
-// Returns true if |window| can use the solo window header. Returns false for
-// windows that are:
-// * Not drawn (for example, DragDropTracker uses one for mouse capture)
-// * Modal alerts (it looks odd for headers to change when an alert opens)
-// * Constrained windows (ditto)
-bool IsValidCandidate(aura::Window* window) {
- return window->type() == aura::client::WINDOW_TYPE_NORMAL &&
- window->layer() &&
- window->layer()->type() != ui::LAYER_NOT_DRAWN &&
- window->GetProperty(aura::client::kModalKey) == ui::MODAL_TYPE_NONE &&
- !window->GetProperty(aura::client::kConstrainedWindowKey);
-}
-
-// Schedule's a paint of the window's entire bounds.
-void SchedulePaint(aura::Window* window) {
- window->SchedulePaintInRect(gfx::Rect(window->bounds().size()));
-}
-
-} // namespace
-
-
-// Class which triggers a repaint of the window which is passed to the
-// constructor whenever the window's show type changes. The window's non client
-// view is responsible for updating whether it uses the solo header as part of
-// the repaint by querying GetWindowWithSoloHeader().
-class SoloWindowTracker::SoloWindowObserver
- : public ash::wm::WindowStateObserver {
- public:
- explicit SoloWindowObserver(aura::Window* window) : window_(window) {
- wm::GetWindowState(window_)->AddObserver(this);
- }
-
- virtual ~SoloWindowObserver() {
- wm::GetWindowState(window_)->RemoveObserver(this);
- }
-
- private:
- // ash::wm::WindowStateObserver override.
- virtual void OnWindowShowTypeChanged(
- ash::wm::WindowState* window_state,
- ash::wm::WindowShowType old_type) OVERRIDE {
- SchedulePaint(window_);
- }
-
- aura::Window* window_;
-
- DISALLOW_COPY_AND_ASSIGN(SoloWindowObserver);
-};
-
-SoloWindowTracker::SoloWindowTracker(aura::RootWindow* root_window)
- : containers_(GetContainers(root_window)),
- solo_window_(NULL) {
- for (size_t i = 0; i < containers_.size(); ++i)
- containers_[i]->AddObserver(this);
-}
-
-SoloWindowTracker::~SoloWindowTracker() {
- for (size_t i = 0; i < containers_.size(); ++i)
- containers_[i]->RemoveObserver(this);
-}
-
-// static
-void SoloWindowTracker::SetSoloHeaderEnabled(bool enabled) {
- g_solo_header_enabled = enabled;
- std::vector<aura::Window*> root_windows =
- Shell::GetInstance()->GetAllRootWindows();
- for (size_t i = 0; i < root_windows.size(); ++i) {
- SoloWindowTracker* tracker =
- internal::GetRootWindowController(root_windows[i])->
- solo_window_tracker();
- if (tracker)
- tracker->UpdateSoloWindow(NULL);
- }
-}
-
-aura::Window* SoloWindowTracker::GetWindowWithSoloHeader() {
- bool use_solo_header = solo_window_ &&
- !wm::GetWindowState(solo_window_)->IsMaximizedOrFullscreen();
- return use_solo_header ? solo_window_ : NULL;
-}
-
-void SoloWindowTracker::UpdateSoloWindow(aura::Window* ignore_window) {
- std::vector<aura::Window*> candidates;
- // Avoid memory allocations for typical window counts.
- candidates.reserve(16);
- for (size_t i = 0; i < containers_.size(); ++i) {
- candidates.insert(candidates.end(),
- containers_[i]->children().begin(),
- containers_[i]->children().end());
- }
-
- aura::Window* old_solo_window = solo_window_;
- solo_window_ = NULL;
- if (g_solo_header_enabled && !AnyVisibleWindowDocked()) {
- for (size_t i = 0; i < candidates.size(); ++i) {
- aura::Window* candidate = candidates[i];
- // Various sorts of windows "don't count" for this computation.
- if (candidate == ignore_window ||
- !IsValidCandidate(candidate) ||
- !GetTargetVisibility(candidate)) {
- continue;
- }
-
- if (solo_window_) {
- // A window can only use the solo header if it is the only visible valid
- // candidate (and there are no visible docked windows).
- solo_window_ = NULL;
- break;
- } else {
- solo_window_ = candidate;
- }
- }
- }
-
- if (solo_window_ == old_solo_window)
- return;
-
- solo_window_observer_.reset(solo_window_ ?
- new SoloWindowObserver(solo_window_) : NULL);
- if (old_solo_window)
- SchedulePaint(old_solo_window);
- if (solo_window_)
- SchedulePaint(solo_window_);
-}
-
-bool SoloWindowTracker::AnyVisibleWindowDocked() const {
- // For the purpose of SoloWindowTracker, there is a visible docked window if
- // it causes the dock to have non-empty bounds. This is intentionally
- // different from:
- // DockedWindowLayoutManager::IsAnyWindowDocked() and
- // DockedWindowLayoutManager::is_dragged_window_docked().
- return !dock_bounds_.IsEmpty();
-}
-
-void SoloWindowTracker::OnWindowAdded(aura::Window* new_window) {
- UpdateSoloWindow(NULL);
-}
-
-void SoloWindowTracker::OnWillRemoveWindow(aura::Window* window) {
- UpdateSoloWindow(window);
-}
-
-void SoloWindowTracker::OnWindowVisibilityChanged(aura::Window* window,
- bool visible) {
- // |window| may be a grandchild of |containers_|.
- std::vector<aura::Window*>::const_iterator it = std::find(
- containers_.begin(), containers_.end(), window->parent());
- if (it != containers_.end())
- UpdateSoloWindow(NULL);
-}
-
-void SoloWindowTracker::OnDockBoundsChanging(const gfx::Rect& new_bounds,
- Reason reason) {
- dock_bounds_ = new_bounds;
- UpdateSoloWindow(NULL);
-}
-
-} // namespace ash