diff options
author | John Bauman <jbauman@chromium.org> | 2015-09-04 16:21:24 -0700 |
---|---|---|
committer | John Bauman <jbauman@chromium.org> | 2015-09-04 23:22:17 +0000 |
commit | b4ba1071baaabc92cb5a2ca89e238c478eca0075 (patch) | |
tree | 6e8a85dc5568f2531916c733404a3126200fca18 | |
parent | 345fad754e0bae40b539ae5e286a9fb63aec9ab2 (diff) | |
download | chromium_src-b4ba1071baaabc92cb5a2ca89e238c478eca0075.zip chromium_src-b4ba1071baaabc92cb5a2ca89e238c478eca0075.tar.gz chromium_src-b4ba1071baaabc92cb5a2ca89e238c478eca0075.tar.bz2 |
Ensure windows update when snapped to side on Windows 10.
It's possible to get a message that the window pos is changing, but have the window pos not actually change in the end. In this case, force the compositor to re-enable swapping.
BUG=516234
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review URL: https://codereview.chromium.org/1305363002
Cr-Commit-Position: refs/heads/master@{#347070}
(cherry picked from commit 55b4c95889d6a72e52bc72702580a62f04f35777)
TBR=sky@chromium.org
Review URL: https://codereview.chromium.org/1309063005 .
Cr-Commit-Position: refs/branch-heads/2490@{#174}
Cr-Branched-From: 7790a3535f2a81a03685eca31a32cf69ae0c114f-refs/heads/master@{#344925}
-rw-r--r-- | ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc | 10 | ||||
-rw-r--r-- | ui/views/widget/desktop_aura/desktop_window_tree_host_win.h | 1 | ||||
-rw-r--r-- | ui/views/win/hwnd_message_handler.cc | 9 | ||||
-rw-r--r-- | ui/views/win/hwnd_message_handler.h | 4 | ||||
-rw-r--r-- | ui/views/win/hwnd_message_handler_delegate.h | 3 |
5 files changed, 25 insertions, 2 deletions
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 5bee7fd..34c5d98 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 @@ -899,6 +899,16 @@ void DesktopWindowTreeHostWin::HandleWindowSizeChanging() { compositor()->DisableSwapUntilResize(); } +void DesktopWindowTreeHostWin::HandleWindowSizeChanged() { + // A resize may not have occurred if the window size happened not to have + // changed (can occur on Windows 10 when snapping a window to the side of + // the screen). In that case do a resize to the current size to reenable + // swaps. + if (compositor()) + compositor()->SetScaleAndSize(compositor()->device_scale_factor(), + compositor()->size()); +} + //////////////////////////////////////////////////////////////////////////////// // DesktopWindowTreeHostWin, private: diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h index 2c5c2fa..363c019 100644 --- a/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h +++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_win.h @@ -190,6 +190,7 @@ class VIEWS_EXPORT DesktopWindowTreeHostWin void PostHandleMSG(UINT message, WPARAM w_param, LPARAM l_param) override; bool HandleScrollEvent(const ui::ScrollEvent& event) override; void HandleWindowSizeChanging() override; + void HandleWindowSizeChanged() override; Widget* GetWidget(); const Widget* GetWidget() const; diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc index b394556..4a9f388 100644 --- a/ui/views/win/hwnd_message_handler.cc +++ b/ui/views/win/hwnd_message_handler.cc @@ -330,9 +330,9 @@ HWNDMessageHandler::HWNDMessageHandler(HWNDMessageHandlerDelegate* delegate) touch_down_contexts_(0), last_mouse_hwheel_time_(0), dwm_transition_desired_(false), + sent_window_size_changing_(false), autohide_factory_(this), - weak_factory_(this) { -} + weak_factory_(this) {} HWNDMessageHandler::~HWNDMessageHandler() { delegate_ = NULL; @@ -2490,6 +2490,7 @@ void HWNDMessageHandler::OnWindowPosChanging(WINDOWPOS* window_pos) { if ((old_size != new_size && !(window_pos->flags & SWP_NOSIZE)) || window_pos->flags & SWP_FRAMECHANGED) { delegate_->HandleWindowSizeChanging(); + sent_window_size_changing_ = true; } if (ScopedFullscreenVisibility::IsHiddenForFullscreen(hwnd())) { @@ -2529,6 +2530,10 @@ void HWNDMessageHandler::OnWindowPosChanged(WINDOWPOS* window_pos) { if (direct_manipulation_helper_) direct_manipulation_helper_->Deactivate(hwnd()); } + if (sent_window_size_changing_) { + sent_window_size_changing_ = false; + delegate_->HandleWindowSizeChanged(); + } SetMsgHandled(FALSE); } diff --git a/ui/views/win/hwnd_message_handler.h b/ui/views/win/hwnd_message_handler.h index 7e54a8f..78fa679 100644 --- a/ui/views/win/hwnd_message_handler.h +++ b/ui/views/win/hwnd_message_handler.h @@ -584,6 +584,10 @@ class VIEWS_EXPORT HWNDMessageHandler : // glass. Defaults to false. bool dwm_transition_desired_; + // True if HandleWindowSizeChanging has been called in the delegate, but not + // HandleWindowSizeChanged. + bool sent_window_size_changing_; + // Manages observation of Windows Session Change messages. scoped_ptr<WindowsSessionChangeObserver> windows_session_change_observer_; diff --git a/ui/views/win/hwnd_message_handler_delegate.h b/ui/views/win/hwnd_message_handler_delegate.h index 6592a89..89740a9 100644 --- a/ui/views/win/hwnd_message_handler_delegate.h +++ b/ui/views/win/hwnd_message_handler_delegate.h @@ -220,6 +220,9 @@ class VIEWS_EXPORT HWNDMessageHandlerDelegate { // Called when the window size is about to change. virtual void HandleWindowSizeChanging() = 0; + // Called when the window size has finished changing. + virtual void HandleWindowSizeChanged() = 0; + protected: virtual ~HWNDMessageHandlerDelegate() {} }; |