Index: chrome/browser/resources/options/chromeos/display_options.js |
diff --git a/chrome/browser/resources/options/chromeos/display_options.js b/chrome/browser/resources/options/chromeos/display_options.js |
index 756e564534b323f096db58965e6c7ced0be66fd1..2bd934ec1bdba1862f831f03291efcca3b6496c5 100644 |
--- a/chrome/browser/resources/options/chromeos/display_options.js |
+++ b/chrome/browser/resources/options/chromeos/display_options.js |
@@ -766,6 +766,37 @@ cr.define('options', function() { |
}, |
/** |
+ * Creates a div element representing the specified display. |
+ * @param {Object} display The display object. |
+ * @param {boolean} focused True if it's focused. |
+ * @private |
+ */ |
+ createDisplayRectangle_: function(display, focused) { |
+ var div = document.createElement('div'); |
+ display.div = div; |
+ div.className = 'displays-display'; |
+ if (focused) |
+ div.classList.add('displays-focused'); |
+ |
+ // div needs to be added to the DOM tree first, otherwise offsetHeight for |
+ // nameContainer below cannot be computed. |
+ this.displaysView_.appendChild(div); |
+ |
+ var nameContainer = document.createElement('div'); |
+ nameContainer.textContent = display.name; |
+ div.appendChild(nameContainer); |
+ div.style.width = Math.floor(display.width * this.visualScale_) + 'px'; |
+ var newHeight = Math.floor(display.height * this.visualScale_); |
+ div.style.height = newHeight + 'px'; |
+ nameContainer.style.marginTop = |
+ (newHeight - nameContainer.offsetHeight) / 2 + 'px'; |
+ |
+ div.onmousedown = this.onMouseDown_.bind(this); |
+ div.ontouchstart = this.onTouchStart_.bind(this); |
+ return div; |
+ }, |
+ |
+ /** |
* Layouts the display rectangles according to the current layout_. |
* @private |
*/ |
@@ -773,8 +804,18 @@ cr.define('options', function() { |
var maxWidth = 0; |
var maxHeight = 0; |
var boundingBox = {left: 0, right: 0, top: 0, bottom: 0}; |
+ this.primaryDisplay_ = null; |
+ this.secondaryDisplay_ = null; |
+ var focusedDisplay = null; |
for (var i = 0; i < this.displays_.length; i++) { |
var display = this.displays_[i]; |
+ if (display.isPrimary) |
+ this.primaryDisplay_ = display; |
+ else |
+ this.secondaryDisplay_ = display; |
+ if (i == this.focusedIndex_) |
+ focusedDisplay = display; |
+ |
boundingBox.left = Math.min(boundingBox.left, display.x); |
boundingBox.right = Math.max( |
boundingBox.right, display.x + display.width); |
@@ -784,6 +825,8 @@ cr.define('options', function() { |
maxWidth = Math.max(maxWidth, display.width); |
maxHeight = Math.max(maxHeight, display.height); |
} |
+ if (!this.primaryDisplay_) |
+ return; |
// Make the margin around the bounding box. |
var areaWidth = boundingBox.right - boundingBox.left + maxWidth; |
@@ -798,13 +841,6 @@ cr.define('options', function() { |
this.displaysView_.style.height = |
Math.ceil(areaHeight * this.visualScale_) + 'px'; |
- var boundingCenter = { |
- x: Math.floor((boundingBox.right + boundingBox.left) * |
- this.visualScale_ / 2), |
- y: Math.floor((boundingBox.bottom + boundingBox.top) * |
- this.visualScale_ / 2) |
- }; |
- |
// Centering the bounding box of the display rectangles. |
var offset = { |
x: Math.floor(this.displaysView_.offsetWidth / 2 - |
@@ -813,46 +849,57 @@ cr.define('options', function() { |
(boundingBox.bottom + boundingBox.top) * this.visualScale_ / 2) |
}; |
- for (var i = 0; i < this.displays_.length; i++) { |
- var display = this.displays_[i]; |
- var div = document.createElement('div'); |
- display.div = div; |
- |
- div.className = 'displays-display'; |
- if (i == this.focusedIndex_) |
- div.classList.add('displays-focused'); |
- |
- if (display.isPrimary) { |
- this.primaryDisplay_ = display; |
- } else { |
- this.secondaryDisplay_ = display; |
+ // Layouting the display rectangles. First layout the primaryDisplay and |
+ // then layout the secondary which is attaching to the primary. |
+ var primaryDiv = this.createDisplayRectangle_( |
+ this.primaryDisplay_, this.primaryDisplay_ == focusedDisplay); |
+ primaryDiv.style.left = |
+ Math.floor(this.primaryDisplay_.x * this.visualScale_) + |
+ offset.x + 'px'; |
+ primaryDiv.style.top = |
+ Math.floor(this.primaryDisplay_.y * this.visualScale_) + |
+ offset.y + 'px'; |
+ this.primaryDisplay_.originalPosition = { |
+ x: primaryDiv.offsetLeft, y: primaryDiv.offsetTop}; |
+ |
+ if (this.secondaryDisplay_) { |
+ var secondaryDiv = this.createDisplayRectangle_( |
+ this.secondaryDisplay_, this.secondaryDisplay_ == focusedDisplay); |
+ // Don't trust the secondary display's x or y, because it may cause a |
+ // 1px gap due to rounding, which will create a fake update on end |
+ // dragging. See crbug.com/386401 |
+ switch (this.layout_) { |
+ case options.SecondaryDisplayLayout.TOP: |
+ secondaryDiv.style.left = |
+ Math.floor(this.secondaryDisplay_.x * this.visualScale_) + |
+ offset.x + 'px'; |
+ secondaryDiv.style.top = |
+ primaryDiv.offsetTop - secondaryDiv.offsetHeight + 'px'; |
+ break; |
+ case options.SecondaryDisplayLayout.RIGHT: |
+ secondaryDiv.style.left = |
+ primaryDiv.offsetLeft + primaryDiv.offsetWidth + 'px'; |
+ secondaryDiv.style.top = |
+ Math.floor(this.secondaryDisplay_.y * this.visualScale_) + |
+ offset.y + 'px'; |
+ break; |
+ case options.SecondaryDisplayLayout.BOTTOM: |
+ secondaryDiv.style.left = |
+ Math.floor(this.secondaryDisplay_.x * this.visualScale_) + |
+ offset.x + 'px'; |
+ secondaryDiv.style.top = |
+ primaryDiv.offsetTop + primaryDiv.offsetHeight + 'px'; |
+ break; |
+ case options.SecondaryDisplayLayout.LEFT: |
+ secondaryDiv.style.left = |
+ primaryDiv.offsetLeft - secondaryDiv.offsetWidth + 'px'; |
+ secondaryDiv.style.top = |
+ Math.floor(this.secondaryDisplay_.y * this.visualScale_) + |
+ offset.y + 'px'; |
+ break; |
} |
- var displayNameContainer = document.createElement('div'); |
- displayNameContainer.textContent = display.name; |
- div.appendChild(displayNameContainer); |
- display.nameContainer = displayNameContainer; |
- display.div.style.width = |
- Math.floor(display.width * this.visualScale_) + 'px'; |
- var newHeight = Math.floor(display.height * this.visualScale_); |
- display.div.style.height = newHeight + 'px'; |
- div.style.left = |
- Math.floor(display.x * this.visualScale_) + offset.x + 'px'; |
- div.style.top = |
- Math.floor(display.y * this.visualScale_) + offset.y + 'px'; |
- display.nameContainer.style.marginTop = |
- (newHeight - display.nameContainer.offsetHeight) / 2 + 'px'; |
- |
- div.onmousedown = this.onMouseDown_.bind(this); |
- div.ontouchstart = this.onTouchStart_.bind(this); |
- |
- this.displaysView_.appendChild(div); |
- |
- // Set the margin top to place the display name at the middle of the |
- // rectangle. Note that this has to be done after it's added into the |
- // |displaysView_|. Otherwise its offsetHeight is yet 0. |
- displayNameContainer.style.marginTop = |
- (div.offsetHeight - displayNameContainer.offsetHeight) / 2 + 'px'; |
- display.originalPosition = {x: div.offsetLeft, y: div.offsetTop}; |
+ this.secondaryDisplay_.originalPosition = { |
+ x: secondaryDiv.offsetLeft, y: secondaryDiv.offsetTop}; |
} |
}, |