Index: ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc |
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc |
index 4f6c7d4c64d425e58f0648d3fb1ff190b39493a6..60cf1fbd4131c11b55bc96dd902d22ae51de38e9 100644 |
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc |
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc |
@@ -83,7 +83,9 @@ DesktopWindowTreeHostWin::DesktopWindowTreeHostWin( |
should_animate_window_close_(false), |
pending_close_(false), |
has_non_client_view_(false), |
- tooltip_(NULL) { |
+ tooltip_(NULL), |
+ need_synchronous_paint_(false), |
+ in_sizing_loop_(false) { |
} |
DesktopWindowTreeHostWin::~DesktopWindowTreeHostWin() { |
@@ -717,6 +719,22 @@ void DesktopWindowTreeHostWin::HandleClose() { |
} |
bool DesktopWindowTreeHostWin::HandleCommand(int command) { |
+ // Windows uses the 4 lower order bits of |notification_code| for type- |
+ // specific information so we must exclude this when comparing. |
+ static const int sc_mask = 0xFFF0; |
+ switch (command & sc_mask) { |
+ case SC_RESTORE: |
+ case SC_MAXIMIZE: |
+ need_synchronous_paint_ = true; |
+ break; |
+ |
+ case SC_SIZE: |
+ in_sizing_loop_ = true; |
+ break; |
+ |
+ default: |
+ break; |
+ } |
return GetWidget()->widget_delegate()->ExecuteWindowsCommand(command); |
} |
@@ -752,10 +770,16 @@ void DesktopWindowTreeHostWin::HandleDisplayChange() { |
} |
void DesktopWindowTreeHostWin::HandleBeginWMSizeMove() { |
+ if (in_sizing_loop_) |
+ need_synchronous_paint_ = true; |
native_widget_delegate_->OnNativeWidgetBeginUserBoundsChange(); |
} |
void DesktopWindowTreeHostWin::HandleEndWMSizeMove() { |
+ if (in_sizing_loop_) { |
+ need_synchronous_paint_ = false; |
+ in_sizing_loop_ = false; |
+ } |
native_widget_delegate_->OnNativeWidgetEndUserBoundsChange(); |
} |
@@ -912,8 +936,15 @@ bool DesktopWindowTreeHostWin::HandleScrollEvent( |
} |
void DesktopWindowTreeHostWin::HandleWindowSizeChanging() { |
- if (compositor()) |
+ if (compositor() && need_synchronous_paint_) { |
compositor()->FinishAllRendering(); |
+ // If we received the window size changing notification due to a restore or |
+ // maximize operation, then we can reset the need_synchronous_paint_ flag |
+ // here. For a sizing operation, the flag will be reset at the end of the |
+ // operation. |
+ if (!in_sizing_loop_) |
+ need_synchronous_paint_ = false; |
+ } |
} |
//////////////////////////////////////////////////////////////////////////////// |