summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Bauman <jbauman@chromium.org>2015-09-09 15:17:32 -0700
committerJohn Bauman <jbauman@chromium.org>2015-09-09 22:20:58 +0000
commitde54b58d404a0cdf01639ae7260ef10bbb843ed9 (patch)
tree46e1da238d560f5a5df98e8d3f7d13ca77e94ed4
parent6f0a92d0c3e4e1ed7dfee48dd2e303b89173d9e1 (diff)
downloadchromium_src-de54b58d404a0cdf01639ae7260ef10bbb843ed9.zip
chromium_src-de54b58d404a0cdf01639ae7260ef10bbb843ed9.tar.gz
chromium_src-de54b58d404a0cdf01639ae7260ef10bbb843ed9.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/1323333005 . Cr-Commit-Position: refs/branch-heads/2454@{#452} Cr-Branched-From: 12bfc3360892ec53cd00fc239a47e5298beb063b-refs/heads/master@{#338390}
-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 93b3c5b..9278c29 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
@@ -906,6 +906,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 c213ffe..047498f 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
@@ -191,6 +191,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 d223349..cf71db8 100644
--- a/ui/views/win/hwnd_message_handler.cc
+++ b/ui/views/win/hwnd_message_handler.cc
@@ -329,9 +329,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;
@@ -2470,6 +2470,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())) {
@@ -2509,6 +2510,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 e7fc8af..6b8f719 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 e773b81..8f8957a 100644
--- a/ui/views/win/hwnd_message_handler_delegate.h
+++ b/ui/views/win/hwnd_message_handler_delegate.h
@@ -224,6 +224,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() {}
};