| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/display/manager/chromeos/touch_transform_controller.h" | 5 #include "ui/display/manager/chromeos/touch_transform_controller.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "third_party/skia/include/core/SkMatrix44.h" | 10 #include "third_party/skia/include/core/SkMatrix44.h" |
| 11 #include "ui/display/display_layout.h" | 11 #include "ui/display/display_layout.h" |
| 12 #include "ui/display/manager/chromeos/display_configurator.h" | 12 #include "ui/display/manager/chromeos/display_configurator.h" |
| 13 #include "ui/display/manager/chromeos/touch_device_transform.h" |
| 14 #include "ui/display/manager/chromeos/touch_transform_setter.h" |
| 13 #include "ui/display/manager/display_manager.h" | 15 #include "ui/display/manager/display_manager.h" |
| 14 #include "ui/display/manager/managed_display_info.h" | 16 #include "ui/display/manager/managed_display_info.h" |
| 15 #include "ui/display/screen.h" | 17 #include "ui/display/screen.h" |
| 16 #include "ui/display/types/display_constants.h" | 18 #include "ui/display/types/display_constants.h" |
| 17 #include "ui/display/types/display_snapshot.h" | 19 #include "ui/display/types/display_snapshot.h" |
| 18 #include "ui/events/devices/device_data_manager.h" | 20 #include "ui/events/devices/input_device_manager.h" |
| 19 | 21 |
| 20 namespace display { | 22 namespace display { |
| 21 | 23 |
| 22 namespace { | 24 namespace { |
| 23 | 25 |
| 24 ui::TouchscreenDevice FindTouchscreenById(int id) { | 26 ui::TouchscreenDevice FindTouchscreenById(int id) { |
| 25 const std::vector<ui::TouchscreenDevice>& touchscreens = | 27 const std::vector<ui::TouchscreenDevice>& touchscreens = |
| 26 ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices(); | 28 ui::InputDeviceManager::GetInstance()->GetTouchscreenDevices(); |
| 27 for (const auto& touchscreen : touchscreens) { | 29 for (const auto& touchscreen : touchscreens) { |
| 28 if (touchscreen.id == id) | 30 if (touchscreen.id == id) |
| 29 return touchscreen; | 31 return touchscreen; |
| 30 } | 32 } |
| 31 | 33 |
| 32 return ui::TouchscreenDevice(); | 34 return ui::TouchscreenDevice(); |
| 33 } | 35 } |
| 34 | 36 |
| 35 // Given an array of touch point and display point pairs, this function computes | 37 // Given an array of touch point and display point pairs, this function computes |
| 36 // and returns the constants(defined below) using a least fit algorithm. | 38 // and returns the constants(defined below) using a least fit algorithm. |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 | 156 |
| 155 DisplayIdList GetCurrentDisplayIdList(const DisplayManager* display_manager) { | 157 DisplayIdList GetCurrentDisplayIdList(const DisplayManager* display_manager) { |
| 156 DCHECK(display_manager->num_connected_displays()); | 158 DCHECK(display_manager->num_connected_displays()); |
| 157 if (display_manager->num_connected_displays() == 1) | 159 if (display_manager->num_connected_displays() == 1) |
| 158 return DisplayIdList{display_manager->first_display_id()}; | 160 return DisplayIdList{display_manager->first_display_id()}; |
| 159 return display_manager->GetCurrentDisplayIdList(); | 161 return display_manager->GetCurrentDisplayIdList(); |
| 160 } | 162 } |
| 161 | 163 |
| 162 } // namespace | 164 } // namespace |
| 163 | 165 |
| 166 TouchTransformController::UpdateData::UpdateData() = default; |
| 167 |
| 168 TouchTransformController::UpdateData::~UpdateData() = default; |
| 169 |
| 164 // This is to compute the scale ratio for the TouchEvent's radius. The | 170 // This is to compute the scale ratio for the TouchEvent's radius. The |
| 165 // configured resolution of the display is not always the same as the touch | 171 // configured resolution of the display is not always the same as the touch |
| 166 // screen's reporting resolution, e.g. the display could be set as | 172 // screen's reporting resolution, e.g. the display could be set as |
| 167 // 1920x1080 while the touchscreen is reporting touch position range at | 173 // 1920x1080 while the touchscreen is reporting touch position range at |
| 168 // 32767x32767. Touch radius is reported in the units the same as touch position | 174 // 32767x32767. Touch radius is reported in the units the same as touch position |
| 169 // so we need to scale the touch radius to be compatible with the display's | 175 // so we need to scale the touch radius to be compatible with the display's |
| 170 // resolution. We compute the scale as | 176 // resolution. We compute the scale as |
| 171 // sqrt of (display_area / touchscreen_area) | 177 // sqrt of (display_area / touchscreen_area) |
| 172 double TouchTransformController::GetTouchResolutionScale( | 178 double TouchTransformController::GetTouchResolutionScale( |
| 173 const ManagedDisplayInfo& touch_display, | 179 const ManagedDisplayInfo& touch_display, |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 return GetUncalibratedTransform(ctm, display, touch_display, touch_area, | 282 return GetUncalibratedTransform(ctm, display, touch_display, touch_area, |
| 277 touch_native_size); | 283 touch_native_size); |
| 278 } | 284 } |
| 279 | 285 |
| 280 stored_ctm.ConcatTransform(ctm); | 286 stored_ctm.ConcatTransform(ctm); |
| 281 return stored_ctm; | 287 return stored_ctm; |
| 282 } | 288 } |
| 283 | 289 |
| 284 TouchTransformController::TouchTransformController( | 290 TouchTransformController::TouchTransformController( |
| 285 DisplayConfigurator* display_configurator, | 291 DisplayConfigurator* display_configurator, |
| 286 DisplayManager* display_manager) | 292 DisplayManager* display_manager, |
| 293 std::unique_ptr<TouchTransformSetter> setter) |
| 287 : display_configurator_(display_configurator), | 294 : display_configurator_(display_configurator), |
| 288 display_manager_(display_manager) {} | 295 display_manager_(display_manager), |
| 296 setter_(std::move(setter)) {} |
| 289 | 297 |
| 290 TouchTransformController::~TouchTransformController() {} | 298 TouchTransformController::~TouchTransformController() {} |
| 291 | 299 |
| 300 void TouchTransformController::UpdateTouchTransforms() const { |
| 301 UpdateData update_data; |
| 302 UpdateTouchTransforms(&update_data); |
| 303 setter_->ConfigureTouchDevices(update_data.device_to_scale, |
| 304 update_data.touch_device_transforms); |
| 305 } |
| 306 |
| 292 void TouchTransformController::UpdateTouchRadius( | 307 void TouchTransformController::UpdateTouchRadius( |
| 293 const ManagedDisplayInfo& display) const { | 308 const ManagedDisplayInfo& display, |
| 294 ui::DeviceDataManager* device_manager = ui::DeviceDataManager::GetInstance(); | 309 UpdateData* update_data) const { |
| 295 for (const auto& device_id : display.input_devices()) { | 310 for (const auto& device_id : display.input_devices()) { |
| 296 device_manager->UpdateTouchRadiusScale( | 311 DCHECK_EQ(0u, update_data->device_to_scale.count(device_id)); |
| 297 device_id, | 312 update_data->device_to_scale[device_id] = |
| 298 GetTouchResolutionScale(display, FindTouchscreenById(device_id))); | 313 GetTouchResolutionScale(display, FindTouchscreenById(device_id)); |
| 299 } | 314 } |
| 300 } | 315 } |
| 301 | 316 |
| 302 void TouchTransformController::UpdateTouchTransform( | 317 void TouchTransformController::UpdateTouchTransform( |
| 303 int64_t target_display_id, | 318 int64_t target_display_id, |
| 304 const ManagedDisplayInfo& touch_display, | 319 const ManagedDisplayInfo& touch_display, |
| 305 const ManagedDisplayInfo& target_display) const { | 320 const ManagedDisplayInfo& target_display, |
| 306 ui::DeviceDataManager* device_manager = ui::DeviceDataManager::GetInstance(); | 321 UpdateData* update_data) const { |
| 322 TouchDeviceTransform touch_device_transform; |
| 323 touch_device_transform.display_id = target_display_id; |
| 307 gfx::Size fb_size = display_configurator_->framebuffer_size(); | 324 gfx::Size fb_size = display_configurator_->framebuffer_size(); |
| 308 for (const auto& device_id : touch_display.input_devices()) { | 325 for (const auto& device_id : touch_display.input_devices()) { |
| 309 device_manager->UpdateTouchInfoForDisplay( | 326 touch_device_transform.device_id = device_id; |
| 310 target_display_id, device_id, | 327 touch_device_transform.transform = GetTouchTransform( |
| 311 GetTouchTransform(target_display, touch_display, | 328 target_display, touch_display, FindTouchscreenById(device_id), fb_size); |
| 312 FindTouchscreenById(device_id), fb_size)); | 329 update_data->touch_device_transforms.push_back(touch_device_transform); |
| 313 } | 330 } |
| 314 } | 331 } |
| 315 | 332 |
| 316 void TouchTransformController::UpdateTouchTransforms() const { | 333 void TouchTransformController::UpdateTouchTransforms( |
| 317 ui::DeviceDataManager::GetInstance()->ClearTouchDeviceAssociations(); | 334 UpdateData* update_data) const { |
| 318 if (display_manager_->num_connected_displays() == 0) | 335 if (display_manager_->num_connected_displays() == 0) |
| 319 return; | 336 return; |
| 320 | 337 |
| 321 DisplayIdList display_id_list = GetCurrentDisplayIdList(display_manager_); | 338 DisplayIdList display_id_list = GetCurrentDisplayIdList(display_manager_); |
| 322 DCHECK(display_id_list.size()); | 339 DCHECK(display_id_list.size()); |
| 323 | 340 |
| 324 DisplayInfoList display_info_list; | 341 DisplayInfoList display_info_list; |
| 325 | 342 |
| 326 for (int64_t display_id : display_id_list) { | 343 for (int64_t display_id : display_id_list) { |
| 327 DCHECK(display_id != kInvalidDisplayId); | 344 DCHECK(display_id != kInvalidDisplayId); |
| 328 display_info_list.push_back(display_manager_->GetDisplayInfo(display_id)); | 345 display_info_list.push_back(display_manager_->GetDisplayInfo(display_id)); |
| 329 UpdateTouchRadius(display_info_list.back()); | 346 UpdateTouchRadius(display_info_list.back(), update_data); |
| 330 } | 347 } |
| 331 | 348 |
| 332 if (display_manager_->IsInMirrorMode()) { | 349 if (display_manager_->IsInMirrorMode()) { |
| 333 std::size_t primary_display_id_index = | 350 std::size_t primary_display_id_index = |
| 334 std::distance(display_id_list.begin(), | 351 std::distance(display_id_list.begin(), |
| 335 std::find(display_id_list.begin(), display_id_list.end(), | 352 std::find(display_id_list.begin(), display_id_list.end(), |
| 336 Screen::GetScreen()->GetPrimaryDisplay().id())); | 353 Screen::GetScreen()->GetPrimaryDisplay().id())); |
| 337 | 354 |
| 338 for (std::size_t index = 0; index < display_id_list.size(); index++) { | 355 for (std::size_t index = 0; index < display_id_list.size(); index++) { |
| 339 // In extended but software mirroring mode, there is a WindowTreeHost | 356 // In extended but software mirroring mode, there is a WindowTreeHost |
| 340 // for each display, but all touches are forwarded to the primary root | 357 // for each display, but all touches are forwarded to the primary root |
| 341 // window's WindowTreeHost. | 358 // window's WindowTreeHost. |
| 342 // In mirror mode, there is just one WindowTreeHost and two displays. | 359 // In mirror mode, there is just one WindowTreeHost and two displays. |
| 343 // Make the WindowTreeHost accept touch events from both displays. | 360 // Make the WindowTreeHost accept touch events from both displays. |
| 344 std::size_t touch_display_index = | 361 std::size_t touch_display_index = |
| 345 display_manager_->SoftwareMirroringEnabled() | 362 display_manager_->SoftwareMirroringEnabled() |
| 346 ? primary_display_id_index | 363 ? primary_display_id_index |
| 347 : index; | 364 : index; |
| 348 UpdateTouchTransform(display_id_list[primary_display_id_index], | 365 UpdateTouchTransform(display_id_list[primary_display_id_index], |
| 349 display_info_list[index], | 366 display_info_list[index], |
| 350 display_info_list[touch_display_index]); | 367 display_info_list[touch_display_index], update_data); |
| 351 } | 368 } |
| 352 return; | 369 return; |
| 353 } | 370 } |
| 354 | 371 |
| 355 for (std::size_t index = 0; index < display_id_list.size(); index++) { | 372 for (std::size_t index = 0; index < display_id_list.size(); index++) { |
| 356 UpdateTouchTransform(display_id_list[index], display_info_list[index], | 373 UpdateTouchTransform(display_id_list[index], display_info_list[index], |
| 357 display_info_list[index]); | 374 display_info_list[index], update_data); |
| 358 } | 375 } |
| 359 } | 376 } |
| 360 | 377 |
| 361 void TouchTransformController::SetForCalibration(bool is_calibrating) { | 378 void TouchTransformController::SetForCalibration(bool is_calibrating) { |
| 362 is_calibrating_ = is_calibrating; | 379 is_calibrating_ = is_calibrating; |
| 363 UpdateTouchTransforms(); | 380 UpdateTouchTransforms(); |
| 364 } | 381 } |
| 365 | 382 |
| 366 } // namespace display | 383 } // namespace display |
| OLD | NEW |