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 448baf898079c28dab37da1087c36257225f5e8c..c64b0ca1434a66d1260d1b637c5175c3cb781935 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,8 +187,8 @@ DesktopWindowTreeHostX11::DesktopWindowTreeHostX11( |
xwindow_(0), |
x_root_window_(DefaultRootWindow(xdisplay_)), |
atom_cache_(xdisplay_, kAtomsToCache), |
- window_mapped_(false), |
- wait_for_unmap_(false), |
+ window_mapped_in_server_(false), |
+ window_mapped_in_client_(false), |
is_fullscreen_(false), |
is_always_on_top_(false), |
use_native_frame_(false), |
@@ -593,7 +593,7 @@ void DesktopWindowTreeHostX11::ShowMaximizedWithBounds( |
} |
bool DesktopWindowTreeHostX11::IsVisible() const { |
- return window_mapped_ && !wait_for_unmap_; |
+ return window_mapped_in_client_; |
} |
void DesktopWindowTreeHostX11::SetSize(const gfx::Size& requested_size) { |
@@ -831,9 +831,9 @@ bool DesktopWindowTreeHostX11::IsActive() const { |
bool is_active = |
(has_window_focus_ || has_pointer_focus_) && !ignore_keyboard_input_; |
- // is_active => window_mapped_ |
- // !window_mapped_ => !is_active |
- DCHECK(!is_active || window_mapped_); |
+ // is_active => window_mapped_in_server_ |
+ // !window_mapped_in_server_ => !is_active |
+ DCHECK(!is_active || window_mapped_in_server_); |
// |has_window_focus_| and |has_pointer_focus_| are mutually exclusive. |
DCHECK(!has_window_focus_ || !has_pointer_focus_); |
@@ -1224,7 +1224,7 @@ void DesktopWindowTreeHostX11::ShowImpl() { |
void DesktopWindowTreeHostX11::HideImpl() { |
if (IsVisible()) { |
XWithdrawWindow(xdisplay_, xwindow_, 0); |
- wait_for_unmap_ = true; |
+ window_mapped_in_client_ = false; |
} |
native_widget_delegate_->OnNativeWidgetVisibilityChanged(false); |
} |
@@ -1242,9 +1242,12 @@ void DesktopWindowTreeHostX11::SetBoundsInPixels( |
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(); |
@@ -1664,9 +1667,6 @@ void DesktopWindowTreeHostX11::OnFrameExtentsUpdated() { |
} |
void DesktopWindowTreeHostX11::UpdateMinAndMaxSize() { |
- if (!IsVisible()) |
- return; |
- |
gfx::Size minimum_in_pixels = |
ToPixelRect(gfx::Rect(native_widget_delegate_->GetMinimumSize())).size(); |
gfx::Size maximum_in_pixels = |
@@ -1937,19 +1937,10 @@ void DesktopWindowTreeHostX11::MapWindow(ui::WindowShowState show_state) { |
ui::X11EventSource* event_source = ui::X11EventSource::GetInstance(); |
DCHECK(event_source); |
- if (wait_for_unmap_) { |
- // Block until our window is unmapped. This avoids a race condition when |
- // remapping an unmapped window. |
- event_source->BlockUntilWindowUnmapped(xwindow_); |
- DCHECK(!wait_for_unmap_); |
- } |
+ UpdateMinAndMaxSize(); |
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_); |
+ window_mapped_in_client_ = true; |
} |
void DesktopWindowTreeHostX11::SetWindowTransparency() { |
@@ -2172,13 +2163,11 @@ uint32_t DesktopWindowTreeHostX11::DispatchEvent( |
break; |
} |
case MapNotify: { |
- window_mapped_ = true; |
+ window_mapped_in_server_ = true; |
for (DesktopWindowTreeHostObserverX11& observer : observer_list_) |
observer.OnWindowMapped(xwindow_); |
- UpdateMinAndMaxSize(); |
- |
// Some WMs only respect maximize hints after the window has been mapped. |
// Check whether we need to re-do a maximization. |
if (should_maximize_after_map_) { |
@@ -2189,8 +2178,7 @@ uint32_t DesktopWindowTreeHostX11::DispatchEvent( |
break; |
} |
case UnmapNotify: { |
- window_mapped_ = false; |
- wait_for_unmap_ = false; |
+ window_mapped_in_server_ = false; |
has_pointer_ = false; |
has_pointer_grab_ = false; |
has_pointer_focus_ = false; |