Chromium Code Reviews| 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/views/widget/native_widget_aura.h" | 5 #include "ui/views/widget/native_widget_aura.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #include "third_party/skia/include/core/SkRegion.h" | 9 #include "third_party/skia/include/core/SkRegion.h" |
| 10 #include "ui/aura/client/activation_client.h" | 10 #include "ui/aura/client/activation_client.h" |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 #include "ui/base/dragdrop/os_exchange_data.h" | 23 #include "ui/base/dragdrop/os_exchange_data.h" |
| 24 #include "ui/base/events/event.h" | 24 #include "ui/base/events/event.h" |
| 25 #include "ui/base/ui_base_types.h" | 25 #include "ui/base/ui_base_types.h" |
| 26 #include "ui/compositor/layer.h" | 26 #include "ui/compositor/layer.h" |
| 27 #include "ui/gfx/canvas.h" | 27 #include "ui/gfx/canvas.h" |
| 28 #include "ui/gfx/font.h" | 28 #include "ui/gfx/font.h" |
| 29 #include "ui/gfx/screen.h" | 29 #include "ui/gfx/screen.h" |
| 30 #include "ui/native_theme/native_theme_aura.h" | 30 #include "ui/native_theme/native_theme_aura.h" |
| 31 #include "ui/views/drag_utils.h" | 31 #include "ui/views/drag_utils.h" |
| 32 #include "ui/views/ime/input_method_bridge.h" | 32 #include "ui/views/ime/input_method_bridge.h" |
| 33 #include "ui/views/view_constants_aura.h" | |
| 33 #include "ui/views/views_delegate.h" | 34 #include "ui/views/views_delegate.h" |
| 34 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" | 35 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" |
| 35 #include "ui/views/widget/drop_helper.h" | 36 #include "ui/views/widget/drop_helper.h" |
| 36 #include "ui/views/widget/native_widget_aura_window_observer.h" | 37 #include "ui/views/widget/native_widget_aura_window_observer.h" |
| 37 #include "ui/views/widget/native_widget_delegate.h" | 38 #include "ui/views/widget/native_widget_delegate.h" |
| 38 #include "ui/views/widget/root_view.h" | 39 #include "ui/views/widget/root_view.h" |
| 39 #include "ui/views/widget/tooltip_manager_aura.h" | 40 #include "ui/views/widget/tooltip_manager_aura.h" |
| 40 #include "ui/views/widget/widget_aura_utils.h" | 41 #include "ui/views/widget/widget_aura_utils.h" |
| 41 #include "ui/views/widget/widget_delegate.h" | 42 #include "ui/views/widget/widget_delegate.h" |
| 42 | 43 |
| 43 #if defined(OS_WIN) | 44 #if defined(OS_WIN) |
| 44 #include "base/win/scoped_gdi_object.h" | 45 #include "base/win/scoped_gdi_object.h" |
| 45 #include "base/win/win_util.h" | 46 #include "base/win/win_util.h" |
| 46 #include "ui/base/l10n/l10n_util_win.h" | 47 #include "ui/base/l10n/l10n_util_win.h" |
| 47 #include "ui/views/widget/desktop_aura/desktop_root_window_host_win.h" | 48 #include "ui/views/widget/desktop_aura/desktop_root_window_host_win.h" |
| 48 #endif | 49 #endif |
| 49 | 50 |
| 50 #if !defined(OS_CHROMEOS) | 51 #if !defined(OS_CHROMEOS) |
| 51 #include "ui/views/widget/desktop_aura/desktop_root_window_host.h" | 52 #include "ui/views/widget/desktop_aura/desktop_root_window_host.h" |
| 52 #endif | 53 #endif |
| 53 | 54 |
| 54 namespace views { | 55 namespace views { |
| 55 | 56 |
| 56 namespace { | 57 namespace { |
| 57 | 58 |
| 58 void SetRestoreBounds(aura::Window* window, const gfx::Rect& bounds) { | 59 void SetRestoreBounds(aura::Window* window, const gfx::Rect& bounds) { |
| 59 window->SetProperty(aura::client::kRestoreBoundsKey, new gfx::Rect(bounds)); | 60 window->SetProperty(aura::client::kRestoreBoundsKey, new gfx::Rect(bounds)); |
| 60 } | 61 } |
| 61 | 62 |
| 63 // Sets |order| to the list of views whose layer / attached window's layer | |
| 64 // is a child of |parent_layer|. |order| is sorted in ascending z-order of | |
| 65 // the views. | |
| 66 // |hosts| are the views with an attached window whose layer is a child of | |
| 67 // |parent_layer|. For the sake of simplificity |hosts| must all have id | |
| 68 // |host_id|. | |
| 69 void GetOrderOfViewsWithLayers( | |
| 70 views::View* current_view, | |
| 71 ui::Layer* parent_layer, | |
| 72 int host_id, | |
| 73 const std::map<views::View*, aura::Window*>& hosts, | |
| 74 std::vector<views::View*>* order) { | |
| 75 DCHECK(current_view); | |
| 76 DCHECK(parent_layer); | |
| 77 DCHECK(order); | |
| 78 if (current_view->layer() && | |
| 79 current_view->layer()->parent() == parent_layer) { | |
| 80 order->push_back(current_view); | |
| 81 // |hosts| may contain a child of |current_view|. | |
| 82 } else if (current_view->id() == host_id && | |
| 83 hosts.find(current_view) != hosts.end()) { | |
| 84 order->push_back(current_view); | |
| 85 return; | |
| 86 } | |
| 87 | |
| 88 for (int i = 0; i < current_view->child_count(); ++i) { | |
| 89 GetOrderOfViewsWithLayers(current_view->child_at(i), parent_layer, | |
| 90 host_id, hosts, order); | |
| 91 } | |
| 92 } | |
| 93 | |
| 62 } // namespace | 94 } // namespace |
| 63 | 95 |
| 64 //////////////////////////////////////////////////////////////////////////////// | 96 //////////////////////////////////////////////////////////////////////////////// |
| 65 // NativeWidgetAura, public: | 97 // NativeWidgetAura, public: |
| 66 | 98 |
| 67 NativeWidgetAura::NativeWidgetAura(internal::NativeWidgetDelegate* delegate) | 99 NativeWidgetAura::NativeWidgetAura(internal::NativeWidgetDelegate* delegate) |
| 68 : delegate_(delegate), | 100 : delegate_(delegate), |
| 69 window_(new aura::Window(this)), | 101 window_(new aura::Window(this)), |
| 70 ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET), | 102 ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET), |
| 71 close_widget_factory_(this), | 103 close_widget_factory_(this), |
| (...skipping 952 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1024 } | 1056 } |
| 1025 | 1057 |
| 1026 // And now, notify them that they have a brand new parent. | 1058 // And now, notify them that they have a brand new parent. |
| 1027 for (Widget::Widgets::iterator it = widgets.begin(); | 1059 for (Widget::Widgets::iterator it = widgets.begin(); |
| 1028 it != widgets.end(); ++it) { | 1060 it != widgets.end(); ++it) { |
| 1029 (*it)->NotifyNativeViewHierarchyChanged(true, new_parent); | 1061 (*it)->NotifyNativeViewHierarchyChanged(true, new_parent); |
| 1030 } | 1062 } |
| 1031 } | 1063 } |
| 1032 | 1064 |
| 1033 // static | 1065 // static |
| 1066 // TODO(pkotwicz): The implementation of the NativeWidgetPrivate statics is the | |
| 1067 // same for NativeWidgetAura and DesktopNativeWidgetAura. Move the | |
| 1068 // implementation of the static functions to a different file. | |
| 1069 void NativeWidgetPrivate::ReorderLayers(gfx::NativeView parent, | |
|
sky
2013/05/21 23:43:55
I think all this code should be moved into a stand
| |
| 1070 View* root_view) { | |
| 1071 // Reorder the layers according to the positions of the views with layers and | |
| 1072 // views with attached windows in the view tree. The reordered layers are | |
| 1073 // positioned above layers for windows which are not attached to a host view. | |
| 1074 // The reordered layers are however positioned below any window layers with a | |
| 1075 // NULL delegate. | |
| 1076 | |
| 1077 // Find all the child windows which are attached to a view. | |
| 1078 std::map<View*, aura::Window*> hosted_windows; | |
|
sky
2013/05/21 23:43:55
This method is long, break it up where you can. Fo
pkotwicz
2013/05/23 02:28:07
Done.
| |
| 1079 const std::vector<aura::Window*>& child_windows = parent->children(); | |
| 1080 for (size_t i = 0; i < child_windows.size(); ++i) { | |
| 1081 aura::Window* child = child_windows[i]; | |
| 1082 View* host_view = child->GetProperty(kHostViewKey); | |
| 1083 if (host_view) { | |
| 1084 if (!child->layer()->delegate()) { | |
| 1085 // If there is a case where the attached NativeView has a NULL layer | |
| 1086 // delegate, we would need handle this case in View::ReorderChildView(). | |
| 1087 NOTREACHED(); | |
| 1088 } | |
| 1089 | |
| 1090 hosted_windows[host_view] = child; | |
| 1091 } | |
| 1092 } | |
| 1093 | |
|
sky
2013/05/21 23:43:55
Can't you early out if hosted_windows is empty?
pkotwicz
2013/05/23 02:28:07
We cannot early out here because there may be view
sky
2013/05/23 15:36:49
Why don't we change ReorderLayers/ReorderChildLaye
pkotwicz
2013/05/23 17:21:45
The change you are suggesting would result in chan
sky
2013/05/23 17:33:35
I think that better matches expectations, right? R
| |
| 1094 // Compute the desired z-order of the layers based on the order of the views | |
| 1095 // with layers and views with attached windows in the view tree. | |
| 1096 std::vector<View*> view_with_layer_order; | |
| 1097 { | |
| 1098 // Temporarily modify the ids of the views attached to a window to simplify | |
|
sky
2013/05/21 23:43:55
Yuck! Don't muck with the ids like this.
pkotwicz
2013/05/23 02:28:07
No more modifying of the ids
| |
| 1099 // GetOrderOfViewsWithLayers. | |
| 1100 const int kHostViewId = 1; | |
| 1101 std::map<View*, int> old_ids; | |
| 1102 for (std::map<View*, aura::Window*>::iterator it = hosted_windows.begin(); | |
| 1103 it != hosted_windows.end(); ++it) { | |
| 1104 View* v = it->first; | |
| 1105 old_ids[v] = v->id(); | |
| 1106 v->set_id(kHostViewId); | |
| 1107 } | |
| 1108 | |
| 1109 GetOrderOfViewsWithLayers(root_view, parent->layer(), kHostViewId, | |
| 1110 hosted_windows, &view_with_layer_order); | |
| 1111 | |
| 1112 // Reset the view ids. | |
| 1113 for (std::map<View*, int>::iterator it = old_ids.begin(); | |
| 1114 it != old_ids.end(); ++it) { | |
| 1115 it->first->set_id(it->second); | |
| 1116 } | |
| 1117 } | |
| 1118 | |
| 1119 // Find the bottommost window with a NULL layer delegate below which the | |
| 1120 // reordered layers should be stacked. |stack_below_window| should be NULL | |
| 1121 // if the reodered layers should be stacked at the top. | |
| 1122 aura::Window* stack_below_window = NULL; | |
| 1123 for (size_t i = 0; i < child_windows.size(); ++i) { | |
| 1124 aura::Window* child = child_windows[i]; | |
| 1125 if (!child->layer()->delegate()) { | |
| 1126 stack_below_window = child; | |
| 1127 break; | |
| 1128 } | |
| 1129 } | |
| 1130 | |
| 1131 // Reorder the layers and windows. | |
| 1132 for (size_t i = 0; i < view_with_layer_order.size(); ++i) { | |
| 1133 View* view = view_with_layer_order[i]; | |
| 1134 ui::Layer* layer = view->layer(); | |
| 1135 aura::Window* window = NULL; | |
| 1136 | |
| 1137 std::map<View*, aura::Window*>::iterator hosted_window_it = | |
| 1138 hosted_windows.find(view); | |
| 1139 if (hosted_window_it != hosted_windows.end()) { | |
| 1140 window = hosted_window_it->second; | |
| 1141 layer = window->layer(); | |
| 1142 } | |
| 1143 | |
| 1144 DCHECK(layer); | |
| 1145 if (stack_below_window) { | |
| 1146 if (window) | |
| 1147 parent->StackChildBelow(window, stack_below_window); | |
| 1148 parent->layer()->StackBelow(layer, stack_below_window->layer()); | |
| 1149 } else { | |
| 1150 if (window) | |
| 1151 parent->StackChildAtTop(window); | |
| 1152 parent->layer()->StackAtTop(layer); | |
| 1153 } | |
| 1154 } | |
| 1155 } | |
| 1156 | |
| 1157 // static | |
| 1034 bool NativeWidgetPrivate::IsMouseButtonDown() { | 1158 bool NativeWidgetPrivate::IsMouseButtonDown() { |
| 1035 return aura::Env::GetInstance()->is_mouse_button_down(); | 1159 return aura::Env::GetInstance()->is_mouse_button_down(); |
| 1036 } | 1160 } |
| 1037 | 1161 |
| 1038 // static | 1162 // static |
| 1039 bool NativeWidgetPrivate::IsTouchDown() { | 1163 bool NativeWidgetPrivate::IsTouchDown() { |
| 1040 return aura::Env::GetInstance()->is_touch_down(); | 1164 return aura::Env::GetInstance()->is_touch_down(); |
| 1041 } | 1165 } |
| 1042 | 1166 |
| 1043 } // namespace internal | 1167 } // namespace internal |
| 1044 } // namespace views | 1168 } // namespace views |
| OLD | NEW |