Index: ui/aura/window.cc |
diff --git a/ui/aura/window.cc b/ui/aura/window.cc |
index be941110d69ae30c28682ea9b6857cada6f3afbe..3e3858ba08624e2a33abe5709690aa0290a72920 100644 |
--- a/ui/aura/window.cc |
+++ b/ui/aura/window.cc |
@@ -30,6 +30,8 @@ |
#include "ui/aura/window_delegate.h" |
#include "ui/aura/window_event_dispatcher.h" |
#include "ui/aura/window_observer.h" |
+#include "ui/aura/window_port.h" |
+#include "ui/aura/window_port_local.h" |
#include "ui/aura/window_tracker.h" |
#include "ui/aura/window_tree_host.h" |
#include "ui/compositor/compositor.h" |
@@ -43,56 +45,20 @@ |
namespace aura { |
-class ScopedCursorHider { |
- public: |
- explicit ScopedCursorHider(Window* window) |
- : window_(window), |
- hid_cursor_(false) { |
- if (!window_->IsRootWindow()) |
- return; |
- const bool cursor_is_in_bounds = window_->GetBoundsInScreen().Contains( |
- Env::GetInstance()->last_mouse_location()); |
- client::CursorClient* cursor_client = client::GetCursorClient(window_); |
- if (cursor_is_in_bounds && cursor_client && |
- cursor_client->IsCursorVisible()) { |
- cursor_client->HideCursor(); |
- hid_cursor_ = true; |
- } |
- } |
- ~ScopedCursorHider() { |
- if (!window_->IsRootWindow()) |
- return; |
- |
- // Update the device scale factor of the cursor client only when the last |
- // mouse location is on this root window. |
- if (hid_cursor_) { |
- client::CursorClient* cursor_client = client::GetCursorClient(window_); |
- if (cursor_client) { |
- const display::Display& display = |
- display::Screen::GetScreen()->GetDisplayNearestWindow(window_); |
- cursor_client->SetDisplay(display); |
- cursor_client->ShowCursor(); |
- } |
- } |
- } |
- |
- private: |
- Window* window_; |
- bool hid_cursor_; |
+Window::Window(WindowDelegate* delegate) : Window(delegate, nullptr) {} |
- DISALLOW_COPY_AND_ASSIGN(ScopedCursorHider); |
-}; |
- |
-Window::Window(WindowDelegate* delegate) |
- : host_(NULL), |
+Window::Window(WindowDelegate* delegate, std::unique_ptr<WindowPort> port) |
+ : port_owner_(std::move(port)), |
+ port_(port_owner_.get()), |
+ host_(nullptr), |
type_(ui::wm::WINDOW_TYPE_UNKNOWN), |
owned_by_parent_(true), |
delegate_(delegate), |
- parent_(NULL), |
+ parent_(nullptr), |
visible_(false), |
id_(kInitialId), |
transparent_(false), |
- user_data_(NULL), |
+ user_data_(nullptr), |
ignore_events_(false), |
// Don't notify newly added observers during notification. This causes |
// problems for code that adds an observer as part of an observer |
@@ -102,6 +68,9 @@ Window::Window(WindowDelegate* delegate) |
} |
Window::~Window() { |
+ // See comment in header as to why this is done. |
+ std::unique_ptr<WindowPort> port = std::move(port_owner_); |
+ |
if (layer()->owner() == this) |
layer()->CompleteAllAnimations(); |
layer()->SuppressPaint(); |
@@ -170,12 +139,18 @@ Window::~Window() { |
} |
void Window::Init(ui::LayerType layer_type) { |
+ if (!port_owner_) { |
+ port_owner_ = Env::GetInstance()->CreateWindowPort(this); |
+ port_ = port_owner_.get(); |
+ } |
SetLayer(new ui::Layer(layer_type)); |
+ std::unique_ptr<WindowPortInitData> init_data = port_->OnPreInit(this); |
layer()->SetVisible(false); |
layer()->set_delegate(this); |
UpdateLayerName(); |
layer()->SetFillsBoundsOpaquely(!transparent_); |
Env::GetInstance()->NotifyWindowInitialized(this); |
+ port_->OnPostInit(std::move(init_data)); |
} |
void Window::SetType(ui::wm::WindowType type) { |
@@ -373,6 +348,8 @@ void Window::AddChild(Window* child) { |
Window* old_root = child->GetRootWindow(); |
+ port_->OnWillAddChild(child); |
+ |
DCHECK(std::find(children_.begin(), children_.end(), child) == |
children_.end()); |
if (child->parent()) |
@@ -406,6 +383,7 @@ void Window::RemoveChild(Window* child) { |
params.phase = WindowObserver::HierarchyChangeParams::HIERARCHY_CHANGING; |
NotifyWindowHierarchyChange(params); |
+ port_->OnWillRemoveChild(child); |
RemoveChildImpl(child, NULL); |
params.phase = WindowObserver::HierarchyChangeParams::HIERARCHY_CHANGED; |
@@ -517,6 +495,8 @@ Window* Window::GetTopWindowContainingPoint(const gfx::Point& local_point) { |
} |
Window* Window::GetToplevelWindow() { |
+ // TODO: this may need to call to the WindowPort. For mus this may need to |
+ // return for any top level. |
Window* topmost_window_with_delegate = NULL; |
for (aura::Window* window = this; window != NULL; window = window->parent()) { |
if (window->delegate()) |
@@ -556,6 +536,8 @@ bool Window::CanFocus() const { |
} |
bool Window::CanReceiveEvents() const { |
+ // TODO(sky): this may want to delegate to the WindowPort as for mus there |
+ // isn't a point in descending into windows owned by the client. |
if (IsRootWindow()) |
return IsVisible(); |
@@ -603,6 +585,13 @@ void Window::SuppressPaint() { |
layer()->SuppressPaint(); |
} |
+std::set<const void*> Window::GetAllPropertKeys() const { |
+ std::set<const void*> keys; |
+ for (auto& pair : prop_map_) |
+ keys.insert(pair.first); |
+ return keys; |
+} |
+ |
// {Set,Get,Clear}Property are implemented in window_property.h. |
void Window::SetNativeWindowProperty(const char* key, void* value) { |
@@ -614,9 +603,7 @@ void* Window::GetNativeWindowProperty(const char* key) const { |
} |
void Window::OnDeviceScaleFactorChanged(float device_scale_factor) { |
- ScopedCursorHider hider(this); |
- if (delegate_) |
- delegate_->OnDeviceScaleFactorChanged(device_scale_factor); |
+ port_->OnDeviceScaleFactorChanged(device_scale_factor); |
} |
#if !defined(NDEBUG) |
@@ -668,6 +655,9 @@ int64_t Window::SetPropertyInternal(const void* key, |
PropertyDeallocator deallocator, |
int64_t value, |
int64_t default_value) { |
+ // This code may be called before |port_| has been created. |
+ std::unique_ptr<WindowPortPropertyData> data = |
+ port_ ? port_->OnWillChangeProperty(key) : nullptr; |
int64_t old = GetPropertyInternal(key, default_value); |
if (value == default_value) { |
prop_map_.erase(key); |
@@ -678,6 +668,8 @@ int64_t Window::SetPropertyInternal(const void* key, |
prop_value.deallocator = deallocator; |
prop_map_[key] = prop_value; |
} |
+ if (port_) |
+ port_->OnPropertyChanged(key, std::move(data)); |
for (WindowObserver& observer : observers_) |
observer.OnWindowPropertyChanged(this, key, old); |
return old; |
@@ -735,6 +727,7 @@ void Window::SetVisible(bool visible) { |
else |
layer()->SetVisible(visible); |
visible_ = visible; |
+ port_->OnVisibilityChanged(visible); |
SchedulePaint(); |
if (parent_ && parent_->layout_manager_) |
parent_->layout_manager_->OnChildWindowVisibilityChanged(this, visible); |
@@ -864,6 +857,7 @@ void Window::StackChildRelativeTo(Window* child, |
direction == STACK_ABOVE ? |
(child_i < target_i ? target_i : target_i + 1) : |
(child_i < target_i ? target_i - 1 : target_i); |
+ port_->OnWillMoveChild(child_i, dest_i); |
children_.erase(children_.begin() + child_i); |
children_.insert(children_.begin() + dest_i, child); |
@@ -1038,6 +1032,11 @@ void Window::OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) { |
void Window::OnLayerBoundsChanged(const gfx::Rect& old_bounds) { |
bounds_ = layer()->bounds(); |
+ |
+ // Use |bounds_| as that is the bounds before any animations, which is what |
+ // mus wants. |
+ port_->OnDidChangeBounds(old_bounds, bounds_); |
+ |
if (layout_manager_) |
layout_manager_->OnWindowResized(); |
if (delegate_) |