| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chromecast/browser/cast_touch_device_manager.h" |
| |
| #include "chromecast/graphics/cast_screen.h" |
| #include "ui/events/devices/device_data_manager.h" |
| #include "ui/events/devices/touchscreen_device.h" |
| #include "ui/gfx/geometry/rect_f.h" |
| #include "ui/gfx/geometry/size_f.h" |
| |
| namespace chromecast { |
| namespace shell { |
| namespace { |
| |
| ui::TouchDeviceTransform GetDeviceTransform( |
| const ui::TouchscreenDevice& touchscreen, |
| int64_t display_id, |
| display::Display::Rotation rotation, |
| const gfx::Rect& native_bounds_in_pixel) { |
| gfx::SizeF touchscreen_size = gfx::SizeF(touchscreen.size); |
| |
| ui::TouchDeviceTransform touch_device_transform; |
| touch_device_transform.display_id = display_id; |
| touch_device_transform.device_id = touchscreen.id; |
| touch_device_transform.transform.Translate(native_bounds_in_pixel.x(), |
| native_bounds_in_pixel.y()); |
| |
| touch_device_transform.transform.Scale( |
| native_bounds_in_pixel.width() / touchscreen_size.width(), |
| native_bounds_in_pixel.height() / touchscreen_size.height()); |
| |
| return touch_device_transform; |
| } |
| |
| } // namespace |
| |
| CastTouchDeviceManager::CastTouchDeviceManager() { |
| ui::DeviceDataManager::GetInstance()->AddObserver(this); |
| } |
| |
| CastTouchDeviceManager::~CastTouchDeviceManager() { |
| ui::DeviceDataManager::GetInstance()->RemoveObserver(this); |
| } |
| |
| void CastTouchDeviceManager::OnTouchscreenDeviceConfigurationChanged() { |
| UpdateTouchscreenConfiguration(); |
| } |
| |
| void CastTouchDeviceManager::OnDisplayConfigured( |
| int64_t display_id, |
| display::Display::Rotation rotation, |
| const gfx::Rect& native_bounds_in_pixel) { |
| display_id_ = display_id; |
| display_rotation_ = rotation; |
| native_display_bounds_in_pixel_ = native_bounds_in_pixel; |
| UpdateTouchscreenConfiguration(); |
| } |
| |
| void CastTouchDeviceManager::UpdateTouchscreenConfiguration() { |
| const std::vector<ui::TouchscreenDevice>& touchscreen_devices = |
| ui::DeviceDataManager::GetInstance()->GetTouchscreenDevices(); |
| if (native_display_bounds_in_pixel_ == gfx::Rect()) |
| return; // Waiting for display configuration. |
| std::vector<ui::TouchDeviceTransform> touch_device_transforms; |
| |
| // All touchscreens are mapped onto primary display. |
| for (const auto& touchscreen : touchscreen_devices) { |
| touch_device_transforms.push_back( |
| GetDeviceTransform(touchscreen, display_id_, display_rotation_, |
| native_display_bounds_in_pixel_)); |
| } |
| |
| ui::DeviceDataManager::GetInstance()->ConfigureTouchDevices( |
| touch_device_transforms); |
| } |
| |
| } // namespace shell |
| } // namespace chromecast |