display_controller_unittest.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt// Use of this source code is governed by a BSD-style license that can be 3aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt// found in the LICENSE file. 4aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 5aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/display/display_controller.h" 6aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 7aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/display/display_info.h" 8aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/display/display_manager.h" 9aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/launcher/launcher.h" 102e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt#include "ash/screen_ash.h" 11aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/shelf/shelf_widget.h" 12aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/shell.h" 13aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/test/ash_test_base.h" 14aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ash/test/cursor_manager_test_api.h" 15aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ui/aura/env.h" 16aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ui/aura/root_window.h" 17aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ui/aura/test/event_generator.h" 18aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ui/aura/window_tracker.h" 19aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ui/base/events/event_handler.h" 2041a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt#include "ui/gfx/display.h" 21aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#include "ui/gfx/screen.h" 2261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt#include "ui/views/widget/widget.h" 23aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 24aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#if defined(USE_X11) 2561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt#include "ui/base/x/x11_util.h" 2661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt#include <X11/Xlib.h> 2761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt#undef RootWindow 28aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#endif 29aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 30aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtnamespace ash { 31aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtnamespace test { 32aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtnamespace { 3341a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt 3441a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardtconst char kDesktopBackgroundView[] = "DesktopBackgroundView"; 3541a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt 3641a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardtclass TestObserver : public DisplayController::Observer { 3741a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt public: 3841a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt TestObserver() : changing_count_(0), changed_count_(0) { 3941a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt Shell::GetInstance()->display_controller()->AddObserver(this); 4061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt } 4161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 4261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt virtual ~TestObserver() { 4361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt Shell::GetInstance()->display_controller()->RemoveObserver(this); 4441a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt } 45aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 46aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt virtual void OnDisplayConfigurationChanging() OVERRIDE { 47aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt ++changing_count_; 48aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt } 49aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 50aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt virtual void OnDisplayConfigurationChanged() OVERRIDE { 51aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt ++changed_count_; 52aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt } 53aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 54aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt int CountAndReset() { 55aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(changing_count_, changed_count_); 56aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt int c = changing_count_; 57aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt changing_count_ = changed_count_ = 0; 58aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt return c; 59aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt } 60aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 61aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt private: 62aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt int changing_count_; 63aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt int changed_count_; 64aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 65aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt DISALLOW_COPY_AND_ASSIGN(TestObserver); 66aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt}; 67aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 68aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtgfx::Display GetPrimaryDisplay() { 69aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt return Shell::GetScreen()->GetDisplayNearestWindow( 70aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetAllRootWindows()[0]); 71aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt} 72aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 73aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtgfx::Display GetSecondaryDisplay() { 74aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt return Shell::GetScreen()->GetDisplayNearestWindow( 75aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetAllRootWindows()[1]); 76aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt} 77aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 78aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtvoid SetSecondaryDisplayLayoutAndOffset(DisplayLayout::Position position, 79aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt int offset) { 80aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt DisplayController* display_controller = 81aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->display_controller(); 82aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt DisplayLayout layout(position, offset); 83aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt ASSERT_GT(Shell::GetScreen()->GetNumDisplays(), 1); 84aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt display_controller->SetLayoutForCurrentDisplays(layout); 85aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt} 86aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 87aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtvoid SetSecondaryDisplayLayout(DisplayLayout::Position position) { 88aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt SetSecondaryDisplayLayoutAndOffset(position, 0); 89aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt} 90aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 91aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtvoid SetDefaultDisplayLayout(DisplayLayout::Position position) { 92aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->display_controller()-> 93aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt SetDefaultDisplayLayout(DisplayLayout(position, 0)); 94aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt} 95aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 96aa37acc1423126f555135935c687eb91995b9440Jan Engelhardtclass DisplayControllerShutdownTest : public test::AshTestBase { 97aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt public: 98aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt virtual void TearDown() OVERRIDE { 99aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt test::AshTestBase::TearDown(); 100aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt if (!SupportsMultipleDisplays()) 101a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt return; 102a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt 103a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt // Make sure that primary display is accessible after shutdown. 104a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt gfx::Display primary = Shell::GetScreen()->GetPrimaryDisplay(); 105a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt EXPECT_EQ("0,0 444x333", primary.bounds().ToString()); 106a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 1078b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt } 108a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt}; 109a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt 110dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardtclass TestEventHandler : public ui::EventHandler { 111dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt public: 1120eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt TestEventHandler() : target_root_(NULL), 1130eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt touch_radius_x_(0.0), 1148b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt touch_radius_y_(0.0), 1158b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt scroll_x_offset_(0.0), 116d78254d7f9d18ef76377a3013302430cce8ea702Jan Engelhardt scroll_y_offset_(0.0), 117d78254d7f9d18ef76377a3013302430cce8ea702Jan Engelhardt scroll_x_offset_ordinal_(0.0), 118d78254d7f9d18ef76377a3013302430cce8ea702Jan Engelhardt scroll_y_offset_ordinal_(0.0) {} 119d78254d7f9d18ef76377a3013302430cce8ea702Jan Engelhardt virtual ~TestEventHandler() {} 120d78254d7f9d18ef76377a3013302430cce8ea702Jan Engelhardt 121a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { 122a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt if (event->flags() & ui::EF_IS_SYNTHESIZED && 123a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt event->type() != ui::ET_MOUSE_EXITED && 1248b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt event->type() != ui::ET_MOUSE_ENTERED) { 125a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt return; 126a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt } 127dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt aura::Window* target = static_cast<aura::Window*>(event->target()); 128dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt mouse_location_ = event->root_location(); 129dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt target_root_ = target->GetRootWindow(); 130dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt event->StopPropagation(); 1310eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt } 1320eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt 1330eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE { 1340eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt aura::Window* target = static_cast<aura::Window*>(event->target()); 135dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt // Only record when the target is the background which covers 136a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt // entire root window. 137a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt if (target->name() != kDesktopBackgroundView) 138a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt return; 1398b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt touch_radius_x_ = event->radius_x(); 1408b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt touch_radius_y_ = event->radius_y(); 1418b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt event->StopPropagation(); 1428b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt } 143a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt 144a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE { 145a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt aura::Window* target = static_cast<aura::Window*>(event->target()); 14604bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt // Only record when the target is the background which covers 147f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt // entire root window. 148f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt if (target->name() != kDesktopBackgroundView) 149f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt return; 150f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt 151f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt if (event->type() == ui::ET_SCROLL) { 152f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt scroll_x_offset_ = event->x_offset(); 153f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt scroll_y_offset_ = event->y_offset(); 154f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt scroll_x_offset_ordinal_ = event->x_offset_ordinal(); 155f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt scroll_y_offset_ordinal_ = event->y_offset_ordinal(); 156f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt } 157f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt event->StopPropagation(); 158f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt } 159f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt 160f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt std::string GetLocationAndReset() { 161f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt std::string result = mouse_location_.ToString(); 162f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt mouse_location_.SetPoint(0, 0); 163f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt target_root_ = NULL; 164f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt return result; 165f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt } 166f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt 167f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt float touch_radius_x() { return touch_radius_x_; } 168f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt float touch_radius_y() { return touch_radius_y_; } 169f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt float scroll_x_offset() { return scroll_x_offset_; } 17004bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt float scroll_y_offset() { return scroll_y_offset_; } 17104bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt float scroll_x_offset_ordinal() { return scroll_x_offset_ordinal_; } 17204bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt float scroll_y_offset_ordinal() { return scroll_y_offset_ordinal_; } 17304bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt 17404bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt private: 17504bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt gfx::Point mouse_location_; 17604bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt aura::RootWindow* target_root_; 17704bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt 17804bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt float touch_radius_x_; 17904bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt float touch_radius_y_; 18004bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt float scroll_x_offset_; 18104bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt float scroll_y_offset_; 182564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt float scroll_x_offset_ordinal_; 183564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt float scroll_y_offset_ordinal_; 18404bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt 18504bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt DISALLOW_COPY_AND_ASSIGN(TestEventHandler); 18604bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt}; 18704bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt 1888bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardtgfx::Display::Rotation GetStoredRotation(int64 id) { 1898bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).rotation(); 1908bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt} 191564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt 192bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardtfloat GetStoredUIScale(int64 id) { 193bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).ui_scale(); 194564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt} 19504bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt 19604bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt#if defined(USE_X11) 197564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardtvoid GetPrimaryAndSeconary(aura::RootWindow** primary, 19804bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt aura::RootWindow** secondary) { 19904bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt *primary = Shell::GetPrimaryRootWindow(); 20004bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 20104bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt *secondary = root_windows[0] == *primary ? root_windows[1] : root_windows[0]; 20204bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt} 20304bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt 20404bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardtstd::string GetXWindowName(aura::RootWindow* window) { 20504bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt char* name = NULL; 20604bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt XFetchName(ui::GetXDisplay(), window->GetAcceleratedWidget(), &name); 20704bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt return std::string(name); 20804bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt} 20904bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt#endif 21004bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt 21104bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt} // namespace 21204bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt 21304bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardttypedef test::AshTestBase DisplayControllerTest; 21404bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt 21504bb988275ac76815a15788a7fc75ac78f3bb833Jan EngelhardtTEST_F(DisplayControllerShutdownTest, Shutdown) { 216564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt if (!SupportsMultipleDisplays()) 2178bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt return; 2188bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt 2198bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt UpdateDisplay("444x333, 200x200"); 220564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt} 221564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt 222564eaf48e14411803a353206eefbb89d525c63ffJan EngelhardtTEST_F(DisplayControllerTest, SecondaryDisplayLayout) { 223bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt if (!SupportsMultipleDisplays()) 224bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt return; 225564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt 2260787a82873fe9db5dea478942b183e6ff2a8500dJan Engelhardt TestObserver observer; 227564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt UpdateDisplay("500x500,400x400"); 2288bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); // resize and add 2298bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt gfx::Display* secondary_display = 2308bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt Shell::GetInstance()->display_manager()->GetDisplayAt(1); 231564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt gfx::Insets insets(5, 5, 5, 5); 232564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt secondary_display->UpdateWorkAreaFromInsets(insets); 233564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt 234bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt // Default layout is RIGHT. 235bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 236564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt EXPECT_EQ("500,0 400x400", GetSecondaryDisplay().bounds().ToString()); 237564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt EXPECT_EQ("505,5 390x390", GetSecondaryDisplay().work_area().ToString()); 23804bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt 23904bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt // Layout the secondary display to the bottom of the primary. 24004bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt SetSecondaryDisplayLayout(DisplayLayout::BOTTOM); 24104bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); 24204bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 2434a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt EXPECT_EQ("0,500 400x400", GetSecondaryDisplay().bounds().ToString()); 2444a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt EXPECT_EQ("5,505 390x390", GetSecondaryDisplay().work_area().ToString()); 2454a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt 2464a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt // Layout the secondary display to the left of the primary. 2474a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt SetSecondaryDisplayLayout(DisplayLayout::LEFT); 2484a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); 2494a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 2504a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt EXPECT_EQ("-400,0 400x400", GetSecondaryDisplay().bounds().ToString()); 2514a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt EXPECT_EQ("-395,5 390x390", GetSecondaryDisplay().work_area().ToString()); 2524a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt 2534a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt // Layout the secondary display to the top of the primary. 2544a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt SetSecondaryDisplayLayout(DisplayLayout::TOP); 2554a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); 2564a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 2574a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt EXPECT_EQ("0,-400 400x400", GetSecondaryDisplay().bounds().ToString()); 2584a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt EXPECT_EQ("5,-395 390x390", GetSecondaryDisplay().work_area().ToString()); 2594a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt 2604a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt // Layout to the right with an offset. 2614a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 300); 2624a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); // resize and add 2634a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 2644a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt EXPECT_EQ("500,300 400x400", GetSecondaryDisplay().bounds().ToString()); 2654a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt 26661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt // Keep the minimum 100. 26761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 490); 26861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); // resize and add 26961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 27061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("500,400 400x400", GetSecondaryDisplay().bounds().ToString()); 27161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 27261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, -400); 27361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); // resize and add 27461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 27561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("500,-300 400x400", GetSecondaryDisplay().bounds().ToString()); 27661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 27761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt // Layout to the bottom with an offset. 27861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -200); 27961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); // resize and add 28061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 28161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("-200,500 400x400", GetSecondaryDisplay().bounds().ToString()); 28261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 28361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt // Keep the minimum 100. 28461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, 490); 28561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); // resize and add 28661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 28761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("400,500 400x400", GetSecondaryDisplay().bounds().ToString()); 28861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 28961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400); 29061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); // resize and add 29161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 29261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString()); 29361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt} 29461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 29561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan EngelhardtTEST_F(DisplayControllerTest, BoundsUpdated) { 29661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt if (!SupportsMultipleDisplays()) 29761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt return; 29861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 29961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt TestObserver observer; 30061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt SetDefaultDisplayLayout(DisplayLayout::BOTTOM); 30161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt UpdateDisplay("200x200,300x300"); // layout, resize and add. 30261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); 30361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 30461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt internal::DisplayManager* display_manager = 30561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt Shell::GetInstance()->display_manager(); 30661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt gfx::Display* secondary_display = display_manager->GetDisplayAt(1); 30761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt gfx::Insets insets(5, 5, 5, 5); 30861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt secondary_display->UpdateWorkAreaFromInsets(insets); 30961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 31061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,0 200x200", GetPrimaryDisplay().bounds().ToString()); 31161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,200 300x300", GetSecondaryDisplay().bounds().ToString()); 31261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("5,205 290x290", GetSecondaryDisplay().work_area().ToString()); 31361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 31461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt UpdateDisplay("400x400,200x200"); 31561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); // two resizes 31661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString()); 31761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,400 200x200", GetSecondaryDisplay().bounds().ToString()); 31861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 31961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt UpdateDisplay("400x400,300x300"); 32061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); 32161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString()); 32261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,400 300x300", GetSecondaryDisplay().bounds().ToString()); 32361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 32461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt UpdateDisplay("400x400"); 32561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); 32661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString()); 32761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 32861cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 32961cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt UpdateDisplay("400x500*2,300x300"); 33061cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); 33161cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 33261cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,0 200x250", GetPrimaryDisplay().bounds().ToString()); 33361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ("0,250 300x300", GetSecondaryDisplay().bounds().ToString()); 33461cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt 33561cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt // No change 33661cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt UpdateDisplay("400x500*2,300x300"); 33761cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ(0, observer.CountAndReset()); 338d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt 339d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt // Rotation 340d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt int64 primary_id = GetPrimaryDisplay().id(); 341d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90); 342d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); 343d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90); 344d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt EXPECT_EQ(0, observer.CountAndReset()); 345d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt 346d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt // UI scale is eanbled only on internal display. 347d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt int64 secondary_id = GetSecondaryDisplay().id(); 348d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt gfx::Display::SetInternalDisplayId(secondary_id); 349d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt display_manager->SetDisplayUIScale(secondary_id, 1.125f); 350d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt EXPECT_EQ(1, observer.CountAndReset()); 351d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt display_manager->SetDisplayUIScale(secondary_id, 1.125f); 352d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt EXPECT_EQ(0, observer.CountAndReset()); 353d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt display_manager->SetDisplayUIScale(primary_id, 1.125f); 354d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt EXPECT_EQ(0, observer.CountAndReset()); 355d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt display_manager->SetDisplayUIScale(primary_id, 1.125f); 356d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt EXPECT_EQ(0, observer.CountAndReset()); 357d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt} 358d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt 359d25e217578492d17f7752bf77cfab5f2c2509795Jan EngelhardtTEST_F(DisplayControllerTest, MirroredLayout) { 360d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt if (!SupportsMultipleDisplays()) 361d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt return; 362d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt 363d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt DisplayController* display_controller = 364d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt Shell::GetInstance()->display_controller(); 365d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt UpdateDisplay("500x500,400x400"); 36641a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored); 36741a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 36841a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ( 36941a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt 2U, Shell::GetInstance()->display_manager()->num_connected_displays()); 37041a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt 37141a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt UpdateDisplay("500x500,1+0-500x500"); 37241a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_TRUE(display_controller->GetCurrentDisplayLayout().mirrored); 37341a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 37441a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ( 37541a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt 2U, Shell::GetInstance()->display_manager()->num_connected_displays()); 37641a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt 37741a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt UpdateDisplay("500x500,500x500"); 37841a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored); 37941a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 38041a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ( 38141a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt 2U, Shell::GetInstance()->display_manager()->num_connected_displays()); 38241a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt} 38341a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt 38441a4cea0f4109fb76762dca073c3c1217658ee06Jan EngelhardtTEST_F(DisplayControllerTest, InvertLayout) { 38541a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ("left, 0", 38641a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt DisplayLayout(DisplayLayout::RIGHT, 0).Invert().ToString()); 38741a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ("left, -100", 38841a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt DisplayLayout(DisplayLayout::RIGHT, 100).Invert().ToString()); 38941a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ("left, 50", 39041a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt DisplayLayout(DisplayLayout::RIGHT, -50).Invert().ToString()); 39141a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt 39241a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ("right, 0", 39341a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt DisplayLayout(DisplayLayout::LEFT, 0).Invert().ToString()); 39441a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ("right, -90", 39541a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt DisplayLayout(DisplayLayout::LEFT, 90).Invert().ToString()); 39641a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ("right, 60", 39741a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt DisplayLayout(DisplayLayout::LEFT, -60).Invert().ToString()); 39841a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt 39941a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ("bottom, 0", 40041a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt DisplayLayout(DisplayLayout::TOP, 0).Invert().ToString()); 40141a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ("bottom, -80", 40241a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt DisplayLayout(DisplayLayout::TOP, 80).Invert().ToString()); 4032b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ("bottom, 70", 4042b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt DisplayLayout(DisplayLayout::TOP, -70).Invert().ToString()); 4052b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt 4062b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ("top, 0", 4072b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt DisplayLayout(DisplayLayout::BOTTOM, 0).Invert().ToString()); 4082b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ("top, -70", 4092b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt DisplayLayout(DisplayLayout::BOTTOM, 70).Invert().ToString()); 4102b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ("top, 80", 4112b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt DisplayLayout(DisplayLayout::BOTTOM, -80).Invert().ToString()); 4122b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt} 4132b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt 4142b01f706e7ba48d72e57f8e47457a86d9ed44992Jan EngelhardtTEST_F(DisplayControllerTest, SwapPrimary) { 4152b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt if (!SupportsMultipleDisplays()) 4162b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt return; 4172b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt 4182b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt DisplayController* display_controller = 4192b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt Shell::GetInstance()->display_controller(); 4202b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt 4212b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt UpdateDisplay("200x200,300x300"); 422d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 423d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay(); 424d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt 4252b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt DisplayLayout display_layout(DisplayLayout::RIGHT, 50); 426d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt display_controller->SetLayoutForCurrentDisplays(display_layout); 4272b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt 4282b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_NE(primary_display.id(), secondary_display.id()); 4292b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt aura::RootWindow* primary_root = 4302b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt display_controller->GetRootWindowForDisplayId(primary_display.id()); 4312b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt aura::RootWindow* secondary_root = 4322b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt display_controller->GetRootWindowForDisplayId(secondary_display.id()); 4332b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_NE(primary_root, secondary_root); 4342b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt aura::Window* launcher_window = 4352b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView(); 4362b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_TRUE(primary_root->Contains(launcher_window)); 4372b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_FALSE(secondary_root->Contains(launcher_window)); 438d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt EXPECT_EQ(primary_display.id(), 439d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt Shell::GetScreen()->GetDisplayNearestPoint( 440d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt gfx::Point(-100, -100)).id()); 4412b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ(primary_display.id(), 4422b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 443d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt 444d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt EXPECT_EQ("0,0 200x200", primary_display.bounds().ToString()); 4452b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ("0,0 200x152", primary_display.work_area().ToString()); 4462b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ("200,0 300x300", secondary_display.bounds().ToString()); 4472b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ("200,0 300x252", secondary_display.work_area().ToString()); 4482b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ("right, 50", 4492b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt display_controller->GetCurrentDisplayLayout().ToString()); 450d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt 4512b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt // Switch primary and secondary 4522b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt display_controller->SetPrimaryDisplay(secondary_display); 4532b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt const DisplayLayout& inverted_layout = 4542b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt display_controller->GetCurrentDisplayLayout(); 4552b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ("left, -50", inverted_layout.ToString()); 4562b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt 4572b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ(secondary_display.id(), 4582b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt Shell::GetScreen()->GetPrimaryDisplay().id()); 4592b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 4602b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ(secondary_display.id(), 461d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt Shell::GetScreen()->GetDisplayNearestPoint( 462d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt gfx::Point(-100, -100)).id()); 4632b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt EXPECT_EQ(secondary_display.id(), 4642b01f706e7ba48d72e57f8e47457a86d9ed44992Jan Engelhardt Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 465b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt 466b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt EXPECT_EQ( 467b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt primary_root, 468b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt display_controller->GetRootWindowForDisplayId(secondary_display.id())); 469b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt EXPECT_EQ( 470b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt secondary_root, 471b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt display_controller->GetRootWindowForDisplayId(primary_display.id())); 472b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt EXPECT_TRUE(primary_root->Contains(launcher_window)); 473b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt EXPECT_FALSE(secondary_root->Contains(launcher_window)); 474b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt 475b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt // Test if the bounds are correctly swapped. 476b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt gfx::Display swapped_primary = Shell::GetScreen()->GetPrimaryDisplay(); 477b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt gfx::Display swapped_secondary = ScreenAsh::GetSecondaryDisplay(); 478b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt EXPECT_EQ("0,0 300x300", swapped_primary.bounds().ToString()); 479b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt EXPECT_EQ("0,0 300x252", swapped_primary.work_area().ToString()); 480b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt EXPECT_EQ("-200,-50 200x200", swapped_secondary.bounds().ToString()); 481b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt 482b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt EXPECT_EQ("-200,-50 200x152", swapped_secondary.work_area().ToString()); 483b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt 484b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt aura::WindowTracker tracker; 485b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt tracker.Add(primary_root); 486b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt tracker.Add(secondary_root); 487b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt 488b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt // Deleting 2nd display should move the primary to original primary display. 489b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt UpdateDisplay("200x200"); 49044517bda3d8130638882f69478a8091316f30cbbJan Engelhardt RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. 49144517bda3d8130638882f69478a8091316f30cbbJan Engelhardt EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 492b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id()); 493b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt EXPECT_EQ(primary_display.id(), 494b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt Shell::GetScreen()->GetDisplayNearestPoint( 495b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt gfx::Point(-100, -100)).id()); 496d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt EXPECT_EQ(primary_display.id(), 497d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 498b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt EXPECT_TRUE(tracker.Contains(primary_root)); 499b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt EXPECT_FALSE(tracker.Contains(secondary_root)); 500b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt EXPECT_TRUE(primary_root->Contains(launcher_window)); 501b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt} 502b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt 503b8592fa3352018646b0befaa48f930f75c5b7d92Jan EngelhardtTEST_F(DisplayControllerTest, SwapPrimaryById) { 504b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt if (!SupportsMultipleDisplays()) 505b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt return; 506b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt 507b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt DisplayController* display_controller = 508b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt Shell::GetInstance()->display_controller(); 509b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt 510b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt UpdateDisplay("200x200,300x300"); 511b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 512b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay(); 513b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt 514b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt DisplayLayout display_layout(DisplayLayout::RIGHT, 50); 515f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt display_controller->SetLayoutForCurrentDisplays(display_layout); 516f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt 517f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_NE(primary_display.id(), secondary_display.id()); 518f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt aura::RootWindow* primary_root = 519f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt display_controller->GetRootWindowForDisplayId(primary_display.id()); 520f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt aura::RootWindow* secondary_root = 521f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt display_controller->GetRootWindowForDisplayId(secondary_display.id()); 522f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt aura::Window* launcher_window = 523f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView(); 524f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_TRUE(primary_root->Contains(launcher_window)); 525f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_FALSE(secondary_root->Contains(launcher_window)); 526f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_NE(primary_root, secondary_root); 527f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_EQ(primary_display.id(), 528f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt Shell::GetScreen()->GetDisplayNearestPoint( 529f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt gfx::Point(-100, -100)).id()); 530f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_EQ(primary_display.id(), 531f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 532f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt 533f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt // Switch primary and secondary by display ID. 534f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt TestObserver observer; 535f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt display_controller->SetPrimaryDisplayId(secondary_display.id()); 536f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_EQ(secondary_display.id(), 537f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt Shell::GetScreen()->GetPrimaryDisplay().id()); 538f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 539f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_LT(0, observer.CountAndReset()); 540f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt 541f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_EQ( 542f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt primary_root, 543f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt display_controller->GetRootWindowForDisplayId(secondary_display.id())); 544f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_EQ( 545f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt secondary_root, 546f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt display_controller->GetRootWindowForDisplayId(primary_display.id())); 547f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_TRUE(primary_root->Contains(launcher_window)); 548f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_FALSE(secondary_root->Contains(launcher_window)); 549f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt 550f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt const DisplayLayout& inverted_layout = 551f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt display_controller->GetCurrentDisplayLayout(); 552f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt 553f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_EQ("left, -50", inverted_layout.ToString()); 554f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt 555f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt // Calling the same ID don't do anything. 556f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt display_controller->SetPrimaryDisplayId(secondary_display.id()); 557f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_EQ(0, observer.CountAndReset()); 558f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt 559f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt aura::WindowTracker tracker; 560f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt tracker.Add(primary_root); 561f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt tracker.Add(secondary_root); 562f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt 563f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt // Deleting 2nd display should move the primary to original primary display. 564f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt UpdateDisplay("200x200"); 565f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. 566f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 567f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id()); 568f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_EQ(primary_display.id(), 569f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt Shell::GetScreen()->GetDisplayNearestPoint( 570d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt gfx::Point(-100, -100)).id()); 571d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt EXPECT_EQ(primary_display.id(), 572fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 573d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt EXPECT_TRUE(tracker.Contains(primary_root)); 574fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt EXPECT_FALSE(tracker.Contains(secondary_root)); 575e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt EXPECT_TRUE(primary_root->Contains(launcher_window)); 576e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt 577fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt internal::DisplayManager* display_manager = 578e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt Shell::GetInstance()->display_manager(); 579d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt // Adding 2nd display with the same ID. The 2nd display should become primary 580d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt // since secondary id is still stored as desirable_primary_id. 581e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt std::vector<internal::DisplayInfo> display_info_list; 582e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt display_info_list.push_back( 583e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt display_manager->GetDisplayInfo(primary_display.id())); 584d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt display_info_list.push_back( 585e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt display_manager->GetDisplayInfo(secondary_display.id())); 586d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt display_manager->OnNativeDisplaysChanged(display_info_list); 587fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt 588fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 589fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt EXPECT_EQ(secondary_display.id(), 590fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt Shell::GetScreen()->GetPrimaryDisplay().id()); 591fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 592fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt EXPECT_EQ( 593fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt primary_root, 594fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt display_controller->GetRootWindowForDisplayId(secondary_display.id())); 595fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt EXPECT_NE( 596fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt primary_root, 597fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt display_controller->GetRootWindowForDisplayId(primary_display.id())); 598fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt EXPECT_TRUE(primary_root->Contains(launcher_window)); 599fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt 600fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt // Deleting 2nd display and adding 2nd display with a different ID. The 2nd 601e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt // display shouldn't become primary. 602d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt UpdateDisplay("200x200"); 603fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt internal::DisplayInfo third_display_info( 604e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt secondary_display.id() + 1, std::string(), false); 605fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt third_display_info.SetBounds(secondary_display.bounds()); 606fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt ASSERT_NE(primary_display.id(), third_display_info.id()); 607e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt 608fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt const internal::DisplayInfo& primary_display_info = 609fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt display_manager->GetDisplayInfo(primary_display.id()); 610e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt std::vector<internal::DisplayInfo> display_info_list2; 611fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt display_info_list2.push_back(primary_display_info); 612fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt display_info_list2.push_back(third_display_info); 613e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt display_manager->OnNativeDisplaysChanged(display_info_list2); 614fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 615fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt EXPECT_EQ(primary_display.id(), 616e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt Shell::GetScreen()->GetPrimaryDisplay().id()); 617e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt EXPECT_EQ(third_display_info.id(), ScreenAsh::GetSecondaryDisplay().id()); 618e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt EXPECT_EQ( 619e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt primary_root, 620e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt display_controller->GetRootWindowForDisplayId(primary_display.id())); 621e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt EXPECT_NE( 622e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt primary_root, 623e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt display_controller->GetRootWindowForDisplayId(third_display_info.id())); 624e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt EXPECT_TRUE(primary_root->Contains(launcher_window)); 62566266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt} 62666266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt 62766266abd17adc9631f3769ef0b82968c0bac6f38Jan EngelhardtTEST_F(DisplayControllerTest, CursorDeviceScaleFactorSwapPrimary) { 62866266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt if (!SupportsMultipleDisplays()) 62966266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt return; 63066266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt 63166266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt DisplayController* display_controller = 63266266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt Shell::GetInstance()->display_controller(); 63366266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt 63466266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt UpdateDisplay("200x200,200x200*2"); 63566266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 63666266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay(); 63766266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt 63866266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt aura::RootWindow* primary_root = 63966266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt display_controller->GetRootWindowForDisplayId(primary_display.id()); 64066266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt aura::RootWindow* secondary_root = 64166266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt display_controller->GetRootWindowForDisplayId(secondary_display.id()); 64266266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt EXPECT_NE(primary_root, secondary_root); 64366266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt 64466266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt test::CursorManagerTestApi test_api(Shell::GetInstance()->cursor_manager()); 64566266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt 64666266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt EXPECT_EQ(1.0f, 64766266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 64866266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt primary_root->MoveCursorTo(gfx::Point(50, 50)); 64966266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor()); 65066266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt EXPECT_EQ(2.0f, 65166266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 652aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt secondary_root->MoveCursorTo(gfx::Point(50, 50)); 653dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor()); 6540eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt 655a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt // Switch primary and secondary 6568b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt display_controller->SetPrimaryDisplay(secondary_display); 6578bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt 658564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt // Cursor's device scale factor should be updated accroding to the swap of 65904bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt // primary and secondary. 660bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt EXPECT_EQ(1.0f, 661f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 6624a0a17620017c1f45946b2cde7139ef18ea3d93cJan Engelhardt secondary_root->MoveCursorTo(gfx::Point(50, 50)); 66361cc52b6f9edfa3efb1d0c9ea9531abb42828ec2Jan Engelhardt EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor()); 664d25e217578492d17f7752bf77cfab5f2c2509795Jan Engelhardt primary_root->MoveCursorTo(gfx::Point(50, 50)); 66541a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt EXPECT_EQ(2.0f, 666d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 66766266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor()); 668b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt 669b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt // Deleting 2nd display. 670f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt UpdateDisplay("200x200"); 671f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. 672fa9b759bacc0ad6a093892ef508811e7feb981b0Jan Engelhardt 673e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt // Cursor's device scale factor should be updated even without moving cursor. 674aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor()); 675aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 676aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt primary_root->MoveCursorTo(gfx::Point(50, 50)); 677d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt EXPECT_EQ(1.0f, 678d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 679d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor()); 680d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt} 681dfe99f1bf291b4b954d3608dbe95a43e16a8bb49Jan Engelhardt 6820eff54bd407aae6b99c3b189d356929e399b5a38Jan Engelhardt#if defined(OS_WIN) 683a93142d5f55db74ebd7d49be9bd88f7a499ded40Jan Engelhardt// TODO(scottmg): RootWindow doesn't get resized on Windows 6848b5bdea659f1fb86b3288a2568ab104a90b914e5Jan Engelhardt// Ash. http://crbug.com/247916. 6858bf513ada0aae0e4b1ac5160113fc532c2f525d0Jan Engelhardt#define MAYBE_UpdateDisplayWithHostOrigin DISABLED_UpdateDisplayWithHostOrigin 686564eaf48e14411803a353206eefbb89d525c63ffJan Engelhardt#else 68704bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt#define MAYBE_UpdateDisplayWithHostOrigin UpdateDisplayWithHostOrigin 688bc438c4cbdab09fafbbceecddd54e44e4234a4a1Jan Engelhardt#endif 689f012b3c9190cd95ac170072f759a97575613ea07Jan Engelhardt 6904a0a17620017c1f45946b2cde7139ef18ea3d93cJan EngelhardtTEST_F(DisplayControllerTest, MAYBE_UpdateDisplayWithHostOrigin) { 69141a4cea0f4109fb76762dca073c3c1217658ee06Jan Engelhardt UpdateDisplay("100x200,300x400"); 692d7282413763b0ba85d512c1cd49174b762ff449cJan Engelhardt ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 69366266abd17adc9631f3769ef0b82968c0bac6f38Jan Engelhardt Shell::RootWindowList root_windows = 694b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt Shell::GetInstance()->GetAllRootWindows(); 695b8592fa3352018646b0befaa48f930f75c5b7d92Jan Engelhardt ASSERT_EQ(2U, root_windows.size()); 696f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_EQ("1,1", root_windows[0]->GetHostOrigin().ToString()); 697f30231a02e145020fb47524f9a0daeb498a4f7d0Jan Engelhardt EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString()); 698e8b42fee7eaa1ba6df203fe0bc4496cae226cbd2Jan Engelhardt // UpdateDisplay set the origin if it's not set. 699aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_NE("1,1", root_windows[1]->GetHostOrigin().ToString()); 700aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString()); 701aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 702aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt UpdateDisplay("100x200,200+300-300x400"); 703aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 704aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("0,0", root_windows[0]->GetHostOrigin().ToString()); 705aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString()); 706aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("200,300", root_windows[1]->GetHostOrigin().ToString()); 707aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString()); 708aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 709aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt UpdateDisplay("400+500-200x300,300x400"); 710aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 711aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("400,500", root_windows[0]->GetHostOrigin().ToString()); 712aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("200x300", root_windows[0]->GetHostSize().ToString()); 713aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("0,0", root_windows[1]->GetHostOrigin().ToString()); 714aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString()); 715aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 716aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt UpdateDisplay("100+200-100x200,300+500-200x300"); 717aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 718aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("100,200", root_windows[0]->GetHostOrigin().ToString()); 719aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString()); 720aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("300,500", root_windows[1]->GetHostOrigin().ToString()); 721aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("200x300", root_windows[1]->GetHostSize().ToString()); 722aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt} 723aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 724aa37acc1423126f555135935c687eb91995b9440Jan EngelhardtTEST_F(DisplayControllerTest, OverscanInsets) { 725aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt if (!SupportsMultipleDisplays()) 726aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt return; 727aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 728aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt DisplayController* display_controller = 729aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->display_controller(); 730aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt TestEventHandler event_handler; 731aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->AddPreTargetHandler(&event_handler); 732aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 733aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt UpdateDisplay("120x200,300x400*2"); 734aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay(); 735aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 736aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 737aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt display_controller->SetOverscanInsets(display1.id(), 738aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt gfx::Insets(10, 15, 20, 25)); 739aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("0,0 80x170", root_windows[0]->bounds().ToString()); 740aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString()); 741aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("80,0 150x200", 742aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 743aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 744aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt aura::test::EventGenerator generator(root_windows[0]); 745aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt generator.MoveMouseToInHost(20, 25); 746aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("5,15", event_handler.GetLocationAndReset()); 747aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 748aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt display_controller->SetOverscanInsets(display1.id(), gfx::Insets()); 749aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("0,0 120x200", root_windows[0]->bounds().ToString()); 750aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("120,0 150x200", 751aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 752aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 753269cbfd30aac18c1fd251be83430dabc60abee0cJan Engelhardt generator.MoveMouseToInHost(30, 20); 754269cbfd30aac18c1fd251be83430dabc60abee0cJan Engelhardt EXPECT_EQ("30,20", event_handler.GetLocationAndReset()); 755aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 756aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt // Make sure the root window transformer uses correct scale 757aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt // factor when swapping display. Test crbug.com/253690. 758aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt UpdateDisplay("400x300*2,600x400/o"); 75904bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt root_windows = Shell::GetAllRootWindows(); 76004bb988275ac76815a15788a7fc75ac78f3bb833Jan Engelhardt gfx::Point point; 761aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(point); 762aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("15,10", point.ToString()); 763aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 764aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt display_controller->SwapPrimaryDisplay(); 765aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt point.SetPoint(0, 0); 766aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(point); 767aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("15,10", point.ToString()); 768aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 769aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 770aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt} 771aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 772aa37acc1423126f555135935c687eb91995b9440Jan EngelhardtTEST_F(DisplayControllerTest, Rotate) { 773aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt if (!SupportsMultipleDisplays()) 774aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt return; 775aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 776aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt DisplayController* display_controller = 777aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->display_controller(); 778aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt internal::DisplayManager* display_manager = 779aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->display_manager(); 780aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt TestEventHandler event_handler; 781aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->AddPreTargetHandler(&event_handler); 782aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 783aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt UpdateDisplay("120x200,300x400*2"); 784aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay(); 785aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt int64 display2_id = ScreenAsh::GetSecondaryDisplay().id(); 786aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 787aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt aura::test::EventGenerator generator1(root_windows[0]); 788aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 789aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString()); 790aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString()); 791aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("120,0 150x200", 792aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 793aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt generator1.MoveMouseToInHost(50, 40); 794aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("50,40", event_handler.GetLocationAndReset()); 795aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display1.id())); 796aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id)); 797aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 798aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt display_manager->SetDisplayRotation(display1.id(), 799aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt gfx::Display::ROTATE_90); 800aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString()); 801aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString()); 802aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("200,0 150x200", 803aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 804aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt generator1.MoveMouseToInHost(50, 40); 805aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("40,69", event_handler.GetLocationAndReset()); 806aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id())); 807aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id)); 808aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 809aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt DisplayLayout display_layout(DisplayLayout::BOTTOM, 50); 81033d180871bea281a448efd0c1a49517318162382Jan Engelhardt display_controller->SetLayoutForCurrentDisplays(display_layout); 811aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("50,120 150x200", 812aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 813aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 814aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt display_manager->SetDisplayRotation(display2_id, 815aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt gfx::Display::ROTATE_270); 816aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString()); 817aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString()); 818aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("50,120 200x150", 819aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 820aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id())); 821aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id)); 822aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 823aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#if !defined(OS_WIN) 824aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt aura::test::EventGenerator generator2(root_windows[1]); 825aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt generator2.MoveMouseToInHost(50, 40); 826aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("179,25", event_handler.GetLocationAndReset()); 827aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt display_manager->SetDisplayRotation(display1.id(), 828aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt gfx::Display::ROTATE_180); 829aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 830aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString()); 831aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString()); 832aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt // Dislay must share at least 100, so the x's offset becomes 20. 833aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("20,200 200x150", 834aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 835aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(gfx::Display::ROTATE_180, GetStoredRotation(display1.id())); 836aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id)); 837aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 838aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt generator1.MoveMouseToInHost(50, 40); 839aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("69,159", event_handler.GetLocationAndReset()); 840aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt#endif 841aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 842aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 843aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt} 84433d180871bea281a448efd0c1a49517318162382Jan Engelhardt 845aa37acc1423126f555135935c687eb91995b9440Jan EngelhardtTEST_F(DisplayControllerTest, ScaleRootWindow) { 846aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt if (!SupportsMultipleDisplays()) 847aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt return; 848aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 849aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt TestEventHandler event_handler; 850aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->AddPreTargetHandler(&event_handler); 851aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 852aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt UpdateDisplay("600x400*2@1.5,500x300"); 853aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 854aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay(); 855aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt gfx::Display::SetInternalDisplayId(display1.id()); 856aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 857aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt gfx::Display display2 = ScreenAsh::GetSecondaryDisplay(); 858aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 859aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("0,0 450x300", display1.bounds().ToString()); 860aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString()); 861aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("450,0 500x300", display2.bounds().ToString()); 862aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(1.5f, GetStoredUIScale(display1.id())); 863aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(1.0f, GetStoredUIScale(display2.id())); 864aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 865aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt aura::test::EventGenerator generator(root_windows[0]); 866aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt generator.MoveMouseToInHost(599, 200); 867aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("449,150", event_handler.GetLocationAndReset()); 868aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 869aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt internal::DisplayManager* display_manager = 870aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->display_manager(); 871aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt display_manager->SetDisplayUIScale(display1.id(), 1.25f); 872aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt display1 = Shell::GetScreen()->GetPrimaryDisplay(); 873aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt display2 = ScreenAsh::GetSecondaryDisplay(); 874aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("0,0 375x250", display1.bounds().ToString()); 875aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("0,0 375x250", root_windows[0]->bounds().ToString()); 876aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ("375,0 500x300", display2.bounds().ToString()); 877aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(1.25f, GetStoredUIScale(display1.id())); 878aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(1.0f, GetStoredUIScale(display2.id())); 879aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 880aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 881aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt} 882aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 883aa37acc1423126f555135935c687eb91995b9440Jan EngelhardtTEST_F(DisplayControllerTest, TouchScale) { 884aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt if (!SupportsMultipleDisplays()) 885aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt return; 886aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 887aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt TestEventHandler event_handler; 888aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->AddPreTargetHandler(&event_handler); 889aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 890aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt UpdateDisplay("200x200*2"); 891aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt gfx::Display display = Shell::GetScreen()->GetPrimaryDisplay(); 892aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 893aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt aura::RootWindow* root_window = root_windows[0]; 894aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt aura::test::EventGenerator generator(root_window); 895aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 896aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt generator.PressMoveAndReleaseTouchTo(50, 50); 897aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt // Default test touches have radius_x/y = 1.0, with device scale 898aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt // factor = 2, the scaled radius_x/y should be 0.5. 899aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(0.5, event_handler.touch_radius_x()); 900aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(0.5, event_handler.touch_radius_y()); 901aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 902aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt generator.ScrollSequence(gfx::Point(0,0), 903aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt base::TimeDelta::FromMilliseconds(100), 904aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 10.0, 1.0, 5, 1); 905aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 906aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt // With device scale factor = 2, ordinal_offset * 2 = offset. 907aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(event_handler.scroll_x_offset(), 908aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt event_handler.scroll_x_offset_ordinal() * 2); 909aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt EXPECT_EQ(event_handler.scroll_y_offset(), 910aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt event_handler.scroll_y_offset_ordinal() * 2); 911aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt 912aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 913aa37acc1423126f555135935c687eb91995b9440Jan Engelhardt} 9143af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt 9153af739b0e7c3b6dcc986645c57c982d0add5006bJan EngelhardtTEST_F(DisplayControllerTest, ConvertHostToRootCoords) { 9163af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt if (!SupportsMultipleDisplays()) 9173af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt return; 9183af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt 9193af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt TestEventHandler event_handler; 9203af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt Shell::GetInstance()->AddPreTargetHandler(&event_handler); 9213af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt 9223af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt UpdateDisplay("600x400*2/r@1.5"); 9233af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt 9243af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay(); 9253af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 9263af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt EXPECT_EQ("0,0 300x450", display1.bounds().ToString()); 9273af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString()); 9283af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt EXPECT_EQ(1.5f, GetStoredUIScale(display1.id())); 9293af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt 9303af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt aura::test::EventGenerator generator(root_windows[0]); 9313af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt generator.MoveMouseToInHost(0, 0); 9323af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt EXPECT_EQ("0,449", event_handler.GetLocationAndReset()); 9333af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt generator.MoveMouseToInHost(599, 0); 9343af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt EXPECT_EQ("0,0", event_handler.GetLocationAndReset()); 9353af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt generator.MoveMouseToInHost(599, 399); 9363af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt EXPECT_EQ("299,0", event_handler.GetLocationAndReset()); 9373af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt generator.MoveMouseToInHost(0, 399); 9383af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt EXPECT_EQ("299,449", event_handler.GetLocationAndReset()); 9393af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt 9403af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt UpdateDisplay("600x400*2/u@1.5"); 9413af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt display1 = Shell::GetScreen()->GetPrimaryDisplay(); 9423af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt root_windows = Shell::GetAllRootWindows(); 9433af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt EXPECT_EQ("0,0 450x300", display1.bounds().ToString()); 9443af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString()); 9453af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt EXPECT_EQ(1.5f, GetStoredUIScale(display1.id())); 9463af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt 9473af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt generator.MoveMouseToInHost(0, 0); 9483af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt EXPECT_EQ("449,299", event_handler.GetLocationAndReset()); 9493af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt generator.MoveMouseToInHost(599, 0); 9503af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt EXPECT_EQ("0,299", event_handler.GetLocationAndReset()); 9513af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt generator.MoveMouseToInHost(599, 399); 9523af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt EXPECT_EQ("0,0", event_handler.GetLocationAndReset()); 9533af739b0e7c3b6dcc986645c57c982d0add5006bJan Engelhardt generator.MoveMouseToInHost(0, 399); 9542e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ("449,0", event_handler.GetLocationAndReset()); 9552e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt 9562e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt UpdateDisplay("600x400*2/l@1.5"); 9572e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt display1 = Shell::GetScreen()->GetPrimaryDisplay(); 9582e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt root_windows = Shell::GetAllRootWindows(); 9592e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ("0,0 300x450", display1.bounds().ToString()); 9602e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString()); 9612e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ(1.5f, GetStoredUIScale(display1.id())); 9622e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt 9632e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt generator.MoveMouseToInHost(0, 0); 9642e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ("299,0", event_handler.GetLocationAndReset()); 9652e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt generator.MoveMouseToInHost(599, 0); 9662e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ("299,449", event_handler.GetLocationAndReset()); 9672e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt generator.MoveMouseToInHost(599, 399); 9682e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ("0,449", event_handler.GetLocationAndReset()); 9692e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt generator.MoveMouseToInHost(0, 399); 9702e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ("0,0", event_handler.GetLocationAndReset()); 9712e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt 9722e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 9732e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt} 9742e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt 9752e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt#if defined(USE_X11) 9762e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan EngelhardtTEST_F(DisplayControllerTest, XWidowNameForRootWindow) { 9772e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ("aura_root_0", GetXWindowName(Shell::GetPrimaryRootWindow())); 9782e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt 9792e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt // Multiple display. 9802e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt UpdateDisplay("200x200,300x300"); 9812e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt aura::RootWindow* primary, *secondary; 9822e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt GetPrimaryAndSeconary(&primary, &secondary); 9832e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ("aura_root_0", GetXWindowName(primary)); 9842e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ("aura_root_x", GetXWindowName(secondary)); 9852e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt 9862e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt // Swap primary. 9872e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt primary = secondary = NULL; 9882e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt Shell::GetInstance()->display_controller()->SwapPrimaryDisplay(); 9892e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt GetPrimaryAndSeconary(&primary, &secondary); 9902e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ("aura_root_0", GetXWindowName(primary)); 9912e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ("aura_root_x", GetXWindowName(secondary)); 9922e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt 9932e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt // Switching back to single display. 9942e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt UpdateDisplay("300x400"); 9952e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt EXPECT_EQ("aura_root_0", GetXWindowName(Shell::GetPrimaryRootWindow())); 9962e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt} 9972e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt#endif 9982e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt 9992e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt} // namespace test 10002e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt} // namespace ash 10012e0ec4fa0fb5162c441cd666f55fe76777e40d5eJan Engelhardt