Chromium Code Reviews| 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..a21ea9b49f788bbf990c94db6655b86d1f032010 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,9 +402,19 @@ 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. |
|
cpu_(ooo_6.6-7.5)
2014/05/27 21:56:27
keep up to "scale factor."
ananta
2014/05/27 22:46:16
Please elaborate. Did you indicate changing "We sc
|
| + 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_); |
| // Map the OS touch event id to a range allowed by the gesture recognizer. |
| @@ -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; |