| Index: ash/display/display_layout_store.cc
|
| diff --git a/ash/display/display_layout_store.cc b/ash/display/display_layout_store.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..70aa516cdab7f8dd48e0a04146b923c75911a903
|
| --- /dev/null
|
| +++ b/ash/display/display_layout_store.cc
|
| @@ -0,0 +1,94 @@
|
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include <stdio.h>
|
| +
|
| +#include "ash/ash_switches.h"
|
| +#include "ash/display/display_layout_store.h"
|
| +#include "base/command_line.h"
|
| +#include "base/logging.h"
|
| +#include "ui/gfx/display.h"
|
| +
|
| +namespace ash {
|
| +namespace internal {
|
| +
|
| +DisplayLayoutStore::DisplayLayoutStore() {
|
| + CommandLine* command_line = CommandLine::ForCurrentProcess();
|
| + if (command_line->HasSwitch(switches::kAshSecondaryDisplayLayout)) {
|
| + std::string value = command_line->GetSwitchValueASCII(
|
| + switches::kAshSecondaryDisplayLayout);
|
| + char layout;
|
| + int offset = 0;
|
| + if (sscanf(value.c_str(), "%c,%d", &layout, &offset) == 2) {
|
| + if (layout == 't')
|
| + default_display_layout_.position = DisplayLayout::TOP;
|
| + else if (layout == 'b')
|
| + default_display_layout_.position = DisplayLayout::BOTTOM;
|
| + else if (layout == 'r')
|
| + default_display_layout_.position = DisplayLayout::RIGHT;
|
| + else if (layout == 'l')
|
| + default_display_layout_.position = DisplayLayout::LEFT;
|
| + default_display_layout_.offset = offset;
|
| + }
|
| + }
|
| +}
|
| +
|
| +DisplayLayoutStore::~DisplayLayoutStore() {
|
| +}
|
| +
|
| +void DisplayLayoutStore::SetDefaultDisplayLayout(const DisplayLayout& layout) {
|
| + CommandLine* command_line = CommandLine::ForCurrentProcess();
|
| + if (!command_line->HasSwitch(switches::kAshSecondaryDisplayLayout))
|
| + default_display_layout_ = layout;
|
| +}
|
| +
|
| +void DisplayLayoutStore::RegisterLayoutForDisplayIdPair(
|
| + int64 id1,
|
| + int64 id2,
|
| + const DisplayLayout& layout) {
|
| + paired_layouts_[std::make_pair(id1, id2)] = layout;
|
| +}
|
| +
|
| +DisplayLayout DisplayLayoutStore::GetRegisteredDisplayLayout(
|
| + const DisplayIdPair& pair) {
|
| + std::map<DisplayIdPair, DisplayLayout>::const_iterator iter =
|
| + paired_layouts_.find(pair);
|
| + return
|
| + iter != paired_layouts_.end() ? iter->second : CreateDisplayLayout(pair);
|
| +}
|
| +
|
| +DisplayLayout DisplayLayoutStore::ComputeDisplayLayoutForDisplayIdPair(
|
| + const DisplayIdPair& pair) {
|
| + DisplayLayout layout = GetRegisteredDisplayLayout(pair);
|
| + DCHECK_NE(layout.primary_id, gfx::Display::kInvalidDisplayID);
|
| + // Invert if the primary was swapped. If mirrored, first is always
|
| + // primary.
|
| + return (layout.primary_id == gfx::Display::kInvalidDisplayID ||
|
| + pair.first == layout.primary_id) ? layout : layout.Invert();
|
| +}
|
| +
|
| +void DisplayLayoutStore::UpdateMirrorStatus(const DisplayIdPair& pair,
|
| + bool mirrored) {
|
| + if (paired_layouts_.find(pair) == paired_layouts_.end())
|
| + CreateDisplayLayout(pair);
|
| + paired_layouts_[pair].mirrored = mirrored;
|
| +}
|
| +
|
| +void DisplayLayoutStore::UpdatePrimaryDisplayId(const DisplayIdPair& pair,
|
| + int64 display_id) {
|
| + if (paired_layouts_.find(pair) == paired_layouts_.end())
|
| + CreateDisplayLayout(pair);
|
| + paired_layouts_[pair].primary_id = display_id;
|
| +}
|
| +
|
| +DisplayLayout DisplayLayoutStore::CreateDisplayLayout(
|
| + const DisplayIdPair& pair) {
|
| + DisplayLayout layout = default_display_layout_;
|
| + layout.primary_id = pair.first;
|
| + paired_layouts_[pair] = layout;
|
| + return layout;
|
| +}
|
| +
|
| +} // namespace internal
|
| +} // namespace ash
|
|
|