12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/test/display_manager_test_api.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_info.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/display/display_manager.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/display.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace ash { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::vector<gfx::Display> DisplayList; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef internal::DisplayInfo DisplayInfo; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef std::vector<DisplayInfo> DisplayInfoList; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::vector<DisplayInfo> CreateDisplayInfoListFromString( 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string specs, 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::DisplayManager* display_manager) { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<DisplayInfo> display_info_list; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<std::string> parts; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::SplitString(specs, ',', &parts); 30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch size_t index = 0; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::vector<std::string>::const_iterator iter = parts.begin(); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != parts.end(); ++iter, ++index) { 33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int64 id = index < display_manager->GetNumDisplays() ? 34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch display_manager->GetDisplayAt(index).id() : 35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch gfx::Display::kInvalidDisplayID; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_info_list.push_back( 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DisplayInfo::CreateFromSpecWithID(*iter, id)); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return display_info_list; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DisplayManagerTestApi::DisplayManagerTestApi( 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) internal::DisplayManager* display_manager) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : display_manager_(display_manager) { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DisplayManagerTestApi::~DisplayManagerTestApi() {} 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DisplayManagerTestApi::UpdateDisplay( 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& display_specs) { 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<DisplayInfo> display_info_list = 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateDisplayInfoListFromString(display_specs, display_manager_); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_host_origin_set = false; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < display_info_list.size(); ++i) { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const DisplayInfo& display_info = display_info_list[i]; 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (display_info.bounds_in_native().origin() != gfx::Point(0, 0)) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) is_host_origin_set = true; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On non-testing environment, when a secondary display is connected, a new 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // native (i.e. X) window for the display is always created below the 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // previous one for GPU performance reasons. Try to emulate the behavior 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // unless host origins are explicitly set. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!is_host_origin_set) { 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sart from (1,1) so that windows won't overlap with native mouse cursor. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // See |AshTestBase::SetUp()|. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int next_y = 1; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (std::vector<DisplayInfo>::iterator iter = display_info_list.begin(); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter != display_info_list.end(); ++iter) { 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::Rect bounds(iter->bounds_in_native().size()); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bounds.set_x(1); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bounds.set_y(next_y); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) next_y += bounds.height(); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) iter->SetBounds(bounds); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_manager_->OnNativeDisplaysChanged(display_info_list); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int64 DisplayManagerTestApi::SetFirstDisplayAsInternalDisplay() { 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Display& internal = display_manager_->displays_[0]; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Display::SetInternalDisplayId(internal.id()); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Display::InternalDisplayId(); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void DisplayManagerTestApi::DisableChangeDisplayUponHostResize() { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) display_manager_->set_change_display_upon_host_resize(false); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace test 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace ash 97