| Index: win8/metro_driver/chrome_app_view_ash.cc
|
| diff --git a/win8/metro_driver/chrome_app_view_ash.cc b/win8/metro_driver/chrome_app_view_ash.cc
|
| index 49d517ef7d50ae11a935d5d4cf6a3cbfb19a54c4..c104a15cc80cebcd2a2c83227b3c02bed7cdf2e1 100644
|
| --- a/win8/metro_driver/chrome_app_view_ash.cc
|
| +++ b/win8/metro_driver/chrome_app_view_ash.cc
|
| @@ -23,6 +23,8 @@
|
| #include "ipc/ipc_channel_proxy.h"
|
| #include "ipc/ipc_sender.h"
|
| #include "ui/events/gestures/gesture_sequence.h"
|
| +#include "ui/gfx/geometry/point_conversions.h"
|
| +#include "ui/gfx/win/dpi.h"
|
| #include "ui/metro_viewer/metro_viewer_messages.h"
|
| #include "win8/metro_driver/file_picker_ash.h"
|
| #include "win8/metro_driver/ime/ime_popup_monitor.h"
|
| @@ -362,7 +364,7 @@ bool LaunchChromeBrowserProcess(const wchar_t* additional_parameters,
|
| // This class helps decoding the pointer properties of an event.
|
| class ChromeAppViewAsh::PointerInfoHandler {
|
| public:
|
| - PointerInfoHandler()
|
| + PointerInfoHandler(float metro_dpi_scale, float win32_dpi_scale)
|
| : x_(0),
|
| y_(0),
|
| wheel_delta_(0),
|
| @@ -370,7 +372,9 @@ class ChromeAppViewAsh::PointerInfoHandler {
|
| timestamp_(0),
|
| pointer_id_(0),
|
| mouse_down_flags_(0),
|
| - is_horizontal_wheel_(0) {}
|
| + is_horizontal_wheel_(0),
|
| + metro_dpi_scale_(metro_dpi_scale),
|
| + win32_dpi_scale_(win32_dpi_scale) {}
|
|
|
| HRESULT Init(winui::Core::IPointerEventArgs* args) {
|
| HRESULT hr = args->get_CurrentPoint(&pointer_point_);
|
| @@ -398,8 +402,18 @@ class ChromeAppViewAsh::PointerInfoHandler {
|
| is_horizontal_wheel_ = 0;
|
| properties->get_IsHorizontalMouseWheel(&is_horizontal_wheel_);
|
|
|
| - x_ = point.X;
|
| - y_ = point.Y;
|
| + // The input coordinates are in DIP based on the metro scale factor.
|
| + // We want to convert it to DIP based on the win32 scale factor.
|
| + // We scale the point by the metro scale factor and then scale down
|
| + // via the win32 scale factor which achieves the needful.
|
| + gfx::Point dip_point_metro(point.X, point.Y);
|
| + gfx::Point scaled_point_metro =
|
| + gfx::ToCeiledPoint(gfx::ScalePoint(dip_point_metro, metro_dpi_scale_));
|
| + gfx::Point dip_point_win32 =
|
| + gfx::ToCeiledPoint(gfx::ScalePoint(scaled_point_metro,
|
| + 1.0 / win32_dpi_scale_));
|
| + x_ = dip_point_win32.x();
|
| + y_ = dip_point_win32.y();
|
|
|
| pointer_point_->get_Timestamp(×tamp_);
|
| pointer_point_->get_PointerId(&pointer_id_);
|
| @@ -502,6 +516,12 @@ class ChromeAppViewAsh::PointerInfoHandler {
|
| // Set to true for a horizontal wheel message.
|
| boolean is_horizontal_wheel_;
|
|
|
| + // The metro device scale factor as reported by the winrt interfaces.
|
| + float metro_dpi_scale_;
|
| + // The win32 dpi scale which is queried via GetDeviceCaps. Please refer to
|
| + // ui/gfx/win/dpi.cc for more information.
|
| + float win32_dpi_scale_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(PointerInfoHandler);
|
| };
|
|
|
| @@ -509,7 +529,8 @@ ChromeAppViewAsh::ChromeAppViewAsh()
|
| : mouse_down_flags_(ui::EF_NONE),
|
| ui_channel_(nullptr),
|
| core_window_hwnd_(NULL),
|
| - scale_(0) {
|
| + metro_dpi_scale_(0),
|
| + win32_dpi_scale_(0) {
|
| DVLOG(1) << __FUNCTION__;
|
| globals.previous_state =
|
| winapp::Activation::ApplicationExecutionState_NotRunning;
|
| @@ -629,8 +650,15 @@ ChromeAppViewAsh::SetWindow(winui::Core::ICoreWindow* window) {
|
| direct3d_helper_.Initialize(window);
|
| DVLOG(1) << "Initialized Direct3D.";
|
|
|
| - scale_ = GetModernUIScale();
|
| - DVLOG(1) << "Scale is " << scale_;
|
| + // On Windows 8+ the WinRT interface IDisplayProperties which we use to get
|
| + // device scale factor does not return the correct values in metro mode.
|
| + // To workaround this we retrieve the device scale factor via the win32 way
|
| + // and scale input coordinates accordingly to pass them in DIP to chrome.
|
| + // TODO(ananta). Investigate and fix.
|
| + metro_dpi_scale_ = GetModernUIScale();
|
| + win32_dpi_scale_ = gfx::GetDPIScale();
|
| + DVLOG(1) << "Metro Scale is " << metro_dpi_scale_;
|
| + DVLOG(1) << "Win32 Scale is " << win32_dpi_scale_;
|
| return S_OK;
|
| }
|
|
|
| @@ -675,7 +703,7 @@ ChromeAppViewAsh::Run() {
|
| // Upon receipt of the MetroViewerHostMsg_SetTargetSurface message the
|
| // browser will use D3D from the browser process to present to our Window.
|
| ui_channel_->Send(new MetroViewerHostMsg_SetTargetSurface(
|
| - gfx::NativeViewId(core_window_hwnd_), scale_));
|
| + gfx::NativeViewId(core_window_hwnd_), win32_dpi_scale_));
|
| DVLOG(1) << "ICoreWindow sent " << core_window_hwnd_;
|
|
|
| // Send an initial size message so that the Ash root window host gets sized
|
| @@ -1047,7 +1075,7 @@ HRESULT ChromeAppViewAsh::OnActivate(
|
|
|
| HRESULT ChromeAppViewAsh::OnPointerMoved(winui::Core::ICoreWindow* sender,
|
| winui::Core::IPointerEventArgs* args) {
|
| - PointerInfoHandler pointer;
|
| + PointerInfoHandler pointer(metro_dpi_scale_, win32_dpi_scale_);
|
| HRESULT hr = pointer.Init(args);
|
| if (FAILED(hr))
|
| return hr;
|
| @@ -1077,7 +1105,7 @@ HRESULT ChromeAppViewAsh::OnPointerMoved(winui::Core::ICoreWindow* sender,
|
| HRESULT ChromeAppViewAsh::OnPointerPressed(
|
| winui::Core::ICoreWindow* sender,
|
| winui::Core::IPointerEventArgs* args) {
|
| - PointerInfoHandler pointer;
|
| + PointerInfoHandler pointer(metro_dpi_scale_, win32_dpi_scale_);
|
| HRESULT hr = pointer.Init(args);
|
| if (FAILED(hr))
|
| return hr;
|
| @@ -1100,7 +1128,7 @@ HRESULT ChromeAppViewAsh::OnPointerPressed(
|
| HRESULT ChromeAppViewAsh::OnPointerReleased(
|
| winui::Core::ICoreWindow* sender,
|
| winui::Core::IPointerEventArgs* args) {
|
| - PointerInfoHandler pointer;
|
| + PointerInfoHandler pointer(metro_dpi_scale_, win32_dpi_scale_);
|
| HRESULT hr = pointer.Init(args);
|
| if (FAILED(hr))
|
| return hr;
|
| @@ -1125,7 +1153,7 @@ HRESULT ChromeAppViewAsh::OnPointerReleased(
|
| HRESULT ChromeAppViewAsh::OnWheel(
|
| winui::Core::ICoreWindow* sender,
|
| winui::Core::IPointerEventArgs* args) {
|
| - PointerInfoHandler pointer;
|
| + PointerInfoHandler pointer(metro_dpi_scale_, win32_dpi_scale_);
|
| HRESULT hr = pointer.Init(args);
|
| if (FAILED(hr))
|
| return hr;
|
|
|