| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/aura/window.h" | 5 #include "ui/aura/window.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #include "ui/aura/window_delegate.h" | 25 #include "ui/aura/window_delegate.h" |
| 26 #include "ui/aura/window_observer.h" | 26 #include "ui/aura/window_observer.h" |
| 27 #include "ui/aura/window_tracker.h" | 27 #include "ui/aura/window_tracker.h" |
| 28 #include "ui/aura/window_tree_host.h" | 28 #include "ui/aura/window_tree_host.h" |
| 29 #include "ui/compositor/compositor.h" | 29 #include "ui/compositor/compositor.h" |
| 30 #include "ui/compositor/layer.h" | 30 #include "ui/compositor/layer.h" |
| 31 #include "ui/events/event_target_iterator.h" | 31 #include "ui/events/event_target_iterator.h" |
| 32 #include "ui/gfx/animation/multi_animation.h" | 32 #include "ui/gfx/animation/multi_animation.h" |
| 33 #include "ui/gfx/canvas.h" | 33 #include "ui/gfx/canvas.h" |
| 34 #include "ui/gfx/path.h" | 34 #include "ui/gfx/path.h" |
| 35 #include "ui/gfx/scoped_canvas.h" |
| 35 #include "ui/gfx/screen.h" | 36 #include "ui/gfx/screen.h" |
| 36 | 37 |
| 37 namespace aura { | 38 namespace aura { |
| 38 | 39 |
| 39 namespace { | 40 namespace { |
| 40 | 41 |
| 41 WindowLayerType UILayerTypeToWindowLayerType(ui::LayerType layer_type) { | 42 WindowLayerType UILayerTypeToWindowLayerType(ui::LayerType layer_type) { |
| 42 switch (layer_type) { | 43 switch (layer_type) { |
| 43 case ui::LAYER_NOT_DRAWN: | 44 case ui::LAYER_NOT_DRAWN: |
| 44 return WINDOW_LAYER_NOT_DRAWN; | 45 return WINDOW_LAYER_NOT_DRAWN; |
| (...skipping 777 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 822 } | 823 } |
| 823 | 824 |
| 824 // If we are currently not the layer's delegate, we will not get bounds | 825 // If we are currently not the layer's delegate, we will not get bounds |
| 825 // changed notification from the layer (this typically happens after animating | 826 // changed notification from the layer (this typically happens after animating |
| 826 // hidden). We must notify ourselves. | 827 // hidden). We must notify ourselves. |
| 827 if (!layer_ || layer_->delegate() != this) | 828 if (!layer_ || layer_->delegate() != this) |
| 828 OnWindowBoundsChanged(old_bounds, ContainsMouse()); | 829 OnWindowBoundsChanged(old_bounds, ContainsMouse()); |
| 829 } | 830 } |
| 830 | 831 |
| 831 void Window::SetVisible(bool visible) { | 832 void Window::SetVisible(bool visible) { |
| 832 if (visible == layer_->GetTargetVisibility()) | 833 if ((layer_ && visible == layer_->GetTargetVisibility()) || |
| 834 (!layer_ && visible == visible_)) |
| 833 return; // No change. | 835 return; // No change. |
| 834 | 836 |
| 835 FOR_EACH_OBSERVER(WindowObserver, observers_, | 837 FOR_EACH_OBSERVER(WindowObserver, observers_, |
| 836 OnWindowVisibilityChanging(this, visible)); | 838 OnWindowVisibilityChanging(this, visible)); |
| 837 | 839 |
| 838 WindowEventDispatcher* dispatcher = GetDispatcher(); | 840 WindowEventDispatcher* dispatcher = GetDispatcher(); |
| 839 if (dispatcher) | 841 if (dispatcher) |
| 840 dispatcher->DispatchMouseExitToHidingWindow(this); | 842 dispatcher->DispatchMouseExitToHidingWindow(this); |
| 841 | 843 |
| 842 client::VisibilityClient* visibility_client = | 844 client::VisibilityClient* visibility_client = |
| 843 client::GetVisibilityClient(this); | 845 client::GetVisibilityClient(this); |
| 844 if (visibility_client) | 846 if (visibility_client) |
| 845 visibility_client->UpdateLayerVisibility(this, visible); | 847 visibility_client->UpdateLayerVisibility(this, visible); |
| 846 else | 848 else if (layer_) |
| 847 layer_->SetVisible(visible); | 849 layer_->SetVisible(visible); |
| 848 visible_ = visible; | 850 visible_ = visible; |
| 849 SchedulePaint(); | 851 SchedulePaint(); |
| 850 if (parent_ && parent_->layout_manager_) | 852 if (parent_ && parent_->layout_manager_) |
| 851 parent_->layout_manager_->OnChildWindowVisibilityChanged(this, visible); | 853 parent_->layout_manager_->OnChildWindowVisibilityChanged(this, visible); |
| 852 | 854 |
| 853 if (delegate_) | 855 if (delegate_) |
| 854 delegate_->OnWindowTargetVisibilityChanged(visible); | 856 delegate_->OnWindowTargetVisibilityChanged(visible); |
| 855 | 857 |
| 856 NotifyWindowVisibilityChanged(this, visible); | 858 NotifyWindowVisibilityChanged(this, visible); |
| 857 | 859 |
| 858 if (dispatcher) | 860 if (dispatcher) |
| 859 dispatcher->OnWindowVisibilityChanged(this, visible); | 861 dispatcher->OnWindowVisibilityChanged(this, visible); |
| 860 } | 862 } |
| 861 | 863 |
| 862 void Window::SchedulePaint() { | 864 void Window::SchedulePaint() { |
| 863 SchedulePaintInRect(gfx::Rect(0, 0, bounds().width(), bounds().height())); | 865 SchedulePaintInRect(gfx::Rect(0, 0, bounds().width(), bounds().height())); |
| 864 } | 866 } |
| 865 | 867 |
| 868 void Window::Paint(gfx::Canvas* canvas) { |
| 869 if (delegate_) |
| 870 delegate_->OnPaint(canvas); |
| 871 PaintLayerlessChildren(canvas); |
| 872 } |
| 873 |
| 874 void Window::PaintLayerlessChildren(gfx::Canvas* canvas) { |
| 875 for (size_t i = 0, count = children_.size(); i < count; ++i) { |
| 876 Window* child = children_[i]; |
| 877 if (!child->layer_ && child->visible_) { |
| 878 gfx::ScopedCanvas scoped_canvas(canvas); |
| 879 if (canvas->ClipRect(child->bounds())) { |
| 880 canvas->Translate(child->bounds().OffsetFromOrigin()); |
| 881 child->Paint(canvas); |
| 882 } |
| 883 } |
| 884 } |
| 885 } |
| 886 |
| 866 Window* Window::GetWindowForPoint(const gfx::Point& local_point, | 887 Window* Window::GetWindowForPoint(const gfx::Point& local_point, |
| 867 bool return_tightest, | 888 bool return_tightest, |
| 868 bool for_event_handling) { | 889 bool for_event_handling) { |
| 869 if (!IsVisible()) | 890 if (!IsVisible()) |
| 870 return NULL; | 891 return NULL; |
| 871 | 892 |
| 872 if ((for_event_handling && !HitTest(local_point)) || | 893 if ((for_event_handling && !HitTest(local_point)) || |
| 873 (!for_event_handling && !ContainsPoint(local_point))) | 894 (!for_event_handling && !ContainsPoint(local_point))) |
| 874 return NULL; | 895 return NULL; |
| 875 | 896 |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1286 delegate_->OnBoundsChanged(old_bounds, bounds()); | 1307 delegate_->OnBoundsChanged(old_bounds, bounds()); |
| 1287 FOR_EACH_OBSERVER(WindowObserver, | 1308 FOR_EACH_OBSERVER(WindowObserver, |
| 1288 observers_, | 1309 observers_, |
| 1289 OnWindowBoundsChanged(this, old_bounds, bounds())); | 1310 OnWindowBoundsChanged(this, old_bounds, bounds())); |
| 1290 WindowEventDispatcher* dispatcher = GetDispatcher(); | 1311 WindowEventDispatcher* dispatcher = GetDispatcher(); |
| 1291 if (dispatcher) | 1312 if (dispatcher) |
| 1292 dispatcher->OnWindowBoundsChanged(this, contained_mouse); | 1313 dispatcher->OnWindowBoundsChanged(this, contained_mouse); |
| 1293 } | 1314 } |
| 1294 | 1315 |
| 1295 void Window::OnPaintLayer(gfx::Canvas* canvas) { | 1316 void Window::OnPaintLayer(gfx::Canvas* canvas) { |
| 1296 if (delegate_) | 1317 Paint(canvas); |
| 1297 delegate_->OnPaint(canvas); | |
| 1298 } | 1318 } |
| 1299 | 1319 |
| 1300 base::Closure Window::PrepareForLayerBoundsChange() { | 1320 base::Closure Window::PrepareForLayerBoundsChange() { |
| 1301 return base::Bind(&Window::OnWindowBoundsChanged, base::Unretained(this), | 1321 return base::Bind(&Window::OnWindowBoundsChanged, base::Unretained(this), |
| 1302 bounds(), ContainsMouse()); | 1322 bounds(), ContainsMouse()); |
| 1303 } | 1323 } |
| 1304 | 1324 |
| 1305 bool Window::CanAcceptEvent(const ui::Event& event) { | 1325 bool Window::CanAcceptEvent(const ui::Event& event) { |
| 1306 // The client may forbid certain windows from receiving events at a given | 1326 // The client may forbid certain windows from receiving events at a given |
| 1307 // point in time. | 1327 // point in time. |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1383 for (const aura::Window* window = this; window; window = window->parent()) { | 1403 for (const aura::Window* window = this; window; window = window->parent()) { |
| 1384 if (window->layer_) | 1404 if (window->layer_) |
| 1385 return window; | 1405 return window; |
| 1386 *offset += window->bounds().OffsetFromOrigin(); | 1406 *offset += window->bounds().OffsetFromOrigin(); |
| 1387 } | 1407 } |
| 1388 *offset = gfx::Vector2d(); | 1408 *offset = gfx::Vector2d(); |
| 1389 return NULL; | 1409 return NULL; |
| 1390 } | 1410 } |
| 1391 | 1411 |
| 1392 } // namespace aura | 1412 } // namespace aura |
| OLD | NEW |