| Index: components/mus/ws/server_window.cc
|
| diff --git a/components/mus/ws/server_window.cc b/components/mus/ws/server_window.cc
|
| deleted file mode 100644
|
| index f6a9304a03b4b8f516244e08fc22082d1f28de7c..0000000000000000000000000000000000000000
|
| --- a/components/mus/ws/server_window.cc
|
| +++ /dev/null
|
| @@ -1,470 +0,0 @@
|
| -// Copyright 2014 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 "components/mus/ws/server_window.h"
|
| -
|
| -#include <inttypes.h>
|
| -#include <stddef.h>
|
| -
|
| -#include "base/strings/stringprintf.h"
|
| -#include "components/mus/common/transient_window_utils.h"
|
| -#include "components/mus/public/interfaces/window_manager.mojom.h"
|
| -#include "components/mus/ws/server_window_delegate.h"
|
| -#include "components/mus/ws/server_window_observer.h"
|
| -#include "components/mus/ws/server_window_surface_manager.h"
|
| -
|
| -namespace mus {
|
| -
|
| -namespace ws {
|
| -
|
| -ServerWindow::ServerWindow(ServerWindowDelegate* delegate, const WindowId& id)
|
| - : ServerWindow(delegate, id, Properties()) {}
|
| -
|
| -ServerWindow::ServerWindow(ServerWindowDelegate* delegate,
|
| - const WindowId& id,
|
| - const Properties& properties)
|
| - : delegate_(delegate),
|
| - id_(id),
|
| - parent_(nullptr),
|
| - stacking_target_(nullptr),
|
| - transient_parent_(nullptr),
|
| - is_modal_(false),
|
| - visible_(false),
|
| - cursor_id_(mojom::Cursor::CURSOR_NULL),
|
| - non_client_cursor_id_(mojom::Cursor::CURSOR_NULL),
|
| - opacity_(1),
|
| - can_focus_(true),
|
| - properties_(properties),
|
| - // Don't notify newly added observers during notification. This causes
|
| - // problems for code that adds an observer as part of an observer
|
| - // notification (such as ServerWindowDrawTracker).
|
| - observers_(
|
| - base::ObserverList<ServerWindowObserver>::NOTIFY_EXISTING_ONLY) {
|
| - DCHECK(delegate); // Must provide a delegate.
|
| -}
|
| -
|
| -ServerWindow::~ServerWindow() {
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, observers_, OnWindowDestroying(this));
|
| -
|
| - if (transient_parent_)
|
| - transient_parent_->RemoveTransientWindow(this);
|
| -
|
| - // Destroy transient children, only after we've removed ourselves from our
|
| - // parent, as destroying an active transient child may otherwise attempt to
|
| - // refocus us.
|
| - Windows transient_children(transient_children_);
|
| - STLDeleteElements(&transient_children);
|
| - DCHECK(transient_children_.empty());
|
| -
|
| - while (!children_.empty())
|
| - children_.front()->parent()->Remove(children_.front());
|
| -
|
| - if (parent_)
|
| - parent_->Remove(this);
|
| -
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, observers_, OnWindowDestroyed(this));
|
| -}
|
| -
|
| -void ServerWindow::AddObserver(ServerWindowObserver* observer) {
|
| - observers_.AddObserver(observer);
|
| -}
|
| -
|
| -void ServerWindow::RemoveObserver(ServerWindowObserver* observer) {
|
| - DCHECK(observers_.HasObserver(observer));
|
| - observers_.RemoveObserver(observer);
|
| -}
|
| -
|
| -void ServerWindow::CreateSurface(mojom::SurfaceType surface_type,
|
| - mojo::InterfaceRequest<mojom::Surface> request,
|
| - mojom::SurfaceClientPtr client) {
|
| - GetOrCreateSurfaceManager()->CreateSurface(surface_type, std::move(request),
|
| - std::move(client));
|
| -}
|
| -
|
| -void ServerWindow::Add(ServerWindow* child) {
|
| - // We assume validation checks happened already.
|
| - DCHECK(child);
|
| - DCHECK(child != this);
|
| - DCHECK(!child->Contains(this));
|
| - if (child->parent() == this) {
|
| - if (children_.size() == 1)
|
| - return; // Already in the right position.
|
| - child->Reorder(children_.back(), mojom::OrderDirection::ABOVE);
|
| - return;
|
| - }
|
| -
|
| - ServerWindow* old_parent = child->parent();
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, child->observers_,
|
| - OnWillChangeWindowHierarchy(child, this, old_parent));
|
| -
|
| - if (child->parent())
|
| - child->parent()->RemoveImpl(child);
|
| -
|
| - child->parent_ = this;
|
| - children_.push_back(child);
|
| -
|
| - // Stack the child properly if it is a transient child of a sibling.
|
| - if (child->transient_parent_ && child->transient_parent_->parent() == this)
|
| - RestackTransientDescendants(child->transient_parent_, &GetStackingTarget,
|
| - &ReorderImpl);
|
| -
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, child->observers_,
|
| - OnWindowHierarchyChanged(child, this, old_parent));
|
| -}
|
| -
|
| -void ServerWindow::Remove(ServerWindow* child) {
|
| - // We assume validation checks happened else where.
|
| - DCHECK(child);
|
| - DCHECK(child != this);
|
| - DCHECK(child->parent() == this);
|
| -
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, child->observers_,
|
| - OnWillChangeWindowHierarchy(child, nullptr, this));
|
| - RemoveImpl(child);
|
| -
|
| - // Stack the child properly if it is a transient child of a sibling.
|
| - if (child->transient_parent_ && child->transient_parent_->parent() == this)
|
| - RestackTransientDescendants(child->transient_parent_, &GetStackingTarget,
|
| - &ReorderImpl);
|
| -
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, child->observers_,
|
| - OnWindowHierarchyChanged(child, nullptr, this));
|
| -}
|
| -
|
| -void ServerWindow::Reorder(ServerWindow* relative,
|
| - mojom::OrderDirection direction) {
|
| - ReorderImpl(this, relative, direction);
|
| -}
|
| -
|
| -void ServerWindow::StackChildAtBottom(ServerWindow* child) {
|
| - // There's nothing to do if the child is already at the bottom.
|
| - if (children_.size() <= 1 || child == children_.front())
|
| - return;
|
| - child->Reorder(children_.front(), mojom::OrderDirection::BELOW);
|
| -}
|
| -
|
| -void ServerWindow::StackChildAtTop(ServerWindow* child) {
|
| - // There's nothing to do if the child is already at the top.
|
| - if (children_.size() <= 1 || child == children_.back())
|
| - return;
|
| - child->Reorder(children_.back(), mojom::OrderDirection::ABOVE);
|
| -}
|
| -
|
| -void ServerWindow::SetBounds(const gfx::Rect& bounds) {
|
| - if (bounds_ == bounds)
|
| - return;
|
| -
|
| - // TODO(fsamuel): figure out how will this work with CompositorFrames.
|
| -
|
| - const gfx::Rect old_bounds = bounds_;
|
| - bounds_ = bounds;
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, observers_,
|
| - OnWindowBoundsChanged(this, old_bounds, bounds));
|
| -}
|
| -
|
| -void ServerWindow::SetClientArea(
|
| - const gfx::Insets& insets,
|
| - const std::vector<gfx::Rect>& additional_client_areas) {
|
| - if (client_area_ == insets &&
|
| - additional_client_areas == additional_client_areas_) {
|
| - return;
|
| - }
|
| -
|
| - additional_client_areas_ = additional_client_areas;
|
| - client_area_ = insets;
|
| - FOR_EACH_OBSERVER(
|
| - ServerWindowObserver, observers_,
|
| - OnWindowClientAreaChanged(this, insets, additional_client_areas));
|
| -}
|
| -
|
| -void ServerWindow::SetHitTestMask(const gfx::Rect& mask) {
|
| - hit_test_mask_.reset(new gfx::Rect(mask));
|
| -}
|
| -
|
| -void ServerWindow::ClearHitTestMask() {
|
| - hit_test_mask_.reset();
|
| -}
|
| -
|
| -const ServerWindow* ServerWindow::GetRoot() const {
|
| - return delegate_->GetRootWindow(this);
|
| -}
|
| -
|
| -std::vector<const ServerWindow*> ServerWindow::GetChildren() const {
|
| - std::vector<const ServerWindow*> children;
|
| - children.reserve(children_.size());
|
| - for (size_t i = 0; i < children_.size(); ++i)
|
| - children.push_back(children_[i]);
|
| - return children;
|
| -}
|
| -
|
| -std::vector<ServerWindow*> ServerWindow::GetChildren() {
|
| - // TODO(sky): rename to children() and fix return type.
|
| - return children_;
|
| -}
|
| -
|
| -ServerWindow* ServerWindow::GetChildWindow(const WindowId& window_id) {
|
| - if (id_ == window_id)
|
| - return this;
|
| -
|
| - for (ServerWindow* child : children_) {
|
| - ServerWindow* window = child->GetChildWindow(window_id);
|
| - if (window)
|
| - return window;
|
| - }
|
| -
|
| - return nullptr;
|
| -}
|
| -
|
| -bool ServerWindow::AddTransientWindow(ServerWindow* child) {
|
| - // A system modal window cannot become a transient child.
|
| - if (child->is_modal() && !child->transient_parent())
|
| - return false;
|
| -
|
| - if (child->transient_parent())
|
| - child->transient_parent()->RemoveTransientWindow(child);
|
| -
|
| - DCHECK(std::find(transient_children_.begin(), transient_children_.end(),
|
| - child) == transient_children_.end());
|
| - transient_children_.push_back(child);
|
| - child->transient_parent_ = this;
|
| -
|
| - // Restack |child| properly above its transient parent, if they share the same
|
| - // parent.
|
| - if (child->parent() == parent())
|
| - RestackTransientDescendants(this, &GetStackingTarget, &ReorderImpl);
|
| -
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, observers_,
|
| - OnTransientWindowAdded(this, child));
|
| - return true;
|
| -}
|
| -
|
| -void ServerWindow::RemoveTransientWindow(ServerWindow* child) {
|
| - Windows::iterator i =
|
| - std::find(transient_children_.begin(), transient_children_.end(), child);
|
| - DCHECK(i != transient_children_.end());
|
| - transient_children_.erase(i);
|
| - DCHECK_EQ(this, child->transient_parent());
|
| - child->transient_parent_ = nullptr;
|
| -
|
| - // If |child| and its former transient parent share the same parent, |child|
|
| - // should be restacked properly so it is not among transient children of its
|
| - // former parent, anymore.
|
| - if (parent() == child->parent())
|
| - RestackTransientDescendants(this, &GetStackingTarget, &ReorderImpl);
|
| -
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, observers_,
|
| - OnTransientWindowRemoved(this, child));
|
| -}
|
| -
|
| -void ServerWindow::SetModal() {
|
| - is_modal_ = true;
|
| -}
|
| -
|
| -bool ServerWindow::Contains(const ServerWindow* window) const {
|
| - for (const ServerWindow* parent = window; parent; parent = parent->parent_) {
|
| - if (parent == this)
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void ServerWindow::SetVisible(bool value) {
|
| - if (visible_ == value)
|
| - return;
|
| -
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, observers_,
|
| - OnWillChangeWindowVisibility(this));
|
| - visible_ = value;
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, observers_,
|
| - OnWindowVisibilityChanged(this));
|
| -}
|
| -
|
| -void ServerWindow::SetOpacity(float value) {
|
| - if (value == opacity_)
|
| - return;
|
| - float old_opacity = opacity_;
|
| - opacity_ = value;
|
| - delegate_->OnScheduleWindowPaint(this);
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, observers_,
|
| - OnWindowOpacityChanged(this, old_opacity, opacity_));
|
| -}
|
| -
|
| -void ServerWindow::SetPredefinedCursor(mus::mojom::Cursor value) {
|
| - if (value == cursor_id_)
|
| - return;
|
| - cursor_id_ = value;
|
| - FOR_EACH_OBSERVER(
|
| - ServerWindowObserver, observers_,
|
| - OnWindowPredefinedCursorChanged(this, static_cast<int32_t>(value)));
|
| -}
|
| -
|
| -void ServerWindow::SetNonClientCursor(mus::mojom::Cursor value) {
|
| - if (value == non_client_cursor_id_)
|
| - return;
|
| - non_client_cursor_id_ = value;
|
| - FOR_EACH_OBSERVER(
|
| - ServerWindowObserver, observers_,
|
| - OnWindowNonClientCursorChanged(this, static_cast<int32_t>(value)));
|
| -}
|
| -
|
| -void ServerWindow::SetTransform(const gfx::Transform& transform) {
|
| - if (transform_ == transform)
|
| - return;
|
| -
|
| - transform_ = transform;
|
| - delegate_->OnScheduleWindowPaint(this);
|
| -}
|
| -
|
| -void ServerWindow::SetProperty(const std::string& name,
|
| - const std::vector<uint8_t>* value) {
|
| - auto it = properties_.find(name);
|
| - if (it != properties_.end()) {
|
| - if (value && it->second == *value)
|
| - return;
|
| - } else if (!value) {
|
| - // This property isn't set in |properties_| and |value| is nullptr, so
|
| - // there's
|
| - // no change.
|
| - return;
|
| - }
|
| -
|
| - if (value) {
|
| - properties_[name] = *value;
|
| - } else if (it != properties_.end()) {
|
| - properties_.erase(it);
|
| - }
|
| -
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, observers_,
|
| - OnWindowSharedPropertyChanged(this, name, value));
|
| -}
|
| -
|
| -std::string ServerWindow::GetName() const {
|
| - auto it = properties_.find(mojom::WindowManager::kName_Property);
|
| - if (it == properties_.end())
|
| - return std::string();
|
| - return std::string(it->second.begin(), it->second.end());
|
| -}
|
| -
|
| -void ServerWindow::SetTextInputState(const ui::TextInputState& state) {
|
| - const bool changed = !(text_input_state_ == state);
|
| - if (changed) {
|
| - text_input_state_ = state;
|
| - // keyboard even if the state is not changed. So we have to notify
|
| - // |observers_|.
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, observers_,
|
| - OnWindowTextInputStateChanged(this, state));
|
| - }
|
| -}
|
| -
|
| -bool ServerWindow::IsDrawn() const {
|
| - const ServerWindow* root = delegate_->GetRootWindow(this);
|
| - if (!root || !root->visible())
|
| - return false;
|
| - const ServerWindow* window = this;
|
| - while (window && window != root && window->visible())
|
| - window = window->parent();
|
| - return root == window;
|
| -}
|
| -
|
| -void ServerWindow::DestroySurfacesScheduledForDestruction() {
|
| - if (!surface_manager_)
|
| - return;
|
| - ServerWindowSurface* surface = surface_manager_->GetDefaultSurface();
|
| - if (surface)
|
| - surface->DestroySurfacesScheduledForDestruction();
|
| -
|
| - surface = surface_manager_->GetUnderlaySurface();
|
| - if (surface)
|
| - surface->DestroySurfacesScheduledForDestruction();
|
| -}
|
| -
|
| -ServerWindowSurfaceManager* ServerWindow::GetOrCreateSurfaceManager() {
|
| - if (!surface_manager_.get())
|
| - surface_manager_.reset(new ServerWindowSurfaceManager(this));
|
| - return surface_manager_.get();
|
| -}
|
| -
|
| -void ServerWindow::SetUnderlayOffset(const gfx::Vector2d& offset) {
|
| - if (offset == underlay_offset_)
|
| - return;
|
| -
|
| - underlay_offset_ = offset;
|
| - delegate_->OnScheduleWindowPaint(this);
|
| -}
|
| -
|
| -#if !defined(NDEBUG)
|
| -std::string ServerWindow::GetDebugWindowHierarchy() const {
|
| - std::string result;
|
| - BuildDebugInfo(std::string(), &result);
|
| - return result;
|
| -}
|
| -
|
| -void ServerWindow::BuildDebugInfo(const std::string& depth,
|
| - std::string* result) const {
|
| - std::string name = GetName();
|
| - *result += base::StringPrintf(
|
| - "%sid=%d,%d visible=%s bounds=%d,%d %dx%d %s\n", depth.c_str(),
|
| - static_cast<int>(id_.client_id), static_cast<int>(id_.window_id),
|
| - visible_ ? "true" : "false", bounds_.x(), bounds_.y(), bounds_.width(),
|
| - bounds_.height(), !name.empty() ? name.c_str() : "(no name)");
|
| - for (const ServerWindow* child : children_)
|
| - child->BuildDebugInfo(depth + " ", result);
|
| -}
|
| -#endif
|
| -
|
| -void ServerWindow::RemoveImpl(ServerWindow* window) {
|
| - window->parent_ = nullptr;
|
| - children_.erase(std::find(children_.begin(), children_.end(), window));
|
| -}
|
| -
|
| -void ServerWindow::OnStackingChanged() {
|
| - if (stacking_target_) {
|
| - Windows::const_iterator window_i = std::find(
|
| - parent()->children().begin(), parent()->children().end(), this);
|
| - DCHECK(window_i != parent()->children().end());
|
| - if (window_i != parent()->children().begin() &&
|
| - (*(window_i - 1) == stacking_target_)) {
|
| - return;
|
| - }
|
| - }
|
| - RestackTransientDescendants(this, &GetStackingTarget, &ReorderImpl);
|
| -}
|
| -
|
| -// static
|
| -void ServerWindow::ReorderImpl(ServerWindow* window,
|
| - ServerWindow* relative,
|
| - mojom::OrderDirection direction) {
|
| - DCHECK(relative);
|
| - DCHECK_NE(window, relative);
|
| - DCHECK_EQ(window->parent(), relative->parent());
|
| -
|
| - if (!AdjustStackingForTransientWindows(&window, &relative, &direction,
|
| - window->stacking_target_))
|
| - return;
|
| -
|
| - window->parent_->children_.erase(std::find(window->parent_->children_.begin(),
|
| - window->parent_->children_.end(),
|
| - window));
|
| - Windows::iterator i = std::find(window->parent_->children_.begin(),
|
| - window->parent_->children_.end(), relative);
|
| - if (direction == mojom::OrderDirection::ABOVE) {
|
| - DCHECK(i != window->parent_->children_.end());
|
| - window->parent_->children_.insert(++i, window);
|
| - } else if (direction == mojom::OrderDirection::BELOW) {
|
| - DCHECK(i != window->parent_->children_.end());
|
| - window->parent_->children_.insert(i, window);
|
| - }
|
| - FOR_EACH_OBSERVER(ServerWindowObserver, window->observers_,
|
| - OnWindowReordered(window, relative, direction));
|
| - window->OnStackingChanged();
|
| -}
|
| -
|
| -// static
|
| -ServerWindow** ServerWindow::GetStackingTarget(ServerWindow* window) {
|
| - return &window->stacking_target_;
|
| -}
|
| -
|
| -} // namespace ws
|
| -
|
| -} // namespace mus
|
|
|