Index: ash/touch/touch_transformer_controller.cc |
diff --git a/ash/touch/touch_transformer_controller.cc b/ash/touch/touch_transformer_controller.cc |
index 67cbab2b5bdc57d6c1536bfc52270acf766a1773..b99cb5a0571a804b3c6db8a302c4f08a94b9b080 100644 |
--- a/ash/touch/touch_transformer_controller.cc |
+++ b/ash/touch/touch_transformer_controller.cc |
@@ -13,6 +13,7 @@ |
#include "ui/display/chromeos/display_configurator.h" |
#include "ui/display/types/chromeos/display_snapshot.h" |
#include "ui/events/device_data_manager.h" |
+#include "ui/events/x/device_data_manager_x11.h" |
namespace ash { |
@@ -24,6 +25,52 @@ DisplayManager* GetDisplayManager() { |
} // namespace |
+ |
+// This is to compute the scale ratio for the TouchEvent's radius. The |
+// configured resolution of the display is not always the same as the touch |
+// screen's reporting resolution, e.g. the display could be set as |
+// 1920x1080 while the touchscreen is reporting touch position range at |
+// 32767x32767. Touch radius is reported in the units the same as touch position |
+// so we need to scale the touch radius to be compatible with the display's |
+// resolution. We compute the scale as |
+// sqrt of (display_area / touchscreen_area) |
+double TouchTransformerController::GetTouchResolutionScale( |
+ const DisplayInfo& touch_display) const { |
+ if (touch_display.touch_device_id() == 0) |
+ return 1.0; |
+ |
+ double min_x, max_x; |
+ double min_y, max_y; |
+ if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange( |
+ touch_display.touch_device_id(), |
+ ui::DeviceDataManagerX11::DT_TOUCH_POSITION_X, |
+ &min_x, &max_x) || |
+ !ui::DeviceDataManagerX11::GetInstance()->GetDataRange( |
+ touch_display.touch_device_id(), |
+ ui::DeviceDataManagerX11::DT_TOUCH_POSITION_Y, |
+ &min_y, &max_y)) { |
+ return 1.0; |
+ } |
+ |
+ double width = touch_display.bounds_in_native().width(); |
+ double height = touch_display.bounds_in_native().height(); |
+ |
+ if (max_x == 0.0 || max_y == 0.0 || width == 0.0 || height == 0.0) |
+ return 1.0; |
+ |
+ // [0, max_x] -> touchscreen width = max_x + 1 |
+ // [0, max_y] -> touchscreen height = max_y + 1 |
+ max_x += 1.0; |
+ max_y += 1.0; |
+ |
+ double ratio = std::sqrt((width * height) / (max_x * max_y)); |
+ |
+ VLOG(2) << "Screen width/height: " << width << "/" << height |
+ << ", Touchscreen width/height: " << max_x << "/" << max_y |
+ << ", Touch radius scale ratio: " << ratio; |
+ return ratio; |
+} |
+ |
// This function computes the extended mode TouchTransformer for |
// |touch_display|. The TouchTransformer maps the touch event position |
// from framebuffer size to the display size. |
@@ -158,10 +205,17 @@ void TouchTransformerController::UpdateTouchTransformer() const { |
display2_id != gfx::Display::kInvalidDisplayID); |
display1 = GetDisplayManager()->GetDisplayInfo(display1_id); |
display2 = GetDisplayManager()->GetDisplayInfo(display2_id); |
+ device_manager->UpdateTouchRadiusScale(display1.touch_device_id(), |
+ GetTouchResolutionScale(display1)); |
+ device_manager->UpdateTouchRadiusScale(display2.touch_device_id(), |
+ GetTouchResolutionScale(display2)); |
} else { |
single_display_id = GetDisplayManager()->first_display_id(); |
DCHECK(single_display_id != gfx::Display::kInvalidDisplayID); |
single_display = GetDisplayManager()->GetDisplayInfo(single_display_id); |
+ device_manager->UpdateTouchRadiusScale( |
+ single_display.touch_device_id(), |
+ GetTouchResolutionScale(single_display)); |
} |
if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR) { |