Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Unified Diff: ui/views/widget/native_widget_aura.cc

Issue 11421006: Desktop aura: Break aura::Window::SetParent in two. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix ash_unittests Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/corewm/shadow_controller_unittest.cc ('k') | ui/views/widget/widget.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/widget/native_widget_aura.cc
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc
index ec9cd7c2155277b01ff8313c96137e50999548e6..53b4b6f00b7d585fea3b154888ff6e6861616bca 100644
--- a/ui/views/widget/native_widget_aura.cc
+++ b/ui/views/widget/native_widget_aura.cc
@@ -108,24 +108,18 @@ void NativeWidgetAura::InitNativeWidget(const Widget::InitParams& params) {
delegate_->OnNativeWidgetCreated();
gfx::Rect window_bounds = params.bounds;
- if (params.child) {
- window_->SetParent(params.GetParent());
- } else {
+ gfx::NativeView parent = params.GetParent();
+ if (!params.child) {
// Set up the transient child before the window is added. This way the
// LayoutManager knows the window has a transient parent.
- gfx::NativeView parent = params.GetParent();
if (parent && parent->type() != aura::client::WINDOW_TYPE_UNKNOWN) {
parent->AddTransientChild(window_);
parent = NULL;
}
// SetAlwaysOnTop before SetParent so that always-on-top container is used.
SetAlwaysOnTop(params.keep_on_top);
- // If the parent is not specified, find the default parent for
- // the |window_| using the desired |window_bounds|.
- if (!parent) {
- parent = aura::client::GetStackingClient(params.GetParent())->
- GetDefaultParent(params.context, window_, window_bounds);
- } else if (window_bounds == gfx::Rect()) {
+ // Make sure we have a real |window_bounds|.
+ if (parent && window_bounds == gfx::Rect()) {
// If a parent is specified but no bounds are given,
// use the origin of the parent's display so that the widget
// will be added to the same display as the parent.
@@ -133,7 +127,16 @@ void NativeWidgetAura::InitNativeWidget(const Widget::InitParams& params) {
GetDisplayNearestWindow(parent).bounds();
window_bounds.set_origin(bounds.origin());
}
- window_->SetParent(parent);
+ }
+
+ if (parent) {
+ parent->AddChild(window_);
+ } else {
+ // TODO(erg): Remove this NULL check once we've made everything in views
+ // actually pass us a context.
+ aura::RootWindow* root_window =
+ params.context ? params.context->GetRootWindow() : NULL;
+ window_->SetDefaultParentByRootWindow(root_window, window_bounds);
}
// Wait to set the bounds until we have a parent. That way we can know our
@@ -1027,7 +1030,23 @@ void NativeWidgetPrivate::ReparentNativeView(gfx::NativeView native_view,
(*it)->NotifyNativeViewHierarchyChanged(false, previous_parent);
}
- native_view->SetParent(new_parent);
+ if (new_parent) {
+ new_parent->AddChild(native_view);
+ } else {
+ // The following looks weird, but it's the equivalent of what aura has
+ // always done. (The previous behaviour of aura::Window::SetParent() used
+ // NULL as a special value that meant ask the StackingClient where things
+ // should go.)
+ //
+ // This probably isn't strictly correct, but its an invariant that a Window
+ // in use will be attached to a RootWindow, so we can't just call
+ // RemoveChild here. The only possible thing that could assign a RootWindow
+ // in this case is the stacking client of the current RootWindow. This
+ // matches our previous behaviour; the global stacking client would almost
+ // always reattach the window to the same RootWindow.
+ native_view->SetDefaultParentByRootWindow(native_view->GetRootWindow(),
+ gfx::Rect());
+ }
// And now, notify them that they have a brand new parent.
for (Widget::Widgets::iterator it = widgets.begin();
« no previous file with comments | « ui/views/corewm/shadow_controller_unittest.cc ('k') | ui/views/widget/widget.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698