Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 cr.exportPath('options'); | 5 cr.exportPath('options'); |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * Enumeration of display layout. These values must match the C++ values in | |
| 9 * ash::DisplayController. | |
| 10 * @enum {number} | |
| 11 */ | |
| 12 options.DisplayLayoutType = { | |
| 13 TOP: 0, | |
| 14 RIGHT: 1, | |
| 15 BOTTOM: 2, | |
| 16 LEFT: 3 | |
| 17 }; | |
| 18 | |
| 19 /** | |
| 20 * Enumeration of multi display mode. These values must match the C++ values in | |
| 21 * ash::DisplayManager. | |
| 22 * @enum {number} | |
| 23 */ | |
| 24 options.MultiDisplayMode = { | |
| 25 EXTENDED: 0, | |
| 26 MIRRORING: 1, | |
| 27 UNIFIED: 2, | |
| 28 }; | |
| 29 | |
| 30 /** | |
| 8 * @typedef {{ | 31 * @typedef {{ |
| 9 * left: number, | 32 * left: number, |
| 10 * top: number, | 33 * top: number, |
| 11 * width: number, | 34 * width: number, |
| 12 * height: number | 35 * height: number |
| 13 * }} | 36 * }} |
| 14 */ | 37 */ |
| 15 options.DisplayBounds; | 38 options.DisplayBounds; |
| 16 | 39 |
| 17 /** | 40 /** |
| 18 * @typedef {{ | 41 * @typedef {{ |
| 42 * x: number, | |
| 43 * y: number | |
| 44 * }} | |
| 45 */ | |
| 46 options.DisplayPosition; | |
| 47 | |
| 48 /** | |
| 49 * @typedef {{ | |
| 19 * width: number, | 50 * width: number, |
| 20 * height: number, | 51 * height: number, |
| 21 * originalWidth: number, | 52 * originalWidth: number, |
| 22 * originalHeight: number, | 53 * originalHeight: number, |
| 23 * deviceScaleFactor: number, | 54 * deviceScaleFactor: number, |
| 24 * scale: number, | 55 * scale: number, |
| 25 * refreshRate: number, | 56 * refreshRate: number, |
| 26 * isBest: boolean, | 57 * isBest: boolean, |
| 27 * selected: boolean | 58 * selected: boolean |
| 28 * }} | 59 * }} |
| 29 */ | 60 */ |
| 30 options.DisplayMode; | 61 options.DisplayMode; |
| 31 | 62 |
| 32 /** | 63 /** |
| 33 * @typedef {{ | 64 * @typedef {{ |
| 34 * profileId: number, | 65 * profileId: number, |
| 35 * name: string | 66 * name: string |
| 36 * }} | 67 * }} |
| 37 */ | 68 */ |
| 38 options.ColorProfile; | 69 options.ColorProfile; |
| 39 | 70 |
| 40 /** | 71 /** |
| 41 * @typedef {{ | 72 * @typedef {{ |
| 42 * availableColorProfiles: !Array<!options.ColorProfile>, | 73 * availableColorProfiles: !Array<!options.ColorProfile>, |
| 43 * bounds: options.DisplayBounds, | 74 * bounds: !options.DisplayBounds, |
| 44 * colorProfileId: number, | 75 * colorProfileId: number, |
| 45 * div: ?Element, | 76 * div: ?Element, |
| 46 * id: string, | 77 * id: string, |
| 47 * isInternal: boolean, | 78 * isInternal: boolean, |
| 48 * isPrimary: boolean, | 79 * isPrimary: boolean, |
| 49 * resolutions: !Array<!options.DisplayMode>, | 80 * resolutions: !Array<!options.DisplayMode>, |
| 50 * name: string, | 81 * name: string, |
| 51 * rotation: number, | 82 * rotation: number, |
| 52 * originalPosition: ?{x: number, y: number} | 83 * originalPosition: ?options.DisplayPosition |
| 53 * }} | 84 * }} |
| 54 */ | 85 */ |
| 55 options.DisplayInfo; | 86 options.DisplayInfo; |
| 56 | 87 |
| 57 /** | |
| 58 * Enumeration of secondary display layout. The value has to be same as the | |
| 59 * values in ash/display/display_controller.cc. | |
| 60 * @enum {number} | |
| 61 */ | |
| 62 options.SecondaryDisplayLayout = { | |
| 63 TOP: 0, | |
| 64 RIGHT: 1, | |
| 65 BOTTOM: 2, | |
| 66 LEFT: 3 | |
| 67 }; | |
| 68 | |
| 69 /** | |
| 70 * Enumeration of multi display mode. The value has to be same as the | |
| 71 * values in ash/display/display_manager.. | |
| 72 * @enum {number} | |
| 73 */ | |
| 74 options.MultiDisplayMode = { | |
| 75 EXTENDED: 0, | |
| 76 MIRRORING: 1, | |
| 77 UNIFIED: 2, | |
| 78 }; | |
| 79 | |
| 80 cr.define('options', function() { | 88 cr.define('options', function() { |
| 81 var Page = cr.ui.pageManager.Page; | 89 var Page = cr.ui.pageManager.Page; |
| 82 var PageManager = cr.ui.pageManager.PageManager; | 90 var PageManager = cr.ui.pageManager.PageManager; |
| 83 | 91 |
| 84 // The scale ratio of the display rectangle to its original size. | 92 // The scale ratio of the display rectangle to its original size. |
| 85 /** @const */ var VISUAL_SCALE = 1 / 10; | 93 /** @const */ var VISUAL_SCALE = 1 / 10; |
| 86 | 94 |
| 87 // The number of pixels to share the edges between displays. | 95 // The number of pixels to share the edges between displays. |
| 88 /** @const */ var MIN_OFFSET_OVERLAP = 5; | 96 /** @const */ var MIN_OFFSET_OVERLAP = 5; |
| 89 | 97 |
| 90 /** | 98 /** |
| 91 * Calculates the bounds of |element| relative to the page. | |
| 92 * @param {HTMLElement} element The element to be known. | |
| 93 * @return {Object} The object for the bounds, with x, y, width, and height. | |
| 94 */ | |
| 95 function getBoundsInPage(element) { | |
| 96 var bounds = { | |
| 97 x: element.offsetLeft, | |
| 98 y: element.offsetTop, | |
| 99 width: element.offsetWidth, | |
| 100 height: element.offsetHeight | |
| 101 }; | |
| 102 var parent = element.offsetParent; | |
| 103 while (parent && parent != document.body) { | |
| 104 bounds.x += parent.offsetLeft; | |
| 105 bounds.y += parent.offsetTop; | |
| 106 parent = parent.offsetParent; | |
| 107 } | |
| 108 return bounds; | |
| 109 } | |
|
stevenjb
2016/01/21 03:56:17
Unused
| |
| 110 | |
| 111 /** | |
| 112 * Gets the position of |point| to |rect|, left, right, top, or bottom. | 99 * Gets the position of |point| to |rect|, left, right, top, or bottom. |
| 113 * @param {Object} rect The base rectangle with x, y, width, and height. | 100 * @param {!options.DisplayBounds} rect The base rectangle. |
| 114 * @param {Object} point The point to check the position. | 101 * @param {!options.DisplayPosition} point The point to check the position. |
| 115 * @return {options.SecondaryDisplayLayout} The position of the calculated | 102 * @return {options.DisplayLayoutType} The position of the calculated point. |
| 116 * point. | |
| 117 */ | 103 */ |
| 118 function getPositionToRectangle(rect, point) { | 104 function getPositionToRectangle(rect, point) { |
| 119 // Separates the area into four (LEFT/RIGHT/TOP/BOTTOM) by the diagonals of | 105 // Separates the area into four (LEFT/RIGHT/TOP/BOTTOM) by the diagonals of |
| 120 // the rect, and decides which area the display should reside. | 106 // the rect, and decides which area the display should reside. |
| 121 var diagonalSlope = rect.height / rect.width; | 107 var diagonalSlope = rect.height / rect.width; |
| 122 var topDownIntercept = rect.y - rect.x * diagonalSlope; | 108 var topDownIntercept = rect.top - rect.left * diagonalSlope; |
| 123 var bottomUpIntercept = rect.y + rect.height + rect.x * diagonalSlope; | 109 var bottomUpIntercept = rect.top + rect.height + rect.left * diagonalSlope; |
| 124 | 110 |
| 125 if (point.y > topDownIntercept + point.x * diagonalSlope) { | 111 if (point.y > topDownIntercept + point.x * diagonalSlope) { |
| 126 if (point.y > bottomUpIntercept - point.x * diagonalSlope) | 112 if (point.y > bottomUpIntercept - point.x * diagonalSlope) |
| 127 return options.SecondaryDisplayLayout.BOTTOM; | 113 return options.DisplayLayoutType.BOTTOM; |
| 128 else | 114 else |
| 129 return options.SecondaryDisplayLayout.LEFT; | 115 return options.DisplayLayoutType.LEFT; |
| 130 } else { | 116 } else { |
| 131 if (point.y > bottomUpIntercept - point.x * diagonalSlope) | 117 if (point.y > bottomUpIntercept - point.x * diagonalSlope) |
| 132 return options.SecondaryDisplayLayout.RIGHT; | 118 return options.DisplayLayoutType.RIGHT; |
| 133 else | 119 else |
| 134 return options.SecondaryDisplayLayout.TOP; | 120 return options.DisplayLayoutType.TOP; |
| 135 } | 121 } |
| 136 } | 122 } |
| 137 | 123 |
| 138 /** | 124 /** |
| 139 * Encapsulated handling of the 'Display' page. | 125 * Encapsulated handling of the 'Display' page. |
| 140 * @constructor | 126 * @constructor |
| 141 * @extends {cr.ui.pageManager.Page} | 127 * @extends {cr.ui.pageManager.Page} |
| 142 */ | 128 */ |
| 143 function DisplayOptions() { | 129 function DisplayOptions() { |
| 144 Page.call(this, 'display', | 130 Page.call(this, 'display', |
| 145 loadTimeData.getString('displayOptionsPageTabTitle'), | 131 loadTimeData.getString('displayOptionsPageTabTitle'), |
| 146 'display-options-page'); | 132 'display-options-page'); |
| 147 } | 133 } |
| 148 | 134 |
| 149 cr.addSingletonGetter(DisplayOptions); | 135 cr.addSingletonGetter(DisplayOptions); |
| 150 | 136 |
| 151 DisplayOptions.prototype = { | 137 DisplayOptions.prototype = { |
| 152 __proto__: Page.prototype, | 138 __proto__: Page.prototype, |
| 153 | 139 |
| 154 /** | 140 /** |
| 155 * Whether the current output status is mirroring displays or not. | 141 * Whether the current output status is mirroring displays or not. |
| 142 * @type {boolean} | |
| 156 * @private | 143 * @private |
| 157 */ | 144 */ |
| 158 mirroring_: false, | 145 mirroring_: false, |
| 159 | 146 |
| 160 /** | 147 /** |
| 161 * Whether the unified desktop is enable or not. | 148 * Whether the unified desktop is enable or not. |
| 149 * @type {boolean} | |
| 162 * @private | 150 * @private |
| 163 */ | 151 */ |
| 164 unifiedDesktopEnabled_: false, | 152 unifiedDesktopEnabled_: false, |
| 165 | 153 |
| 166 /** | 154 /** |
| 167 * Whether the unified desktop option should be present. | 155 * Whether the unified desktop option should be present. |
| 156 * @type {boolean} | |
| 168 * @private | 157 * @private |
| 169 */ | 158 */ |
| 170 showUnifiedDesktopOption_: false, | 159 showUnifiedDesktopOption_: false, |
| 171 | 160 |
| 172 /** | 161 /** |
| 173 * The current secondary display layout. | 162 * The current secondary display layout. |
| 163 * @type {options.DisplayLayoutType} | |
| 174 * @private | 164 * @private |
| 175 */ | 165 */ |
| 176 layout_: options.SecondaryDisplayLayout.RIGHT, | 166 layout_: options.DisplayLayoutType.RIGHT, |
| 177 | 167 |
| 178 /** | 168 /** |
| 179 * The array of current output displays. It also contains the display | 169 * The array of current output displays. It also contains the display |
| 180 * rectangles currently rendered on screen. | 170 * rectangles currently rendered on screen. |
| 181 * @type {!Array<!options.DisplayInfo>} | 171 * @type {!Array<!options.DisplayInfo>} |
| 182 * @private | 172 * @private |
| 183 */ | 173 */ |
| 184 displays_: [], | 174 displays_: [], |
| 185 | 175 |
| 186 /** | 176 /** |
| 187 * The index for the currently focused display in the options UI. null if | 177 * The index of the currently focused display, or -1 for none. |
| 188 * no one has focus. | 178 * @type {number} |
| 189 * @private | 179 * @private |
| 190 */ | 180 */ |
| 191 focusedIndex_: null, | 181 focusedIndex_: -1, |
| 192 | 182 |
| 193 /** | 183 /** |
| 194 * The primary display edit info. | 184 * The primary display edit info. |
| 195 * @type {?options.DisplayInfo} | 185 * @type {?options.DisplayInfo} |
| 196 * @private | 186 * @private |
| 197 */ | 187 */ |
| 198 primaryDisplay_: null, | 188 primaryDisplay_: null, |
| 199 | 189 |
| 200 /** | 190 /** |
| 201 * The secondary display edit info. | 191 * The secondary display edit info. |
| 202 * @type {?options.DisplayInfo} | 192 * @type {?options.DisplayInfo} |
| 203 * @private | 193 * @private |
| 204 */ | 194 */ |
| 205 secondaryDisplay_: null, | 195 secondaryDisplay_: null, |
| 206 | 196 |
| 207 /** | 197 /** |
| 198 * Drag info. | |
| 199 * @type {?{display: !options.DisplayInfo, | |
| 200 * originalLocation: !options.DisplayPosition, | |
| 201 * eventLocation: !options.DisplayPosition}} | |
| 202 * @private | |
| 203 */ | |
| 204 dragging_: null, | |
| 205 | |
| 206 /** | |
| 208 * The container div element which contains all of the display rectangles. | 207 * The container div element which contains all of the display rectangles. |
| 208 * @type {?Element} | |
| 209 * @private | 209 * @private |
| 210 */ | 210 */ |
| 211 displaysView_: null, | 211 displaysView_: null, |
| 212 | 212 |
| 213 /** | 213 /** |
| 214 * The scale factor of the actual display size to the drawn display | 214 * The scale factor of the actual display size to the drawn display |
| 215 * rectangle size. | 215 * rectangle size. |
| 216 * @type {number} | |
| 216 * @private | 217 * @private |
| 217 */ | 218 */ |
| 218 visualScale_: VISUAL_SCALE, | 219 visualScale_: VISUAL_SCALE, |
| 219 | 220 |
| 220 /** | 221 /** |
| 221 * The location where the last touch event happened. This is used to | 222 * The location where the last touch event happened. This is used to |
| 222 * prevent unnecessary dragging events happen. Set to null unless it's | 223 * prevent unnecessary dragging events happen. Set to null unless it's |
| 223 * during touch events. | 224 * during touch events. |
| 225 * @type {?options.DisplayPosition} | |
| 224 * @private | 226 * @private |
| 225 */ | 227 */ |
| 226 lastTouchLocation_: null, | 228 lastTouchLocation_: null, |
| 227 | 229 |
| 228 /** | 230 /** |
| 229 * Whether the display settings can be shown. | 231 * Whether the display settings can be shown. |
| 232 * @type {boolean} | |
| 230 * @private | 233 * @private |
| 231 */ | 234 */ |
| 232 enabled_: true, | 235 enabled_: true, |
| 233 | 236 |
| 234 /** @override */ | 237 /** @override */ |
| 235 initializePage: function() { | 238 initializePage: function() { |
| 236 Page.prototype.initializePage.call(this); | 239 Page.prototype.initializePage.call(this); |
| 237 | 240 |
| 238 $('display-options-select-mirroring').onchange = (function() { | 241 $('display-options-select-mirroring').onchange = (function() { |
| 239 this.mirroring_ = | 242 this.mirroring_ = |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 250 $('display-options-set-primary').onclick = (function() { | 253 $('display-options-set-primary').onclick = (function() { |
| 251 chrome.send('setPrimary', [this.displays_[this.focusedIndex_].id]); | 254 chrome.send('setPrimary', [this.displays_[this.focusedIndex_].id]); |
| 252 }).bind(this); | 255 }).bind(this); |
| 253 $('display-options-resolution-selection').onchange = (function(ev) { | 256 $('display-options-resolution-selection').onchange = (function(ev) { |
| 254 var display = this.displays_[this.focusedIndex_]; | 257 var display = this.displays_[this.focusedIndex_]; |
| 255 var resolution = display.resolutions[ev.target.value]; | 258 var resolution = display.resolutions[ev.target.value]; |
| 256 chrome.send('setDisplayMode', [display.id, resolution]); | 259 chrome.send('setDisplayMode', [display.id, resolution]); |
| 257 }).bind(this); | 260 }).bind(this); |
| 258 $('display-options-orientation-selection').onchange = (function(ev) { | 261 $('display-options-orientation-selection').onchange = (function(ev) { |
| 259 var displayIndex = | 262 var displayIndex = |
| 260 (this.focusedIndex_ === null) ? 0 : this.focusedIndex_; | 263 (this.focusedIndex_ == -1) ? 0 : this.focusedIndex_; |
| 261 var rotation = parseInt(ev.target.value, 10); | 264 var rotation = parseInt(ev.target.value, 10); |
| 262 chrome.send('setRotation', [this.displays_[displayIndex].id, rotation]); | 265 chrome.send('setRotation', [this.displays_[displayIndex].id, rotation]); |
| 263 }).bind(this); | 266 }).bind(this); |
| 264 $('display-options-color-profile-selection').onchange = (function(ev) { | 267 $('display-options-color-profile-selection').onchange = (function(ev) { |
| 265 chrome.send('setColorProfile', [this.displays_[this.focusedIndex_].id, | 268 chrome.send('setColorProfile', [this.displays_[this.focusedIndex_].id, |
| 266 ev.target.value]); | 269 ev.target.value]); |
| 267 }).bind(this); | 270 }).bind(this); |
| 268 $('selected-display-start-calibrating-overscan').onclick = (function() { | 271 $('selected-display-start-calibrating-overscan').onclick = (function() { |
| 269 // Passes the target display ID. Do not specify it through URL hash, | 272 // Passes the target display ID. Do not specify it through URL hash, |
| 270 // we do not care back/forward. | 273 // we do not care back/forward. |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 292 'selected-display-option-title'); | 295 'selected-display-option-title'); |
| 293 var maxSize = 0; | 296 var maxSize = 0; |
| 294 for (var i = 0; i < optionTitles.length; i++) | 297 for (var i = 0; i < optionTitles.length; i++) |
| 295 maxSize = Math.max(maxSize, optionTitles[i].clientWidth); | 298 maxSize = Math.max(maxSize, optionTitles[i].clientWidth); |
| 296 for (var i = 0; i < optionTitles.length; i++) | 299 for (var i = 0; i < optionTitles.length; i++) |
| 297 optionTitles[i].style.width = maxSize + 'px'; | 300 optionTitles[i].style.width = maxSize + 'px'; |
| 298 chrome.send('getDisplayInfo'); | 301 chrome.send('getDisplayInfo'); |
| 299 }, | 302 }, |
| 300 | 303 |
| 301 /** @override */ | 304 /** @override */ |
| 302 canShowPage: function() { | 305 canShowPage: function() { return this.enabled_; }, |
| 303 return this.enabled_; | |
| 304 }, | |
| 305 | 306 |
| 306 /** | 307 /** |
| 307 * Enables or disables the page. When disabled, the page will not be able to | 308 * Enables or disables the page. When disabled, the page will not be able to |
| 308 * open, and will close if currently opened. | 309 * open, and will close if currently opened. |
| 309 * @param {boolean} enabled Whether the page should be enabled. | 310 * @param {boolean} enabled Whether the page should be enabled. |
| 310 * @param {boolean} showUnifiedDesktop Whether the unified desktop option | 311 * @param {boolean} showUnifiedDesktop Whether the unified desktop option |
| 311 * should be present. | 312 * should be present. |
| 312 */ | 313 */ |
| 313 setEnabled: function(enabled, showUnifiedDesktop) { | 314 setEnabled: function(enabled, showUnifiedDesktop) { |
| 314 if (this.enabled_ == enabled && | 315 if (this.enabled_ == enabled && |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 394 | 395 |
| 395 /** | 396 /** |
| 396 * Collects the current data and sends it to Chrome. | 397 * Collects the current data and sends it to Chrome. |
| 397 * @private | 398 * @private |
| 398 */ | 399 */ |
| 399 applyResult_: function() { | 400 applyResult_: function() { |
| 400 // Offset is calculated from top or left edge. | 401 // Offset is calculated from top or left edge. |
| 401 var primary = this.primaryDisplay_; | 402 var primary = this.primaryDisplay_; |
| 402 var secondary = this.secondaryDisplay_; | 403 var secondary = this.secondaryDisplay_; |
| 403 var offset; | 404 var offset; |
| 404 if (this.layout_ == options.SecondaryDisplayLayout.LEFT || | 405 if (this.layout_ == options.DisplayLayoutType.LEFT || |
| 405 this.layout_ == options.SecondaryDisplayLayout.RIGHT) { | 406 this.layout_ == options.DisplayLayoutType.RIGHT) { |
| 406 offset = secondary.div.offsetTop - primary.div.offsetTop; | 407 offset = secondary.div.offsetTop - primary.div.offsetTop; |
| 407 } else { | 408 } else { |
| 408 offset = secondary.div.offsetLeft - primary.div.offsetLeft; | 409 offset = secondary.div.offsetLeft - primary.div.offsetLeft; |
| 409 } | 410 } |
| 410 offset = Math.floor(offset / this.visualScale_); | 411 offset = Math.floor(offset / this.visualScale_); |
| 411 chrome.send('setDisplayLayout', [secondary.id, this.layout_, offset]); | 412 chrome.send('setDisplayLayout', [secondary.id, this.layout_, offset]); |
| 412 }, | 413 }, |
| 413 | 414 |
| 414 /** | 415 /** |
| 415 * Snaps the region [point, width] to [basePoint, baseWidth] if | 416 * Snaps the region [point, width] to [basePoint, baseWidth] if |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 434 return basePoint; | 435 return basePoint; |
| 435 else if (endDiff < SNAP_DISTANCE_PX) | 436 else if (endDiff < SNAP_DISTANCE_PX) |
| 436 return basePoint + baseWidth - width; | 437 return basePoint + baseWidth - width; |
| 437 | 438 |
| 438 return point; | 439 return point; |
| 439 }, | 440 }, |
| 440 | 441 |
| 441 /** | 442 /** |
| 442 * Processes the actual dragging of display rectangle. | 443 * Processes the actual dragging of display rectangle. |
| 443 * @param {Event} e The event which triggers this drag. | 444 * @param {Event} e The event which triggers this drag. |
| 444 * @param {Object} eventLocation The location where the event happens. | 445 * @param {options.DisplayPosition} eventLocation The location where the |
| 446 * event happens. | |
| 445 * @private | 447 * @private |
| 446 */ | 448 */ |
| 447 processDragging_: function(e, eventLocation) { | 449 processDragging_: function(e, eventLocation) { |
| 448 if (!this.dragging_) | 450 if (!this.dragging_) |
| 449 return true; | 451 return true; |
| 450 | 452 |
| 451 var index = -1; | 453 var index = -1; |
| 452 for (var i = 0; i < this.displays_.length; i++) { | 454 for (var i = 0; i < this.displays_.length; i++) { |
| 453 if (this.displays_[i] == this.dragging_.display) { | 455 if (this.displays_[i] == this.dragging_.display) { |
| 454 index = i; | 456 index = i; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 472 | 474 |
| 473 var baseDiv = this.dragging_.display.isPrimary ? | 475 var baseDiv = this.dragging_.display.isPrimary ? |
| 474 this.secondaryDisplay_.div : this.primaryDisplay_.div; | 476 this.secondaryDisplay_.div : this.primaryDisplay_.div; |
| 475 var draggingDiv = this.dragging_.display.div; | 477 var draggingDiv = this.dragging_.display.div; |
| 476 | 478 |
| 477 newPosition.x = this.snapToEdge_(newPosition.x, draggingDiv.offsetWidth, | 479 newPosition.x = this.snapToEdge_(newPosition.x, draggingDiv.offsetWidth, |
| 478 baseDiv.offsetLeft, baseDiv.offsetWidth); | 480 baseDiv.offsetLeft, baseDiv.offsetWidth); |
| 479 newPosition.y = this.snapToEdge_(newPosition.y, draggingDiv.offsetHeight, | 481 newPosition.y = this.snapToEdge_(newPosition.y, draggingDiv.offsetHeight, |
| 480 baseDiv.offsetTop, baseDiv.offsetHeight); | 482 baseDiv.offsetTop, baseDiv.offsetHeight); |
| 481 | 483 |
| 482 var newCenter = { | 484 var newCenter = /** {!options.DisplayPosition} */({ |
| 483 x: newPosition.x + draggingDiv.offsetWidth / 2, | 485 x: newPosition.x + draggingDiv.offsetWidth / 2, |
| 484 y: newPosition.y + draggingDiv.offsetHeight / 2 | 486 y: newPosition.y + draggingDiv.offsetHeight / 2 |
| 485 }; | 487 }); |
| 486 | 488 |
| 487 var baseBounds = { | 489 var baseBounds = /** {!options.DisplayBounds} */({ |
| 488 x: baseDiv.offsetLeft, | 490 left: baseDiv.offsetLeft, |
| 489 y: baseDiv.offsetTop, | 491 top: baseDiv.offsetTop, |
| 490 width: baseDiv.offsetWidth, | 492 width: baseDiv.offsetWidth, |
| 491 height: baseDiv.offsetHeight | 493 height: baseDiv.offsetHeight |
| 492 }; | 494 }); |
| 493 switch (getPositionToRectangle(baseBounds, newCenter)) { | 495 switch (getPositionToRectangle(baseBounds, newCenter)) { |
| 494 case options.SecondaryDisplayLayout.RIGHT: | 496 case options.DisplayLayoutType.RIGHT: |
| 495 this.layout_ = this.dragging_.display.isPrimary ? | 497 this.layout_ = this.dragging_.display.isPrimary ? |
| 496 options.SecondaryDisplayLayout.LEFT : | 498 options.DisplayLayoutType.LEFT : |
| 497 options.SecondaryDisplayLayout.RIGHT; | 499 options.DisplayLayoutType.RIGHT; |
| 498 break; | 500 break; |
| 499 case options.SecondaryDisplayLayout.LEFT: | 501 case options.DisplayLayoutType.LEFT: |
| 500 this.layout_ = this.dragging_.display.isPrimary ? | 502 this.layout_ = this.dragging_.display.isPrimary ? |
| 501 options.SecondaryDisplayLayout.RIGHT : | 503 options.DisplayLayoutType.RIGHT : |
| 502 options.SecondaryDisplayLayout.LEFT; | 504 options.DisplayLayoutType.LEFT; |
| 503 break; | 505 break; |
| 504 case options.SecondaryDisplayLayout.TOP: | 506 case options.DisplayLayoutType.TOP: |
| 505 this.layout_ = this.dragging_.display.isPrimary ? | 507 this.layout_ = this.dragging_.display.isPrimary ? |
| 506 options.SecondaryDisplayLayout.BOTTOM : | 508 options.DisplayLayoutType.BOTTOM : |
| 507 options.SecondaryDisplayLayout.TOP; | 509 options.DisplayLayoutType.TOP; |
| 508 break; | 510 break; |
| 509 case options.SecondaryDisplayLayout.BOTTOM: | 511 case options.DisplayLayoutType.BOTTOM: |
| 510 this.layout_ = this.dragging_.display.isPrimary ? | 512 this.layout_ = this.dragging_.display.isPrimary ? |
| 511 options.SecondaryDisplayLayout.TOP : | 513 options.DisplayLayoutType.TOP : |
| 512 options.SecondaryDisplayLayout.BOTTOM; | 514 options.DisplayLayoutType.BOTTOM; |
| 513 break; | 515 break; |
| 514 } | 516 } |
| 515 | 517 |
| 516 if (this.layout_ == options.SecondaryDisplayLayout.LEFT || | 518 if (this.layout_ == options.DisplayLayoutType.LEFT || |
| 517 this.layout_ == options.SecondaryDisplayLayout.RIGHT) { | 519 this.layout_ == options.DisplayLayoutType.RIGHT) { |
| 518 if (newPosition.y > baseDiv.offsetTop + baseDiv.offsetHeight) | 520 if (newPosition.y > baseDiv.offsetTop + baseDiv.offsetHeight) |
| 519 this.layout_ = this.dragging_.display.isPrimary ? | 521 this.layout_ = this.dragging_.display.isPrimary ? |
| 520 options.SecondaryDisplayLayout.TOP : | 522 options.DisplayLayoutType.TOP : |
| 521 options.SecondaryDisplayLayout.BOTTOM; | 523 options.DisplayLayoutType.BOTTOM; |
| 522 else if (newPosition.y + draggingDiv.offsetHeight < | 524 else if (newPosition.y + draggingDiv.offsetHeight < baseDiv.offsetTop) |
| 523 baseDiv.offsetTop) | |
| 524 this.layout_ = this.dragging_.display.isPrimary ? | 525 this.layout_ = this.dragging_.display.isPrimary ? |
| 525 options.SecondaryDisplayLayout.BOTTOM : | 526 options.DisplayLayoutType.BOTTOM : |
| 526 options.SecondaryDisplayLayout.TOP; | 527 options.DisplayLayoutType.TOP; |
| 527 } else { | 528 } else { |
| 528 if (newPosition.x > baseDiv.offsetLeft + baseDiv.offsetWidth) | 529 if (newPosition.x > baseDiv.offsetLeft + baseDiv.offsetWidth) |
| 529 this.layout_ = this.dragging_.display.isPrimary ? | 530 this.layout_ = this.dragging_.display.isPrimary ? |
| 530 options.SecondaryDisplayLayout.LEFT : | 531 options.DisplayLayoutType.LEFT : |
| 531 options.SecondaryDisplayLayout.RIGHT; | 532 options.DisplayLayoutType.RIGHT; |
| 532 else if (newPosition.x + draggingDiv.offsetWidth < | 533 else if (newPosition.x + draggingDiv.offsetWidth < baseDiv.offsetLeft) |
| 533 baseDiv.offsetLeft) | |
| 534 this.layout_ = this.dragging_.display.isPrimary ? | 534 this.layout_ = this.dragging_.display.isPrimary ? |
| 535 options.SecondaryDisplayLayout.RIGHT : | 535 options.DisplayLayoutType.RIGHT : |
| 536 options.SecondaryDisplayLayout.LEFT; | 536 options.DisplayLayoutType.LEFT; |
| 537 } | 537 } |
| 538 | 538 |
| 539 var layoutToBase; | 539 var layoutToBase; |
| 540 if (!this.dragging_.display.isPrimary) { | 540 if (!this.dragging_.display.isPrimary) { |
| 541 layoutToBase = this.layout_; | 541 layoutToBase = this.layout_; |
| 542 } else { | 542 } else { |
| 543 switch (this.layout_) { | 543 switch (this.layout_) { |
| 544 case options.SecondaryDisplayLayout.RIGHT: | 544 case options.DisplayLayoutType.RIGHT: |
| 545 layoutToBase = options.SecondaryDisplayLayout.LEFT; | 545 layoutToBase = options.DisplayLayoutType.LEFT; |
| 546 break; | 546 break; |
| 547 case options.SecondaryDisplayLayout.LEFT: | 547 case options.DisplayLayoutType.LEFT: |
| 548 layoutToBase = options.SecondaryDisplayLayout.RIGHT; | 548 layoutToBase = options.DisplayLayoutType.RIGHT; |
| 549 break; | 549 break; |
| 550 case options.SecondaryDisplayLayout.TOP: | 550 case options.DisplayLayoutType.TOP: |
| 551 layoutToBase = options.SecondaryDisplayLayout.BOTTOM; | 551 layoutToBase = options.DisplayLayoutType.BOTTOM; |
| 552 break; | 552 break; |
| 553 case options.SecondaryDisplayLayout.BOTTOM: | 553 case options.DisplayLayoutType.BOTTOM: |
| 554 layoutToBase = options.SecondaryDisplayLayout.TOP; | 554 layoutToBase = options.DisplayLayoutType.TOP; |
| 555 break; | 555 break; |
| 556 } | 556 } |
| 557 } | 557 } |
| 558 | 558 |
| 559 switch (layoutToBase) { | 559 switch (layoutToBase) { |
| 560 case options.SecondaryDisplayLayout.RIGHT: | 560 case options.DisplayLayoutType.RIGHT: |
| 561 draggingDiv.style.left = | 561 draggingDiv.style.left = |
| 562 baseDiv.offsetLeft + baseDiv.offsetWidth + 'px'; | 562 baseDiv.offsetLeft + baseDiv.offsetWidth + 'px'; |
| 563 draggingDiv.style.top = newPosition.y + 'px'; | 563 draggingDiv.style.top = newPosition.y + 'px'; |
| 564 break; | 564 break; |
| 565 case options.SecondaryDisplayLayout.LEFT: | 565 case options.DisplayLayoutType.LEFT: |
| 566 draggingDiv.style.left = | 566 draggingDiv.style.left = |
| 567 baseDiv.offsetLeft - draggingDiv.offsetWidth + 'px'; | 567 baseDiv.offsetLeft - draggingDiv.offsetWidth + 'px'; |
| 568 draggingDiv.style.top = newPosition.y + 'px'; | 568 draggingDiv.style.top = newPosition.y + 'px'; |
| 569 break; | 569 break; |
| 570 case options.SecondaryDisplayLayout.TOP: | 570 case options.DisplayLayoutType.TOP: |
| 571 draggingDiv.style.top = | 571 draggingDiv.style.top = |
| 572 baseDiv.offsetTop - draggingDiv.offsetHeight + 'px'; | 572 baseDiv.offsetTop - draggingDiv.offsetHeight + 'px'; |
| 573 draggingDiv.style.left = newPosition.x + 'px'; | 573 draggingDiv.style.left = newPosition.x + 'px'; |
| 574 break; | 574 break; |
| 575 case options.SecondaryDisplayLayout.BOTTOM: | 575 case options.DisplayLayoutType.BOTTOM: |
| 576 draggingDiv.style.top = | 576 draggingDiv.style.top = |
| 577 baseDiv.offsetTop + baseDiv.offsetHeight + 'px'; | 577 baseDiv.offsetTop + baseDiv.offsetHeight + 'px'; |
| 578 draggingDiv.style.left = newPosition.x + 'px'; | 578 draggingDiv.style.left = newPosition.x + 'px'; |
| 579 break; | 579 break; |
| 580 } | 580 } |
| 581 | 581 |
| 582 return false; | 582 return false; |
| 583 }, | 583 }, |
| 584 | 584 |
| 585 /** | 585 /** |
| 586 * start dragging of a display rectangle. | 586 * Start dragging of a display rectangle. |
| 587 * @param {HTMLElement} target The event target. | 587 * @param {!HTMLElement} target The event target. |
| 588 * @param {Object} eventLocation The object to hold the location where | 588 * @param {!options.DisplayPosition} eventLocation The event location. |
| 589 * this event happens. | |
| 590 * @private | 589 * @private |
| 591 */ | 590 */ |
| 592 startDragging_: function(target, eventLocation) { | 591 startDragging_: function(target, eventLocation) { |
| 593 var oldFocusedIndex = this.focusedIndex_; | 592 var oldFocusedIndex = this.focusedIndex_; |
| 594 var willUpdateDisplayDescription = false; | 593 var willUpdateDisplayDescription = false; |
| 595 this.focusedIndex_ = null; | 594 this.focusedIndex_ = -1; |
| 596 for (var i = 0; i < this.displays_.length; i++) { | 595 for (var i = 0; i < this.displays_.length; i++) { |
| 597 var display = this.displays_[i]; | 596 var display = this.displays_[i]; |
| 598 if (display.div == target || | 597 if (display.div == target || |
| 599 (target.offsetParent && target.offsetParent == display.div)) { | 598 (target.offsetParent && target.offsetParent == display.div)) { |
| 600 this.focusedIndex_ = i; | 599 this.focusedIndex_ = i; |
| 601 if (oldFocusedIndex !== null && oldFocusedIndex != i) | 600 if (oldFocusedIndex !== null && oldFocusedIndex != i) |
| 602 willUpdateDisplayDescription = true; | 601 willUpdateDisplayDescription = true; |
| 603 break; | 602 break; |
| 604 } | 603 } |
| 605 } | 604 } |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 630 /** | 629 /** |
| 631 * finish the current dragging of displays. | 630 * finish the current dragging of displays. |
| 632 * @param {Event} e The event which triggers this. | 631 * @param {Event} e The event which triggers this. |
| 633 * @private | 632 * @private |
| 634 */ | 633 */ |
| 635 endDragging_: function(e) { | 634 endDragging_: function(e) { |
| 636 this.lastTouchLocation_ = null; | 635 this.lastTouchLocation_ = null; |
| 637 if (this.dragging_) { | 636 if (this.dragging_) { |
| 638 // Make sure the dragging location is connected. | 637 // Make sure the dragging location is connected. |
| 639 var baseDiv = this.dragging_.display.isPrimary ? | 638 var baseDiv = this.dragging_.display.isPrimary ? |
| 640 this.secondaryDisplay_.div : this.primaryDisplay_.div; | 639 this.secondaryDisplay_.div : |
| 640 this.primaryDisplay_.div; | |
| 641 var draggingDiv = this.dragging_.display.div; | 641 var draggingDiv = this.dragging_.display.div; |
| 642 if (this.layout_ == options.SecondaryDisplayLayout.LEFT || | 642 if (this.layout_ == options.DisplayLayoutType.LEFT || |
| 643 this.layout_ == options.SecondaryDisplayLayout.RIGHT) { | 643 this.layout_ == options.DisplayLayoutType.RIGHT) { |
| 644 var top = Math.max(draggingDiv.offsetTop, | 644 var top = Math.max( |
| 645 baseDiv.offsetTop - draggingDiv.offsetHeight + | 645 draggingDiv.offsetTop, baseDiv.offsetTop - |
| 646 MIN_OFFSET_OVERLAP); | 646 draggingDiv.offsetHeight + MIN_OFFSET_OVERLAP); |
| 647 top = Math.min(top, | 647 top = Math.min( |
| 648 baseDiv.offsetTop + baseDiv.offsetHeight - | 648 top, |
| 649 MIN_OFFSET_OVERLAP); | 649 baseDiv.offsetTop + baseDiv.offsetHeight - MIN_OFFSET_OVERLAP); |
| 650 draggingDiv.style.top = top + 'px'; | 650 draggingDiv.style.top = top + 'px'; |
| 651 } else { | 651 } else { |
| 652 var left = Math.max(draggingDiv.offsetLeft, | 652 var left = Math.max( |
| 653 baseDiv.offsetLeft - draggingDiv.offsetWidth + | 653 draggingDiv.offsetLeft, baseDiv.offsetLeft - |
| 654 MIN_OFFSET_OVERLAP); | 654 draggingDiv.offsetWidth + MIN_OFFSET_OVERLAP); |
| 655 left = Math.min(left, | 655 left = Math.min( |
| 656 baseDiv.offsetLeft + baseDiv.offsetWidth - | 656 left, |
| 657 MIN_OFFSET_OVERLAP); | 657 baseDiv.offsetLeft + baseDiv.offsetWidth - MIN_OFFSET_OVERLAP); |
| 658 draggingDiv.style.left = left + 'px'; | 658 draggingDiv.style.left = left + 'px'; |
| 659 } | 659 } |
| 660 var originalPosition = this.dragging_.display.originalPosition; | 660 var originalPosition = this.dragging_.display.originalPosition; |
| 661 if (originalPosition.x != draggingDiv.offsetLeft || | 661 if (originalPosition.x != draggingDiv.offsetLeft || |
| 662 originalPosition.y != draggingDiv.offsetTop) | 662 originalPosition.y != draggingDiv.offsetTop) |
| 663 this.applyResult_(); | 663 this.applyResult_(); |
| 664 this.dragging_ = null; | 664 this.dragging_ = null; |
| 665 } | 665 } |
| 666 return false; | 666 return false; |
| 667 }, | 667 }, |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 704 $('display-options-orientation-selection').disabled = true; | 704 $('display-options-orientation-selection').disabled = true; |
| 705 $('selected-display-name').textContent = ''; | 705 $('selected-display-name').textContent = ''; |
| 706 var resolution = $('display-options-resolution-selection'); | 706 var resolution = $('display-options-resolution-selection'); |
| 707 resolution.appendChild(document.createElement('option')); | 707 resolution.appendChild(document.createElement('option')); |
| 708 resolution.disabled = true; | 708 resolution.disabled = true; |
| 709 }, | 709 }, |
| 710 | 710 |
| 711 /** | 711 /** |
| 712 * Updates the description of selected display section for the selected | 712 * Updates the description of selected display section for the selected |
| 713 * display. | 713 * display. |
| 714 * @param {Object} display The selected display object. | 714 * @param {options.DisplayInfo} display The selected display object. |
| 715 * @private | 715 * @private |
| 716 */ | 716 */ |
| 717 updateSelectedDisplaySectionForDisplay_: function(display) { | 717 updateSelectedDisplaySectionForDisplay_: function(display) { |
| 718 var arrow = $('display-configuration-arrow'); | 718 var arrow = $('display-configuration-arrow'); |
| 719 arrow.hidden = false; | 719 arrow.hidden = false; |
| 720 // Adding 1 px to the position to fit the border line and the border in | 720 // Adding 1 px to the position to fit the border line and the border in |
| 721 // arrow precisely. | 721 // arrow precisely. |
| 722 arrow.style.top = $('display-configurations').offsetTop - | 722 arrow.style.top = $('display-configurations').offsetTop - |
| 723 arrow.offsetHeight / 2 + 'px'; | 723 arrow.offsetHeight / 2 + 'px'; |
| 724 arrow.style.left = display.div.offsetLeft + | 724 arrow.style.left = display.div.offsetLeft + |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 797 updateSelectedDisplayDescription_: function() { | 797 updateSelectedDisplayDescription_: function() { |
| 798 var resolution = $('display-options-resolution-selection'); | 798 var resolution = $('display-options-resolution-selection'); |
| 799 resolution.textContent = ''; | 799 resolution.textContent = ''; |
| 800 var orientation = $('display-options-orientation-selection'); | 800 var orientation = $('display-options-orientation-selection'); |
| 801 var orientationOptions = orientation.getElementsByTagName('option'); | 801 var orientationOptions = orientation.getElementsByTagName('option'); |
| 802 for (var i = 0; i < orientationOptions.length; i++) | 802 for (var i = 0; i < orientationOptions.length; i++) |
| 803 orientationOptions[i].selected = false; | 803 orientationOptions[i].selected = false; |
| 804 | 804 |
| 805 if (this.mirroring_) { | 805 if (this.mirroring_) { |
| 806 this.updateSelectedDisplaySectionMirroring_(); | 806 this.updateSelectedDisplaySectionMirroring_(); |
| 807 } else if (this.focusedIndex_ == null || | 807 } else if (this.focusedIndex_ == -1 || |
| 808 this.displays_[this.focusedIndex_] == null) { | 808 this.displays_[this.focusedIndex_] == null) { |
| 809 this.updateSelectedDisplaySectionNoSelected_(); | 809 this.updateSelectedDisplaySectionNoSelected_(); |
| 810 } else { | 810 } else { |
| 811 this.updateSelectedDisplaySectionForDisplay_( | 811 this.updateSelectedDisplaySectionForDisplay_( |
| 812 this.displays_[this.focusedIndex_]); | 812 this.displays_[this.focusedIndex_]); |
| 813 } | 813 } |
| 814 }, | 814 }, |
| 815 | 815 |
| 816 /** | 816 /** |
| 817 * Clears the drawing area for display rectangles. | 817 * Clears the drawing area for display rectangles. |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 974 }; | 974 }; |
| 975 | 975 |
| 976 if (this.secondaryDisplay_) { | 976 if (this.secondaryDisplay_) { |
| 977 var secondaryDiv = this.createDisplayRectangle_( | 977 var secondaryDiv = this.createDisplayRectangle_( |
| 978 this.secondaryDisplay_, this.secondaryDisplay_ == focusedDisplay); | 978 this.secondaryDisplay_, this.secondaryDisplay_ == focusedDisplay); |
| 979 // Don't trust the secondary display's x or y, because it may cause a | 979 // Don't trust the secondary display's x or y, because it may cause a |
| 980 // 1px gap due to rounding, which will create a fake update on end | 980 // 1px gap due to rounding, which will create a fake update on end |
| 981 // dragging. See crbug.com/386401 | 981 // dragging. See crbug.com/386401 |
| 982 var bounds = this.secondaryDisplay_.bounds; | 982 var bounds = this.secondaryDisplay_.bounds; |
| 983 switch (this.layout_) { | 983 switch (this.layout_) { |
| 984 case options.SecondaryDisplayLayout.TOP: | 984 case options.DisplayLayoutType.TOP: |
| 985 secondaryDiv.style.left = | 985 secondaryDiv.style.left = |
| 986 Math.floor(bounds.left * this.visualScale_) + offset.x + 'px'; | 986 Math.floor(bounds.left * this.visualScale_) + offset.x + 'px'; |
| 987 secondaryDiv.style.top = | 987 secondaryDiv.style.top = |
| 988 primaryDiv.offsetTop - secondaryDiv.offsetHeight + 'px'; | 988 primaryDiv.offsetTop - secondaryDiv.offsetHeight + 'px'; |
| 989 break; | 989 break; |
| 990 case options.SecondaryDisplayLayout.RIGHT: | 990 case options.DisplayLayoutType.RIGHT: |
| 991 secondaryDiv.style.left = | 991 secondaryDiv.style.left = |
| 992 primaryDiv.offsetLeft + primaryDiv.offsetWidth + 'px'; | 992 primaryDiv.offsetLeft + primaryDiv.offsetWidth + 'px'; |
| 993 secondaryDiv.style.top = | 993 secondaryDiv.style.top = |
| 994 Math.floor(bounds.top * this.visualScale_) + offset.y + 'px'; | 994 Math.floor(bounds.top * this.visualScale_) + offset.y + 'px'; |
| 995 break; | 995 break; |
| 996 case options.SecondaryDisplayLayout.BOTTOM: | 996 case options.DisplayLayoutType.BOTTOM: |
| 997 secondaryDiv.style.left = | 997 secondaryDiv.style.left = |
| 998 Math.floor(bounds.left * this.visualScale_) + offset.x + 'px'; | 998 Math.floor(bounds.left * this.visualScale_) + offset.x + 'px'; |
| 999 secondaryDiv.style.top = | 999 secondaryDiv.style.top = |
| 1000 primaryDiv.offsetTop + primaryDiv.offsetHeight + 'px'; | 1000 primaryDiv.offsetTop + primaryDiv.offsetHeight + 'px'; |
| 1001 break; | 1001 break; |
| 1002 case options.SecondaryDisplayLayout.LEFT: | 1002 case options.DisplayLayoutType.LEFT: |
| 1003 secondaryDiv.style.left = | 1003 secondaryDiv.style.left = |
| 1004 primaryDiv.offsetLeft - secondaryDiv.offsetWidth + 'px'; | 1004 primaryDiv.offsetLeft - secondaryDiv.offsetWidth + 'px'; |
| 1005 secondaryDiv.style.top = | 1005 secondaryDiv.style.top = |
| 1006 Math.floor(bounds.top * this.visualScale_) + offset.y + 'px'; | 1006 Math.floor(bounds.top * this.visualScale_) + offset.y + 'px'; |
| 1007 break; | 1007 break; |
| 1008 } | 1008 } |
| 1009 this.secondaryDisplay_.originalPosition = { | 1009 this.secondaryDisplay_.originalPosition = { |
| 1010 x: secondaryDiv.offsetLeft, | 1010 x: secondaryDiv.offsetLeft, |
| 1011 y: secondaryDiv.offsetTop | 1011 y: secondaryDiv.offsetTop |
| 1012 }; | 1012 }; |
| 1013 } | 1013 } |
| 1014 }, | 1014 }, |
| 1015 | 1015 |
| 1016 /** | 1016 /** |
| 1017 * Called when the display arrangement has changed. | 1017 * Called when the display arrangement has changed. |
| 1018 * @param {options.MultiDisplayMode} mode multi display mode. | 1018 * @param {options.MultiDisplayMode} mode multi display mode. |
| 1019 * @param {Array<options.DisplayInfo>} displays The list of the display | 1019 * @param {Array<options.DisplayInfo>} displays The list of the display |
| 1020 * information. | 1020 * information. |
| 1021 * @param {options.SecondaryDisplayLayout} layout The layout strategy. | 1021 * @param {options.DisplayLayoutType} layout The layout strategy. |
| 1022 * @param {number} offset The offset of the secondary display. | 1022 * @param {number} offset The offset of the secondary display. |
| 1023 * @private | 1023 * @private |
| 1024 */ | 1024 */ |
| 1025 onDisplayChanged_: function(mode, displays, layout, offset) { | 1025 onDisplayChanged_: function(mode, displays, layout, offset) { |
| 1026 if (!this.visible) | 1026 if (!this.visible) |
| 1027 return; | 1027 return; |
| 1028 | 1028 |
| 1029 var hasExternal = false; | 1029 var hasExternal = false; |
| 1030 for (var i = 0; i < displays.length; i++) { | 1030 for (var i = 0; i < displays.length; i++) { |
| 1031 if (!displays[i].isInternal) { | 1031 if (!displays[i].isInternal) { |
| 1032 hasExternal = true; | 1032 hasExternal = true; |
| 1033 break; | 1033 break; |
| 1034 } | 1034 } |
| 1035 } | 1035 } |
| 1036 | 1036 |
| 1037 this.layout_ = layout; | 1037 this.layout_ = layout; |
| 1038 | 1038 |
| 1039 var mirroring = mode == options.MultiDisplayMode.MIRRORING; | 1039 var mirroring = mode == options.MultiDisplayMode.MIRRORING; |
| 1040 var unifiedDesktopEnabled = mode == options.MultiDisplayMode.UNIFIED; | 1040 var unifiedDesktopEnabled = mode == options.MultiDisplayMode.UNIFIED; |
| 1041 | 1041 |
| 1042 // Focus to the first display next to the primary one when |displays| list | 1042 // Focus to the first display next to the primary one when |displays| list |
| 1043 // is updated. | 1043 // is updated. |
| 1044 if (mirroring) { | 1044 if (mirroring) { |
| 1045 this.focusedIndex_ = null; | 1045 this.focusedIndex_ = -1; |
| 1046 } else if (this.mirroring_ != mirroring || | 1046 } else if (this.mirroring_ != mirroring || |
| 1047 this.unifiedDesktopEnabled_ != unifiedDesktopEnabled || | 1047 this.unifiedDesktopEnabled_ != unifiedDesktopEnabled || |
| 1048 this.displays_.length != displays.length) { | 1048 this.displays_.length != displays.length) { |
| 1049 this.focusedIndex_ = 0; | 1049 this.focusedIndex_ = 0; |
| 1050 } | 1050 } |
| 1051 | 1051 |
| 1052 this.mirroring_ = mirroring; | 1052 this.mirroring_ = mirroring; |
| 1053 this.unifiedDesktopEnabled_ = unifiedDesktopEnabled; | 1053 this.unifiedDesktopEnabled_ = unifiedDesktopEnabled; |
| 1054 this.displays_ = displays; | 1054 this.displays_ = displays; |
| 1055 | 1055 |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 1084 mode, displays, layout, offset) { | 1084 mode, displays, layout, offset) { |
| 1085 DisplayOptions.getInstance().onDisplayChanged_( | 1085 DisplayOptions.getInstance().onDisplayChanged_( |
| 1086 mode, displays, layout, offset); | 1086 mode, displays, layout, offset); |
| 1087 }; | 1087 }; |
| 1088 | 1088 |
| 1089 // Export | 1089 // Export |
| 1090 return { | 1090 return { |
| 1091 DisplayOptions: DisplayOptions | 1091 DisplayOptions: DisplayOptions |
| 1092 }; | 1092 }; |
| 1093 }); | 1093 }); |
| OLD | NEW |