| Index: ash/display/display_controller.cc
|
| diff --git a/ash/display/display_controller.cc b/ash/display/display_controller.cc
|
| index 456b831235a36e971c5e3bb6e08f7ee21f7567a8..d7a95d0292e09964b6d998917a66a804157597e9 100644
|
| --- a/ash/display/display_controller.cc
|
| +++ b/ash/display/display_controller.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "ash/display/display_controller.h"
|
|
|
| +#include <algorithm>
|
| +
|
| #include "ash/ash_switches.h"
|
| #include "ash/display/multi_display_manager.h"
|
| #include "ash/root_window_controller.h"
|
| @@ -22,9 +24,17 @@
|
|
|
| namespace ash {
|
| namespace internal {
|
| +namespace {
|
| +
|
| +// The number of pixels to overlap between the primary and secondary displays,
|
| +// in case that the offset value is too large.
|
| +const int kMinimumOverlapForInvalidOffset = 50;
|
| +
|
| +}
|
|
|
| DisplayController::DisplayController()
|
| : secondary_display_layout_(RIGHT),
|
| + secondary_display_offset_(0),
|
| dont_warp_mouse_(false) {
|
| aura::Env::GetInstance()->display_manager()->AddObserver(this);
|
| }
|
| @@ -122,6 +132,11 @@ void DisplayController::SetSecondaryDisplayLayout(
|
| UpdateDisplayBoundsForLayout();
|
| }
|
|
|
| +void DisplayController::SetSecondaryDisplayOffset(int offset) {
|
| + secondary_display_offset_ = offset;
|
| + UpdateDisplayBoundsForLayout();
|
| +}
|
| +
|
| bool DisplayController::WarpMouseCursorIfNecessary(
|
| aura::RootWindow* current_root,
|
| const gfx::Point& point_in_root) {
|
| @@ -243,18 +258,33 @@ void DisplayController::UpdateDisplayBoundsForLayout() {
|
| gfx::Point new_secondary_origin = primary_bounds.origin();
|
|
|
| // TODO(oshima|mukai): Implement more flexible layout.
|
| +
|
| + // Ignore the offset in case the secondary display doesn't share edges with
|
| + // the primary display.
|
| + int offset = secondary_display_offset_;
|
| + if (secondary_display_layout_ == TOP || secondary_display_layout_ == BOTTOM) {
|
| + offset = std::min(
|
| + offset, primary_bounds.width() - kMinimumOverlapForInvalidOffset);
|
| + offset = std::max(
|
| + offset, -secondary_bounds.width() + kMinimumOverlapForInvalidOffset);
|
| + } else {
|
| + offset = std::min(
|
| + offset, primary_bounds.height() - kMinimumOverlapForInvalidOffset);
|
| + offset = std::max(
|
| + offset, -secondary_bounds.height() + kMinimumOverlapForInvalidOffset);
|
| + }
|
| switch (secondary_display_layout_) {
|
| case TOP:
|
| - new_secondary_origin.Offset(0, -secondary_bounds.height());
|
| + new_secondary_origin.Offset(offset, -secondary_bounds.height());
|
| break;
|
| case RIGHT:
|
| - new_secondary_origin.Offset(primary_bounds.width(), 0);
|
| + new_secondary_origin.Offset(primary_bounds.width(), offset);
|
| break;
|
| case BOTTOM:
|
| - new_secondary_origin.Offset(0, primary_bounds.height());
|
| + new_secondary_origin.Offset(offset, primary_bounds.height());
|
| break;
|
| case LEFT:
|
| - new_secondary_origin.Offset(-secondary_bounds.width(), 0);
|
| + new_secondary_origin.Offset(-secondary_bounds.width(), offset);
|
| break;
|
| }
|
| gfx::Insets insets = secondary_display->GetWorkAreaInsets();
|
|
|