summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Bauman <jbauman@chromium.org>2015-09-04 16:21:24 -0700
committerJohn Bauman <jbauman@chromium.org>2015-09-04 23:22:17 +0000
commitb4ba1071baaabc92cb5a2ca89e238c478eca0075 (patch)
tree6e8a85dc5568f2531916c733404a3126200fca18
parent345fad754e0bae40b539ae5e286a9fb63aec9ab2 (diff)
downloadchromium_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.cc10
-rw-r--r--ui/views/widget/desktop_aura/desktop_window_tree_host_win.h1
-rw-r--r--ui/views/win/hwnd_message_handler.cc9
-rw-r--r--ui/views/win/hwnd_message_handler.h4
-rw-r--r--ui/views/win/hwnd_message_handler_delegate.h3
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() {}
};