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