diff options
author | dnicoara <dnicoara@chromium.org> | 2014-11-07 11:56:14 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-11-07 19:56:33 +0000 |
commit | 287f36714b0a985aa463b3194e4ed57dae4fa6ec (patch) | |
tree | 3178ada645cd6de4f478f655a43d25f1e30ebff5 /athena | |
parent | cad5a674fe07d08bb8a775da0cb2a555eb796e6e (diff) | |
download | chromium_src-287f36714b0a985aa463b3194e4ed57dae4fa6ec.zip chromium_src-287f36714b0a985aa463b3194e4ed57dae4fa6ec.tar.gz chromium_src-287f36714b0a985aa463b3194e4ed57dae4fa6ec.tar.bz2 |
[Athena] Map displays to touchscreens
In order to support different modes and different multi-monitor
configurations Ozone will no longer match the touchscreen to the primary
display. Instead Ozone relies on the display manager to setup the mapping
correctly.
BUG=none
Review URL: https://codereview.chromium.org/682093003
Cr-Commit-Position: refs/heads/master@{#303276}
Diffstat (limited to 'athena')
-rw-r--r-- | athena/env/DEPS | 1 | ||||
-rw-r--r-- | athena/env/athena_env_impl.cc | 84 |
2 files changed, 84 insertions, 1 deletions
diff --git a/athena/env/DEPS b/athena/env/DEPS index bcac64e..82dec51 100644 --- a/athena/env/DEPS +++ b/athena/env/DEPS @@ -4,6 +4,7 @@ include_rules = [ "+ui/base", "+ui/chromeos", "+ui/display", + "+ui/events/devices", "+ui/gfx", "+ui/wm", ] diff --git a/athena/env/athena_env_impl.cc b/athena/env/athena_env_impl.cc index 326b950..6b5975d 100644 --- a/athena/env/athena_env_impl.cc +++ b/athena/env/athena_env_impl.cc @@ -22,6 +22,9 @@ #include "ui/display/chromeos/display_configurator.h" #include "ui/display/types/display_mode.h" #include "ui/display/types/display_snapshot.h" +#include "ui/events/devices/device_data_manager.h" +#include "ui/events/devices/input_device_event_observer.h" +#include "ui/events/devices/touchscreen_device.h" #include "ui/gfx/screen.h" #include "ui/wm/core/compound_event_filter.h" #include "ui/wm/core/cursor_manager.h" @@ -39,6 +42,48 @@ AthenaEnv* instance = nullptr; // Screen object used during shutdown. gfx::Screen* screen_for_shutdown = nullptr; +gfx::Transform GetTouchTransform(const ui::DisplaySnapshot& display, + const ui::TouchscreenDevice& touchscreen, + const gfx::SizeF& framebuffer_size) { + if (!display.current_mode()) + return gfx::Transform(); + + gfx::SizeF display_size = display.current_mode()->size(); +#if defined(USE_X11) + gfx::SizeF touchscreen_size = framebuffer_size; +#elif defined(USE_OZONE) + gfx::SizeF touchscreen_size = touchscreen.size; +#endif + + if (display_size.IsEmpty() || touchscreen_size.IsEmpty()) + return gfx::Transform(); + + gfx::Transform transform; + transform.Scale(display_size.width() / touchscreen_size.width(), + display_size.height() / touchscreen_size.height()); + + return transform; +} + +double GetTouchRadiusScale(const ui::DisplaySnapshot& display, + const ui::TouchscreenDevice& touchscreen, + const gfx::SizeF& framebuffer_size) { + if (!display.current_mode()) + return 1; + + gfx::SizeF display_size = display.current_mode()->size(); +#if defined(USE_X11) + gfx::SizeF touchscreen_size = framebuffer_size; +#elif defined(USE_OZONE) + gfx::SizeF touchscreen_size = touchscreen.size; +#endif + + if (display_size.IsEmpty() || touchscreen_size.IsEmpty()) + return 1; + + return std::sqrt(display_size.GetArea() / touchscreen_size.GetArea()); +} + // TODO(flackr:oshima): Remove this once athena switches to share // ash::DisplayManager. class ScreenForShutdown : public gfx::Screen { @@ -152,13 +197,16 @@ class AthenaNativeCursorManager : public wm::NativeCursorManager { class AthenaEnvImpl : public AthenaEnv, public aura::WindowTreeHostObserver, - public ui::DisplayConfigurator::Observer { + public ui::DisplayConfigurator::Observer, + public ui::InputDeviceEventObserver { public: AthenaEnvImpl() : display_configurator_(new ui::DisplayConfigurator) { display_configurator_->Init(false); display_configurator_->ForceInitialConfigure(0); display_configurator_->AddObserver(this); + ui::DeviceDataManager::GetInstance()->AddObserver(this); + gfx::Size screen_size = GetPrimaryDisplaySize(); if (screen_size.IsEmpty()) { // TODO(oshima): Remove this hack. @@ -234,6 +282,8 @@ class AthenaEnvImpl : public AthenaEnv, screen_.reset(); aura::Env::DeleteInstance(); + ui::DeviceDataManager::GetInstance()->RemoveObserver(this); + display_configurator_->RemoveObserver(this); display_configurator_.reset(); } @@ -286,11 +336,20 @@ class AthenaEnvImpl : public AthenaEnv, void OnDisplayModeChanged( const std::vector<ui::DisplayConfigurator::DisplayState>& displays) override { + MapTouchscreenToDisplay(); + gfx::Size size = GetPrimaryDisplaySize(); if (!size.IsEmpty()) host_->UpdateRootWindowSize(size); } + // ui::InputDeviceEventObserver: + void OnTouchscreenDeviceConfigurationChanged() override { + MapTouchscreenToDisplay(); + } + + void OnKeyboardDeviceConfigurationChanged() override {} + // aura::WindowTreeHostObserver: void OnHostCloseRequested(const aura::WindowTreeHost* host) override { base::MessageLoopForUI::current()->PostTask( @@ -306,6 +365,29 @@ class AthenaEnvImpl : public AthenaEnv, return mode ? mode->size() : gfx::Size(); } + void MapTouchscreenToDisplay() const { + auto device_manager = ui::DeviceDataManager::GetInstance(); + auto displays = display_configurator_->cached_displays(); + auto touchscreens = device_manager->touchscreen_devices(); + + if (displays.empty() || touchscreens.empty()) + return; + + gfx::SizeF framebuffer_size = display_configurator_->framebuffer_size(); + device_manager->ClearTouchTransformerRecord(); + device_manager->UpdateTouchInfoForDisplay( + displays[0].display->display_id(), + touchscreens[0].id, + GetTouchTransform(*displays[0].display, + touchscreens[0], + framebuffer_size)); + device_manager->UpdateTouchRadiusScale( + touchscreens[0].id, + GetTouchRadiusScale(*displays[0].display, + touchscreens[0], + framebuffer_size)); + } + scoped_ptr<aura::TestScreen> screen_; scoped_ptr<aura::WindowTreeHost> host_; |