| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 /** | 5 /** |
| 6 * @fileoverview | 6 * @fileoverview |
| 7 * 'settings-display' is the settings subpage for display settings. | 7 * 'settings-display' is the settings subpage for display settings. |
| 8 */ | 8 */ |
| 9 | 9 |
| 10 cr.define('settings.display', function() { | 10 cr.define('settings.display', function() { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 | 46 |
| 47 /** @type {!chrome.system.display.DisplayUnitInfo|undefined} */ | 47 /** @type {!chrome.system.display.DisplayUnitInfo|undefined} */ |
| 48 selectedDisplay: {type: Object, observer: 'selectedDisplayChanged_'}, | 48 selectedDisplay: {type: Object, observer: 'selectedDisplayChanged_'}, |
| 49 | 49 |
| 50 /** Id passed to the overscan dialog. */ | 50 /** Id passed to the overscan dialog. */ |
| 51 overscanDisplayId: { | 51 overscanDisplayId: { |
| 52 type: String, | 52 type: String, |
| 53 notify: true, | 53 notify: true, |
| 54 }, | 54 }, |
| 55 | 55 |
| 56 /** Maximum mode index value for slider. */ | 56 /** @private {!Array<number>} Mode index values for slider. */ |
| 57 maxModeIndex_: {type: Number, value: 0}, | 57 modeValues_: Array, |
| 58 | 58 |
| 59 /** Selected mode index value for slider. */ | 59 /** @private Selected mode index value for slider. */ |
| 60 selectedModeIndex_: {type: Number}, | 60 selectedModeIndex_: Number, |
| 61 }, |
| 61 | 62 |
| 62 /** Immediate selected mode index value for slider. */ | 63 /** @private {number} Selected mode index received from chrome. */ |
| 63 immediateSelectedModeIndex_: {type: Number, value: 0} | 64 currentSelectedModeIndex_: -1, |
| 64 }, | |
| 65 | 65 |
| 66 /** | 66 /** |
| 67 * Listener for chrome.system.display.onDisplayChanged events. | 67 * Listener for chrome.system.display.onDisplayChanged events. |
| 68 * @type {function(void)|undefined} | 68 * @type {function(void)|undefined} |
| 69 * @private | 69 * @private |
| 70 */ | 70 */ |
| 71 displayChangedListener_: undefined, | 71 displayChangedListener_: undefined, |
| 72 | 72 |
| 73 /** @override */ | 73 /** @override */ |
| 74 attached: function() { | 74 attached: function() { |
| 75 this.displayChangedListener_ = this.getDisplayInfo_.bind(this); | 75 this.displayChangedListener_ = this.getDisplayInfo_.bind(this); |
| 76 settings.display.systemDisplayApi.onDisplayChanged.addListener( | 76 settings.display.systemDisplayApi.onDisplayChanged.addListener( |
| 77 this.displayChangedListener_); | 77 this.displayChangedListener_); |
| 78 this.getDisplayInfo_(); | 78 this.getDisplayInfo_(); |
| 79 }, | 79 }, |
| 80 | 80 |
| 81 /** @override */ | 81 /** @override */ |
| 82 detached: function() { | 82 detached: function() { |
| 83 if (this.displayChangedListener_) { | 83 if (this.displayChangedListener_) { |
| 84 settings.display.systemDisplayApi.onDisplayChanged.removeListener( | 84 settings.display.systemDisplayApi.onDisplayChanged.removeListener( |
| 85 this.displayChangedListener_); | 85 this.displayChangedListener_); |
| 86 } | 86 } |
| 87 this.currentSelectedModeIndex_ = -1; |
| 87 }, | 88 }, |
| 88 | 89 |
| 89 /** | 90 /** |
| 90 * Shows or hides the overscan dialog. | 91 * Shows or hides the overscan dialog. |
| 91 * @param {boolean} showOverscan | 92 * @param {boolean} showOverscan |
| 92 * @private | 93 * @private |
| 93 */ | 94 */ |
| 94 showOverscanDialog_: function(showOverscan) { | 95 showOverscanDialog_: function(showOverscan) { |
| 95 if (showOverscan) { | 96 if (showOverscan) { |
| 96 this.$.displayOverscan.open(); | 97 this.$.displayOverscan.open(); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 getSelectedModeIndex_: function(selectedDisplay) { | 144 getSelectedModeIndex_: function(selectedDisplay) { |
| 144 for (var i = 0; i < selectedDisplay.modes.length; ++i) { | 145 for (var i = 0; i < selectedDisplay.modes.length; ++i) { |
| 145 if (selectedDisplay.modes[i].isSelected) | 146 if (selectedDisplay.modes[i].isSelected) |
| 146 return i; | 147 return i; |
| 147 } | 148 } |
| 148 return 0; | 149 return 0; |
| 149 }, | 150 }, |
| 150 | 151 |
| 151 /** @private */ | 152 /** @private */ |
| 152 selectedDisplayChanged_: function() { | 153 selectedDisplayChanged_: function() { |
| 153 // Set maxModeIndex first so that the slider updates correctly. | 154 // Set |modeValues_| before |selectedModeIndex_| so that the slider updates |
| 154 if (this.selectedDisplay.modes.length == 0) { | 155 // correctly. |
| 155 this.maxModeIndex_ = 0; | 156 let numModes = this.selectedDisplay.modes.length; |
| 157 if (numModes == 0) { |
| 158 this.modeValues_ = []; |
| 156 this.selectedModeIndex_ = 0; | 159 this.selectedModeIndex_ = 0; |
| 160 this.currentSelectedModeIndex_ = 0; |
| 157 return; | 161 return; |
| 158 } | 162 } |
| 159 this.maxModeIndex_ = this.selectedDisplay.modes.length - 1; | 163 this.modeValues_ = Array.from(Array(numModes).keys()); |
| 160 this.selectedModeIndex_ = this.getSelectedModeIndex_(this.selectedDisplay); | 164 this.selectedModeIndex_ = this.getSelectedModeIndex_(this.selectedDisplay); |
| 161 this.immediateSelectedModeIndex_ = this.selectedModeIndex_; | 165 this.currentSelectedModeIndex_ = this.selectedModeIndex_; |
| 162 }, | 166 }, |
| 163 | 167 |
| 164 /** | 168 /** |
| 165 * @param {!Array<!chrome.system.display.DisplayUnitInfo>} displays | 169 * @param {!Array<!chrome.system.display.DisplayUnitInfo>} displays |
| 166 * @return {boolean} | 170 * @return {boolean} |
| 167 * @private | 171 * @private |
| 168 */ | 172 */ |
| 169 showDisplayTabMenu_: function(displays) { | 173 showDisplayTabMenu_: function(displays) { |
| 170 return displays.length > 1; | 174 return displays.length > 1; |
| 171 }, | 175 }, |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 */ | 245 */ |
| 242 enableSetResolution_: function(selectedDisplay) { | 246 enableSetResolution_: function(selectedDisplay) { |
| 243 return selectedDisplay.modes.length > 1; | 247 return selectedDisplay.modes.length > 1; |
| 244 }, | 248 }, |
| 245 | 249 |
| 246 /** | 250 /** |
| 247 * @return {string} | 251 * @return {string} |
| 248 * @private | 252 * @private |
| 249 */ | 253 */ |
| 250 getResolutionText_: function() { | 254 getResolutionText_: function() { |
| 251 if (this.selectedDisplay.modes.length == 0) { | 255 if (this.selectedDisplay.modes.length == 0 || |
| 252 var widthStr = this.selectedDisplay.bounds.width.toString(); | 256 this.currentSelectedModeIndex_ == -1) { |
| 253 var heightStr = this.selectedDisplay.bounds.height.toString(); | 257 // If currentSelectedModeIndex_ == -1, selectedDisplay and |
| 258 // selectedModeIndex_ are not in sync. |
| 259 let widthStr = this.selectedDisplay.bounds.width.toString(); |
| 260 let heightStr = this.selectedDisplay.bounds.height.toString(); |
| 254 return this.i18n('displayResolutionText', widthStr, heightStr); | 261 return this.i18n('displayResolutionText', widthStr, heightStr); |
| 255 } | 262 } |
| 256 // immediateSelectedModeIndex_ is bound to paper-slider.immediate-value | 263 let mode = this.selectedDisplay.modes[this.selectedModeIndex_]; |
| 257 // which may not be valid, or may not have updated yet when this is called. | 264 let best = |
| 258 if (isNaN(this.immediateSelectedModeIndex_) || | |
| 259 this.immediateSelectedModeIndex_ >= this.selectedDisplay.modes.length) { | |
| 260 this.immediateSelectedModeIndex_ = | |
| 261 this.getSelectedModeIndex_(this.selectedDisplay); | |
| 262 } | |
| 263 var mode = this.selectedDisplay.modes[this.immediateSelectedModeIndex_]; | |
| 264 var best = | |
| 265 this.selectedDisplay.isInternal ? mode.uiScale == 1.0 : mode.isNative; | 265 this.selectedDisplay.isInternal ? mode.uiScale == 1.0 : mode.isNative; |
| 266 var widthStr = mode.width.toString(); | 266 let widthStr = mode.width.toString(); |
| 267 var heightStr = mode.height.toString(); | 267 let heightStr = mode.height.toString(); |
| 268 if (best) | 268 if (best) |
| 269 return this.i18n('displayResolutionTextBest', widthStr, heightStr); | 269 return this.i18n('displayResolutionTextBest', widthStr, heightStr); |
| 270 else if (mode.isNative) | 270 else if (mode.isNative) |
| 271 return this.i18n('displayResolutionTextNative', widthStr, heightStr); | 271 return this.i18n('displayResolutionTextNative', widthStr, heightStr); |
| 272 return this.i18n('displayResolutionText', widthStr, heightStr); | 272 return this.i18n('displayResolutionText', widthStr, heightStr); |
| 273 }, | 273 }, |
| 274 | 274 |
| 275 /** | 275 /** |
| 276 * @param {!{detail: string}} e |e.detail| is the id of the selected display. | 276 * @param {!{detail: string}} e |e.detail| is the id of the selected display. |
| 277 * @private | 277 * @private |
| 278 */ | 278 */ |
| 279 onSelectDisplay_: function(e) { | 279 onSelectDisplay_: function(e) { |
| 280 var id = e.detail; | 280 var id = e.detail; |
| 281 for (let display of this.displays) { | 281 for (let display of this.displays) { |
| 282 if (id != display.id) | 282 if (id != display.id) |
| 283 continue; | 283 continue; |
| 284 this.currentSelectedModeIndex_ = -1; |
| 284 this.selectedDisplay = display; | 285 this.selectedDisplay = display; |
| 285 } | 286 } |
| 286 }, | 287 }, |
| 287 | 288 |
| 288 /** | 289 /** |
| 289 * Handles event when a display tab is selected. | 290 * Handles event when a display tab is selected. |
| 290 * @param {!{detail: !{item: !{displayId: string}}}} e | 291 * @param {!{detail: !{item: !{displayId: string}}}} e |
| 291 * @private | 292 * @private |
| 292 */ | 293 */ |
| 293 onSelectDisplayTab_: function(e) { | 294 onSelectDisplayTab_: function(e) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 310 | 311 |
| 311 /** @type {!chrome.system.display.DisplayProperties} */ var properties = { | 312 /** @type {!chrome.system.display.DisplayProperties} */ var properties = { |
| 312 isPrimary: true | 313 isPrimary: true |
| 313 }; | 314 }; |
| 314 settings.display.systemDisplayApi.setDisplayProperties( | 315 settings.display.systemDisplayApi.setDisplayProperties( |
| 315 this.selectedDisplay.id, properties, | 316 this.selectedDisplay.id, properties, |
| 316 this.setPropertiesCallback_.bind(this)); | 317 this.setPropertiesCallback_.bind(this)); |
| 317 }, | 318 }, |
| 318 | 319 |
| 319 /** | 320 /** |
| 320 * @param {!{target: !PaperSliderElement}} e | 321 * Triggered when the 'change' event for the selected mode slider is |
| 322 * triggered. This only occurs when the value is comitted (i.e. not while |
| 323 * the slider is being dragged). |
| 321 * @private | 324 * @private |
| 322 */ | 325 */ |
| 323 onChangeMode_: function(e) { | 326 onSelectedModeChange_: function() { |
| 324 var curIndex = this.selectedModeIndex_; | 327 if (this.currentSelectedModeIndex_ == -1 || |
| 325 var newIndex = parseInt(e.target.value, 10); | 328 this.currentSelectedModeIndex_ == this.selectedModeIndex_) { |
| 326 if (newIndex == curIndex) | 329 // Don't change the selected display mode until we have received an update |
| 330 // from Chrome and the mode differs from the current mode. |
| 327 return; | 331 return; |
| 328 assert(newIndex >= 0); | 332 } |
| 329 assert(newIndex < this.selectedDisplay.modes.length); | |
| 330 /** @type {!chrome.system.display.DisplayProperties} */ var properties = { | 333 /** @type {!chrome.system.display.DisplayProperties} */ var properties = { |
| 331 displayMode: this.selectedDisplay.modes[newIndex] | 334 displayMode: this.selectedDisplay.modes[this.selectedModeIndex_] |
| 332 }; | 335 }; |
| 333 settings.display.systemDisplayApi.setDisplayProperties( | 336 settings.display.systemDisplayApi.setDisplayProperties( |
| 334 this.selectedDisplay.id, properties, | 337 this.selectedDisplay.id, properties, |
| 335 this.setPropertiesCallback_.bind(this)); | 338 this.setPropertiesCallback_.bind(this)); |
| 336 }, | 339 }, |
| 337 | 340 |
| 338 /** | 341 /** |
| 339 * @param {!Event} event | 342 * @param {!Event} event |
| 340 * @private | 343 * @private |
| 341 */ | 344 */ |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 displayIds += display.id; | 394 displayIds += display.id; |
| 392 if (display.isPrimary && !primaryDisplay) | 395 if (display.isPrimary && !primaryDisplay) |
| 393 primaryDisplay = display; | 396 primaryDisplay = display; |
| 394 if (this.selectedDisplay && display.id == this.selectedDisplay.id) | 397 if (this.selectedDisplay && display.id == this.selectedDisplay.id) |
| 395 selectedDisplay = display; | 398 selectedDisplay = display; |
| 396 } | 399 } |
| 397 this.displayIds = displayIds; | 400 this.displayIds = displayIds; |
| 398 this.primaryDisplayId = (primaryDisplay && primaryDisplay.id) || ''; | 401 this.primaryDisplayId = (primaryDisplay && primaryDisplay.id) || ''; |
| 399 this.selectedDisplay = selectedDisplay || primaryDisplay || | 402 this.selectedDisplay = selectedDisplay || primaryDisplay || |
| 400 (this.displays && this.displays[0]); | 403 (this.displays && this.displays[0]); |
| 404 // Save the selected mode index received from Chrome so that we do not |
| 405 // send an unnecessary setDisplayProperties call (which would log an error). |
| 406 this.currentSelectedModeIndex_ = |
| 407 this.getSelectedModeIndex_(this.selectedDisplay); |
| 408 |
| 401 this.$.displayLayout.updateDisplays(this.displays, this.layouts); | 409 this.$.displayLayout.updateDisplays(this.displays, this.layouts); |
| 402 }, | 410 }, |
| 403 | 411 |
| 404 /** @private */ | 412 /** @private */ |
| 405 setPropertiesCallback_: function() { | 413 setPropertiesCallback_: function() { |
| 406 if (chrome.runtime.lastError) { | 414 if (chrome.runtime.lastError) { |
| 407 console.error( | 415 console.error( |
| 408 'setDisplayProperties Error: ' + chrome.runtime.lastError.message); | 416 'setDisplayProperties Error: ' + chrome.runtime.lastError.message); |
| 409 } | 417 } |
| 410 }, | 418 }, |
| 411 }); | 419 }); |
| OLD | NEW |