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

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"
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 TouchTransformerController::TouchTransformerController() { 119 TouchTransformerController::TouchTransformerController() {
120 Shell::GetInstance()->display_controller()->AddObserver(this); 120 Shell::GetInstance()->display_controller()->AddObserver(this);
121 } 121 }
122 122
123 TouchTransformerController::~TouchTransformerController() { 123 TouchTransformerController::~TouchTransformerController() {
124 Shell::GetInstance()->display_controller()->RemoveObserver(this); 124 Shell::GetInstance()->display_controller()->RemoveObserver(this);
125 } 125 }
126 126
127 void TouchTransformerController::UpdateTouchTransformer() const { 127 void TouchTransformerController::UpdateTouchTransformer() const {
128 ui::DeviceDataManager* device_manager = ui::DeviceDataManager::GetInstance(); 128 ui::DeviceDataManager* device_manager = ui::DeviceDataManager::GetInstance();
129 device_manager->ClearTouchTransformerRecord(); 129 device_manager->ClearTouchDeviceAssociations();
130 130
131 // Display IDs and DisplayInfo for mirror or extended mode. 131 // Display IDs and DisplayInfo for mirror or extended mode.
132 int64 display1_id = gfx::Display::kInvalidDisplayID; 132 int64 display1_id = gfx::Display::kInvalidDisplayID;
133 int64 display2_id = gfx::Display::kInvalidDisplayID; 133 int64 display2_id = gfx::Display::kInvalidDisplayID;
134 DisplayInfo display1; 134 DisplayInfo display1;
135 DisplayInfo display2; 135 DisplayInfo display2;
136 // Display ID and DisplayInfo for single display mode. 136 // Display ID and DisplayInfo for single display mode.
137 int64 single_display_id = gfx::Display::kInvalidDisplayID; 137 int64 single_display_id = gfx::Display::kInvalidDisplayID;
138 DisplayInfo single_display; 138 DisplayInfo single_display;
139 139
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 single_display.touch_device_id(), 171 single_display.touch_device_id(),
172 GetTouchResolutionScale( 172 GetTouchResolutionScale(
173 single_display, 173 single_display,
174 FindTouchscreenById(single_display.touch_device_id()))); 174 FindTouchscreenById(single_display.touch_device_id())));
175 } 175 }
176 176
177 gfx::Size fb_size = 177 gfx::Size fb_size =
178 Shell::GetInstance()->display_configurator()->framebuffer_size(); 178 Shell::GetInstance()->display_configurator()->framebuffer_size();
179 179
180 if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR) { 180 if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_MIRROR) {
181 // In mirror mode, both displays share the same root window so 181 // In mirror mode, there is just one WindowTreeHost and two displays. Make
182 // both display ids are associated with the root window. 182 // the WindowTreeHost accept touch events from both displays.
183 aura::Window* root = display_controller->GetPrimaryRootWindow(); 183 int64 primary_display_id = display_controller->GetPrimaryDisplayId();
184 RootWindowController::ForWindow(root)->ash_host()->UpdateDisplayID(
185 display1_id, display2_id);
186 device_manager->UpdateTouchInfoForDisplay( 184 device_manager->UpdateTouchInfoForDisplay(
187 display1_id, display1.touch_device_id(), 185 primary_display_id, display1.touch_device_id(),
188 GetTouchTransform(display1, display1, 186 GetTouchTransform(display1, display1,
189 FindTouchscreenById(display1.touch_device_id()), 187 FindTouchscreenById(display1.touch_device_id()),
190 fb_size)); 188 fb_size));
191 device_manager->UpdateTouchInfoForDisplay( 189 device_manager->UpdateTouchInfoForDisplay(
192 display2_id, display2.touch_device_id(), 190 primary_display_id, display2.touch_device_id(),
193 GetTouchTransform(display2, display2, 191 GetTouchTransform(display2, display2,
194 FindTouchscreenById(display2.touch_device_id()), 192 FindTouchscreenById(display2.touch_device_id()),
195 fb_size)); 193 fb_size));
196 return; 194 return;
197 } 195 }
198 196
199 if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED) { 197 if (display_state == ui::MULTIPLE_DISPLAY_STATE_DUAL_EXTENDED) {
200 // In extended but software mirroring mode, ther is only one X root window 198 // In extended but software mirroring mode, there is a WindowTreeHost for
201 // that associates with both displays. 199 // each display, but all touches are forwarded to the primary root window's
200 // WindowTreeHost.
202 if (GetDisplayManager()->software_mirroring_enabled()) { 201 if (GetDisplayManager()->software_mirroring_enabled()) {
203 aura::Window* root = display_controller->GetPrimaryRootWindow(); 202 DisplayInfo target_display =
204 RootWindowController::ForWindow(root)->ash_host()->UpdateDisplayID(
205 display1_id, display2_id);
206 DisplayInfo source_display =
207 display_controller->GetPrimaryDisplayId() == display1_id ? display1 203 display_controller->GetPrimaryDisplayId() == display1_id ? display1
208 : display2; 204 : display2;
209 // Mapping from framebuffer size to the source display's native
210 // resolution.
211 device_manager->UpdateTouchInfoForDisplay( 205 device_manager->UpdateTouchInfoForDisplay(
212 display1_id, display1.touch_device_id(), 206 target_display.id(), display1.touch_device_id(),
213 GetTouchTransform(source_display, display1, 207 GetTouchTransform(target_display, display1,
214 FindTouchscreenById(display1.touch_device_id()), 208 FindTouchscreenById(display1.touch_device_id()),
215 fb_size)); 209 fb_size));
216 device_manager->UpdateTouchInfoForDisplay( 210 device_manager->UpdateTouchInfoForDisplay(
217 display2_id, display2.touch_device_id(), 211 target_display.id(), display2.touch_device_id(),
218 GetTouchTransform(source_display, display2, 212 GetTouchTransform(target_display, display2,
219 FindTouchscreenById(display2.touch_device_id()), 213 FindTouchscreenById(display2.touch_device_id()),
220 fb_size)); 214 fb_size));
221 } else { 215 } else {
222 // In actual extended mode, each display is associated with one root 216 // In actual extended mode, each display is associated with one
223 // window. 217 // 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.
233 device_manager->UpdateTouchInfoForDisplay( 218 device_manager->UpdateTouchInfoForDisplay(
234 display1_id, display1.touch_device_id(), 219 display1_id, display1.touch_device_id(),
235 GetTouchTransform(display1, display1, 220 GetTouchTransform(display1, display1,
236 FindTouchscreenById(display1.touch_device_id()), 221 FindTouchscreenById(display1.touch_device_id()),
237 fb_size)); 222 fb_size));
238 device_manager->UpdateTouchInfoForDisplay( 223 device_manager->UpdateTouchInfoForDisplay(
239 display2_id, display2.touch_device_id(), 224 display2_id, display2.touch_device_id(),
240 GetTouchTransform(display2, display2, 225 GetTouchTransform(display2, display2,
241 FindTouchscreenById(display2.touch_device_id()), 226 FindTouchscreenById(display2.touch_device_id()),
242 fb_size)); 227 fb_size));
243 } 228 }
244 return; 229 return;
245 } 230 }
246 231
247 // Single display mode. The root window has one associated display id. 232 // 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( 233 device_manager->UpdateTouchInfoForDisplay(
253 single_display_id, single_display.touch_device_id(), 234 single_display_id, single_display.touch_device_id(),
254 GetTouchTransform(single_display, single_display, 235 GetTouchTransform(single_display, single_display,
255 FindTouchscreenById(single_display.touch_device_id()), 236 FindTouchscreenById(single_display.touch_device_id()),
256 fb_size)); 237 fb_size));
257 } 238 }
258 239
259 void TouchTransformerController::OnDisplaysInitialized() { 240 void TouchTransformerController::OnDisplaysInitialized() {
260 UpdateTouchTransformer(); 241 UpdateTouchTransformer();
261 } 242 }
262 243
263 void TouchTransformerController::OnDisplayConfigurationChanged() { 244 void TouchTransformerController::OnDisplayConfigurationChanged() {
264 UpdateTouchTransformer(); 245 UpdateTouchTransformer();
265 } 246 }
266 247
267 } // namespace ash 248 } // namespace ash
OLDNEW
« no previous file with comments | « ash/host/ash_window_tree_host_x11.cc ('k') | ash/touch/touch_transformer_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698