summaryrefslogtreecommitdiffstats
path: root/win8/metro_driver
diff options
context:
space:
mode:
authorrobertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-23 12:57:25 +0000
committerrobertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-23 12:57:25 +0000
commit0a02eabbfbfdc4de544bfa861e0f639911e3e8c6 (patch)
treee89a689b72dc8a49a2846db768b7389a8715afb6 /win8/metro_driver
parent95471194b8a58d9a9f0ea25160fa16f2b6b646aa (diff)
downloadchromium_src-0a02eabbfbfdc4de544bfa861e0f639911e3e8c6.zip
chromium_src-0a02eabbfbfdc4de544bfa861e0f639911e3e8c6.tar.gz
chromium_src-0a02eabbfbfdc4de544bfa861e0f639911e3e8c6.tar.bz2
Fix Ash on Windows multi-monitor support and snap-view sizing.
Plumb through window size events to the remote root window host. Also add an initial sizing message to get Ash's initial state to be correct. BUG=236379 TEST=Move Ash from one monitor to another with a different size, observe that things resize themselves correctly. Also, snap Ash, observe similar goodness. Review URL: https://chromiumcodereview.appspot.com/15599002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@201771 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'win8/metro_driver')
-rw-r--r--win8/metro_driver/chrome_app_view_ash.cc36
-rw-r--r--win8/metro_driver/chrome_app_view_ash.h4
2 files changed, 40 insertions, 0 deletions
diff --git a/win8/metro_driver/chrome_app_view_ash.cc b/win8/metro_driver/chrome_app_view_ash.cc
index f3a3a88..1f81ed3 100644
--- a/win8/metro_driver/chrome_app_view_ash.cc
+++ b/win8/metro_driver/chrome_app_view_ash.cc
@@ -54,6 +54,10 @@ typedef winfoundtn::ITypedEventHandler<
winui::Core::CoreWindow*,
winui::Core::WindowActivatedEventArgs*> WindowActivatedHandler;
+typedef winfoundtn::ITypedEventHandler<
+ winui::Core::CoreWindow*,
+ winui::Core::WindowSizeChangedEventArgs*> SizeChangedHandler;
+
// This function is exported by chrome.exe.
typedef int (__cdecl *BreakpadExceptionHandler)(EXCEPTION_POINTERS* info);
@@ -326,6 +330,11 @@ ChromeAppViewAsh::SetWindow(winui::Core::ICoreWindow* window) {
hr = interop->get_WindowHandle(&core_window_hwnd_);
CheckHR(hr);
+ hr = window_->add_SizeChanged(mswr::Callback<SizeChangedHandler>(
+ this, &ChromeAppViewAsh::OnSizeChanged).Get(),
+ &sizechange_token_);
+ CheckHR(hr);
+
// Register for pointer and keyboard notifications. We forward
// them to the browser process via IPC.
hr = window_->add_PointerMoved(mswr::Callback<PointerEventHandler>(
@@ -448,6 +457,14 @@ ChromeAppViewAsh::Run() {
gfx::NativeViewId(core_window_hwnd_)));
DVLOG(1) << "ICoreWindow sent " << core_window_hwnd_;
+ // Send an initial size message so that the Ash root window host gets sized
+ // correctly.
+ RECT rect = {0};
+ ::GetWindowRect(core_window_hwnd_, &rect);
+ ui_channel_->Send(
+ new MetroViewerHostMsg_WindowSizeChanged(rect.right - rect.left,
+ rect.bottom - rect.top));
+
// And post the task that'll do the inner Metro message pumping to it.
msg_loop.PostTask(FROM_HERE, base::Bind(&RunMessageLoop, dispatcher.Get()));
msg_loop.Run();
@@ -830,6 +847,25 @@ HRESULT ChromeAppViewAsh::OnWindowActivated(
return S_OK;
}
+HRESULT ChromeAppViewAsh::OnSizeChanged(winui::Core::ICoreWindow* sender,
+ winui::Core::IWindowSizeChangedEventArgs* args) {
+ if (!window_) {
+ return S_OK;
+ }
+
+ winfoundtn::Size size;
+ HRESULT hr = args->get_Size(&size);
+ if (FAILED(hr))
+ return hr;
+
+ uint32 cx = static_cast<uint32>(size.Width);
+ uint32 cy = static_cast<uint32>(size.Height);
+
+ DVLOG(1) << "Window size changed: width=" << cx << ", height=" << cy;
+ ui_channel_->Send(new MetroViewerHostMsg_WindowSizeChanged(cx, cy));
+ return S_OK;
+}
+
///////////////////////////////////////////////////////////////////////////////
diff --git a/win8/metro_driver/chrome_app_view_ash.h b/win8/metro_driver/chrome_app_view_ash.h
index 0989cda..010f0d6 100644
--- a/win8/metro_driver/chrome_app_view_ash.h
+++ b/win8/metro_driver/chrome_app_view_ash.h
@@ -111,6 +111,9 @@ class ChromeAppViewAsh
HRESULT OnWindowActivated(winui::Core::ICoreWindow* sender,
winui::Core::IWindowActivatedEventArgs* args);
+ HRESULT OnSizeChanged(winui::Core::ICoreWindow* sender,
+ winui::Core::IWindowSizeChangedEventArgs* args);
+
mswr::ComPtr<winui::Core::ICoreWindow> window_;
mswr::ComPtr<winapp::Core::ICoreApplicationView> view_;
EventRegistrationToken activated_token_;
@@ -125,6 +128,7 @@ class ChromeAppViewAsh
EventRegistrationToken accel_keydown_token_;
EventRegistrationToken accel_keyup_token_;
EventRegistrationToken window_activated_token_;
+ EventRegistrationToken sizechange_token_;
// Keep state about which button is currently down, if any, as PointerMoved
// events do not contain that state, but Ash's MouseEvents need it.