17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// found in the LICENSE file. 47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include <stdio.h> 67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/ash_switches.h" 87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/display/display_layout_store.h" 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/command_line.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/logging.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ui/gfx/display.h" 127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace ash { 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDisplayLayoutStore::DisplayLayoutStore() { 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CommandLine* command_line = CommandLine::ForCurrentProcess(); 177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (command_line->HasSwitch(switches::kAshSecondaryDisplayLayout)) { 187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string value = command_line->GetSwitchValueASCII( 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch switches::kAshSecondaryDisplayLayout); 207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch char layout; 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int offset = 0; 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (sscanf(value.c_str(), "%c,%d", &layout, &offset) == 2) { 237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (layout == 't') 247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch default_display_layout_.position = DisplayLayout::TOP; 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch else if (layout == 'b') 267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch default_display_layout_.position = DisplayLayout::BOTTOM; 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch else if (layout == 'r') 287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch default_display_layout_.position = DisplayLayout::RIGHT; 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch else if (layout == 'l') 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch default_display_layout_.position = DisplayLayout::LEFT; 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch default_display_layout_.offset = offset; 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDisplayLayoutStore::~DisplayLayoutStore() { 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DisplayLayoutStore::SetDefaultDisplayLayout(const DisplayLayout& layout) { 407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CommandLine* command_line = CommandLine::ForCurrentProcess(); 417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!command_line->HasSwitch(switches::kAshSecondaryDisplayLayout)) 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch default_display_layout_ = layout; 437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DisplayLayoutStore::RegisterLayoutForDisplayIdPair( 467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int64 id1, 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int64 id2, 487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const DisplayLayout& layout) { 497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch paired_layouts_[std::make_pair(id1, id2)] = layout; 507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDisplayLayout DisplayLayoutStore::GetRegisteredDisplayLayout( 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const DisplayIdPair& pair) { 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::map<DisplayIdPair, DisplayLayout>::const_iterator iter = 557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch paired_layouts_.find(pair); 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch iter != paired_layouts_.end() ? iter->second : CreateDisplayLayout(pair); 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDisplayLayout DisplayLayoutStore::ComputeDisplayLayoutForDisplayIdPair( 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const DisplayIdPair& pair) { 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DisplayLayout layout = GetRegisteredDisplayLayout(pair); 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_NE(layout.primary_id, gfx::Display::kInvalidDisplayID); 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Invert if the primary was swapped. If mirrored, first is always 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // primary. 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return (layout.primary_id == gfx::Display::kInvalidDisplayID || 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pair.first == layout.primary_id) ? layout : layout.Invert(); 687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DisplayLayoutStore::UpdateMirrorStatus(const DisplayIdPair& pair, 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool mirrored) { 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (paired_layouts_.find(pair) == paired_layouts_.end()) 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateDisplayLayout(pair); 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch paired_layouts_[pair].mirrored = mirrored; 757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DisplayLayoutStore::UpdatePrimaryDisplayId(const DisplayIdPair& pair, 787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int64 display_id) { 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (paired_layouts_.find(pair) == paired_layouts_.end()) 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch CreateDisplayLayout(pair); 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch paired_layouts_[pair].primary_id = display_id; 827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 847dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDisplayLayout DisplayLayoutStore::CreateDisplayLayout( 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const DisplayIdPair& pair) { 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DisplayLayout layout = default_display_layout_; 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch layout.primary_id = pair.first; 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch paired_layouts_[pair] = layout; 897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return layout; 907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace ash 93