Index: desktop_aura/desktop_screen_win.cc =================================================================== --- desktop_aura/desktop_screen_win.cc (revision 272007) +++ desktop_aura/desktop_screen_win.cc (working copy) @@ -54,6 +54,8 @@ } HWND DesktopScreenWin::GetHWNDFromNativeView(gfx::NativeView window) const { + if (!window) + return NULL; aura::WindowTreeHost* host = window->GetHost(); return host ? host->GetAcceleratedWidget() : NULL; } Index: desktop_aura/desktop_window_tree_host_win.cc =================================================================== --- desktop_aura/desktop_window_tree_host_win.cc (revision 272007) +++ desktop_aura/desktop_window_tree_host_win.cc (working copy) @@ -129,7 +129,9 @@ native_widget_delegate_); HWND parent_hwnd = NULL; - if (params.parent && params.parent->GetHost()) + if (params.parent_widget) + parent_hwnd = params.parent_widget; + else if (params.parent && params.parent->GetHost()) parent_hwnd = params.parent->GetHost()->GetAcceleratedWidget(); message_handler_->set_remove_standard_frame(params.remove_standard_frame); @@ -775,6 +777,7 @@ void DesktopWindowTreeHostWin::HandleNativeFocus(HWND last_focused_window) { // TODO(beng): inform the native_widget_delegate_. + GetWidget()->GetNativeWindow()->Focus(); InputMethod* input_method = GetInputMethod(); if (input_method) input_method->OnFocus(); @@ -782,6 +785,7 @@ void DesktopWindowTreeHostWin::HandleNativeBlur(HWND focused_window) { // TODO(beng): inform the native_widget_delegate_. + GetWidget()->GetNativeWindow()->Blur(); InputMethod* input_method = GetInputMethod(); if (input_method) input_method->OnBlur(); Index: desktop_aura/desktop_window_tree_host_x11.cc =================================================================== --- desktop_aura/desktop_window_tree_host_x11.cc (revision 272007) +++ desktop_aura/desktop_window_tree_host_x11.cc (working copy) @@ -143,7 +143,8 @@ window_parent_(NULL), window_shape_(NULL), custom_window_shape_(false), - urgency_hint_set_(false) { + urgency_hint_set_(false), + xwindow_destroyed_(false) { } DesktopWindowTreeHostX11::~DesktopWindowTreeHostX11() { @@ -332,7 +333,8 @@ // Actually free our native resources. if (ui::PlatformEventSource::GetInstance()) ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); - XDestroyWindow(xdisplay_, xwindow_); + if (!xwindow_destroyed_) + XDestroyWindow(xdisplay_, xwindow_); xwindow_ = None; desktop_native_widget_aura_->OnHostClosed(); @@ -998,9 +1000,13 @@ } } + gfx::AcceleratedWidget parent_widget = params.parent_widget; + if (parent_widget == gfx::kNullAcceleratedWidget) + parent_widget = x_root_window_; + bounds_ = params.bounds; xwindow_ = XCreateWindow( - xdisplay_, x_root_window_, + xdisplay_, parent_widget, bounds_.x(), bounds_.y(), bounds_.width(), bounds_.height(), 0, // border width @@ -1503,6 +1509,10 @@ } break; } + case DestroyNotify: + xwindow_destroyed_ = true; + CloseNow(); + break; case FocusOut: if (xev->xfocus.mode != NotifyGrab) { ReleaseCapture(); Index: desktop_aura/desktop_window_tree_host_x11.h =================================================================== --- desktop_aura/desktop_window_tree_host_x11.h (revision 272007) +++ desktop_aura/desktop_window_tree_host_x11.h (working copy) @@ -319,6 +319,9 @@ // the frame when |xwindow_| gains focus or handles a mouse button event. bool urgency_hint_set_; + // True if the xwindow has already been destroyed. + bool xwindow_destroyed_; + DISALLOW_COPY_AND_ASSIGN(DesktopWindowTreeHostX11); }; Index: widget.cc =================================================================== --- widget.cc (revision 272007) +++ widget.cc (working copy) @@ -116,6 +116,7 @@ show_state(ui::SHOW_STATE_DEFAULT), double_buffer(false), parent(NULL), + parent_widget(gfx::kNullAcceleratedWidget), native_widget(NULL), desktop_window_tree_host(NULL), top_level(false), @@ -141,6 +142,7 @@ show_state(ui::SHOW_STATE_DEFAULT), double_buffer(false), parent(NULL), + parent_widget(gfx::kNullAcceleratedWidget), native_widget(NULL), desktop_window_tree_host(NULL), top_level(false), @@ -398,7 +400,12 @@ Minimize(); } else if (params.delegate) { SetContentsView(params.delegate->GetContentsView()); - SetInitialBoundsForFramelessWindow(params.bounds); + if (params.parent_widget) { + // Set the bounds directly instead of applying an inset. + SetBounds(params.bounds); + } else { + SetInitialBoundsForFramelessWindow(params.bounds); + } } native_widget_initialized_ = true; } Index: widget.h =================================================================== --- widget.h (revision 272007) +++ widget.h (working copy) @@ -213,6 +213,7 @@ // Should the widget be double buffered? Default is false. bool double_buffer; gfx::NativeView parent; + gfx::AcceleratedWidget parent_widget; // Specifies the initial bounds of the Widget. Default is empty, which means // the NativeWidget may specify a default size. If the parent is specified, // |bounds| is in the parent's coordinate system. If the parent is not