| Index: ui/events/x/device_data_manager.cc | 
| diff --git a/ui/events/x/device_data_manager.cc b/ui/events/x/device_data_manager.cc | 
| index a2e02928c4bb9288353d465c4e52f619682f06b4..e14ff899f0a0e5023f8186e11cafa0e6395894a5 100644 | 
| --- a/ui/events/x/device_data_manager.cc | 
| +++ b/ui/events/x/device_data_manager.cc | 
| @@ -13,6 +13,7 @@ | 
| #include "ui/events/event_constants.h" | 
| #include "ui/events/x/device_list_cache_x.h" | 
| #include "ui/events/x/touch_factory_x11.h" | 
| +#include "ui/gfx/display.h" | 
| #include "ui/gfx/x/x11_types.h" | 
|  | 
| // XIScrollClass was introduced in XI 2.1 so we need to define it here | 
| @@ -121,6 +122,9 @@ DeviceDataManager::DeviceDataManager() | 
| CHECK(arraysize(kCachedAtoms) == static_cast<size_t>(DT_LAST_ENTRY) + 1); | 
| UpdateDeviceList(gfx::GetXDisplay()); | 
| UpdateButtonMap(); | 
| + | 
| +  for (int i = 0; i < kMaxDeviceNum; i++) | 
| +    touch_device_to_display_map_[i] = gfx::Display::kInvalidDisplayID; | 
| } | 
|  | 
| DeviceDataManager::~DeviceDataManager() { | 
| @@ -581,6 +585,44 @@ bool DeviceDataManager::GetDataRange(unsigned int deviceid, | 
| return false; | 
| } | 
|  | 
| +void DeviceDataManager::ClearTouchCTM() { | 
| +  for (int i = 0; i < kMaxDeviceNum; i++) | 
| +    touch_device_ctm_map_[i] = TouchCTM(); | 
| +} | 
| + | 
| +void DeviceDataManager::SetTouchCTM(int touch_device_id, | 
| +                                    const TouchCTM& touch_ctm) { | 
| +  if (touch_device_id > 0 && touch_device_id < kMaxDeviceNum) | 
| +    touch_device_ctm_map_[touch_device_id] = touch_ctm; | 
| +} | 
| + | 
| +void DeviceDataManager::ApplyTouchCTM(int touch_device_id, float* x, float* y) { | 
| +  if (touch_device_id > 0 && touch_device_id < kMaxDeviceNum) { | 
| +    const TouchCTM ctm = touch_device_ctm_map_[touch_device_id]; | 
| +    *x = *x * ctm.x_scale + ctm.x_offset; | 
| +    *y = *y * ctm.y_scale + ctm.y_offset; | 
| +  } | 
| +} | 
| + | 
| + | 
| +void DeviceDataManager::ClearTouchDeviceToDisplayMap() { | 
| +  for (int i = 0 ; i < kMaxDeviceNum; i++) | 
| +    touch_device_to_display_map_[i] = gfx::Display::kInvalidDisplayID; | 
| +} | 
| + | 
| +void DeviceDataManager::MapTouchDeviceToDisplay(int touch_device_id, | 
| +                                                int64 display_id) { | 
| +  if (touch_device_id > 0 && touch_device_id < kMaxDeviceNum) | 
| +    touch_device_to_display_map_[touch_device_id] = display_id; | 
| +} | 
| + | 
| +int64 DeviceDataManager::GetDisplayForTouchDevice(int touch_device_id) { | 
| +  if (touch_device_id > 0 && touch_device_id < kMaxDeviceNum) | 
| +    return touch_device_to_display_map_[touch_device_id]; | 
| +  else | 
| +    return gfx::Display::kInvalidDisplayID; | 
| +} | 
| + | 
| void DeviceDataManager::SetDeviceListForTest( | 
| const std::vector<unsigned int>& touchscreen, | 
| const std::vector<unsigned int>& cmt_devices) { | 
|  |