| 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 "ash/touch/touch_transformer_controller.h" | 5 #include "ash/touch/touch_transformer_controller.h" |
| 6 | 6 |
| 7 #include "ash/display/display_controller.h" | 7 #include "ash/display/display_controller.h" |
| 8 #include "ash/display/display_manager.h" | 8 #include "ash/display/display_manager.h" |
| 9 #include "ash/host/ash_window_tree_host.h" | 9 #include "ash/host/ash_window_tree_host.h" |
| 10 #include "ash/root_window_controller.h" | 10 #include "ash/root_window_controller.h" |
| 11 #include "ash/shell.h" | 11 #include "ash/shell.h" |
| 12 #include "ui/aura/window_tree_host.h" | 12 #include "ui/aura/window_tree_host.h" |
| 13 #include "ui/display/chromeos/display_configurator.h" | 13 #include "ui/display/chromeos/display_configurator.h" |
| 14 #include "ui/display/types/display_snapshot.h" | 14 #include "ui/display/types/display_snapshot.h" |
| 15 #include "ui/events/devices/device_data_manager.h" | 15 #include "ui/events/devices/device_data_manager.h" |
| 16 | 16 |
| 17 namespace ash { | 17 namespace ash { |
| 18 | 18 |
| 19 namespace { | 19 namespace { |
| 20 | 20 |
| 21 DisplayManager* GetDisplayManager() { | |
| 22 return Shell::GetInstance()->display_manager(); | |
| 23 } | |
| 24 | |
| 25 ui::TouchscreenDevice FindTouchscreenById(unsigned int id) { | 21 ui::TouchscreenDevice FindTouchscreenById(unsigned int id) { |
| 26 const std::vector<ui::TouchscreenDevice>& touchscreens = | 22 const std::vector<ui::TouchscreenDevice>& touchscreens = |
| 27 ui::DeviceDataManager::GetInstance()->touchscreen_devices(); | 23 ui::DeviceDataManager::GetInstance()->touchscreen_devices(); |
| 28 for (const auto& touchscreen : touchscreens) { | 24 for (const auto& touchscreen : touchscreens) { |
| 29 if (touchscreen.id == id) | 25 if (touchscreen.id == id) |
| 30 return touchscreen; | 26 return touchscreen; |
| 31 } | 27 } |
| 32 | 28 |
| 33 return ui::TouchscreenDevice(); | 29 return ui::TouchscreenDevice(); |
| 34 } | 30 } |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 TouchTransformerController::TouchTransformerController() { | 115 TouchTransformerController::TouchTransformerController() { |
| 120 Shell::GetInstance()->display_controller()->AddObserver(this); | 116 Shell::GetInstance()->display_controller()->AddObserver(this); |
| 121 } | 117 } |
| 122 | 118 |
| 123 TouchTransformerController::~TouchTransformerController() { | 119 TouchTransformerController::~TouchTransformerController() { |
| 124 Shell::GetInstance()->display_controller()->RemoveObserver(this); | 120 Shell::GetInstance()->display_controller()->RemoveObserver(this); |
| 125 } | 121 } |
| 126 | 122 |
| 127 void TouchTransformerController::UpdateTouchTransformer() const { | 123 void TouchTransformerController::UpdateTouchTransformer() const { |
| 128 ui::DeviceDataManager* device_manager = ui::DeviceDataManager::GetInstance(); | 124 ui::DeviceDataManager* device_manager = ui::DeviceDataManager::GetInstance(); |
| 129 device_manager->ClearTouchTransformerRecord(); | 125 device_manager->ClearTouchDeviceAssociations(); |
| 130 | 126 |
| 131 // Display IDs and DisplayInfo for mirror or extended mode. | 127 // Display IDs and DisplayInfo for mirror or extended mode. |
| 132 int64 display1_id = gfx::Display::kInvalidDisplayID; | 128 int64 display1_id = gfx::Display::kInvalidDisplayID; |
| 133 int64 display2_id = gfx::Display::kInvalidDisplayID; | 129 int64 display2_id = gfx::Display::kInvalidDisplayID; |
| 134 DisplayInfo display1; | 130 DisplayInfo display1; |
| 135 DisplayInfo display2; | 131 DisplayInfo display2; |
| 136 // Display ID and DisplayInfo for single display mode. | 132 // Display ID and DisplayInfo for single display mode. |
| 137 int64 single_display_id = gfx::Display::kInvalidDisplayID; | 133 int64 single_display_id = gfx::Display::kInvalidDisplayID; |
| 138 DisplayInfo single_display; | 134 DisplayInfo single_display; |
| 139 | 135 |
| 140 DisplayController* display_controller = | 136 DisplayController* display_controller = |
| 141 Shell::GetInstance()->display_controller(); | 137 Shell::GetInstance()->display_controller(); |
| 138 DisplayManager* display_manager = Shell::GetInstance()->display_manager(); |
| 139 |
| 142 ui::MultipleDisplayState display_state = | 140 ui::MultipleDisplayState display_state = |
| 143 Shell::GetInstance()->display_configurator()->display_state(); | 141 Shell::GetInstance()->display_configurator()->display_state(); |
| 144 if (display_state == ui::MULTIPLE_DISPLAY_STATE_INVALID || | 142 if (display_state == ui::MULTIPLE_DISPLAY_STATE_INVALID || |
| 145 display_state == ui::MULTIPLE_DISPLAY_STATE_HEADLESS) { | 143 display_state == ui::MULTIPLE_DISPLAY_STATE_HEADLESS) { |
| 146 return; | 144 return; |
| 147 } else if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR || | 145 } else if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR || |
| 148 display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED) { | 146 display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED) { |
| 149 DisplayIdPair id_pair = GetDisplayManager()->GetCurrentDisplayIdPair(); | 147 DisplayIdPair id_pair = display_manager->GetCurrentDisplayIdPair(); |
| 150 display1_id = id_pair.first; | 148 display1_id = id_pair.first; |
| 151 display2_id = id_pair.second; | 149 display2_id = id_pair.second; |
| 152 DCHECK(display1_id != gfx::Display::kInvalidDisplayID && | 150 DCHECK(display1_id != gfx::Display::kInvalidDisplayID && |
| 153 display2_id != gfx::Display::kInvalidDisplayID); | 151 display2_id != gfx::Display::kInvalidDisplayID); |
| 154 display1 = GetDisplayManager()->GetDisplayInfo(display1_id); | 152 display1 = display_manager->GetDisplayInfo(display1_id); |
| 155 display2 = GetDisplayManager()->GetDisplayInfo(display2_id); | 153 display2 = display_manager->GetDisplayInfo(display2_id); |
| 156 device_manager->UpdateTouchRadiusScale( | 154 device_manager->UpdateTouchRadiusScale( |
| 157 display1.touch_device_id(), | 155 display1.touch_device_id(), |
| 158 GetTouchResolutionScale( | 156 GetTouchResolutionScale( |
| 159 display1, | 157 display1, |
| 160 FindTouchscreenById(display1.touch_device_id()))); | 158 FindTouchscreenById(display1.touch_device_id()))); |
| 161 device_manager->UpdateTouchRadiusScale( | 159 device_manager->UpdateTouchRadiusScale( |
| 162 display2.touch_device_id(), | 160 display2.touch_device_id(), |
| 163 GetTouchResolutionScale( | 161 GetTouchResolutionScale( |
| 164 display2, | 162 display2, |
| 165 FindTouchscreenById(display2.touch_device_id()))); | 163 FindTouchscreenById(display2.touch_device_id()))); |
| 166 } else { | 164 } else { |
| 167 single_display_id = GetDisplayManager()->first_display_id(); | 165 single_display_id = display_manager->first_display_id(); |
| 168 DCHECK(single_display_id != gfx::Display::kInvalidDisplayID); | 166 DCHECK(single_display_id != gfx::Display::kInvalidDisplayID); |
| 169 single_display = GetDisplayManager()->GetDisplayInfo(single_display_id); | 167 single_display = display_manager->GetDisplayInfo(single_display_id); |
| 170 device_manager->UpdateTouchRadiusScale( | 168 device_manager->UpdateTouchRadiusScale( |
| 171 single_display.touch_device_id(), | 169 single_display.touch_device_id(), |
| 172 GetTouchResolutionScale( | 170 GetTouchResolutionScale( |
| 173 single_display, | 171 single_display, |
| 174 FindTouchscreenById(single_display.touch_device_id()))); | 172 FindTouchscreenById(single_display.touch_device_id()))); |
| 175 } | 173 } |
| 176 | 174 |
| 177 gfx::Size fb_size = | 175 gfx::Size fb_size = |
| 178 Shell::GetInstance()->display_configurator()->framebuffer_size(); | 176 Shell::GetInstance()->display_configurator()->framebuffer_size(); |
| 179 | 177 |
| 180 if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR) { | 178 if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR) { |
| 181 // In mirror mode, both displays share the same root window so | 179 // In mirror mode, there is just one WindowTreeHost and two displays. Make |
| 182 // both display ids are associated with the root window. | 180 // the WindowTreeHost accept touch events from both displays. |
| 183 aura::Window* root = display_controller->GetPrimaryRootWindow(); | |
| 184 RootWindowController::ForWindow(root)->ash_host()->UpdateDisplayID( | |
| 185 display1_id, display2_id); | |
| 186 device_manager->UpdateTouchInfoForDisplay( | 181 device_manager->UpdateTouchInfoForDisplay( |
| 187 display1_id, display1.touch_device_id(), | 182 display_manager->GetDisplayForId(display1_id), |
| 183 display1.touch_device_id(), |
| 188 GetTouchTransform(display1, display1, | 184 GetTouchTransform(display1, display1, |
| 189 FindTouchscreenById(display1.touch_device_id()), | 185 FindTouchscreenById(display1.touch_device_id()), |
| 190 fb_size)); | 186 fb_size)); |
| 191 device_manager->UpdateTouchInfoForDisplay( | 187 device_manager->UpdateTouchInfoForDisplay( |
| 192 display2_id, display2.touch_device_id(), | 188 display_manager->GetDisplayForId(display2_id), |
| 189 display2.touch_device_id(), |
| 193 GetTouchTransform(display2, display2, | 190 GetTouchTransform(display2, display2, |
| 194 FindTouchscreenById(display2.touch_device_id()), | 191 FindTouchscreenById(display2.touch_device_id()), |
| 195 fb_size)); | 192 fb_size)); |
| 196 return; | 193 return; |
| 197 } | 194 } |
| 198 | 195 |
| 199 if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED) { | 196 if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED) { |
| 200 // In extended but software mirroring mode, ther is only one X root window | 197 // In extended but software mirroring mode, there is a WindowTreeHost for |
| 201 // that associates with both displays. | 198 // each display, but all touches are forwarded to the primary root window's |
| 202 if (GetDisplayManager()->software_mirroring_enabled()) { | 199 // WindowTreeHost. |
| 203 aura::Window* root = display_controller->GetPrimaryRootWindow(); | 200 if (display_manager->software_mirroring_enabled()) { |
| 204 RootWindowController::ForWindow(root)->ash_host()->UpdateDisplayID( | |
| 205 display1_id, display2_id); | |
| 206 DisplayInfo source_display = | 201 DisplayInfo source_display = |
| 207 display_controller->GetPrimaryDisplayId() == display1_id ? display1 | 202 display_controller->GetPrimaryDisplayId() == display1_id ? display1 |
| 208 : display2; | 203 : display2; |
| 209 // Mapping from framebuffer size to the source display's native | 204 // Mapping from framebuffer size to the source display's native |
| 210 // resolution. | 205 // resolution. |
| 211 device_manager->UpdateTouchInfoForDisplay( | 206 device_manager->UpdateTouchInfoForDisplay( |
| 212 display1_id, display1.touch_device_id(), | 207 display_manager->GetDisplayForId(display1_id), |
| 208 display1.touch_device_id(), |
| 213 GetTouchTransform(source_display, display1, | 209 GetTouchTransform(source_display, display1, |
| 214 FindTouchscreenById(display1.touch_device_id()), | 210 FindTouchscreenById(display1.touch_device_id()), |
| 215 fb_size)); | 211 fb_size)); |
| 216 device_manager->UpdateTouchInfoForDisplay( | 212 device_manager->UpdateTouchInfoForDisplay( |
| 217 display2_id, display2.touch_device_id(), | 213 display_manager->GetDisplayForId(display2_id), |
| 214 display2.touch_device_id(), |
| 218 GetTouchTransform(source_display, display2, | 215 GetTouchTransform(source_display, display2, |
| 219 FindTouchscreenById(display2.touch_device_id()), | 216 FindTouchscreenById(display2.touch_device_id()), |
| 220 fb_size)); | 217 fb_size)); |
| 221 } else { | 218 } else { |
| 222 // In actual extended mode, each display is associated with one root | 219 // In actual extended mode, each display is associated with one |
| 223 // window. | 220 // WindowTreeHost. |
| 224 aura::Window* root1 = | |
| 225 display_controller->GetRootWindowForDisplayId(display1_id); | |
| 226 aura::Window* root2 = | |
| 227 display_controller->GetRootWindowForDisplayId(display2_id); | |
| 228 RootWindowController::ForWindow(root1)->ash_host()->UpdateDisplayID( | |
| 229 display1_id, gfx::Display::kInvalidDisplayID); | |
| 230 RootWindowController::ForWindow(root2)->ash_host()->UpdateDisplayID( | |
| 231 display2_id, gfx::Display::kInvalidDisplayID); | |
| 232 // Mapping from framebuffer size to each display's native resolution. | 221 // Mapping from framebuffer size to each display's native resolution. |
| 233 device_manager->UpdateTouchInfoForDisplay( | 222 device_manager->UpdateTouchInfoForDisplay( |
| 234 display1_id, display1.touch_device_id(), | 223 display_manager->GetDisplayForId(display1_id), |
| 224 display1.touch_device_id(), |
| 235 GetTouchTransform(display1, display1, | 225 GetTouchTransform(display1, display1, |
| 236 FindTouchscreenById(display1.touch_device_id()), | 226 FindTouchscreenById(display1.touch_device_id()), |
| 237 fb_size)); | 227 fb_size)); |
| 238 device_manager->UpdateTouchInfoForDisplay( | 228 device_manager->UpdateTouchInfoForDisplay( |
| 239 display2_id, display2.touch_device_id(), | 229 display_manager->GetDisplayForId(display2_id), |
| 230 display2.touch_device_id(), |
| 240 GetTouchTransform(display2, display2, | 231 GetTouchTransform(display2, display2, |
| 241 FindTouchscreenById(display2.touch_device_id()), | 232 FindTouchscreenById(display2.touch_device_id()), |
| 242 fb_size)); | 233 fb_size)); |
| 243 } | 234 } |
| 244 return; | 235 return; |
| 245 } | 236 } |
| 246 | 237 |
| 247 // Single display mode. The root window has one associated display id. | 238 // Single display mode. The WindowTreeHost has one associated display id. |
| 248 aura::Window* root = | |
| 249 display_controller->GetRootWindowForDisplayId(single_display.id()); | |
| 250 RootWindowController::ForWindow(root)->ash_host()->UpdateDisplayID( | |
| 251 single_display.id(), gfx::Display::kInvalidDisplayID); | |
| 252 device_manager->UpdateTouchInfoForDisplay( | 239 device_manager->UpdateTouchInfoForDisplay( |
| 253 single_display_id, single_display.touch_device_id(), | 240 display_manager->GetDisplayForId(single_display_id), |
| 241 single_display.touch_device_id(), |
| 254 GetTouchTransform(single_display, single_display, | 242 GetTouchTransform(single_display, single_display, |
| 255 FindTouchscreenById(single_display.touch_device_id()), | 243 FindTouchscreenById(single_display.touch_device_id()), |
| 256 fb_size)); | 244 fb_size)); |
| 257 } | 245 } |
| 258 | 246 |
| 259 void TouchTransformerController::OnDisplaysInitialized() { | 247 void TouchTransformerController::OnDisplaysInitialized() { |
| 260 UpdateTouchTransformer(); | 248 UpdateTouchTransformer(); |
| 261 } | 249 } |
| 262 | 250 |
| 263 void TouchTransformerController::OnDisplayConfigurationChanged() { | 251 void TouchTransformerController::OnDisplayConfigurationChanged() { |
| 264 UpdateTouchTransformer(); | 252 UpdateTouchTransformer(); |
| 265 } | 253 } |
| 266 | 254 |
| 267 } // namespace ash | 255 } // namespace ash |
| OLD | NEW |