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

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

Issue 1594683002: Introduce DisplayConfigurationController (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@issue_576375_display1b1
Patch Set: Rebase Created 4 years, 11 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 (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/window_tree_host_manager.h" 5 #include "ash/display/window_tree_host_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <map> 9 #include <map>
10 #include <utility> 10 #include <utility>
(...skipping 30 matching lines...) Expand all
41 #include "ui/aura/window_property.h" 41 #include "ui/aura/window_property.h"
42 #include "ui/aura/window_tracker.h" 42 #include "ui/aura/window_tracker.h"
43 #include "ui/aura/window_tree_host.h" 43 #include "ui/aura/window_tree_host.h"
44 #include "ui/base/ime/input_method_factory.h" 44 #include "ui/base/ime/input_method_factory.h"
45 #include "ui/compositor/compositor.h" 45 #include "ui/compositor/compositor.h"
46 #include "ui/gfx/display.h" 46 #include "ui/gfx/display.h"
47 #include "ui/gfx/screen.h" 47 #include "ui/gfx/screen.h"
48 #include "ui/wm/core/coordinate_conversion.h" 48 #include "ui/wm/core/coordinate_conversion.h"
49 #include "ui/wm/public/activation_client.h" 49 #include "ui/wm/public/activation_client.h"
50 50
51 #if defined(OS_CHROMEOS)
52 #include "ash/display/display_animator.h"
53 #include "base/sys_info.h"
54 #include "base/time/time.h"
55 #endif // defined(OS_CHROMEOS)
56
57 #if defined(USE_X11) 51 #if defined(USE_X11)
58 #include "ui/base/x/x11_util.h" 52 #include "ui/base/x/x11_util.h"
59 #include "ui/gfx/x/x11_types.h" 53 #include "ui/gfx/x/x11_types.h"
60 54
61 // Including this at the bottom to avoid other 55 // Including this at the bottom to avoid other
62 // potential conflict with chrome headers. 56 // potential conflict with chrome headers.
63 #include <X11/extensions/Xrandr.h> 57 #include <X11/extensions/Xrandr.h>
64 #undef RootWindow 58 #undef RootWindow
65 #endif // defined(USE_X11) 59 #endif // defined(USE_X11)
66 60
67 #if defined(OS_CHROMEOS) && defined(USE_OZONE) 61 #if defined(OS_CHROMEOS) && defined(USE_OZONE)
68 #include "ui/events/ozone/chromeos/cursor_controller.h" 62 #include "ui/events/ozone/chromeos/cursor_controller.h"
69 #endif 63 #endif
70 64
71 namespace ash { 65 namespace ash {
72 namespace { 66 namespace {
73 67
74 // Primary display stored in global object as it can be 68 // Primary display stored in global object as it can be
75 // accessed after Shell is deleted. A separate display instance is created 69 // accessed after Shell is deleted. A separate display instance is created
76 // during the shutdown instead of always keeping two display instances 70 // during the shutdown instead of always keeping two display instances
77 // (one here and another one in display_manager) in sync, which is error prone. 71 // (one here and another one in display_manager) in sync, which is error prone.
78 // This is initialized in the constructor, and then in CreatePrimaryHost(). 72 // This is initialized in the constructor, and then in CreatePrimaryHost().
79 int64_t primary_display_id = -1; 73 int64_t primary_display_id = -1;
80 74
81 // Specifies how long the display change should have been disabled
82 // after each display change operations.
83 // |kCycleDisplayThrottleTimeoutMs| is set to be longer to avoid
84 // changing the settings while the system is still configurating
85 // displays. It will be overriden by |kAfterDisplayChangeThrottleTimeoutMs|
86 // when the display change happens, so the actual timeout is much shorter.
87 const int64_t kAfterDisplayChangeThrottleTimeoutMs = 500;
88 const int64_t kCycleDisplayThrottleTimeoutMs = 4000;
89 const int64_t kSwapDisplayThrottleTimeoutMs = 500;
90
91 #if defined(USE_OZONE) && defined(OS_CHROMEOS) 75 #if defined(USE_OZONE) && defined(OS_CHROMEOS)
92 // Add 20% more cursor motion on non-integrated displays. 76 // Add 20% more cursor motion on non-integrated displays.
93 const float kCursorMultiplierForExternalDisplays = 1.2f; 77 const float kCursorMultiplierForExternalDisplays = 1.2f;
94 #endif 78 #endif
95 79
96 DisplayManager* GetDisplayManager() { 80 DisplayManager* GetDisplayManager() {
97 return Shell::GetInstance()->display_manager(); 81 return Shell::GetInstance()->display_manager();
98 } 82 }
99 83
100 void SetDisplayPropertiesOnHost(AshWindowTreeHost* ash_host, 84 void SetDisplayPropertiesOnHost(AshWindowTreeHost* ash_host,
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 aura::client::CaptureClient* capture_client_; 222 aura::client::CaptureClient* capture_client_;
239 aura::client::FocusClient* focus_client_; 223 aura::client::FocusClient* focus_client_;
240 aura::WindowTracker tracker_; 224 aura::WindowTracker tracker_;
241 aura::Window* focused_; 225 aura::Window* focused_;
242 aura::Window* active_; 226 aura::Window* active_;
243 227
244 DISALLOW_COPY_AND_ASSIGN(FocusActivationStore); 228 DISALLOW_COPY_AND_ASSIGN(FocusActivationStore);
245 }; 229 };
246 230
247 //////////////////////////////////////////////////////////////////////////////// 231 ////////////////////////////////////////////////////////////////////////////////
248 // DisplayChangeLimiter
249
250 WindowTreeHostManager::DisplayChangeLimiter::DisplayChangeLimiter()
251 : throttle_timeout_(base::Time::Now()) {}
252
253 void WindowTreeHostManager::DisplayChangeLimiter::SetThrottleTimeout(
254 int64_t throttle_ms) {
255 throttle_timeout_ =
256 base::Time::Now() + base::TimeDelta::FromMilliseconds(throttle_ms);
257 }
258
259 bool WindowTreeHostManager::DisplayChangeLimiter::IsThrottled() const {
260 return base::Time::Now() < throttle_timeout_;
261 }
262
263 ////////////////////////////////////////////////////////////////////////////////
264 // WindowTreeHostManager 232 // WindowTreeHostManager
265 233
266 WindowTreeHostManager::WindowTreeHostManager() 234 WindowTreeHostManager::WindowTreeHostManager()
267 : primary_tree_host_for_replace_(nullptr), 235 : primary_tree_host_for_replace_(nullptr),
268 focus_activation_store_(new FocusActivationStore()), 236 focus_activation_store_(new FocusActivationStore()),
269 cursor_window_controller_(new CursorWindowController()), 237 cursor_window_controller_(new CursorWindowController()),
270 mirror_window_controller_(new MirrorWindowController()), 238 mirror_window_controller_(new MirrorWindowController()),
271 cursor_display_id_for_restore_(gfx::Display::kInvalidDisplayID), 239 cursor_display_id_for_restore_(gfx::Display::kInvalidDisplayID),
272 weak_ptr_factory_(this) { 240 weak_ptr_factory_(this) {
273 #if defined(OS_CHROMEOS)
274 if (base::SysInfo::IsRunningOnChromeOS())
275 limiter_.reset(new DisplayChangeLimiter);
276 #endif
277 // Reset primary display to make sure that tests don't use 241 // Reset primary display to make sure that tests don't use
278 // stale display info from previous tests. 242 // stale display info from previous tests.
279 primary_display_id = gfx::Display::kInvalidDisplayID; 243 primary_display_id = gfx::Display::kInvalidDisplayID;
280 } 244 }
281 245
282 WindowTreeHostManager::~WindowTreeHostManager() {} 246 WindowTreeHostManager::~WindowTreeHostManager() {}
283 247
284 void WindowTreeHostManager::Start() { 248 void WindowTreeHostManager::Start() {
285 Shell::GetScreen()->AddObserver(this); 249 Shell::GetScreen()->AddObserver(this);
286 Shell::GetInstance()->display_manager()->set_delegate(this); 250 Shell::GetInstance()->display_manager()->set_delegate(this);
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 for (WindowTreeHostMap::const_iterator it = window_tree_hosts_.begin(); 383 for (WindowTreeHostMap::const_iterator it = window_tree_hosts_.begin();
420 it != window_tree_hosts_.end(); ++it) { 384 it != window_tree_hosts_.end(); ++it) {
421 RootWindowController* controller = 385 RootWindowController* controller =
422 GetRootWindowController(GetWindow(it->second)); 386 GetRootWindowController(GetWindow(it->second));
423 if (controller) 387 if (controller)
424 controllers.push_back(controller); 388 controllers.push_back(controller);
425 } 389 }
426 return controllers; 390 return controllers;
427 } 391 }
428 392
429 void WindowTreeHostManager::ToggleMirrorMode() { 393 void WindowTreeHostManager::SwapPrimaryDisplayForTest() {
430 DisplayManager* display_manager = GetDisplayManager(); 394 if (Shell::GetScreen()->GetNumDisplays() <= 1)
431 if (display_manager->num_connected_displays() <= 1)
432 return; 395 return;
433 396 SetPrimaryDisplay(ScreenUtil::GetSecondaryDisplay());
434 if (limiter_) {
435 if (limiter_->IsThrottled())
436 return;
437 limiter_->SetThrottleTimeout(kCycleDisplayThrottleTimeoutMs);
438 }
439 #if defined(OS_CHROMEOS)
440 Shell* shell = Shell::GetInstance();
441 DisplayAnimator* animation = shell->display_animator();
442 animation->StartFadeOutAnimation(base::Bind(
443 &WindowTreeHostManager::SetMirrorModeAfterAnimation,
444 weak_ptr_factory_.GetWeakPtr(), !display_manager->IsInMirrorMode()));
445 #endif
446 }
447
448 void WindowTreeHostManager::SwapPrimaryDisplay() {
449 if (limiter_) {
450 if (limiter_->IsThrottled())
451 return;
452 limiter_->SetThrottleTimeout(kSwapDisplayThrottleTimeoutMs);
453 }
454
455 if (Shell::GetScreen()->GetNumDisplays() > 1) {
456 #if defined(OS_CHROMEOS)
457 DisplayAnimator* animation = Shell::GetInstance()->display_animator();
458 if (animation) {
459 animation->StartFadeOutAnimation(
460 base::Bind(&WindowTreeHostManager::OnFadeOutForSwapDisplayFinished,
461 weak_ptr_factory_.GetWeakPtr()));
462 } else {
463 SetPrimaryDisplay(ScreenUtil::GetSecondaryDisplay());
464 }
465 #else
466 SetPrimaryDisplay(ScreenUtil::GetSecondaryDisplay());
467 #endif
468 }
469 } 397 }
470 398
471 void WindowTreeHostManager::SetPrimaryDisplayId(int64_t id) { 399 void WindowTreeHostManager::SetPrimaryDisplayId(int64_t id) {
472 DCHECK_NE(gfx::Display::kInvalidDisplayID, id); 400 DCHECK_NE(gfx::Display::kInvalidDisplayID, id);
473 if (id == gfx::Display::kInvalidDisplayID || primary_display_id == id) 401 if (id == gfx::Display::kInvalidDisplayID || primary_display_id == id)
474 return; 402 return;
475 403
476 const gfx::Display& display = GetDisplayManager()->GetDisplayForId(id); 404 const gfx::Display& display = GetDisplayManager()->GetDisplayForId(id);
477 if (display.is_valid()) 405 if (display.is_valid())
478 SetPrimaryDisplay(display); 406 SetPrimaryDisplay(display);
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 cursor_display_id_for_restore_ = display.id(); 754 cursor_display_id_for_restore_ = display.id();
827 755
828 gfx::Point point_in_native = point_in_screen; 756 gfx::Point point_in_native = point_in_screen;
829 aura::Window* root_window = GetRootWindowForDisplayId(display.id()); 757 aura::Window* root_window = GetRootWindowForDisplayId(display.id());
830 ::wm::ConvertPointFromScreen(root_window, &point_in_native); 758 ::wm::ConvertPointFromScreen(root_window, &point_in_native);
831 root_window->GetHost()->ConvertPointToNativeScreen(&point_in_native); 759 root_window->GetHost()->ConvertPointToNativeScreen(&point_in_native);
832 cursor_location_in_native_coords_for_restore_ = point_in_native; 760 cursor_location_in_native_coords_for_restore_ = point_in_native;
833 } 761 }
834 762
835 void WindowTreeHostManager::PostDisplayConfigurationChange() { 763 void WindowTreeHostManager::PostDisplayConfigurationChange() {
836 if (limiter_)
837 limiter_->SetThrottleTimeout(kAfterDisplayChangeThrottleTimeoutMs);
838
839 focus_activation_store_->Restore(); 764 focus_activation_store_->Restore();
840 765
841 DisplayManager* display_manager = GetDisplayManager(); 766 DisplayManager* display_manager = GetDisplayManager();
842 DisplayLayoutStore* layout_store = display_manager->layout_store(); 767 DisplayLayoutStore* layout_store = display_manager->layout_store();
843 if (display_manager->num_connected_displays() > 1) { 768 if (display_manager->num_connected_displays() > 1) {
844 DisplayIdPair pair = display_manager->GetCurrentDisplayIdPair(); 769 DisplayIdPair pair = display_manager->GetCurrentDisplayIdPair();
845 DisplayLayout layout = layout_store->GetRegisteredDisplayLayout(pair); 770 DisplayLayout layout = layout_store->GetRegisteredDisplayLayout(pair);
846 layout_store->UpdateMultiDisplayState( 771 layout_store->UpdateMultiDisplayState(
847 pair, display_manager->IsInMirrorMode(), layout.default_unified); 772 pair, display_manager->IsInMirrorMode(), layout.default_unified);
848 773
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
912 window_tree_hosts_[display.id()] = ash_host; 837 window_tree_hosts_[display.id()] = ash_host;
913 SetDisplayPropertiesOnHost(ash_host, display); 838 SetDisplayPropertiesOnHost(ash_host, display);
914 839
915 #if defined(OS_CHROMEOS) 840 #if defined(OS_CHROMEOS)
916 if (switches::ConstrainPointerToRoot()) 841 if (switches::ConstrainPointerToRoot())
917 ash_host->ConfineCursorToRootWindow(); 842 ash_host->ConfineCursorToRootWindow();
918 #endif 843 #endif
919 return ash_host; 844 return ash_host;
920 } 845 }
921 846
922 void WindowTreeHostManager::OnFadeOutForSwapDisplayFinished() {
923 #if defined(OS_CHROMEOS)
924 SetPrimaryDisplay(ScreenUtil::GetSecondaryDisplay());
925 Shell::GetInstance()->display_animator()->StartFadeInAnimation();
926 #endif
927 }
928
929 void WindowTreeHostManager::SetMirrorModeAfterAnimation(bool mirror) {
930 GetDisplayManager()->SetMirrorMode(mirror);
931 }
932
933 } // namespace ash 847 } // namespace ash
OLDNEW
« no previous file with comments | « ash/display/window_tree_host_manager.h ('k') | ash/display/window_tree_host_manager_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698