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

Side by Side Diff: ash/display/display_controller.cc

Issue 224113005: Eliminate ash::internal namespace (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « ash/display/display_controller.h ('k') | ash/display/display_controller_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/display/display_controller.h" 5 #include "ash/display/display_controller.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <map> 9 #include <map>
10 10
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 // Specifies how long the display change should have been disabled 65 // Specifies how long the display change should have been disabled
66 // after each display change operations. 66 // after each display change operations.
67 // |kCycleDisplayThrottleTimeoutMs| is set to be longer to avoid 67 // |kCycleDisplayThrottleTimeoutMs| is set to be longer to avoid
68 // changing the settings while the system is still configurating 68 // changing the settings while the system is still configurating
69 // displays. It will be overriden by |kAfterDisplayChangeThrottleTimeoutMs| 69 // displays. It will be overriden by |kAfterDisplayChangeThrottleTimeoutMs|
70 // when the display change happens, so the actual timeout is much shorter. 70 // when the display change happens, so the actual timeout is much shorter.
71 const int64 kAfterDisplayChangeThrottleTimeoutMs = 500; 71 const int64 kAfterDisplayChangeThrottleTimeoutMs = 500;
72 const int64 kCycleDisplayThrottleTimeoutMs = 4000; 72 const int64 kCycleDisplayThrottleTimeoutMs = 4000;
73 const int64 kSwapDisplayThrottleTimeoutMs = 500; 73 const int64 kSwapDisplayThrottleTimeoutMs = 500;
74 74
75 internal::DisplayManager* GetDisplayManager() { 75 DisplayManager* GetDisplayManager() {
76 return Shell::GetInstance()->display_manager(); 76 return Shell::GetInstance()->display_manager();
77 } 77 }
78 78
79 void SetDisplayPropertiesOnHost(aura::WindowTreeHost* host, 79 void SetDisplayPropertiesOnHost(aura::WindowTreeHost* host,
80 const gfx::Display& display) { 80 const gfx::Display& display) {
81 internal::DisplayInfo info = 81 DisplayInfo info = GetDisplayManager()->GetDisplayInfo(display.id());
82 GetDisplayManager()->GetDisplayInfo(display.id());
83 #if defined(OS_CHROMEOS) && defined(USE_X11) 82 #if defined(OS_CHROMEOS) && defined(USE_X11)
84 // Native window property (Atom in X11) that specifies the display's 83 // Native window property (Atom in X11) that specifies the display's
85 // rotation, scale factor and if it's internal display. They are 84 // rotation, scale factor and if it's internal display. They are
86 // read and used by touchpad/mouse driver directly on X (contact 85 // read and used by touchpad/mouse driver directly on X (contact
87 // adlr@ for more details on touchpad/mouse driver side). The value 86 // adlr@ for more details on touchpad/mouse driver side). The value
88 // of the rotation is one of 0 (normal), 1 (90 degrees clockwise), 2 87 // of the rotation is one of 0 (normal), 1 (90 degrees clockwise), 2
89 // (180 degree) or 3 (270 degrees clockwise). The value of the 88 // (180 degree) or 3 (270 degrees clockwise). The value of the
90 // scale factor is in percent (100, 140, 200 etc). 89 // scale factor is in percent (100, 140, 200 etc).
91 const char kRotationProp[] = "_CHROME_DISPLAY_ROTATION"; 90 const char kRotationProp[] = "_CHROME_DISPLAY_ROTATION";
92 const char kScaleFactorProp[] = "_CHROME_DISPLAY_SCALE_FACTOR"; 91 const char kScaleFactorProp[] = "_CHROME_DISPLAY_SCALE_FACTOR";
(...skipping 18 matching lines...) Expand all
111 int internal = display.IsInternal() ? 1 : 0; 110 int internal = display.IsInternal() ? 1 : 0;
112 gfx::AcceleratedWidget xwindow = host->GetAcceleratedWidget(); 111 gfx::AcceleratedWidget xwindow = host->GetAcceleratedWidget();
113 ui::SetIntProperty(xwindow, kInternalProp, kCARDINAL, internal); 112 ui::SetIntProperty(xwindow, kInternalProp, kCARDINAL, internal);
114 ui::SetIntProperty(xwindow, kRotationProp, kCARDINAL, xrandr_rotation); 113 ui::SetIntProperty(xwindow, kRotationProp, kCARDINAL, xrandr_rotation);
115 ui::SetIntProperty(xwindow, 114 ui::SetIntProperty(xwindow,
116 kScaleFactorProp, 115 kScaleFactorProp,
117 kCARDINAL, 116 kCARDINAL,
118 100 * display.device_scale_factor()); 117 100 * display.device_scale_factor());
119 #endif 118 #endif
120 scoped_ptr<aura::RootWindowTransformer> transformer( 119 scoped_ptr<aura::RootWindowTransformer> transformer(
121 internal::CreateRootWindowTransformerForDisplay(host->window(), 120 CreateRootWindowTransformerForDisplay(host->window(), display));
122 display));
123 host->SetRootWindowTransformer(transformer.Pass()); 121 host->SetRootWindowTransformer(transformer.Pass());
124 122
125 internal::DisplayMode mode; 123 DisplayMode mode;
126 if (GetDisplayManager()->GetSelectedModeForDisplayId(display.id(), &mode) && 124 if (GetDisplayManager()->GetSelectedModeForDisplayId(display.id(), &mode) &&
127 mode.refresh_rate > 0.0f) { 125 mode.refresh_rate > 0.0f) {
128 host->compositor()->vsync_manager()->SetAuthoritativeVSyncInterval( 126 host->compositor()->vsync_manager()->SetAuthoritativeVSyncInterval(
129 base::TimeDelta::FromMicroseconds( 127 base::TimeDelta::FromMicroseconds(
130 base::Time::kMicrosecondsPerSecond / mode.refresh_rate)); 128 base::Time::kMicrosecondsPerSecond / mode.refresh_rate));
131 } 129 }
132 } 130 }
133 131
134 } // namespace 132 } // namespace
135 133
136 namespace internal {
137
138 // A utility class to store/restore focused/active window 134 // A utility class to store/restore focused/active window
139 // when the display configuration has changed. 135 // when the display configuration has changed.
140 class FocusActivationStore { 136 class FocusActivationStore {
141 public: 137 public:
142 FocusActivationStore() 138 FocusActivationStore()
143 : activation_client_(NULL), 139 : activation_client_(NULL),
144 capture_client_(NULL), 140 capture_client_(NULL),
145 focus_client_(NULL), 141 focus_client_(NULL),
146 focused_(NULL), 142 focused_(NULL),
147 active_(NULL) { 143 active_(NULL) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 aura::client::ActivationClient* activation_client_; 190 aura::client::ActivationClient* activation_client_;
195 aura::client::CaptureClient* capture_client_; 191 aura::client::CaptureClient* capture_client_;
196 aura::client::FocusClient* focus_client_; 192 aura::client::FocusClient* focus_client_;
197 aura::WindowTracker tracker_; 193 aura::WindowTracker tracker_;
198 aura::Window* focused_; 194 aura::Window* focused_;
199 aura::Window* active_; 195 aura::Window* active_;
200 196
201 DISALLOW_COPY_AND_ASSIGN(FocusActivationStore); 197 DISALLOW_COPY_AND_ASSIGN(FocusActivationStore);
202 }; 198 };
203 199
204 } // namespace internal
205
206 //////////////////////////////////////////////////////////////////////////////// 200 ////////////////////////////////////////////////////////////////////////////////
207 // DisplayChangeLimiter 201 // DisplayChangeLimiter
208 202
209 DisplayController::DisplayChangeLimiter::DisplayChangeLimiter() 203 DisplayController::DisplayChangeLimiter::DisplayChangeLimiter()
210 : throttle_timeout_(base::Time::Now()) { 204 : throttle_timeout_(base::Time::Now()) {
211 } 205 }
212 206
213 void DisplayController::DisplayChangeLimiter::SetThrottleTimeout( 207 void DisplayController::DisplayChangeLimiter::SetThrottleTimeout(
214 int64 throttle_ms) { 208 int64 throttle_ms) {
215 throttle_timeout_ = 209 throttle_timeout_ =
216 base::Time::Now() + base::TimeDelta::FromMilliseconds(throttle_ms); 210 base::Time::Now() + base::TimeDelta::FromMilliseconds(throttle_ms);
217 } 211 }
218 212
219 bool DisplayController::DisplayChangeLimiter::IsThrottled() const { 213 bool DisplayController::DisplayChangeLimiter::IsThrottled() const {
220 return base::Time::Now() < throttle_timeout_; 214 return base::Time::Now() < throttle_timeout_;
221 } 215 }
222 216
223 //////////////////////////////////////////////////////////////////////////////// 217 ////////////////////////////////////////////////////////////////////////////////
224 // DisplayController 218 // DisplayController
225 219
226 DisplayController::DisplayController() 220 DisplayController::DisplayController()
227 : primary_root_window_for_replace_(NULL), 221 : primary_root_window_for_replace_(NULL),
228 focus_activation_store_(new internal::FocusActivationStore()), 222 focus_activation_store_(new FocusActivationStore()),
229 cursor_window_controller_(new internal::CursorWindowController()), 223 cursor_window_controller_(new CursorWindowController()),
230 mirror_window_controller_(new internal::MirrorWindowController()) { 224 mirror_window_controller_(new MirrorWindowController()) {
231 #if defined(OS_CHROMEOS) 225 #if defined(OS_CHROMEOS)
232 if (base::SysInfo::IsRunningOnChromeOS()) 226 if (base::SysInfo::IsRunningOnChromeOS())
233 limiter_.reset(new DisplayChangeLimiter); 227 limiter_.reset(new DisplayChangeLimiter);
234 #endif 228 #endif
235 // Reset primary display to make sure that tests don't use 229 // Reset primary display to make sure that tests don't use
236 // stale display info from previous tests. 230 // stale display info from previous tests.
237 primary_display_id = gfx::Display::kInvalidDisplayID; 231 primary_display_id = gfx::Display::kInvalidDisplayID;
238 } 232 }
239 233
240 DisplayController::~DisplayController() { 234 DisplayController::~DisplayController() {
241 } 235 }
242 236
243 void DisplayController::Start() { 237 void DisplayController::Start() {
244 // Created here so that Shell has finished being created. Adds itself 238 // Created here so that Shell has finished being created. Adds itself
245 // as a ShellObserver. 239 // as a ShellObserver.
246 virtual_keyboard_window_controller_.reset( 240 virtual_keyboard_window_controller_.reset(
247 new internal::VirtualKeyboardWindowController); 241 new VirtualKeyboardWindowController);
248 Shell::GetScreen()->AddObserver(this); 242 Shell::GetScreen()->AddObserver(this);
249 Shell::GetInstance()->display_manager()->set_delegate(this); 243 Shell::GetInstance()->display_manager()->set_delegate(this);
250 244
251 FOR_EACH_OBSERVER(Observer, observers_, OnDisplaysInitialized()); 245 FOR_EACH_OBSERVER(Observer, observers_, OnDisplaysInitialized());
252 } 246 }
253 247
254 void DisplayController::Shutdown() { 248 void DisplayController::Shutdown() {
255 // Unset the display manager's delegate here because 249 // Unset the display manager's delegate here because
256 // DisplayManager outlives DisplayController. 250 // DisplayManager outlives DisplayController.
257 Shell::GetInstance()->display_manager()->set_delegate(NULL); 251 Shell::GetInstance()->display_manager()->set_delegate(NULL);
258 252
259 cursor_window_controller_.reset(); 253 cursor_window_controller_.reset();
260 mirror_window_controller_.reset(); 254 mirror_window_controller_.reset();
261 virtual_keyboard_window_controller_.reset(); 255 virtual_keyboard_window_controller_.reset();
262 256
263 Shell::GetScreen()->RemoveObserver(this); 257 Shell::GetScreen()->RemoveObserver(this);
264 // Delete all root window controllers, which deletes root window 258 // Delete all root window controllers, which deletes root window
265 // from the last so that the primary root window gets deleted last. 259 // from the last so that the primary root window gets deleted last.
266 for (std::map<int64, aura::Window*>::const_reverse_iterator it = 260 for (std::map<int64, aura::Window*>::const_reverse_iterator it =
267 root_windows_.rbegin(); it != root_windows_.rend(); ++it) { 261 root_windows_.rbegin(); it != root_windows_.rend(); ++it) {
268 internal::RootWindowController* controller = 262 RootWindowController* controller = GetRootWindowController(it->second);
269 internal::GetRootWindowController(it->second);
270 DCHECK(controller); 263 DCHECK(controller);
271 delete controller; 264 delete controller;
272 } 265 }
273 } 266 }
274 267
275 void DisplayController::InitPrimaryDisplay() { 268 void DisplayController::InitPrimaryDisplay() {
276 const gfx::Display& primary_candidate = 269 const gfx::Display& primary_candidate =
277 GetDisplayManager()->GetPrimaryDisplayCandidate(); 270 GetDisplayManager()->GetPrimaryDisplayCandidate();
278 primary_display_id = primary_candidate.id(); 271 primary_display_id = primary_candidate.id();
279 AddWindowTreeHostForDisplay(primary_candidate); 272 AddWindowTreeHostForDisplay(primary_candidate);
280 } 273 }
281 274
282 void DisplayController::InitSecondaryDisplays() { 275 void DisplayController::InitSecondaryDisplays() {
283 internal::DisplayManager* display_manager = GetDisplayManager(); 276 DisplayManager* display_manager = GetDisplayManager();
284 for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) { 277 for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
285 const gfx::Display& display = display_manager->GetDisplayAt(i); 278 const gfx::Display& display = display_manager->GetDisplayAt(i);
286 if (primary_display_id != display.id()) { 279 if (primary_display_id != display.id()) {
287 aura::WindowTreeHost* host = AddWindowTreeHostForDisplay(display); 280 aura::WindowTreeHost* host = AddWindowTreeHostForDisplay(display);
288 internal::RootWindowController::CreateForSecondaryDisplay(host); 281 RootWindowController::CreateForSecondaryDisplay(host);
289 } 282 }
290 } 283 }
291 UpdateHostWindowNames(); 284 UpdateHostWindowNames();
292 } 285 }
293 286
294 void DisplayController::AddObserver(Observer* observer) { 287 void DisplayController::AddObserver(Observer* observer) {
295 observers_.AddObserver(observer); 288 observers_.AddObserver(observer);
296 } 289 }
297 290
298 void DisplayController::RemoveObserver(Observer* observer) { 291 void DisplayController::RemoveObserver(Observer* observer) {
(...skipping 11 matching lines...) Expand all
310 } 303 }
311 304
312 aura::Window* DisplayController::GetRootWindowForDisplayId(int64 id) { 305 aura::Window* DisplayController::GetRootWindowForDisplayId(int64 id) {
313 return root_windows_[id]; 306 return root_windows_[id];
314 } 307 }
315 308
316 void DisplayController::CloseChildWindows() { 309 void DisplayController::CloseChildWindows() {
317 for (std::map<int64, aura::Window*>::const_iterator it = 310 for (std::map<int64, aura::Window*>::const_iterator it =
318 root_windows_.begin(); it != root_windows_.end(); ++it) { 311 root_windows_.begin(); it != root_windows_.end(); ++it) {
319 aura::Window* root_window = it->second; 312 aura::Window* root_window = it->second;
320 internal::RootWindowController* controller = 313 RootWindowController* controller = GetRootWindowController(root_window);
321 internal::GetRootWindowController(root_window);
322 if (controller) { 314 if (controller) {
323 controller->CloseChildWindows(); 315 controller->CloseChildWindows();
324 } else { 316 } else {
325 while (!root_window->children().empty()) { 317 while (!root_window->children().empty()) {
326 aura::Window* child = root_window->children()[0]; 318 aura::Window* child = root_window->children()[0];
327 delete child; 319 delete child;
328 } 320 }
329 } 321 }
330 } 322 }
331 } 323 }
332 324
333 aura::Window::Windows DisplayController::GetAllRootWindows() { 325 aura::Window::Windows DisplayController::GetAllRootWindows() {
334 aura::Window::Windows windows; 326 aura::Window::Windows windows;
335 for (std::map<int64, aura::Window*>::const_iterator it = 327 for (std::map<int64, aura::Window*>::const_iterator it =
336 root_windows_.begin(); it != root_windows_.end(); ++it) { 328 root_windows_.begin(); it != root_windows_.end(); ++it) {
337 DCHECK(it->second); 329 DCHECK(it->second);
338 if (internal::GetRootWindowController(it->second)) 330 if (GetRootWindowController(it->second))
339 windows.push_back(it->second); 331 windows.push_back(it->second);
340 } 332 }
341 return windows; 333 return windows;
342 } 334 }
343 335
344 gfx::Insets DisplayController::GetOverscanInsets(int64 display_id) const { 336 gfx::Insets DisplayController::GetOverscanInsets(int64 display_id) const {
345 return GetDisplayManager()->GetOverscanInsets(display_id); 337 return GetDisplayManager()->GetOverscanInsets(display_id);
346 } 338 }
347 339
348 void DisplayController::SetOverscanInsets(int64 display_id, 340 void DisplayController::SetOverscanInsets(int64 display_id,
349 const gfx::Insets& insets_in_dip) { 341 const gfx::Insets& insets_in_dip) {
350 GetDisplayManager()->SetOverscanInsets(display_id, insets_in_dip); 342 GetDisplayManager()->SetOverscanInsets(display_id, insets_in_dip);
351 } 343 }
352 344
353 std::vector<internal::RootWindowController*> 345 std::vector<RootWindowController*>
354 DisplayController::GetAllRootWindowControllers() { 346 DisplayController::GetAllRootWindowControllers() {
355 std::vector<internal::RootWindowController*> controllers; 347 std::vector<RootWindowController*> controllers;
356 for (std::map<int64, aura::Window*>::const_iterator it = 348 for (std::map<int64, aura::Window*>::const_iterator it =
357 root_windows_.begin(); it != root_windows_.end(); ++it) { 349 root_windows_.begin(); it != root_windows_.end(); ++it) {
358 internal::RootWindowController* controller = 350 RootWindowController* controller = GetRootWindowController(it->second);
359 internal::GetRootWindowController(it->second);
360 if (controller) 351 if (controller)
361 controllers.push_back(controller); 352 controllers.push_back(controller);
362 } 353 }
363 return controllers; 354 return controllers;
364 } 355 }
365 356
366 void DisplayController::ToggleMirrorMode() { 357 void DisplayController::ToggleMirrorMode() {
367 internal::DisplayManager* display_manager = GetDisplayManager(); 358 DisplayManager* display_manager = GetDisplayManager();
368 if (display_manager->num_connected_displays() <= 1) 359 if (display_manager->num_connected_displays() <= 1)
369 return; 360 return;
370 361
371 if (limiter_) { 362 if (limiter_) {
372 if (limiter_->IsThrottled()) 363 if (limiter_->IsThrottled())
373 return; 364 return;
374 limiter_->SetThrottleTimeout(kCycleDisplayThrottleTimeoutMs); 365 limiter_->SetThrottleTimeout(kCycleDisplayThrottleTimeoutMs);
375 } 366 }
376 #if defined(OS_CHROMEOS) 367 #if defined(OS_CHROMEOS)
377 Shell* shell = Shell::GetInstance(); 368 Shell* shell = Shell::GetInstance();
378 internal::OutputConfiguratorAnimation* animation = 369 OutputConfiguratorAnimation* animation =
379 shell->output_configurator_animation(); 370 shell->output_configurator_animation();
380 animation->StartFadeOutAnimation(base::Bind( 371 animation->StartFadeOutAnimation(
381 base::IgnoreResult(&internal::DisplayManager::SetMirrorMode), 372 base::Bind(base::IgnoreResult(&DisplayManager::SetMirrorMode),
382 base::Unretained(display_manager), 373 base::Unretained(display_manager),
383 !display_manager->IsMirrored())); 374 !display_manager->IsMirrored()));
384 #endif 375 #endif
385 } 376 }
386 377
387 void DisplayController::SwapPrimaryDisplay() { 378 void DisplayController::SwapPrimaryDisplay() {
388 if (limiter_) { 379 if (limiter_) {
389 if (limiter_->IsThrottled()) 380 if (limiter_->IsThrottled())
390 return; 381 return;
391 limiter_->SetThrottleTimeout(kSwapDisplayThrottleTimeoutMs); 382 limiter_->SetThrottleTimeout(kSwapDisplayThrottleTimeoutMs);
392 } 383 }
393 384
394 if (Shell::GetScreen()->GetNumDisplays() > 1) { 385 if (Shell::GetScreen()->GetNumDisplays() > 1) {
395 #if defined(OS_CHROMEOS) 386 #if defined(OS_CHROMEOS)
396 internal::OutputConfiguratorAnimation* animation = 387 OutputConfiguratorAnimation* animation =
397 Shell::GetInstance()->output_configurator_animation(); 388 Shell::GetInstance()->output_configurator_animation();
398 if (animation) { 389 if (animation) {
399 animation->StartFadeOutAnimation(base::Bind( 390 animation->StartFadeOutAnimation(base::Bind(
400 &DisplayController::OnFadeOutForSwapDisplayFinished, 391 &DisplayController::OnFadeOutForSwapDisplayFinished,
401 base::Unretained(this))); 392 base::Unretained(this)));
402 } else { 393 } else {
403 SetPrimaryDisplay(ScreenUtil::GetSecondaryDisplay()); 394 SetPrimaryDisplay(ScreenUtil::GetSecondaryDisplay());
404 } 395 }
405 #else 396 #else
406 SetPrimaryDisplay(ScreenUtil::GetSecondaryDisplay()); 397 SetPrimaryDisplay(ScreenUtil::GetSecondaryDisplay());
407 #endif 398 #endif
408 } 399 }
409 } 400 }
410 401
411 void DisplayController::SetPrimaryDisplayId(int64 id) { 402 void DisplayController::SetPrimaryDisplayId(int64 id) {
412 DCHECK_NE(gfx::Display::kInvalidDisplayID, id); 403 DCHECK_NE(gfx::Display::kInvalidDisplayID, id);
413 if (id == gfx::Display::kInvalidDisplayID || primary_display_id == id) 404 if (id == gfx::Display::kInvalidDisplayID || primary_display_id == id)
414 return; 405 return;
415 406
416 const gfx::Display& display = GetDisplayManager()->GetDisplayForId(id); 407 const gfx::Display& display = GetDisplayManager()->GetDisplayForId(id);
417 if (display.is_valid()) 408 if (display.is_valid())
418 SetPrimaryDisplay(display); 409 SetPrimaryDisplay(display);
419 } 410 }
420 411
421 void DisplayController::SetPrimaryDisplay( 412 void DisplayController::SetPrimaryDisplay(
422 const gfx::Display& new_primary_display) { 413 const gfx::Display& new_primary_display) {
423 internal::DisplayManager* display_manager = GetDisplayManager(); 414 DisplayManager* display_manager = GetDisplayManager();
424 DCHECK(new_primary_display.is_valid()); 415 DCHECK(new_primary_display.is_valid());
425 DCHECK(display_manager->IsActiveDisplay(new_primary_display)); 416 DCHECK(display_manager->IsActiveDisplay(new_primary_display));
426 417
427 if (!new_primary_display.is_valid() || 418 if (!new_primary_display.is_valid() ||
428 !display_manager->IsActiveDisplay(new_primary_display)) { 419 !display_manager->IsActiveDisplay(new_primary_display)) {
429 LOG(ERROR) << "Invalid or non-existent display is requested:" 420 LOG(ERROR) << "Invalid or non-existent display is requested:"
430 << new_primary_display.ToString(); 421 << new_primary_display.ToString();
431 return; 422 return;
432 } 423 }
433 424
(...skipping 10 matching lines...) Expand all
444 return; 435 return;
445 436
446 gfx::Display old_primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 437 gfx::Display old_primary_display = Shell::GetScreen()->GetPrimaryDisplay();
447 438
448 // Swap root windows between current and new primary display. 439 // Swap root windows between current and new primary display.
449 aura::Window* primary_root = root_windows_[primary_display_id]; 440 aura::Window* primary_root = root_windows_[primary_display_id];
450 DCHECK(primary_root); 441 DCHECK(primary_root);
451 DCHECK_NE(primary_root, non_primary_root); 442 DCHECK_NE(primary_root, non_primary_root);
452 443
453 root_windows_[new_primary_display.id()] = primary_root; 444 root_windows_[new_primary_display.id()] = primary_root;
454 internal::GetRootWindowSettings(primary_root)->display_id = 445 GetRootWindowSettings(primary_root)->display_id = new_primary_display.id();
455 new_primary_display.id();
456 446
457 root_windows_[old_primary_display.id()] = non_primary_root; 447 root_windows_[old_primary_display.id()] = non_primary_root;
458 internal::GetRootWindowSettings(non_primary_root)->display_id = 448 GetRootWindowSettings(non_primary_root)->display_id =
459 old_primary_display.id(); 449 old_primary_display.id();
460 450
461 primary_display_id = new_primary_display.id(); 451 primary_display_id = new_primary_display.id();
462 GetDisplayManager()->layout_store()->UpdatePrimaryDisplayId( 452 GetDisplayManager()->layout_store()->UpdatePrimaryDisplayId(
463 display_manager->GetCurrentDisplayIdPair(), primary_display_id); 453 display_manager->GetCurrentDisplayIdPair(), primary_display_id);
464 454
465 UpdateWorkAreaOfDisplayNearestWindow( 455 UpdateWorkAreaOfDisplayNearestWindow(
466 primary_root, old_primary_display.GetWorkAreaInsets()); 456 primary_root, old_primary_display.GetWorkAreaInsets());
467 UpdateWorkAreaOfDisplayNearestWindow( 457 UpdateWorkAreaOfDisplayNearestWindow(
468 non_primary_root, new_primary_display.GetWorkAreaInsets()); 458 non_primary_root, new_primary_display.GetWorkAreaInsets());
469 459
470 // Update the dispay manager with new display info. 460 // Update the dispay manager with new display info.
471 std::vector<internal::DisplayInfo> display_info_list; 461 std::vector<DisplayInfo> display_info_list;
472 display_info_list.push_back(display_manager->GetDisplayInfo( 462 display_info_list.push_back(display_manager->GetDisplayInfo(
473 primary_display_id)); 463 primary_display_id));
474 display_info_list.push_back(display_manager->GetDisplayInfo( 464 display_info_list.push_back(display_manager->GetDisplayInfo(
475 ScreenUtil::GetSecondaryDisplay().id())); 465 ScreenUtil::GetSecondaryDisplay().id()));
476 GetDisplayManager()->set_force_bounds_changed(true); 466 GetDisplayManager()->set_force_bounds_changed(true);
477 GetDisplayManager()->UpdateDisplays(display_info_list); 467 GetDisplayManager()->UpdateDisplays(display_info_list);
478 GetDisplayManager()->set_force_bounds_changed(false); 468 GetDisplayManager()->set_force_bounds_changed(false);
479 } 469 }
480 470
481 void DisplayController::EnsurePointerInDisplays() { 471 void DisplayController::EnsurePointerInDisplays() {
482 // If the mouse is currently on a display in native location, 472 // If the mouse is currently on a display in native location,
483 // use the same native location. Otherwise find the display closest 473 // use the same native location. Otherwise find the display closest
484 // to the current cursor location in screen coordinates. 474 // to the current cursor location in screen coordinates.
485 475
486 gfx::Point point_in_screen = Shell::GetScreen()->GetCursorScreenPoint(); 476 gfx::Point point_in_screen = Shell::GetScreen()->GetCursorScreenPoint();
487 gfx::Point target_location_in_native; 477 gfx::Point target_location_in_native;
488 int64 closest_distance_squared = -1; 478 int64 closest_distance_squared = -1;
489 internal::DisplayManager* display_manager = GetDisplayManager(); 479 DisplayManager* display_manager = GetDisplayManager();
490 480
491 aura::Window* dst_root_window = NULL; 481 aura::Window* dst_root_window = NULL;
492 for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) { 482 for (size_t i = 0; i < display_manager->GetNumDisplays(); ++i) {
493 const gfx::Display& display = display_manager->GetDisplayAt(i); 483 const gfx::Display& display = display_manager->GetDisplayAt(i);
494 const internal::DisplayInfo display_info = 484 const DisplayInfo display_info =
495 display_manager->GetDisplayInfo(display.id()); 485 display_manager->GetDisplayInfo(display.id());
496 aura::Window* root_window = GetRootWindowForDisplayId(display.id()); 486 aura::Window* root_window = GetRootWindowForDisplayId(display.id());
497 if (display_info.bounds_in_native().Contains( 487 if (display_info.bounds_in_native().Contains(
498 cursor_location_in_native_coords_for_restore_)) { 488 cursor_location_in_native_coords_for_restore_)) {
499 dst_root_window = root_window; 489 dst_root_window = root_window;
500 target_location_in_native = cursor_location_in_native_coords_for_restore_; 490 target_location_in_native = cursor_location_in_native_coords_for_restore_;
501 break; 491 break;
502 } 492 }
503 gfx::Point center = display.bounds().CenterPoint(); 493 gfx::Point center = display.bounds().CenterPoint();
504 // Use the distance squared from the center of the dislay. This is not 494 // Use the distance squared from the center of the dislay. This is not
(...skipping 17 matching lines...) Expand all
522 } 512 }
523 dst_root_window->GetHost()->ConvertPointFromNativeScreen( 513 dst_root_window->GetHost()->ConvertPointFromNativeScreen(
524 &target_location_in_native); 514 &target_location_in_native);
525 dst_root_window->MoveCursorTo(target_location_in_native); 515 dst_root_window->MoveCursorTo(target_location_in_native);
526 } 516 }
527 517
528 bool DisplayController::UpdateWorkAreaOfDisplayNearestWindow( 518 bool DisplayController::UpdateWorkAreaOfDisplayNearestWindow(
529 const aura::Window* window, 519 const aura::Window* window,
530 const gfx::Insets& insets) { 520 const gfx::Insets& insets) {
531 const aura::Window* root_window = window->GetRootWindow(); 521 const aura::Window* root_window = window->GetRootWindow();
532 int64 id = internal::GetRootWindowSettings(root_window)->display_id; 522 int64 id = GetRootWindowSettings(root_window)->display_id;
533 // if id is |kInvaildDisplayID|, it's being deleted. 523 // if id is |kInvaildDisplayID|, it's being deleted.
534 DCHECK(id != gfx::Display::kInvalidDisplayID); 524 DCHECK(id != gfx::Display::kInvalidDisplayID);
535 return GetDisplayManager()->UpdateWorkAreaOfDisplay(id, insets); 525 return GetDisplayManager()->UpdateWorkAreaOfDisplay(id, insets);
536 } 526 }
537 527
538 void DisplayController::OnDisplayBoundsChanged(const gfx::Display& display) { 528 void DisplayController::OnDisplayBoundsChanged(const gfx::Display& display) {
539 const internal::DisplayInfo& display_info = 529 const DisplayInfo& display_info =
540 GetDisplayManager()->GetDisplayInfo(display.id()); 530 GetDisplayManager()->GetDisplayInfo(display.id());
541 DCHECK(!display_info.bounds_in_native().IsEmpty()); 531 DCHECK(!display_info.bounds_in_native().IsEmpty());
542 aura::WindowTreeHost* host = root_windows_[display.id()]->GetHost(); 532 aura::WindowTreeHost* host = root_windows_[display.id()]->GetHost();
543 host->SetBounds(display_info.bounds_in_native()); 533 host->SetBounds(display_info.bounds_in_native());
544 SetDisplayPropertiesOnHost(host, display); 534 SetDisplayPropertiesOnHost(host, display);
545 } 535 }
546 536
547 void DisplayController::OnDisplayAdded(const gfx::Display& display) { 537 void DisplayController::OnDisplayAdded(const gfx::Display& display) {
548 if (primary_root_window_for_replace_) { 538 if (primary_root_window_for_replace_) {
549 DCHECK(root_windows_.empty()); 539 DCHECK(root_windows_.empty());
550 primary_display_id = display.id(); 540 primary_display_id = display.id();
551 root_windows_[display.id()] = primary_root_window_for_replace_; 541 root_windows_[display.id()] = primary_root_window_for_replace_;
552 internal::GetRootWindowSettings(primary_root_window_for_replace_)-> 542 GetRootWindowSettings(primary_root_window_for_replace_)->display_id =
553 display_id = display.id(); 543 display.id();
554 primary_root_window_for_replace_ = NULL; 544 primary_root_window_for_replace_ = NULL;
555 const internal::DisplayInfo& display_info = 545 const DisplayInfo& display_info =
556 GetDisplayManager()->GetDisplayInfo(display.id()); 546 GetDisplayManager()->GetDisplayInfo(display.id());
557 aura::WindowTreeHost* host = root_windows_[display.id()]->GetHost(); 547 aura::WindowTreeHost* host = root_windows_[display.id()]->GetHost();
558 host->SetBounds(display_info.bounds_in_native()); 548 host->SetBounds(display_info.bounds_in_native());
559 SetDisplayPropertiesOnHost(host, display); 549 SetDisplayPropertiesOnHost(host, display);
560 } else { 550 } else {
561 if (primary_display_id == gfx::Display::kInvalidDisplayID) 551 if (primary_display_id == gfx::Display::kInvalidDisplayID)
562 primary_display_id = display.id(); 552 primary_display_id = display.id();
563 DCHECK(!root_windows_.empty()); 553 DCHECK(!root_windows_.empty());
564 aura::WindowTreeHost* host = AddWindowTreeHostForDisplay(display); 554 aura::WindowTreeHost* host = AddWindowTreeHostForDisplay(display);
565 internal::RootWindowController::CreateForSecondaryDisplay(host); 555 RootWindowController::CreateForSecondaryDisplay(host);
566 } 556 }
567 } 557 }
568 558
569 void DisplayController::OnDisplayRemoved(const gfx::Display& display) { 559 void DisplayController::OnDisplayRemoved(const gfx::Display& display) {
570 aura::Window* root_to_delete = root_windows_[display.id()]; 560 aura::Window* root_to_delete = root_windows_[display.id()];
571 DCHECK(root_to_delete) << display.ToString(); 561 DCHECK(root_to_delete) << display.ToString();
572 562
573 // Display for root window will be deleted when the Primary RootWindow 563 // Display for root window will be deleted when the Primary RootWindow
574 // is deleted by the Shell. 564 // is deleted by the Shell.
575 root_windows_.erase(display.id()); 565 root_windows_.erase(display.id());
576 566
577 // When the primary root window's display is removed, move the primary 567 // When the primary root window's display is removed, move the primary
578 // root to the other display. 568 // root to the other display.
579 if (primary_display_id == display.id()) { 569 if (primary_display_id == display.id()) {
580 // Temporarily store the primary root window in 570 // Temporarily store the primary root window in
581 // |primary_root_window_for_replace_| when replacing the display. 571 // |primary_root_window_for_replace_| when replacing the display.
582 if (root_windows_.size() == 0) { 572 if (root_windows_.size() == 0) {
583 primary_display_id = gfx::Display::kInvalidDisplayID; 573 primary_display_id = gfx::Display::kInvalidDisplayID;
584 primary_root_window_for_replace_ = root_to_delete; 574 primary_root_window_for_replace_ = root_to_delete;
585 return; 575 return;
586 } 576 }
587 DCHECK_EQ(1U, root_windows_.size()); 577 DCHECK_EQ(1U, root_windows_.size());
588 primary_display_id = ScreenUtil::GetSecondaryDisplay().id(); 578 primary_display_id = ScreenUtil::GetSecondaryDisplay().id();
589 aura::Window* primary_root = root_to_delete; 579 aura::Window* primary_root = root_to_delete;
590 580
591 // Delete the other root instead. 581 // Delete the other root instead.
592 root_to_delete = root_windows_[primary_display_id]; 582 root_to_delete = root_windows_[primary_display_id];
593 internal::GetRootWindowSettings(root_to_delete)->display_id = display.id(); 583 GetRootWindowSettings(root_to_delete)->display_id = display.id();
594 584
595 // Setup primary root. 585 // Setup primary root.
596 root_windows_[primary_display_id] = primary_root; 586 root_windows_[primary_display_id] = primary_root;
597 internal::GetRootWindowSettings(primary_root)->display_id = 587 GetRootWindowSettings(primary_root)->display_id = primary_display_id;
598 primary_display_id;
599 588
600 OnDisplayBoundsChanged( 589 OnDisplayBoundsChanged(
601 GetDisplayManager()->GetDisplayForId(primary_display_id)); 590 GetDisplayManager()->GetDisplayForId(primary_display_id));
602 } 591 }
603 internal::RootWindowController* controller = 592 RootWindowController* controller = GetRootWindowController(root_to_delete);
604 internal::GetRootWindowController(root_to_delete);
605 DCHECK(controller); 593 DCHECK(controller);
606 controller->MoveWindowsTo(GetPrimaryRootWindow()); 594 controller->MoveWindowsTo(GetPrimaryRootWindow());
607 // Delete most of root window related objects, but don't delete 595 // Delete most of root window related objects, but don't delete
608 // root window itself yet because the stack may be using it. 596 // root window itself yet because the stack may be using it.
609 controller->Shutdown(); 597 controller->Shutdown();
610 base::MessageLoop::current()->DeleteSoon(FROM_HERE, controller); 598 base::MessageLoop::current()->DeleteSoon(FROM_HERE, controller);
611 } 599 }
612 600
613 void DisplayController::OnHostResized(const aura::WindowTreeHost* host) { 601 void DisplayController::OnHostResized(const aura::WindowTreeHost* host) {
614 gfx::Display display = Shell::GetScreen()->GetDisplayNearestWindow( 602 gfx::Display display = Shell::GetScreen()->GetDisplayNearestWindow(
615 const_cast<aura::Window*>(host->window())); 603 const_cast<aura::Window*>(host->window()));
616 604
617 internal::DisplayManager* display_manager = GetDisplayManager(); 605 DisplayManager* display_manager = GetDisplayManager();
618 if (display_manager->UpdateDisplayBounds(display.id(), host->GetBounds())) { 606 if (display_manager->UpdateDisplayBounds(display.id(), host->GetBounds())) {
619 mirror_window_controller_->UpdateWindow(); 607 mirror_window_controller_->UpdateWindow();
620 cursor_window_controller_->UpdateContainer(); 608 cursor_window_controller_->UpdateContainer();
621 } 609 }
622 } 610 }
623 611
624 void DisplayController::CreateOrUpdateNonDesktopDisplay( 612 void DisplayController::CreateOrUpdateNonDesktopDisplay(
625 const internal::DisplayInfo& info) { 613 const DisplayInfo& info) {
626 switch (GetDisplayManager()->second_display_mode()) { 614 switch (GetDisplayManager()->second_display_mode()) {
627 case internal::DisplayManager::MIRRORING: 615 case DisplayManager::MIRRORING:
628 mirror_window_controller_->UpdateWindow(info); 616 mirror_window_controller_->UpdateWindow(info);
629 cursor_window_controller_->UpdateContainer(); 617 cursor_window_controller_->UpdateContainer();
630 virtual_keyboard_window_controller_->Close(); 618 virtual_keyboard_window_controller_->Close();
631 break; 619 break;
632 case internal::DisplayManager::VIRTUAL_KEYBOARD: 620 case DisplayManager::VIRTUAL_KEYBOARD:
633 mirror_window_controller_->Close(); 621 mirror_window_controller_->Close();
634 cursor_window_controller_->UpdateContainer(); 622 cursor_window_controller_->UpdateContainer();
635 virtual_keyboard_window_controller_->UpdateWindow(info); 623 virtual_keyboard_window_controller_->UpdateWindow(info);
636 break; 624 break;
637 case internal::DisplayManager::EXTENDED: 625 case DisplayManager::EXTENDED:
638 NOTREACHED(); 626 NOTREACHED();
639 } 627 }
640 } 628 }
641 629
642 void DisplayController::CloseNonDesktopDisplay() { 630 void DisplayController::CloseNonDesktopDisplay() {
643 mirror_window_controller_->Close(); 631 mirror_window_controller_->Close();
644 cursor_window_controller_->UpdateContainer(); 632 cursor_window_controller_->UpdateContainer();
645 virtual_keyboard_window_controller_->Close(); 633 virtual_keyboard_window_controller_->Close();
646 } 634 }
647 635
(...skipping 11 matching lines...) Expand all
659 root_window->GetHost()->ConvertPointToNativeScreen(&point_in_screen); 647 root_window->GetHost()->ConvertPointToNativeScreen(&point_in_screen);
660 cursor_location_in_native_coords_for_restore_ = point_in_screen; 648 cursor_location_in_native_coords_for_restore_ = point_in_screen;
661 } 649 }
662 650
663 void DisplayController::PostDisplayConfigurationChange() { 651 void DisplayController::PostDisplayConfigurationChange() {
664 if (limiter_) 652 if (limiter_)
665 limiter_->SetThrottleTimeout(kAfterDisplayChangeThrottleTimeoutMs); 653 limiter_->SetThrottleTimeout(kAfterDisplayChangeThrottleTimeoutMs);
666 654
667 focus_activation_store_->Restore(); 655 focus_activation_store_->Restore();
668 656
669 internal::DisplayManager* display_manager = GetDisplayManager(); 657 DisplayManager* display_manager = GetDisplayManager();
670 internal::DisplayLayoutStore* layout_store = display_manager->layout_store(); 658 DisplayLayoutStore* layout_store = display_manager->layout_store();
671 if (display_manager->num_connected_displays() > 1) { 659 if (display_manager->num_connected_displays() > 1) {
672 DisplayIdPair pair = display_manager->GetCurrentDisplayIdPair(); 660 DisplayIdPair pair = display_manager->GetCurrentDisplayIdPair();
673 layout_store->UpdateMirrorStatus(pair, display_manager->IsMirrored()); 661 layout_store->UpdateMirrorStatus(pair, display_manager->IsMirrored());
674 DisplayLayout layout = layout_store->GetRegisteredDisplayLayout(pair); 662 DisplayLayout layout = layout_store->GetRegisteredDisplayLayout(pair);
675 663
676 if (Shell::GetScreen()->GetNumDisplays() > 1 ) { 664 if (Shell::GetScreen()->GetNumDisplays() > 1 ) {
677 int64 primary_id = layout.primary_id; 665 int64 primary_id = layout.primary_id;
678 SetPrimaryDisplayId( 666 SetPrimaryDisplayId(
679 primary_id == gfx::Display::kInvalidDisplayID ? 667 primary_id == gfx::Display::kInvalidDisplayID ?
680 pair.first : primary_id); 668 pair.first : primary_id);
681 // Update the primary_id in case the above call is 669 // Update the primary_id in case the above call is
682 // ignored. Happens when a) default layout's primary id 670 // ignored. Happens when a) default layout's primary id
683 // doesn't exist, or b) the primary_id has already been 671 // doesn't exist, or b) the primary_id has already been
684 // set to the same and didn't update it. 672 // set to the same and didn't update it.
685 layout_store->UpdatePrimaryDisplayId( 673 layout_store->UpdatePrimaryDisplayId(
686 pair, Shell::GetScreen()->GetPrimaryDisplay().id()); 674 pair, Shell::GetScreen()->GetPrimaryDisplay().id());
687 } 675 }
688 } 676 }
689 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanged()); 677 FOR_EACH_OBSERVER(Observer, observers_, OnDisplayConfigurationChanged());
690 UpdateHostWindowNames(); 678 UpdateHostWindowNames();
691 EnsurePointerInDisplays(); 679 EnsurePointerInDisplays();
692 } 680 }
693 681
694 aura::WindowTreeHost* DisplayController::AddWindowTreeHostForDisplay( 682 aura::WindowTreeHost* DisplayController::AddWindowTreeHostForDisplay(
695 const gfx::Display& display) { 683 const gfx::Display& display) {
696 static int host_count = 0; 684 static int host_count = 0;
697 const internal::DisplayInfo& display_info = 685 const DisplayInfo& display_info =
698 GetDisplayManager()->GetDisplayInfo(display.id()); 686 GetDisplayManager()->GetDisplayInfo(display.id());
699 const gfx::Rect& bounds_in_native = display_info.bounds_in_native(); 687 const gfx::Rect& bounds_in_native = display_info.bounds_in_native();
700 aura::WindowTreeHost* host = 688 aura::WindowTreeHost* host =
701 Shell::GetInstance()->window_tree_host_factory()->CreateWindowTreeHost( 689 Shell::GetInstance()->window_tree_host_factory()->CreateWindowTreeHost(
702 bounds_in_native); 690 bounds_in_native);
703 host->window()->SetName(base::StringPrintf("RootWindow-%d", host_count++)); 691 host->window()->SetName(base::StringPrintf("RootWindow-%d", host_count++));
704 host->compositor()->SetBackgroundColor(SK_ColorBLACK); 692 host->compositor()->SetBackgroundColor(SK_ColorBLACK);
705 // No need to remove our observer observer because the DisplayController 693 // No need to remove our observer observer because the DisplayController
706 // outlives the host. 694 // outlives the host.
707 host->AddObserver(this); 695 host->AddObserver(this);
708 internal::InitRootWindowSettings(host->window())->display_id = display.id(); 696 InitRootWindowSettings(host->window())->display_id = display.id();
709 host->InitHost(); 697 host->InitHost();
710 698
711 root_windows_[display.id()] = host->window(); 699 root_windows_[display.id()] = host->window();
712 SetDisplayPropertiesOnHost(host, display); 700 SetDisplayPropertiesOnHost(host, display);
713 701
714 #if defined(OS_CHROMEOS) 702 #if defined(OS_CHROMEOS)
715 static bool force_constrain_pointer_to_root = 703 static bool force_constrain_pointer_to_root =
716 CommandLine::ForCurrentProcess()->HasSwitch( 704 CommandLine::ForCurrentProcess()->HasSwitch(
717 switches::kAshConstrainPointerToRoot); 705 switches::kAshConstrainPointerToRoot);
718 if (base::SysInfo::IsRunningOnChromeOS() || force_constrain_pointer_to_root) 706 if (base::SysInfo::IsRunningOnChromeOS() || force_constrain_pointer_to_root)
(...skipping 20 matching lines...) Expand all
739 std::string name = 727 std::string name =
740 root_windows[i] == primary ? "aura_root_0" : "aura_root_x"; 728 root_windows[i] == primary ? "aura_root_0" : "aura_root_x";
741 gfx::AcceleratedWidget xwindow = 729 gfx::AcceleratedWidget xwindow =
742 root_windows[i]->GetHost()->GetAcceleratedWidget(); 730 root_windows[i]->GetHost()->GetAcceleratedWidget();
743 XStoreName(gfx::GetXDisplay(), xwindow, name.c_str()); 731 XStoreName(gfx::GetXDisplay(), xwindow, name.c_str());
744 } 732 }
745 #endif 733 #endif
746 } 734 }
747 735
748 } // namespace ash 736 } // namespace ash
OLDNEW
« no previous file with comments | « ash/display/display_controller.h ('k') | ash/display/display_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698