1// Copyright 2013 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 <stdio.h>
6
7#include "ash/ash_switches.h"
8#include "ash/display/display_layout_store.h"
9#include "base/command_line.h"
10#include "base/logging.h"
11#include "ui/gfx/display.h"
12
13namespace ash {
14
15DisplayLayoutStore::DisplayLayoutStore() {
16  CommandLine* command_line = CommandLine::ForCurrentProcess();
17  if (command_line->HasSwitch(switches::kAshSecondaryDisplayLayout)) {
18    std::string value = command_line->GetSwitchValueASCII(
19        switches::kAshSecondaryDisplayLayout);
20    char layout;
21    int offset = 0;
22    if (sscanf(value.c_str(), "%c,%d", &layout, &offset) == 2) {
23      if (layout == 't')
24        default_display_layout_.position = DisplayLayout::TOP;
25      else if (layout == 'b')
26        default_display_layout_.position = DisplayLayout::BOTTOM;
27      else if (layout == 'r')
28        default_display_layout_.position = DisplayLayout::RIGHT;
29      else if (layout == 'l')
30        default_display_layout_.position = DisplayLayout::LEFT;
31      default_display_layout_.offset = offset;
32    }
33  }
34}
35
36DisplayLayoutStore::~DisplayLayoutStore() {
37}
38
39void DisplayLayoutStore::SetDefaultDisplayLayout(const DisplayLayout& layout) {
40  CommandLine* command_line = CommandLine::ForCurrentProcess();
41  if (!command_line->HasSwitch(switches::kAshSecondaryDisplayLayout))
42    default_display_layout_ = layout;
43}
44
45void DisplayLayoutStore::RegisterLayoutForDisplayIdPair(
46    int64 id1,
47    int64 id2,
48    const DisplayLayout& layout) {
49  paired_layouts_[std::make_pair(id1, id2)] = layout;
50}
51
52DisplayLayout DisplayLayoutStore::GetRegisteredDisplayLayout(
53    const DisplayIdPair& pair) {
54  std::map<DisplayIdPair, DisplayLayout>::const_iterator iter =
55      paired_layouts_.find(pair);
56  return
57      iter != paired_layouts_.end() ? iter->second : CreateDisplayLayout(pair);
58}
59
60DisplayLayout DisplayLayoutStore::ComputeDisplayLayoutForDisplayIdPair(
61    const DisplayIdPair& pair) {
62  DisplayLayout layout = GetRegisteredDisplayLayout(pair);
63  DCHECK_NE(layout.primary_id, gfx::Display::kInvalidDisplayID);
64  // Invert if the primary was swapped. If mirrored, first is always
65  // primary.
66  return (layout.primary_id == gfx::Display::kInvalidDisplayID ||
67          pair.first == layout.primary_id) ? layout : layout.Invert();
68}
69
70void DisplayLayoutStore::UpdateMirrorStatus(const DisplayIdPair& pair,
71                                            bool mirrored) {
72  if (paired_layouts_.find(pair) == paired_layouts_.end())
73    CreateDisplayLayout(pair);
74  paired_layouts_[pair].mirrored = mirrored;
75}
76
77void DisplayLayoutStore::UpdatePrimaryDisplayId(const DisplayIdPair& pair,
78                                                int64 display_id) {
79  if (paired_layouts_.find(pair) == paired_layouts_.end())
80    CreateDisplayLayout(pair);
81  paired_layouts_[pair].primary_id = display_id;
82}
83
84DisplayLayout DisplayLayoutStore::CreateDisplayLayout(
85    const DisplayIdPair& pair) {
86  DisplayLayout layout = default_display_layout_;
87  layout.primary_id = pair.first;
88  paired_layouts_[pair] = layout;
89  return layout;
90}
91
92}  // namespace ash
93