1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ash/display/display_controller.h" 6 7 #include "ash/display/display_info.h" 8 #include "ash/display/display_layout_store.h" 9 #include "ash/display/display_manager.h" 10 #include "ash/launcher/launcher.h" 11 #include "ash/screen_ash.h" 12 #include "ash/shelf/shelf_widget.h" 13 #include "ash/shell.h" 14 #include "ash/test/ash_test_base.h" 15 #include "ash/test/cursor_manager_test_api.h" 16 #include "ui/aura/env.h" 17 #include "ui/aura/root_window.h" 18 #include "ui/aura/test/event_generator.h" 19 #include "ui/aura/window_tracker.h" 20 #include "ui/base/events/event_handler.h" 21 #include "ui/gfx/display.h" 22 #include "ui/gfx/screen.h" 23 #include "ui/views/widget/widget.h" 24 25 #if defined(USE_X11) 26 #include "ui/base/x/x11_util.h" 27 #include <X11/Xlib.h> 28 #undef RootWindow 29 #endif 30 31 namespace ash { 32 namespace { 33 34 const char kDesktopBackgroundView[] = "DesktopBackgroundView"; 35 36 class TestObserver : public DisplayController::Observer, 37 public gfx::DisplayObserver { 38 public: 39 TestObserver() 40 : changing_count_(0), 41 changed_count_(0), 42 bounds_changed_count_(0), 43 changed_display_id_(0) { 44 Shell::GetInstance()->display_controller()->AddObserver(this); 45 Shell::GetScreen()->AddObserver(this); 46 } 47 48 virtual ~TestObserver() { 49 Shell::GetInstance()->display_controller()->RemoveObserver(this); 50 Shell::GetScreen()->RemoveObserver(this); 51 } 52 53 // Overridden from DisplayController::Observer 54 virtual void OnDisplayConfigurationChanging() OVERRIDE { 55 ++changing_count_; 56 } 57 virtual void OnDisplayConfigurationChanged() OVERRIDE { 58 ++changed_count_; 59 } 60 61 // Overrideen from gfx::DisplayObserver 62 virtual void OnDisplayBoundsChanged(const gfx::Display& display) OVERRIDE { 63 changed_display_id_ = display.id(); 64 bounds_changed_count_ ++; 65 } 66 virtual void OnDisplayAdded(const gfx::Display& new_display) OVERRIDE { 67 } 68 virtual void OnDisplayRemoved(const gfx::Display& old_display) OVERRIDE { 69 } 70 71 int CountAndReset() { 72 EXPECT_EQ(changing_count_, changed_count_); 73 int count = changing_count_; 74 changing_count_ = changed_count_ = 0; 75 return count; 76 } 77 78 int64 GetBoundsChangedCountAndReset() { 79 int count = bounds_changed_count_; 80 bounds_changed_count_ = 0; 81 return count; 82 } 83 84 int64 GetChangedDisplayIdAndReset() { 85 int64 id = changed_display_id_; 86 changed_display_id_ = 0; 87 return id; 88 } 89 90 private: 91 int changing_count_; 92 int changed_count_; 93 94 int bounds_changed_count_; 95 int64 changed_display_id_; 96 97 DISALLOW_COPY_AND_ASSIGN(TestObserver); 98 }; 99 100 gfx::Display GetPrimaryDisplay() { 101 return Shell::GetScreen()->GetDisplayNearestWindow( 102 Shell::GetAllRootWindows()[0]); 103 } 104 105 gfx::Display GetSecondaryDisplay() { 106 return Shell::GetScreen()->GetDisplayNearestWindow( 107 Shell::GetAllRootWindows()[1]); 108 } 109 110 void SetSecondaryDisplayLayoutAndOffset(DisplayLayout::Position position, 111 int offset) { 112 DisplayLayout layout(position, offset); 113 ASSERT_GT(Shell::GetScreen()->GetNumDisplays(), 1); 114 Shell::GetInstance()->display_controller()-> 115 SetLayoutForCurrentDisplays(layout); 116 } 117 118 void SetSecondaryDisplayLayout(DisplayLayout::Position position) { 119 SetSecondaryDisplayLayoutAndOffset(position, 0); 120 } 121 122 void SetDefaultDisplayLayout(DisplayLayout::Position position) { 123 Shell::GetInstance()->display_manager()->layout_store()-> 124 SetDefaultDisplayLayout(DisplayLayout(position, 0)); 125 } 126 127 class DisplayControllerShutdownTest : public test::AshTestBase { 128 public: 129 virtual void TearDown() OVERRIDE { 130 test::AshTestBase::TearDown(); 131 if (!SupportsMultipleDisplays()) 132 return; 133 134 // Make sure that primary display is accessible after shutdown. 135 gfx::Display primary = Shell::GetScreen()->GetPrimaryDisplay(); 136 EXPECT_EQ("0,0 444x333", primary.bounds().ToString()); 137 EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 138 } 139 }; 140 141 class TestEventHandler : public ui::EventHandler { 142 public: 143 TestEventHandler() : target_root_(NULL), 144 touch_radius_x_(0.0), 145 touch_radius_y_(0.0), 146 scroll_x_offset_(0.0), 147 scroll_y_offset_(0.0), 148 scroll_x_offset_ordinal_(0.0), 149 scroll_y_offset_ordinal_(0.0) {} 150 virtual ~TestEventHandler() {} 151 152 virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { 153 if (event->flags() & ui::EF_IS_SYNTHESIZED && 154 event->type() != ui::ET_MOUSE_EXITED && 155 event->type() != ui::ET_MOUSE_ENTERED) { 156 return; 157 } 158 aura::Window* target = static_cast<aura::Window*>(event->target()); 159 mouse_location_ = event->root_location(); 160 target_root_ = target->GetRootWindow(); 161 event->StopPropagation(); 162 } 163 164 virtual void OnTouchEvent(ui::TouchEvent* event) OVERRIDE { 165 aura::Window* target = static_cast<aura::Window*>(event->target()); 166 // Only record when the target is the background which covers 167 // entire root window. 168 if (target->name() != kDesktopBackgroundView) 169 return; 170 touch_radius_x_ = event->radius_x(); 171 touch_radius_y_ = event->radius_y(); 172 event->StopPropagation(); 173 } 174 175 virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE { 176 aura::Window* target = static_cast<aura::Window*>(event->target()); 177 // Only record when the target is the background which covers 178 // entire root window. 179 if (target->name() != kDesktopBackgroundView) 180 return; 181 182 if (event->type() == ui::ET_SCROLL) { 183 scroll_x_offset_ = event->x_offset(); 184 scroll_y_offset_ = event->y_offset(); 185 scroll_x_offset_ordinal_ = event->x_offset_ordinal(); 186 scroll_y_offset_ordinal_ = event->y_offset_ordinal(); 187 } 188 event->StopPropagation(); 189 } 190 191 std::string GetLocationAndReset() { 192 std::string result = mouse_location_.ToString(); 193 mouse_location_.SetPoint(0, 0); 194 target_root_ = NULL; 195 return result; 196 } 197 198 float touch_radius_x() { return touch_radius_x_; } 199 float touch_radius_y() { return touch_radius_y_; } 200 float scroll_x_offset() { return scroll_x_offset_; } 201 float scroll_y_offset() { return scroll_y_offset_; } 202 float scroll_x_offset_ordinal() { return scroll_x_offset_ordinal_; } 203 float scroll_y_offset_ordinal() { return scroll_y_offset_ordinal_; } 204 205 private: 206 gfx::Point mouse_location_; 207 aura::RootWindow* target_root_; 208 209 float touch_radius_x_; 210 float touch_radius_y_; 211 float scroll_x_offset_; 212 float scroll_y_offset_; 213 float scroll_x_offset_ordinal_; 214 float scroll_y_offset_ordinal_; 215 216 DISALLOW_COPY_AND_ASSIGN(TestEventHandler); 217 }; 218 219 gfx::Display::Rotation GetStoredRotation(int64 id) { 220 return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).rotation(); 221 } 222 223 float GetStoredUIScale(int64 id) { 224 return Shell::GetInstance()->display_manager()->GetDisplayInfo(id).ui_scale(); 225 } 226 227 #if defined(USE_X11) 228 void GetPrimaryAndSeconary(aura::RootWindow** primary, 229 aura::RootWindow** secondary) { 230 *primary = Shell::GetPrimaryRootWindow(); 231 Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 232 *secondary = root_windows[0] == *primary ? root_windows[1] : root_windows[0]; 233 } 234 235 std::string GetXWindowName(aura::RootWindow* window) { 236 char* name = NULL; 237 XFetchName(ui::GetXDisplay(), window->GetAcceleratedWidget(), &name); 238 std::string ret(name); 239 XFree(name); 240 return ret; 241 } 242 #endif 243 244 } // namespace 245 246 typedef test::AshTestBase DisplayControllerTest; 247 248 TEST_F(DisplayControllerShutdownTest, Shutdown) { 249 if (!SupportsMultipleDisplays()) 250 return; 251 252 UpdateDisplay("444x333, 200x200"); 253 } 254 255 TEST_F(DisplayControllerTest, SecondaryDisplayLayout) { 256 if (!SupportsMultipleDisplays()) 257 return; 258 259 TestObserver observer; 260 UpdateDisplay("500x500,400x400"); 261 EXPECT_EQ(1, observer.CountAndReset()); // resize and add 262 EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 263 gfx::Insets insets(5, 5, 5, 5); 264 int64 secondary_display_id = ScreenAsh::GetSecondaryDisplay().id(); 265 Shell::GetInstance()->display_manager()->UpdateWorkAreaOfDisplay( 266 secondary_display_id, insets); 267 268 // Default layout is RIGHT. 269 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 270 EXPECT_EQ("500,0 400x400", GetSecondaryDisplay().bounds().ToString()); 271 EXPECT_EQ("505,5 390x390", GetSecondaryDisplay().work_area().ToString()); 272 273 // Layout the secondary display to the bottom of the primary. 274 SetSecondaryDisplayLayout(DisplayLayout::BOTTOM); 275 EXPECT_EQ(1, observer.CountAndReset()); 276 EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 277 EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 278 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 279 EXPECT_EQ("0,500 400x400", GetSecondaryDisplay().bounds().ToString()); 280 EXPECT_EQ("5,505 390x390", GetSecondaryDisplay().work_area().ToString()); 281 282 // Layout the secondary display to the left of the primary. 283 SetSecondaryDisplayLayout(DisplayLayout::LEFT); 284 EXPECT_EQ(1, observer.CountAndReset()); 285 EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 286 EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 287 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 288 EXPECT_EQ("-400,0 400x400", GetSecondaryDisplay().bounds().ToString()); 289 EXPECT_EQ("-395,5 390x390", GetSecondaryDisplay().work_area().ToString()); 290 291 // Layout the secondary display to the top of the primary. 292 SetSecondaryDisplayLayout(DisplayLayout::TOP); 293 EXPECT_EQ(1, observer.CountAndReset()); 294 EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 295 EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 296 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 297 EXPECT_EQ("0,-400 400x400", GetSecondaryDisplay().bounds().ToString()); 298 EXPECT_EQ("5,-395 390x390", GetSecondaryDisplay().work_area().ToString()); 299 300 // Layout to the right with an offset. 301 SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 300); 302 EXPECT_EQ(1, observer.CountAndReset()); // resize and add 303 EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 304 EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 305 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 306 EXPECT_EQ("500,300 400x400", GetSecondaryDisplay().bounds().ToString()); 307 308 // Keep the minimum 100. 309 SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, 490); 310 EXPECT_EQ(1, observer.CountAndReset()); // resize and add 311 EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 312 EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 313 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 314 EXPECT_EQ("500,400 400x400", GetSecondaryDisplay().bounds().ToString()); 315 316 SetSecondaryDisplayLayoutAndOffset(DisplayLayout::RIGHT, -400); 317 EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 318 EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 319 EXPECT_EQ(1, observer.CountAndReset()); // resize and add 320 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 321 EXPECT_EQ("500,-300 400x400", GetSecondaryDisplay().bounds().ToString()); 322 323 // Layout to the bottom with an offset. 324 SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -200); 325 EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 326 EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 327 EXPECT_EQ(1, observer.CountAndReset()); // resize and add 328 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 329 EXPECT_EQ("-200,500 400x400", GetSecondaryDisplay().bounds().ToString()); 330 331 // Keep the minimum 100. 332 SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, 490); 333 EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 334 EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 335 EXPECT_EQ(1, observer.CountAndReset()); // resize and add 336 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 337 EXPECT_EQ("400,500 400x400", GetSecondaryDisplay().bounds().ToString()); 338 339 SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400); 340 EXPECT_EQ(secondary_display_id, observer.GetChangedDisplayIdAndReset()); 341 EXPECT_EQ(1, observer.GetBoundsChangedCountAndReset()); 342 EXPECT_EQ(1, observer.CountAndReset()); // resize and add 343 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 344 EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString()); 345 346 // Setting the same layout shouldn't invoke observers. 347 SetSecondaryDisplayLayoutAndOffset(DisplayLayout::BOTTOM, -400); 348 EXPECT_EQ(0, observer.GetChangedDisplayIdAndReset()); 349 EXPECT_EQ(0, observer.GetBoundsChangedCountAndReset()); 350 EXPECT_EQ(0, observer.CountAndReset()); // resize and add 351 EXPECT_EQ("0,0 500x500", GetPrimaryDisplay().bounds().ToString()); 352 EXPECT_EQ("-300,500 400x400", GetSecondaryDisplay().bounds().ToString()); 353 } 354 355 TEST_F(DisplayControllerTest, BoundsUpdated) { 356 if (!SupportsMultipleDisplays()) 357 return; 358 359 TestObserver observer; 360 SetDefaultDisplayLayout(DisplayLayout::BOTTOM); 361 UpdateDisplay("200x200,300x300"); // layout, resize and add. 362 EXPECT_EQ(1, observer.CountAndReset()); 363 364 internal::DisplayManager* display_manager = 365 Shell::GetInstance()->display_manager(); 366 gfx::Insets insets(5, 5, 5, 5); 367 display_manager->UpdateWorkAreaOfDisplay( 368 ScreenAsh::GetSecondaryDisplay().id(), insets); 369 370 EXPECT_EQ("0,0 200x200", GetPrimaryDisplay().bounds().ToString()); 371 EXPECT_EQ("0,200 300x300", GetSecondaryDisplay().bounds().ToString()); 372 EXPECT_EQ("5,205 290x290", GetSecondaryDisplay().work_area().ToString()); 373 374 UpdateDisplay("400x400,200x200"); 375 EXPECT_EQ(1, observer.CountAndReset()); // two resizes 376 EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString()); 377 EXPECT_EQ("0,400 200x200", GetSecondaryDisplay().bounds().ToString()); 378 379 UpdateDisplay("400x400,300x300"); 380 EXPECT_EQ(1, observer.CountAndReset()); 381 EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString()); 382 EXPECT_EQ("0,400 300x300", GetSecondaryDisplay().bounds().ToString()); 383 384 UpdateDisplay("400x400"); 385 EXPECT_EQ(1, observer.CountAndReset()); 386 EXPECT_EQ("0,0 400x400", GetPrimaryDisplay().bounds().ToString()); 387 EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 388 389 UpdateDisplay("400x500*2,300x300"); 390 EXPECT_EQ(1, observer.CountAndReset()); 391 ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 392 EXPECT_EQ("0,0 200x250", GetPrimaryDisplay().bounds().ToString()); 393 EXPECT_EQ("0,250 300x300", GetSecondaryDisplay().bounds().ToString()); 394 395 // No change 396 UpdateDisplay("400x500*2,300x300"); 397 EXPECT_EQ(0, observer.CountAndReset()); 398 399 // Rotation 400 int64 primary_id = GetPrimaryDisplay().id(); 401 display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90); 402 EXPECT_EQ(1, observer.CountAndReset()); 403 display_manager->SetDisplayRotation(primary_id, gfx::Display::ROTATE_90); 404 EXPECT_EQ(0, observer.CountAndReset()); 405 406 // UI scale is eanbled only on internal display. 407 int64 secondary_id = GetSecondaryDisplay().id(); 408 gfx::Display::SetInternalDisplayId(secondary_id); 409 display_manager->SetDisplayUIScale(secondary_id, 1.125f); 410 EXPECT_EQ(1, observer.CountAndReset()); 411 display_manager->SetDisplayUIScale(secondary_id, 1.125f); 412 EXPECT_EQ(0, observer.CountAndReset()); 413 display_manager->SetDisplayUIScale(primary_id, 1.125f); 414 EXPECT_EQ(0, observer.CountAndReset()); 415 display_manager->SetDisplayUIScale(primary_id, 1.125f); 416 EXPECT_EQ(0, observer.CountAndReset()); 417 } 418 419 TEST_F(DisplayControllerTest, MirroredLayout) { 420 if (!SupportsMultipleDisplays()) 421 return; 422 423 DisplayController* display_controller = 424 Shell::GetInstance()->display_controller(); 425 UpdateDisplay("500x500,400x400"); 426 EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored); 427 EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 428 EXPECT_EQ( 429 2U, Shell::GetInstance()->display_manager()->num_connected_displays()); 430 431 UpdateDisplay("1+0-500x500,1+0-500x500"); 432 EXPECT_TRUE(display_controller->GetCurrentDisplayLayout().mirrored); 433 EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 434 EXPECT_EQ( 435 2U, Shell::GetInstance()->display_manager()->num_connected_displays()); 436 437 UpdateDisplay("500x500,500x500"); 438 EXPECT_FALSE(display_controller->GetCurrentDisplayLayout().mirrored); 439 EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 440 EXPECT_EQ( 441 2U, Shell::GetInstance()->display_manager()->num_connected_displays()); 442 } 443 444 TEST_F(DisplayControllerTest, InvertLayout) { 445 EXPECT_EQ("left, 0", 446 DisplayLayout(DisplayLayout::RIGHT, 0).Invert().ToString()); 447 EXPECT_EQ("left, -100", 448 DisplayLayout(DisplayLayout::RIGHT, 100).Invert().ToString()); 449 EXPECT_EQ("left, 50", 450 DisplayLayout(DisplayLayout::RIGHT, -50).Invert().ToString()); 451 452 EXPECT_EQ("right, 0", 453 DisplayLayout(DisplayLayout::LEFT, 0).Invert().ToString()); 454 EXPECT_EQ("right, -90", 455 DisplayLayout(DisplayLayout::LEFT, 90).Invert().ToString()); 456 EXPECT_EQ("right, 60", 457 DisplayLayout(DisplayLayout::LEFT, -60).Invert().ToString()); 458 459 EXPECT_EQ("bottom, 0", 460 DisplayLayout(DisplayLayout::TOP, 0).Invert().ToString()); 461 EXPECT_EQ("bottom, -80", 462 DisplayLayout(DisplayLayout::TOP, 80).Invert().ToString()); 463 EXPECT_EQ("bottom, 70", 464 DisplayLayout(DisplayLayout::TOP, -70).Invert().ToString()); 465 466 EXPECT_EQ("top, 0", 467 DisplayLayout(DisplayLayout::BOTTOM, 0).Invert().ToString()); 468 EXPECT_EQ("top, -70", 469 DisplayLayout(DisplayLayout::BOTTOM, 70).Invert().ToString()); 470 EXPECT_EQ("top, 80", 471 DisplayLayout(DisplayLayout::BOTTOM, -80).Invert().ToString()); 472 } 473 474 TEST_F(DisplayControllerTest, SwapPrimary) { 475 if (!SupportsMultipleDisplays()) 476 return; 477 478 DisplayController* display_controller = 479 Shell::GetInstance()->display_controller(); 480 481 UpdateDisplay("200x200,300x300"); 482 gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 483 gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay(); 484 485 DisplayLayout display_layout(DisplayLayout::RIGHT, 50); 486 display_controller->SetLayoutForCurrentDisplays(display_layout); 487 488 EXPECT_NE(primary_display.id(), secondary_display.id()); 489 aura::RootWindow* primary_root = 490 display_controller->GetRootWindowForDisplayId(primary_display.id()); 491 aura::RootWindow* secondary_root = 492 display_controller->GetRootWindowForDisplayId(secondary_display.id()); 493 EXPECT_NE(primary_root, secondary_root); 494 aura::Window* launcher_window = 495 Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView(); 496 EXPECT_TRUE(primary_root->Contains(launcher_window)); 497 EXPECT_FALSE(secondary_root->Contains(launcher_window)); 498 EXPECT_EQ(primary_display.id(), 499 Shell::GetScreen()->GetDisplayNearestPoint( 500 gfx::Point(-100, -100)).id()); 501 EXPECT_EQ(primary_display.id(), 502 Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 503 504 EXPECT_EQ("0,0 200x200", primary_display.bounds().ToString()); 505 EXPECT_EQ("0,0 200x152", primary_display.work_area().ToString()); 506 EXPECT_EQ("200,0 300x300", secondary_display.bounds().ToString()); 507 EXPECT_EQ("200,0 300x252", secondary_display.work_area().ToString()); 508 EXPECT_EQ("right, 50", 509 display_controller->GetCurrentDisplayLayout().ToString()); 510 511 // Switch primary and secondary 512 display_controller->SetPrimaryDisplay(secondary_display); 513 const DisplayLayout& inverted_layout = 514 display_controller->GetCurrentDisplayLayout(); 515 EXPECT_EQ("left, -50", inverted_layout.ToString()); 516 517 EXPECT_EQ(secondary_display.id(), 518 Shell::GetScreen()->GetPrimaryDisplay().id()); 519 EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 520 EXPECT_EQ(secondary_display.id(), 521 Shell::GetScreen()->GetDisplayNearestPoint( 522 gfx::Point(-100, -100)).id()); 523 EXPECT_EQ(secondary_display.id(), 524 Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 525 526 EXPECT_EQ( 527 primary_root, 528 display_controller->GetRootWindowForDisplayId(secondary_display.id())); 529 EXPECT_EQ( 530 secondary_root, 531 display_controller->GetRootWindowForDisplayId(primary_display.id())); 532 EXPECT_TRUE(primary_root->Contains(launcher_window)); 533 EXPECT_FALSE(secondary_root->Contains(launcher_window)); 534 535 // Test if the bounds are correctly swapped. 536 gfx::Display swapped_primary = Shell::GetScreen()->GetPrimaryDisplay(); 537 gfx::Display swapped_secondary = ScreenAsh::GetSecondaryDisplay(); 538 EXPECT_EQ("0,0 300x300", swapped_primary.bounds().ToString()); 539 EXPECT_EQ("0,0 300x252", swapped_primary.work_area().ToString()); 540 EXPECT_EQ("-200,-50 200x200", swapped_secondary.bounds().ToString()); 541 542 EXPECT_EQ("-200,-50 200x152", swapped_secondary.work_area().ToString()); 543 544 aura::WindowTracker tracker; 545 tracker.Add(primary_root); 546 tracker.Add(secondary_root); 547 548 // Deleting 2nd display should move the primary to original primary display. 549 UpdateDisplay("200x200"); 550 RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. 551 EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 552 EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id()); 553 EXPECT_EQ(primary_display.id(), 554 Shell::GetScreen()->GetDisplayNearestPoint( 555 gfx::Point(-100, -100)).id()); 556 EXPECT_EQ(primary_display.id(), 557 Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 558 EXPECT_TRUE(tracker.Contains(primary_root)); 559 EXPECT_FALSE(tracker.Contains(secondary_root)); 560 EXPECT_TRUE(primary_root->Contains(launcher_window)); 561 } 562 563 TEST_F(DisplayControllerTest, SwapPrimaryById) { 564 if (!SupportsMultipleDisplays()) 565 return; 566 567 DisplayController* display_controller = 568 Shell::GetInstance()->display_controller(); 569 570 UpdateDisplay("200x200,300x300"); 571 gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 572 gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay(); 573 574 DisplayLayout display_layout(DisplayLayout::RIGHT, 50); 575 display_controller->SetLayoutForCurrentDisplays(display_layout); 576 577 EXPECT_NE(primary_display.id(), secondary_display.id()); 578 aura::RootWindow* primary_root = 579 display_controller->GetRootWindowForDisplayId(primary_display.id()); 580 aura::RootWindow* secondary_root = 581 display_controller->GetRootWindowForDisplayId(secondary_display.id()); 582 aura::Window* launcher_window = 583 Launcher::ForPrimaryDisplay()->shelf_widget()->GetNativeView(); 584 EXPECT_TRUE(primary_root->Contains(launcher_window)); 585 EXPECT_FALSE(secondary_root->Contains(launcher_window)); 586 EXPECT_NE(primary_root, secondary_root); 587 EXPECT_EQ(primary_display.id(), 588 Shell::GetScreen()->GetDisplayNearestPoint( 589 gfx::Point(-100, -100)).id()); 590 EXPECT_EQ(primary_display.id(), 591 Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 592 593 // Switch primary and secondary by display ID. 594 TestObserver observer; 595 display_controller->SetPrimaryDisplayId(secondary_display.id()); 596 EXPECT_EQ(secondary_display.id(), 597 Shell::GetScreen()->GetPrimaryDisplay().id()); 598 EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 599 EXPECT_LT(0, observer.CountAndReset()); 600 601 EXPECT_EQ( 602 primary_root, 603 display_controller->GetRootWindowForDisplayId(secondary_display.id())); 604 EXPECT_EQ( 605 secondary_root, 606 display_controller->GetRootWindowForDisplayId(primary_display.id())); 607 EXPECT_TRUE(primary_root->Contains(launcher_window)); 608 EXPECT_FALSE(secondary_root->Contains(launcher_window)); 609 610 const DisplayLayout& inverted_layout = 611 display_controller->GetCurrentDisplayLayout(); 612 613 EXPECT_EQ("left, -50", inverted_layout.ToString()); 614 615 // Calling the same ID don't do anything. 616 display_controller->SetPrimaryDisplayId(secondary_display.id()); 617 EXPECT_EQ(0, observer.CountAndReset()); 618 619 aura::WindowTracker tracker; 620 tracker.Add(primary_root); 621 tracker.Add(secondary_root); 622 623 // Deleting 2nd display should move the primary to original primary display. 624 UpdateDisplay("200x200"); 625 RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. 626 EXPECT_EQ(1, Shell::GetScreen()->GetNumDisplays()); 627 EXPECT_EQ(primary_display.id(), Shell::GetScreen()->GetPrimaryDisplay().id()); 628 EXPECT_EQ(primary_display.id(), 629 Shell::GetScreen()->GetDisplayNearestPoint( 630 gfx::Point(-100, -100)).id()); 631 EXPECT_EQ(primary_display.id(), 632 Shell::GetScreen()->GetDisplayNearestWindow(NULL).id()); 633 EXPECT_TRUE(tracker.Contains(primary_root)); 634 EXPECT_FALSE(tracker.Contains(secondary_root)); 635 EXPECT_TRUE(primary_root->Contains(launcher_window)); 636 637 internal::DisplayManager* display_manager = 638 Shell::GetInstance()->display_manager(); 639 // Adding 2nd display with the same ID. The 2nd display should become primary 640 // since secondary id is still stored as desirable_primary_id. 641 std::vector<internal::DisplayInfo> display_info_list; 642 display_info_list.push_back( 643 display_manager->GetDisplayInfo(primary_display.id())); 644 display_info_list.push_back( 645 display_manager->GetDisplayInfo(secondary_display.id())); 646 display_manager->OnNativeDisplaysChanged(display_info_list); 647 648 EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 649 EXPECT_EQ(secondary_display.id(), 650 Shell::GetScreen()->GetPrimaryDisplay().id()); 651 EXPECT_EQ(primary_display.id(), ScreenAsh::GetSecondaryDisplay().id()); 652 EXPECT_EQ( 653 primary_root, 654 display_controller->GetRootWindowForDisplayId(secondary_display.id())); 655 EXPECT_NE( 656 primary_root, 657 display_controller->GetRootWindowForDisplayId(primary_display.id())); 658 EXPECT_TRUE(primary_root->Contains(launcher_window)); 659 660 // Deleting 2nd display and adding 2nd display with a different ID. The 2nd 661 // display shouldn't become primary. 662 UpdateDisplay("200x200"); 663 internal::DisplayInfo third_display_info( 664 secondary_display.id() + 1, std::string(), false); 665 third_display_info.SetBounds(secondary_display.bounds()); 666 ASSERT_NE(primary_display.id(), third_display_info.id()); 667 668 const internal::DisplayInfo& primary_display_info = 669 display_manager->GetDisplayInfo(primary_display.id()); 670 std::vector<internal::DisplayInfo> display_info_list2; 671 display_info_list2.push_back(primary_display_info); 672 display_info_list2.push_back(third_display_info); 673 display_manager->OnNativeDisplaysChanged(display_info_list2); 674 EXPECT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 675 EXPECT_EQ(primary_display.id(), 676 Shell::GetScreen()->GetPrimaryDisplay().id()); 677 EXPECT_EQ(third_display_info.id(), ScreenAsh::GetSecondaryDisplay().id()); 678 EXPECT_EQ( 679 primary_root, 680 display_controller->GetRootWindowForDisplayId(primary_display.id())); 681 EXPECT_NE( 682 primary_root, 683 display_controller->GetRootWindowForDisplayId(third_display_info.id())); 684 EXPECT_TRUE(primary_root->Contains(launcher_window)); 685 } 686 687 TEST_F(DisplayControllerTest, CursorDeviceScaleFactorSwapPrimary) { 688 if (!SupportsMultipleDisplays()) 689 return; 690 691 DisplayController* display_controller = 692 Shell::GetInstance()->display_controller(); 693 694 UpdateDisplay("200x200,200x200*2"); 695 gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); 696 gfx::Display secondary_display = ScreenAsh::GetSecondaryDisplay(); 697 698 aura::RootWindow* primary_root = 699 display_controller->GetRootWindowForDisplayId(primary_display.id()); 700 aura::RootWindow* secondary_root = 701 display_controller->GetRootWindowForDisplayId(secondary_display.id()); 702 EXPECT_NE(primary_root, secondary_root); 703 704 test::CursorManagerTestApi test_api(Shell::GetInstance()->cursor_manager()); 705 706 EXPECT_EQ(1.0f, 707 primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 708 primary_root->MoveCursorTo(gfx::Point(50, 50)); 709 EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor()); 710 EXPECT_EQ(2.0f, 711 secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 712 secondary_root->MoveCursorTo(gfx::Point(50, 50)); 713 EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor()); 714 715 // Switch primary and secondary 716 display_controller->SetPrimaryDisplay(secondary_display); 717 718 // Cursor's device scale factor should be updated accroding to the swap of 719 // primary and secondary. 720 EXPECT_EQ(1.0f, 721 secondary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 722 secondary_root->MoveCursorTo(gfx::Point(50, 50)); 723 EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor()); 724 primary_root->MoveCursorTo(gfx::Point(50, 50)); 725 EXPECT_EQ(2.0f, 726 primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 727 EXPECT_EQ(2.0f, test_api.GetDisplay().device_scale_factor()); 728 729 // Deleting 2nd display. 730 UpdateDisplay("200x200"); 731 RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. 732 733 // Cursor's device scale factor should be updated even without moving cursor. 734 EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor()); 735 736 primary_root->MoveCursorTo(gfx::Point(50, 50)); 737 EXPECT_EQ(1.0f, 738 primary_root->AsRootWindowHostDelegate()->GetDeviceScaleFactor()); 739 EXPECT_EQ(1.0f, test_api.GetDisplay().device_scale_factor()); 740 } 741 742 #if defined(OS_WIN) 743 // TODO(scottmg): RootWindow doesn't get resized on Windows 744 // Ash. http://crbug.com/247916. 745 #define MAYBE_UpdateDisplayWithHostOrigin DISABLED_UpdateDisplayWithHostOrigin 746 #else 747 #define MAYBE_UpdateDisplayWithHostOrigin UpdateDisplayWithHostOrigin 748 #endif 749 750 TEST_F(DisplayControllerTest, MAYBE_UpdateDisplayWithHostOrigin) { 751 UpdateDisplay("100x200,300x400"); 752 ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 753 Shell::RootWindowList root_windows = 754 Shell::GetInstance()->GetAllRootWindows(); 755 ASSERT_EQ(2U, root_windows.size()); 756 EXPECT_EQ("1,1", root_windows[0]->GetHostOrigin().ToString()); 757 EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString()); 758 // UpdateDisplay set the origin if it's not set. 759 EXPECT_NE("1,1", root_windows[1]->GetHostOrigin().ToString()); 760 EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString()); 761 762 UpdateDisplay("100x200,200+300-300x400"); 763 ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 764 EXPECT_EQ("0,0", root_windows[0]->GetHostOrigin().ToString()); 765 EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString()); 766 EXPECT_EQ("200,300", root_windows[1]->GetHostOrigin().ToString()); 767 EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString()); 768 769 UpdateDisplay("400+500-200x300,300x400"); 770 ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 771 EXPECT_EQ("400,500", root_windows[0]->GetHostOrigin().ToString()); 772 EXPECT_EQ("200x300", root_windows[0]->GetHostSize().ToString()); 773 EXPECT_EQ("0,0", root_windows[1]->GetHostOrigin().ToString()); 774 EXPECT_EQ("300x400", root_windows[1]->GetHostSize().ToString()); 775 776 UpdateDisplay("100+200-100x200,300+500-200x300"); 777 ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 778 EXPECT_EQ("100,200", root_windows[0]->GetHostOrigin().ToString()); 779 EXPECT_EQ("100x200", root_windows[0]->GetHostSize().ToString()); 780 EXPECT_EQ("300,500", root_windows[1]->GetHostOrigin().ToString()); 781 EXPECT_EQ("200x300", root_windows[1]->GetHostSize().ToString()); 782 } 783 784 TEST_F(DisplayControllerTest, OverscanInsets) { 785 if (!SupportsMultipleDisplays()) 786 return; 787 788 DisplayController* display_controller = 789 Shell::GetInstance()->display_controller(); 790 TestEventHandler event_handler; 791 Shell::GetInstance()->AddPreTargetHandler(&event_handler); 792 793 UpdateDisplay("120x200,300x400*2"); 794 gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay(); 795 Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 796 797 display_controller->SetOverscanInsets(display1.id(), 798 gfx::Insets(10, 15, 20, 25)); 799 EXPECT_EQ("0,0 80x170", root_windows[0]->bounds().ToString()); 800 EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString()); 801 EXPECT_EQ("80,0 150x200", 802 ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 803 804 aura::test::EventGenerator generator(root_windows[0]); 805 generator.MoveMouseToInHost(20, 25); 806 EXPECT_EQ("5,15", event_handler.GetLocationAndReset()); 807 808 display_controller->SetOverscanInsets(display1.id(), gfx::Insets()); 809 EXPECT_EQ("0,0 120x200", root_windows[0]->bounds().ToString()); 810 EXPECT_EQ("120,0 150x200", 811 ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 812 813 generator.MoveMouseToInHost(30, 20); 814 EXPECT_EQ("30,20", event_handler.GetLocationAndReset()); 815 816 // Make sure the root window transformer uses correct scale 817 // factor when swapping display. Test crbug.com/253690. 818 UpdateDisplay("400x300*2,600x400/o"); 819 root_windows = Shell::GetAllRootWindows(); 820 gfx::Point point; 821 Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(point); 822 EXPECT_EQ("15,10", point.ToString()); 823 824 display_controller->SwapPrimaryDisplay(); 825 point.SetPoint(0, 0); 826 Shell::GetAllRootWindows()[1]->GetRootTransform().TransformPoint(point); 827 EXPECT_EQ("15,10", point.ToString()); 828 829 Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 830 } 831 832 TEST_F(DisplayControllerTest, Rotate) { 833 if (!SupportsMultipleDisplays()) 834 return; 835 836 DisplayController* display_controller = 837 Shell::GetInstance()->display_controller(); 838 internal::DisplayManager* display_manager = 839 Shell::GetInstance()->display_manager(); 840 TestEventHandler event_handler; 841 Shell::GetInstance()->AddPreTargetHandler(&event_handler); 842 843 UpdateDisplay("120x200,300x400*2"); 844 gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay(); 845 int64 display2_id = ScreenAsh::GetSecondaryDisplay().id(); 846 Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 847 aura::test::EventGenerator generator1(root_windows[0]); 848 849 EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString()); 850 EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString()); 851 EXPECT_EQ("120,0 150x200", 852 ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 853 generator1.MoveMouseToInHost(50, 40); 854 EXPECT_EQ("50,40", event_handler.GetLocationAndReset()); 855 EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display1.id())); 856 EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id)); 857 858 display_manager->SetDisplayRotation(display1.id(), 859 gfx::Display::ROTATE_90); 860 EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString()); 861 EXPECT_EQ("150x200", root_windows[1]->bounds().size().ToString()); 862 EXPECT_EQ("200,0 150x200", 863 ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 864 generator1.MoveMouseToInHost(50, 40); 865 EXPECT_EQ("40,69", event_handler.GetLocationAndReset()); 866 EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id())); 867 EXPECT_EQ(gfx::Display::ROTATE_0, GetStoredRotation(display2_id)); 868 869 DisplayLayout display_layout(DisplayLayout::BOTTOM, 50); 870 display_controller->SetLayoutForCurrentDisplays(display_layout); 871 EXPECT_EQ("50,120 150x200", 872 ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 873 874 display_manager->SetDisplayRotation(display2_id, 875 gfx::Display::ROTATE_270); 876 EXPECT_EQ("200x120", root_windows[0]->bounds().size().ToString()); 877 EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString()); 878 EXPECT_EQ("50,120 200x150", 879 ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 880 EXPECT_EQ(gfx::Display::ROTATE_90, GetStoredRotation(display1.id())); 881 EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id)); 882 883 #if !defined(OS_WIN) 884 aura::test::EventGenerator generator2(root_windows[1]); 885 generator2.MoveMouseToInHost(50, 40); 886 EXPECT_EQ("179,25", event_handler.GetLocationAndReset()); 887 display_manager->SetDisplayRotation(display1.id(), 888 gfx::Display::ROTATE_180); 889 890 EXPECT_EQ("120x200", root_windows[0]->bounds().size().ToString()); 891 EXPECT_EQ("200x150", root_windows[1]->bounds().size().ToString()); 892 // Dislay must share at least 100, so the x's offset becomes 20. 893 EXPECT_EQ("20,200 200x150", 894 ScreenAsh::GetSecondaryDisplay().bounds().ToString()); 895 EXPECT_EQ(gfx::Display::ROTATE_180, GetStoredRotation(display1.id())); 896 EXPECT_EQ(gfx::Display::ROTATE_270, GetStoredRotation(display2_id)); 897 898 generator1.MoveMouseToInHost(50, 40); 899 EXPECT_EQ("69,159", event_handler.GetLocationAndReset()); 900 #endif 901 902 Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 903 } 904 905 TEST_F(DisplayControllerTest, ScaleRootWindow) { 906 if (!SupportsMultipleDisplays()) 907 return; 908 909 TestEventHandler event_handler; 910 Shell::GetInstance()->AddPreTargetHandler(&event_handler); 911 912 UpdateDisplay("600x400*2 (at) 1.5,500x300"); 913 914 gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay(); 915 gfx::Display::SetInternalDisplayId(display1.id()); 916 917 gfx::Display display2 = ScreenAsh::GetSecondaryDisplay(); 918 Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 919 EXPECT_EQ("0,0 450x300", display1.bounds().ToString()); 920 EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString()); 921 EXPECT_EQ("450,0 500x300", display2.bounds().ToString()); 922 EXPECT_EQ(1.5f, GetStoredUIScale(display1.id())); 923 EXPECT_EQ(1.0f, GetStoredUIScale(display2.id())); 924 925 aura::test::EventGenerator generator(root_windows[0]); 926 generator.MoveMouseToInHost(599, 200); 927 EXPECT_EQ("449,150", event_handler.GetLocationAndReset()); 928 929 internal::DisplayManager* display_manager = 930 Shell::GetInstance()->display_manager(); 931 display_manager->SetDisplayUIScale(display1.id(), 1.25f); 932 display1 = Shell::GetScreen()->GetPrimaryDisplay(); 933 display2 = ScreenAsh::GetSecondaryDisplay(); 934 EXPECT_EQ("0,0 375x250", display1.bounds().ToString()); 935 EXPECT_EQ("0,0 375x250", root_windows[0]->bounds().ToString()); 936 EXPECT_EQ("375,0 500x300", display2.bounds().ToString()); 937 EXPECT_EQ(1.25f, GetStoredUIScale(display1.id())); 938 EXPECT_EQ(1.0f, GetStoredUIScale(display2.id())); 939 940 Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 941 } 942 943 TEST_F(DisplayControllerTest, TouchScale) { 944 if (!SupportsMultipleDisplays()) 945 return; 946 947 TestEventHandler event_handler; 948 Shell::GetInstance()->AddPreTargetHandler(&event_handler); 949 950 UpdateDisplay("200x200*2"); 951 gfx::Display display = Shell::GetScreen()->GetPrimaryDisplay(); 952 Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 953 aura::RootWindow* root_window = root_windows[0]; 954 aura::test::EventGenerator generator(root_window); 955 956 generator.PressMoveAndReleaseTouchTo(50, 50); 957 // Default test touches have radius_x/y = 1.0, with device scale 958 // factor = 2, the scaled radius_x/y should be 0.5. 959 EXPECT_EQ(0.5, event_handler.touch_radius_x()); 960 EXPECT_EQ(0.5, event_handler.touch_radius_y()); 961 962 generator.ScrollSequence(gfx::Point(0,0), 963 base::TimeDelta::FromMilliseconds(100), 964 10.0, 1.0, 5, 1); 965 966 // With device scale factor = 2, ordinal_offset * 2 = offset. 967 EXPECT_EQ(event_handler.scroll_x_offset(), 968 event_handler.scroll_x_offset_ordinal() * 2); 969 EXPECT_EQ(event_handler.scroll_y_offset(), 970 event_handler.scroll_y_offset_ordinal() * 2); 971 972 Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 973 } 974 975 TEST_F(DisplayControllerTest, ConvertHostToRootCoords) { 976 if (!SupportsMultipleDisplays()) 977 return; 978 979 TestEventHandler event_handler; 980 Shell::GetInstance()->AddPreTargetHandler(&event_handler); 981 982 UpdateDisplay("600x400*2/r (at) 1.5"); 983 984 gfx::Display display1 = Shell::GetScreen()->GetPrimaryDisplay(); 985 Shell::RootWindowList root_windows = Shell::GetAllRootWindows(); 986 EXPECT_EQ("0,0 300x450", display1.bounds().ToString()); 987 EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString()); 988 EXPECT_EQ(1.5f, GetStoredUIScale(display1.id())); 989 990 aura::test::EventGenerator generator(root_windows[0]); 991 generator.MoveMouseToInHost(0, 0); 992 EXPECT_EQ("0,449", event_handler.GetLocationAndReset()); 993 generator.MoveMouseToInHost(599, 0); 994 EXPECT_EQ("0,0", event_handler.GetLocationAndReset()); 995 generator.MoveMouseToInHost(599, 399); 996 EXPECT_EQ("299,0", event_handler.GetLocationAndReset()); 997 generator.MoveMouseToInHost(0, 399); 998 EXPECT_EQ("299,449", event_handler.GetLocationAndReset()); 999 1000 UpdateDisplay("600x400*2/u (at) 1.5"); 1001 display1 = Shell::GetScreen()->GetPrimaryDisplay(); 1002 root_windows = Shell::GetAllRootWindows(); 1003 EXPECT_EQ("0,0 450x300", display1.bounds().ToString()); 1004 EXPECT_EQ("0,0 450x300", root_windows[0]->bounds().ToString()); 1005 EXPECT_EQ(1.5f, GetStoredUIScale(display1.id())); 1006 1007 generator.MoveMouseToInHost(0, 0); 1008 EXPECT_EQ("449,299", event_handler.GetLocationAndReset()); 1009 generator.MoveMouseToInHost(599, 0); 1010 EXPECT_EQ("0,299", event_handler.GetLocationAndReset()); 1011 generator.MoveMouseToInHost(599, 399); 1012 EXPECT_EQ("0,0", event_handler.GetLocationAndReset()); 1013 generator.MoveMouseToInHost(0, 399); 1014 EXPECT_EQ("449,0", event_handler.GetLocationAndReset()); 1015 1016 UpdateDisplay("600x400*2/l (at) 1.5"); 1017 display1 = Shell::GetScreen()->GetPrimaryDisplay(); 1018 root_windows = Shell::GetAllRootWindows(); 1019 EXPECT_EQ("0,0 300x450", display1.bounds().ToString()); 1020 EXPECT_EQ("0,0 300x450", root_windows[0]->bounds().ToString()); 1021 EXPECT_EQ(1.5f, GetStoredUIScale(display1.id())); 1022 1023 generator.MoveMouseToInHost(0, 0); 1024 EXPECT_EQ("299,0", event_handler.GetLocationAndReset()); 1025 generator.MoveMouseToInHost(599, 0); 1026 EXPECT_EQ("299,449", event_handler.GetLocationAndReset()); 1027 generator.MoveMouseToInHost(599, 399); 1028 EXPECT_EQ("0,449", event_handler.GetLocationAndReset()); 1029 generator.MoveMouseToInHost(0, 399); 1030 EXPECT_EQ("0,0", event_handler.GetLocationAndReset()); 1031 1032 Shell::GetInstance()->RemovePreTargetHandler(&event_handler); 1033 } 1034 1035 #if defined(USE_X11) 1036 TEST_F(DisplayControllerTest, XWidowNameForRootWindow) { 1037 EXPECT_EQ("aura_root_0", GetXWindowName(Shell::GetPrimaryRootWindow())); 1038 1039 // Multiple display. 1040 UpdateDisplay("200x200,300x300"); 1041 aura::RootWindow* primary, *secondary; 1042 GetPrimaryAndSeconary(&primary, &secondary); 1043 EXPECT_EQ("aura_root_0", GetXWindowName(primary)); 1044 EXPECT_EQ("aura_root_x", GetXWindowName(secondary)); 1045 1046 // Swap primary. 1047 primary = secondary = NULL; 1048 Shell::GetInstance()->display_controller()->SwapPrimaryDisplay(); 1049 GetPrimaryAndSeconary(&primary, &secondary); 1050 EXPECT_EQ("aura_root_0", GetXWindowName(primary)); 1051 EXPECT_EQ("aura_root_x", GetXWindowName(secondary)); 1052 1053 // Switching back to single display. 1054 UpdateDisplay("300x400"); 1055 EXPECT_EQ("aura_root_0", GetXWindowName(Shell::GetPrimaryRootWindow())); 1056 } 1057 #endif 1058 1059 } // namespace ash 1060