Index: ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc |
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc |
index 66a424a3b2fa782de0337b0d6a267aecb136b1a5..128887af23a76e9dc6430e548365944a0c30d438 100644 |
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc |
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc |
@@ -187,6 +187,7 @@ DesktopWindowTreeHostX11::DesktopWindowTreeHostX11( |
x_root_window_(DefaultRootWindow(xdisplay_)), |
atom_cache_(xdisplay_, kAtomsToCache), |
window_mapped_(false), |
+ wait_for_map_(false), |
wait_for_unmap_(false), |
is_fullscreen_(false), |
is_always_on_top_(false), |
@@ -584,7 +585,7 @@ void DesktopWindowTreeHostX11::ShowMaximizedWithBounds( |
} |
bool DesktopWindowTreeHostX11::IsVisible() const { |
- return window_mapped_ && !wait_for_unmap_; |
+ return wait_for_map_ || (window_mapped_ && !wait_for_unmap_); |
} |
void DesktopWindowTreeHostX11::SetSize(const gfx::Size& requested_size) { |
@@ -1199,6 +1200,7 @@ void DesktopWindowTreeHostX11::HideImpl() { |
if (IsVisible()) { |
XWithdrawWindow(xdisplay_, xwindow_, 0); |
wait_for_unmap_ = true; |
+ wait_for_map_ = false; |
} |
native_widget_delegate_->OnNativeWidgetVisibilityChanged(false); |
} |
@@ -1216,9 +1218,12 @@ void DesktopWindowTreeHostX11::SetBounds( |
XWindowChanges changes = {0}; |
unsigned value_mask = 0; |
- delayed_resize_task_.Cancel(); |
if (size_changed) { |
+ // Only cancel the delayed resize task if we're already about to call |
+ // OnHostResized in this function. |
+ delayed_resize_task_.Cancel(); |
+ |
// Update the minimum and maximum sizes in case they have changed. |
UpdateMinAndMaxSize(); |
@@ -1905,11 +1910,7 @@ void DesktopWindowTreeHostX11::MapWindow(ui::WindowShowState show_state) { |
} |
XMapWindow(xdisplay_, xwindow_); |
- |
- // We now block until our window is mapped. Some X11 APIs will crash and |
- // burn if passed |xwindow_| before the window is mapped, and XMapWindow is |
- // asynchronous. |
- event_source->BlockUntilWindowMapped(xwindow_); |
+ wait_for_map_ = true; |
} |
void DesktopWindowTreeHostX11::SetWindowTransparency() { |
@@ -2132,6 +2133,7 @@ uint32_t DesktopWindowTreeHostX11::DispatchEvent( |
break; |
} |
case MapNotify: { |
+ wait_for_map_ = false; |
window_mapped_ = true; |
FOR_EACH_OBSERVER(DesktopWindowTreeHostObserverX11, |