| Index: ash/wm/solo_window_tracker.cc
|
| diff --git a/ash/wm/solo_window_tracker.cc b/ash/wm/solo_window_tracker.cc
|
| deleted file mode 100644
|
| index f35678cb49f1704239ec08f641c018979a7ef8b9..0000000000000000000000000000000000000000
|
| --- a/ash/wm/solo_window_tracker.cc
|
| +++ /dev/null
|
| @@ -1,209 +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() == ui::wm::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
|
|
|