Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Side by Side Diff: ash/touch/touch_transformer_controller.cc

Issue 922843002: Fix software mirror mode on Ozone part 2/2 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698