diff options
Diffstat (limited to 'application/palemoon/components/shell/content/setDesktopBackground.js')
-rw-r--r-- | application/palemoon/components/shell/content/setDesktopBackground.js | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/application/palemoon/components/shell/content/setDesktopBackground.js b/application/palemoon/components/shell/content/setDesktopBackground.js new file mode 100644 index 000000000..e90a32d03 --- /dev/null +++ b/application/palemoon/components/shell/content/setDesktopBackground.js @@ -0,0 +1,213 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +var Ci = Components.interfaces; + +var gSetBackground = { +#ifndef XP_MACOSX + _position : "", + _backgroundColor : 0, +#else + _position : "STRETCH", +#endif + _screenWidth : 0, + _screenHeight : 0, + _image : null, + _canvas : null, + + get _shell() + { + return Components.classes["@mozilla.org/browser/shell-service;1"] + .getService(Ci.nsIShellService); + }, + + load: function () + { + this._canvas = document.getElementById("screen"); + this._screenWidth = screen.width; + this._screenHeight = screen.height; +#ifdef XP_MACOSX + document.documentElement.getButton("accept").hidden = true; +#endif + if (this._screenWidth / this._screenHeight >= 1.6) + document.getElementById("monitor").setAttribute("aspectratio", "16:10"); + +#ifdef XP_WIN + // hide fill + fit options if <win7 since don't work + var version = Components.classes["@mozilla.org/system-info;1"] + .getService(Ci.nsIPropertyBag2) + .getProperty("version"); + var isWindows7OrHigher = (parseFloat(version) >= 6.1); + if (!isWindows7OrHigher) { + document.getElementById("fillPosition").hidden = true; + document.getElementById("fitPosition").hidden = true; + } +#endif + + // make sure that the correct dimensions will be used + setTimeout(function(self) { + self.init(window.arguments[0]); + }, 0, this); + }, + + init: function (aImage) + { + this._image = aImage; + + // set the size of the coordinate space + this._canvas.width = this._canvas.clientWidth; + this._canvas.height = this._canvas.clientHeight; + + var ctx = this._canvas.getContext("2d"); + ctx.scale(this._canvas.clientWidth / this._screenWidth, this._canvas.clientHeight / this._screenHeight); + +#ifndef XP_MACOSX + this._initColor(); +#else + // Make sure to reset the button state in case the user has already + // set an image as their desktop background. + var setDesktopBackground = document.getElementById("setDesktopBackground"); + setDesktopBackground.hidden = false; + var bundle = document.getElementById("backgroundBundle"); + setDesktopBackground.label = bundle.getString("DesktopBackgroundSet"); + setDesktopBackground.disabled = false; + + document.getElementById("showDesktopPreferences").hidden = true; +#endif + this.updatePosition(); + }, + +#ifndef XP_MACOSX + _initColor: function () + { + var color = this._shell.desktopBackgroundColor; + + const rMask = 4294901760; + const gMask = 65280; + const bMask = 255; + var r = (color & rMask) >> 16; + var g = (color & gMask) >> 8; + var b = (color & bMask); + this.updateColor(this._rgbToHex(r, g, b)); + + var colorpicker = document.getElementById("desktopColor"); + colorpicker.color = this._backgroundColor; + }, + + updateColor: function (aColor) + { + this._backgroundColor = aColor; + this._canvas.style.backgroundColor = aColor; + }, + + // Converts a color string in the format "#RRGGBB" to an integer. + _hexStringToLong: function (aString) + { + return parseInt(aString.substring(1,3), 16) << 16 | + parseInt(aString.substring(3,5), 16) << 8 | + parseInt(aString.substring(5,7), 16); + }, + + _rgbToHex: function (aR, aG, aB) + { + return "#" + [aR, aG, aB].map(function(aInt) aInt.toString(16).replace(/^(.)$/, "0$1")) + .join("").toUpperCase(); + }, +#else + observe: function (aSubject, aTopic, aData) + { + if (aTopic == "shell:desktop-background-changed") { + document.getElementById("setDesktopBackground").hidden = true; + document.getElementById("showDesktopPreferences").hidden = false; + + Components.classes["@mozilla.org/observer-service;1"] + .getService(Ci.nsIObserverService) + .removeObserver(this, "shell:desktop-background-changed"); + } + }, + + showDesktopPrefs: function() + { + this._shell.openApplication(Ci.nsIMacShellService.APPLICATION_DESKTOP); + }, +#endif + + setDesktopBackground: function () + { +#ifndef XP_MACOSX + document.persist("menuPosition", "value"); + this._shell.desktopBackgroundColor = this._hexStringToLong(this._backgroundColor); +#else + Components.classes["@mozilla.org/observer-service;1"] + .getService(Ci.nsIObserverService) + .addObserver(this, "shell:desktop-background-changed", false); + + var bundle = document.getElementById("backgroundBundle"); + var setDesktopBackground = document.getElementById("setDesktopBackground"); + setDesktopBackground.disabled = true; + setDesktopBackground.label = bundle.getString("DesktopBackgroundDownloading"); +#endif + this._shell.setDesktopBackground(this._image, + Ci.nsIShellService["BACKGROUND_" + this._position]); + }, + + updatePosition: function () + { + var ctx = this._canvas.getContext("2d"); + ctx.clearRect(0, 0, this._screenWidth, this._screenHeight); + +#ifndef XP_MACOSX + this._position = document.getElementById("menuPosition").value; +#endif + + switch (this._position) { + case "TILE": + ctx.save(); + ctx.fillStyle = ctx.createPattern(this._image, "repeat"); + ctx.fillRect(0, 0, this._screenWidth, this._screenHeight); + ctx.restore(); + break; + case "STRETCH": + ctx.drawImage(this._image, 0, 0, this._screenWidth, this._screenHeight); + break; + case "CENTER": + var x = (this._screenWidth - this._image.naturalWidth) / 2; + var y = (this._screenHeight - this._image.naturalHeight) / 2; + ctx.drawImage(this._image, x, y); + break; + case "FILL": + //Try maxing width first, overflow height + var widthRatio = this._screenWidth / this._image.naturalWidth; + var width = this._image.naturalWidth * widthRatio; + var height = this._image.naturalHeight * widthRatio; + if (height < this._screenHeight) { + //height less than screen, max height and overflow width + var heightRatio = this._screenHeight / this._image.naturalHeight; + width = this._image.naturalWidth * heightRatio; + height = this._image.naturalHeight * heightRatio; + } + var x = (this._screenWidth - width) / 2; + var y = (this._screenHeight - height) / 2; + ctx.drawImage(this._image, x, y, width, height); + break; + case "FIT": + //Try maxing width first, top and bottom borders + var widthRatio = this._screenWidth / this._image.naturalWidth; + var width = this._image.naturalWidth * widthRatio; + var height = this._image.naturalHeight * widthRatio; + var x = 0; + var y = (this._screenHeight - height) / 2; + if (height > this._screenHeight) { + //height overflow, maximise height, side borders + var heightRatio = this._screenHeight / this._image.naturalHeight; + width = this._image.naturalWidth * heightRatio; + height = this._image.naturalHeight * heightRatio; + x = (this._screenWidth - width) / 2; + y = 0; + } + ctx.drawImage(this._image, x, y, width, height); + break; + } + } +}; |