Compare commits
	
		
			10 Commits
		
	
	
		
			3.13.90
			...
			wip/backgr
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					ef200512cd | ||
| 
						 | 
					3526bc0f0a | ||
| 
						 | 
					079809af1d | ||
| 
						 | 
					26719b02e4 | ||
| 
						 | 
					3a45ddcaad | ||
| 
						 | 
					f839100bc2 | ||
| 
						 | 
					c93767768c | ||
| 
						 | 
					0011755b41 | ||
| 
						 | 
					ec932b2306 | ||
| 
						 | 
					1c0c38574d | 
@@ -1,5 +1,103 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
// READ THIS FIRST
 | 
			
		||||
// Background handling is a maze of objects, both objects in this file, and
 | 
			
		||||
// also objects inside Mutter. They all have a role.
 | 
			
		||||
//
 | 
			
		||||
// BackgroundManager
 | 
			
		||||
//   The only object that other parts of GNOME Shell deal with; a
 | 
			
		||||
//   BackgroundManager creates background actors and adds them to
 | 
			
		||||
//   the specified container. When the background is changed by the
 | 
			
		||||
//   user it will fade out the old actor and fade in the new actor.
 | 
			
		||||
//   (This is separate from the fading for an animated background,
 | 
			
		||||
//   since using two actors is quite inefficient.)
 | 
			
		||||
//
 | 
			
		||||
// MetaBackgroundImage
 | 
			
		||||
//   An object represented an image file that will be used for drawing
 | 
			
		||||
//   the background. MetaBackgroundImage objects asynchronously load,
 | 
			
		||||
//   so they are first created in an unloaded state, then later emit
 | 
			
		||||
//   a ::loaded signal when the Cogl object becomes available.
 | 
			
		||||
//
 | 
			
		||||
// MetaBackgroundImageCache
 | 
			
		||||
//   A cache from filename to MetaBackgroundImage.
 | 
			
		||||
//
 | 
			
		||||
// BackgroundSource
 | 
			
		||||
//   An object that is created for each GSettings schema (separate
 | 
			
		||||
//   settings schemas are used for the lock screen and main background),
 | 
			
		||||
//   and holds a reference to shared Background objects.
 | 
			
		||||
//
 | 
			
		||||
// MetaBackground
 | 
			
		||||
//   Holds the specification of a background - a background color
 | 
			
		||||
//   or gradient and one or two images blended together.
 | 
			
		||||
//
 | 
			
		||||
// Background
 | 
			
		||||
//   JS delegate object that Connects a MetaBackground to the GSettings
 | 
			
		||||
//   schema for the background.
 | 
			
		||||
//
 | 
			
		||||
// Animation
 | 
			
		||||
//   A helper object that handles loading a XML-based animation; it is a
 | 
			
		||||
//   wrapper for GnomeDesktop.BGSlideShow
 | 
			
		||||
//
 | 
			
		||||
// MetaBackgroundActor
 | 
			
		||||
//   An actor that draws the background for a single monitor
 | 
			
		||||
//
 | 
			
		||||
// BackgroundActor
 | 
			
		||||
//   JS delegate object for MetaBackgroundActor.
 | 
			
		||||
//
 | 
			
		||||
// BackgroundCache
 | 
			
		||||
//   A cache of Settings schema => BackgroundSource and of a single Animation.
 | 
			
		||||
//   Also used to share file monitors.
 | 
			
		||||
//
 | 
			
		||||
// A static image, background color or gradient is relatively straightforward. The
 | 
			
		||||
// calling code creates a separate BackgroundManager for each monitor. Since they
 | 
			
		||||
// are created for the same GSettings schema, they will use the same BackgroundSource
 | 
			
		||||
// object, which provides a single Background and correspondingly a single
 | 
			
		||||
// MetaBackground object.
 | 
			
		||||
//
 | 
			
		||||
// BackgroundManager---   ----- BackgroundManager
 | 
			
		||||
//  BackgroundActor    \./       BackgroundActor
 | 
			
		||||
//    |   |     \       |        /    |   |
 | 
			
		||||
//    |   |      BackgroundSource     |   |        looked up in BackgroundCache
 | 
			
		||||
//    |    \            |             /   |
 | 
			
		||||
//    |     `-------Background-------`    |
 | 
			
		||||
//  MetaBackgroundActor |    MetaBackgroundActor
 | 
			
		||||
//     \                |                /
 | 
			
		||||
//      `--------- MetaBackground-------`
 | 
			
		||||
//                      |
 | 
			
		||||
//             MetaBackgroundImage            looked up in MetaBackgroundImageCache
 | 
			
		||||
//
 | 
			
		||||
// The animated case is tricker because the animation XML file can specify different
 | 
			
		||||
// files for different monitor resolutions and aspect ratios. For this reason,
 | 
			
		||||
// the BackgroundSource provides different Background share a single Animation object,
 | 
			
		||||
// which tracks the animation, but use different MetaBackground objects. In the
 | 
			
		||||
// common case, the different MetaBackground objects will be created for the
 | 
			
		||||
// same filename and look up the *same* MetaBackgroundImage object, so there is
 | 
			
		||||
// little wasted memory:
 | 
			
		||||
//
 | 
			
		||||
// BackgroundManager---   ----- BackgroundManager
 | 
			
		||||
//  BackgroundActor    \./       BackgroundActor
 | 
			
		||||
//    |   |     \       |        /     |  |
 | 
			
		||||
//    |   |        BackgroundSource    |  |        looked up in BackgroundCache
 | 
			
		||||
//    |    \      /           \       /   |
 | 
			
		||||
//    |  Background           Background  |
 | 
			
		||||
//    |      |    \           /  |        |
 | 
			
		||||
//    |      |      Animation    |        |        looked up in BackgroundCache
 | 
			
		||||
//  MetaBackg|oundActor     MetaB|ckgroundActor
 | 
			
		||||
//       |   |                   |   |
 | 
			
		||||
//       |   |                   |   |
 | 
			
		||||
//  MetaBackground          MetaBackground
 | 
			
		||||
//           \                  /
 | 
			
		||||
//            MetaBackgroundImage         looked up in MetaBackgroundImageCache
 | 
			
		||||
//            MetaBackgroundImage
 | 
			
		||||
//
 | 
			
		||||
// But the case of different filenames and different background images
 | 
			
		||||
// is possible as well:
 | 
			
		||||
//                   ....
 | 
			
		||||
//  MetaBackground          MetaBackground
 | 
			
		||||
//       |                       |
 | 
			
		||||
// MetaBackgroundImage     MetaBackgroundImage
 | 
			
		||||
// MetaBackgroundImage     MetaBackgroundImage
 | 
			
		||||
 | 
			
		||||
const Clutter = imports.gi.Clutter;
 | 
			
		||||
const GDesktopEnums = imports.gi.GDesktopEnums;
 | 
			
		||||
const Gio = imports.gi.Gio;
 | 
			
		||||
@@ -36,235 +134,25 @@ const BackgroundCache = new Lang.Class({
 | 
			
		||||
    Name: 'BackgroundCache',
 | 
			
		||||
 | 
			
		||||
    _init: function() {
 | 
			
		||||
       this._patterns = [];
 | 
			
		||||
       this._images = [];
 | 
			
		||||
       this._pendingFileLoads = [];
 | 
			
		||||
       this._fileMonitors = {};
 | 
			
		||||
        this._pendingFileLoads = [];
 | 
			
		||||
        this._fileMonitors = {};
 | 
			
		||||
        this._backgroundSources = {};
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getPatternContent: function(params) {
 | 
			
		||||
        params = Params.parse(params, { monitorIndex: 0,
 | 
			
		||||
                                        color: null,
 | 
			
		||||
                                        secondColor: null,
 | 
			
		||||
                                        shadingType: null,
 | 
			
		||||
                                        effects: Meta.BackgroundEffects.NONE });
 | 
			
		||||
 | 
			
		||||
        let content = null;
 | 
			
		||||
 | 
			
		||||
        let candidateContent = null;
 | 
			
		||||
        for (let i = 0; i < this._patterns.length; i++) {
 | 
			
		||||
            if (this._patterns[i].get_shading() != params.shadingType)
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            if (!params.color.equal(this._patterns[i].get_color()))
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            if (params.shadingType != GDesktopEnums.BackgroundShading.SOLID &&
 | 
			
		||||
                !params.secondColor.equal(this._patterns[i].get_second_color()))
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            candidateContent = this._patterns[i];
 | 
			
		||||
 | 
			
		||||
            if (params.effects != this._patterns[i].effects)
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (candidateContent) {
 | 
			
		||||
            content = candidateContent.copy(params.monitorIndex, params.effects);
 | 
			
		||||
        } else {
 | 
			
		||||
            content = new Meta.Background({ meta_screen: global.screen,
 | 
			
		||||
                                            monitor: params.monitorIndex,
 | 
			
		||||
                                            effects: params.effects });
 | 
			
		||||
 | 
			
		||||
            if (params.shadingType == GDesktopEnums.BackgroundShading.SOLID) {
 | 
			
		||||
                content.load_color(params.color);
 | 
			
		||||
            } else {
 | 
			
		||||
                content.load_gradient(params.shadingType, params.color, params.secondColor);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._patterns.push(content);
 | 
			
		||||
        return content;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _monitorFile: function(filename) {
 | 
			
		||||
    monitorFile: function(filename) {
 | 
			
		||||
        if (this._fileMonitors[filename])
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let file = Gio.File.new_for_path(filename);
 | 
			
		||||
        let monitor = file.monitor(Gio.FileMonitorFlags.NONE, null);
 | 
			
		||||
 | 
			
		||||
        let signalId = monitor.connect('changed',
 | 
			
		||||
                                       Lang.bind(this, function() {
 | 
			
		||||
                                           for (let i = 0; i < this._images.length; i++) {
 | 
			
		||||
                                               if (this._images[i].get_filename() == filename)
 | 
			
		||||
                                                   this._images.splice(i, 1);
 | 
			
		||||
                                           }
 | 
			
		||||
 | 
			
		||||
                                           monitor.disconnect(signalId);
 | 
			
		||||
 | 
			
		||||
                                           this.emit('file-changed', filename);
 | 
			
		||||
                                       }));
 | 
			
		||||
        monitor.connect('changed',
 | 
			
		||||
                        Lang.bind(this, function() {
 | 
			
		||||
                            this.emit('file-changed', filename);
 | 
			
		||||
                        }));
 | 
			
		||||
 | 
			
		||||
        this._fileMonitors[filename] = monitor;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _removeContent: function(contentList, content) {
 | 
			
		||||
        let index = contentList.indexOf(content);
 | 
			
		||||
        if (index < 0)
 | 
			
		||||
            throw new Error("Trying to remove invalid content: " + content);
 | 
			
		||||
        contentList.splice(index, 1);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    removePatternContent: function(content) {
 | 
			
		||||
        this._removeContent(this._patterns, content);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    removeImageContent: function(content) {
 | 
			
		||||
        let filename = content.get_filename();
 | 
			
		||||
 | 
			
		||||
        let hasOtherUsers = this._images.some(function(content) { return filename == content.get_filename(); });
 | 
			
		||||
        if (!hasOtherUsers)
 | 
			
		||||
            delete this._fileMonitors[filename];
 | 
			
		||||
 | 
			
		||||
        this._removeContent(this._images, content);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _attachCallerToFileLoad: function(caller, fileLoad) {
 | 
			
		||||
        fileLoad.callers.push(caller);
 | 
			
		||||
 | 
			
		||||
        if (!caller.cancellable)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        caller.cancellable.connect(Lang.bind(this, function() {
 | 
			
		||||
            let idx = fileLoad.callers.indexOf(caller);
 | 
			
		||||
            fileLoad.callers.splice(idx, 1);
 | 
			
		||||
 | 
			
		||||
            if (fileLoad.callers.length == 0) {
 | 
			
		||||
                fileLoad.cancellable.cancel();
 | 
			
		||||
 | 
			
		||||
                let idx = this._pendingFileLoads.indexOf(fileLoad);
 | 
			
		||||
                this._pendingFileLoads.splice(idx, 1);
 | 
			
		||||
            }
 | 
			
		||||
        }));
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _loadImageContent: function(params) {
 | 
			
		||||
        params = Params.parse(params, { monitorIndex: 0,
 | 
			
		||||
                                        style: null,
 | 
			
		||||
                                        filename: null,
 | 
			
		||||
                                        effects: Meta.BackgroundEffects.NONE,
 | 
			
		||||
                                        cancellable: null,
 | 
			
		||||
                                        onFinished: null });
 | 
			
		||||
 | 
			
		||||
        let caller = { monitorIndex: params.monitorIndex,
 | 
			
		||||
                       effects: params.effects,
 | 
			
		||||
                       cancellable: params.cancellable,
 | 
			
		||||
                       onFinished: params.onFinished };
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < this._pendingFileLoads.length; i++) {
 | 
			
		||||
            let fileLoad = this._pendingFileLoads[i];
 | 
			
		||||
 | 
			
		||||
            if (fileLoad.filename == params.filename &&
 | 
			
		||||
                fileLoad.style == params.style) {
 | 
			
		||||
                this._attachCallerToFileLoad(caller, fileLoad);
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let fileLoad = { filename: params.filename,
 | 
			
		||||
                         style: params.style,
 | 
			
		||||
                         cancellable: new Gio.Cancellable(),
 | 
			
		||||
                         callers: [] };
 | 
			
		||||
        this._attachCallerToFileLoad(caller, fileLoad);
 | 
			
		||||
 | 
			
		||||
        let content = new Meta.Background({ meta_screen: global.screen });
 | 
			
		||||
 | 
			
		||||
        content.load_file_async(params.filename,
 | 
			
		||||
                                params.style,
 | 
			
		||||
                                params.cancellable,
 | 
			
		||||
                                Lang.bind(this,
 | 
			
		||||
                                          function(object, result) {
 | 
			
		||||
                                              try {
 | 
			
		||||
                                                  content.load_file_finish(result);
 | 
			
		||||
 | 
			
		||||
                                                  this._monitorFile(params.filename);
 | 
			
		||||
                                              } catch(e) {
 | 
			
		||||
                                                  content = null;
 | 
			
		||||
                                              }
 | 
			
		||||
 | 
			
		||||
                                              for (let i = 0; i < fileLoad.callers.length; i++) {
 | 
			
		||||
                                                  let caller = fileLoad.callers[i];
 | 
			
		||||
                                                  if (caller.onFinished) {
 | 
			
		||||
                                                      let newContent;
 | 
			
		||||
 | 
			
		||||
                                                      if (content) {
 | 
			
		||||
                                                          newContent = content.copy(caller.monitorIndex, caller.effects);
 | 
			
		||||
                                                          this._images.push(newContent);
 | 
			
		||||
                                                      }
 | 
			
		||||
 | 
			
		||||
                                                      caller.onFinished(newContent);
 | 
			
		||||
                                                  }
 | 
			
		||||
                                              }
 | 
			
		||||
 | 
			
		||||
                                              let idx = this._pendingFileLoads.indexOf(fileLoad);
 | 
			
		||||
                                              this._pendingFileLoads.splice(idx, 1);
 | 
			
		||||
                                          }));
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getImageContent: function(params) {
 | 
			
		||||
        params = Params.parse(params, { monitorIndex: 0,
 | 
			
		||||
                                        style: null,
 | 
			
		||||
                                        filename: null,
 | 
			
		||||
                                        effects: Meta.BackgroundEffects.NONE,
 | 
			
		||||
                                        cancellable: null,
 | 
			
		||||
                                        onFinished: null });
 | 
			
		||||
 | 
			
		||||
        let content = null;
 | 
			
		||||
 | 
			
		||||
        let candidateContent = null;
 | 
			
		||||
        for (let i = 0; i < this._images.length; i++) {
 | 
			
		||||
            if (this._images[i].get_style() != params.style)
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            if (this._images[i].get_filename() != params.filename)
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            if (params.style == GDesktopEnums.BackgroundStyle.SPANNED &&
 | 
			
		||||
                this._images[i].monitor != params.monitorIndex)
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            candidateContent = this._images[i];
 | 
			
		||||
 | 
			
		||||
            if (params.effects != this._images[i].effects)
 | 
			
		||||
                continue;
 | 
			
		||||
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (candidateContent) {
 | 
			
		||||
            content = candidateContent.copy(params.monitorIndex, params.effects);
 | 
			
		||||
 | 
			
		||||
            if (params.cancellable && params.cancellable.is_cancelled())
 | 
			
		||||
                content = null;
 | 
			
		||||
            else
 | 
			
		||||
                this._images.push(content);
 | 
			
		||||
 | 
			
		||||
            if (params.onFinished)
 | 
			
		||||
                params.onFinished(content);
 | 
			
		||||
        } else {
 | 
			
		||||
            this._loadImageContent({ filename: params.filename,
 | 
			
		||||
                                     style: params.style,
 | 
			
		||||
                                     effects: params.effects,
 | 
			
		||||
                                     monitorIndex: params.monitorIndex,
 | 
			
		||||
                                     cancellable: params.cancellable,
 | 
			
		||||
                                     onFinished: params.onFinished });
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getAnimation: function(params) {
 | 
			
		||||
        params = Params.parse(params, { filename: null,
 | 
			
		||||
                                        onLoaded: null });
 | 
			
		||||
@@ -282,7 +170,6 @@ const BackgroundCache = new Lang.Class({
 | 
			
		||||
        let animation = new Animation({ filename: params.filename });
 | 
			
		||||
 | 
			
		||||
        animation.load(Lang.bind(this, function() {
 | 
			
		||||
                           this._monitorFile(params.filename);
 | 
			
		||||
                           this._animationFilename = params.filename;
 | 
			
		||||
                           this._animation = animation;
 | 
			
		||||
 | 
			
		||||
@@ -294,6 +181,31 @@ const BackgroundCache = new Lang.Class({
 | 
			
		||||
                               GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded');
 | 
			
		||||
                           }
 | 
			
		||||
                       }));
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getBackgroundSource: function(layoutManager, settingsSchema) {
 | 
			
		||||
        // The layoutManager is always the same one; we pass in it since
 | 
			
		||||
        // Main.layoutManager may not be set yet
 | 
			
		||||
 | 
			
		||||
        if (!(settingsSchema in this._backgroundSources)) {
 | 
			
		||||
            this._backgroundSources[settingsSchema] = new BackgroundSource(layoutManager, settingsSchema);
 | 
			
		||||
            this._backgroundSources[settingsSchema]._useCount = 1;
 | 
			
		||||
        } else {
 | 
			
		||||
            this._backgroundSources[settingsSchema]._useCount++;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this._backgroundSources[settingsSchema];
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    releaseBackgroundSource: function(settingsSchema) {
 | 
			
		||||
        if (settingsSchema in this._backgroundSources) {
 | 
			
		||||
            let source = this._backgroundSources[settingsSchema];
 | 
			
		||||
            source._useCount--;
 | 
			
		||||
            if (source._useCount == 0) {
 | 
			
		||||
                delete this._backgroundSources[settingsSchema];
 | 
			
		||||
                source.destroy();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
Signals.addSignalMethods(BackgroundCache.prototype);
 | 
			
		||||
@@ -310,28 +222,18 @@ const Background = new Lang.Class({
 | 
			
		||||
    _init: function(params) {
 | 
			
		||||
        params = Params.parse(params, { monitorIndex: 0,
 | 
			
		||||
                                        layoutManager: Main.layoutManager,
 | 
			
		||||
                                        effects: Meta.BackgroundEffects.NONE,
 | 
			
		||||
                                        settings: null,
 | 
			
		||||
                                        overrideImage: null });
 | 
			
		||||
        this.actor = new Meta.BackgroundGroup();
 | 
			
		||||
        this.actor._delegate = this;
 | 
			
		||||
                                        filename: null,
 | 
			
		||||
                                        style: null });
 | 
			
		||||
 | 
			
		||||
        this._destroySignalId = this.actor.connect('destroy',
 | 
			
		||||
                                                   Lang.bind(this, this._destroy));
 | 
			
		||||
        this.background = new Meta.Background({ 'meta-screen': global.screen });
 | 
			
		||||
 | 
			
		||||
        this._settings = params.settings;
 | 
			
		||||
        this._overrideImage = params.overrideImage;
 | 
			
		||||
        this._filename = params.filename;
 | 
			
		||||
        this._style = params.style;
 | 
			
		||||
        this._monitorIndex = params.monitorIndex;
 | 
			
		||||
        this._layoutManager = params.layoutManager;
 | 
			
		||||
        this._effects = params.effects;
 | 
			
		||||
        this._fileWatches = {};
 | 
			
		||||
        this._pattern = null;
 | 
			
		||||
        // contains a single image for static backgrounds and
 | 
			
		||||
        // two images (from and to) for slide shows
 | 
			
		||||
        this._images = {};
 | 
			
		||||
 | 
			
		||||
        this._brightness = 1.0;
 | 
			
		||||
        this._vignetteSharpness = 0.2;
 | 
			
		||||
        this._cancellable = new Gio.Cancellable();
 | 
			
		||||
        this.isLoaded = false;
 | 
			
		||||
 | 
			
		||||
@@ -342,7 +244,7 @@ const Background = new Lang.Class({
 | 
			
		||||
        this._load();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _destroy: function() {
 | 
			
		||||
    destroy: function() {
 | 
			
		||||
        this._cancellable.cancel();
 | 
			
		||||
 | 
			
		||||
        if (this._updateAnimationTimeoutId) {
 | 
			
		||||
@@ -357,28 +259,6 @@ const Background = new Lang.Class({
 | 
			
		||||
        }
 | 
			
		||||
        this._fileWatches = null;
 | 
			
		||||
 | 
			
		||||
        if (this._pattern) {
 | 
			
		||||
            if (this._pattern.content)
 | 
			
		||||
                this._cache.removePatternContent(this._pattern.content);
 | 
			
		||||
 | 
			
		||||
            this._pattern.destroy();
 | 
			
		||||
            this._pattern = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        keys = Object.keys(this._images);
 | 
			
		||||
        for (i = 0; i < keys.length; i++) {
 | 
			
		||||
            let actor = this._images[keys[i]];
 | 
			
		||||
 | 
			
		||||
            if (actor.content)
 | 
			
		||||
                this._cache.removeImageContent(actor.content);
 | 
			
		||||
 | 
			
		||||
            actor.destroy();
 | 
			
		||||
            this._images[keys[i]] = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.actor.disconnect(this._destroySignalId);
 | 
			
		||||
        this._destroySignalId = 0;
 | 
			
		||||
 | 
			
		||||
        if (this._settingsChangedSignalId != 0)
 | 
			
		||||
            this._settings.disconnect(this._settingsChangedSignalId);
 | 
			
		||||
        this._settingsChangedSignalId = 0;
 | 
			
		||||
@@ -407,22 +287,17 @@ const Background = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        let shadingType = this._settings.get_enum(COLOR_SHADING_TYPE_KEY);
 | 
			
		||||
 | 
			
		||||
        let content = this._cache.getPatternContent({ monitorIndex: this._monitorIndex,
 | 
			
		||||
                                                      effects: this._effects,
 | 
			
		||||
                                                      color: color,
 | 
			
		||||
                                                      secondColor: secondColor,
 | 
			
		||||
                                                      shadingType: shadingType });
 | 
			
		||||
 | 
			
		||||
        this._pattern = new Meta.BackgroundActor();
 | 
			
		||||
        this.actor.add_child(this._pattern);
 | 
			
		||||
 | 
			
		||||
        this._pattern.content = content;
 | 
			
		||||
        if (shadingType == GDesktopEnums.BackgroundShading.SOLID)
 | 
			
		||||
            this.background.set_color(color);
 | 
			
		||||
        else
 | 
			
		||||
            this.background.set_gradient(shadingType, color, secondColor);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _watchCacheFile: function(filename) {
 | 
			
		||||
    _watchFile: function(filename) {
 | 
			
		||||
        if (this._fileWatches[filename])
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._cache.monitorFile(filename);
 | 
			
		||||
        let signalId = this._cache.connect('file-changed',
 | 
			
		||||
                                           Lang.bind(this, function(cache, changedFile) {
 | 
			
		||||
                                               if (changedFile == filename) {
 | 
			
		||||
@@ -432,82 +307,46 @@ const Background = new Lang.Class({
 | 
			
		||||
        this._fileWatches[filename] = signalId;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _ensureImage: function(index) {
 | 
			
		||||
        if (this._images[index])
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let actor = new Meta.BackgroundActor();
 | 
			
		||||
 | 
			
		||||
        // The background pattern is the first actor in
 | 
			
		||||
        // the group, and all images should be above that.
 | 
			
		||||
        this.actor.insert_child_at_index(actor, index + 1);
 | 
			
		||||
        this._images[index] = actor;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _updateImage: function(index, content, filename) {
 | 
			
		||||
        content.brightness = this._brightness;
 | 
			
		||||
        content.vignette_sharpness = this._vignetteSharpness;
 | 
			
		||||
 | 
			
		||||
        let image = this._images[index];
 | 
			
		||||
        if (image.content)
 | 
			
		||||
            this._cache.removeImageContent(image.content);
 | 
			
		||||
        image.content = content;
 | 
			
		||||
        this._watchCacheFile(filename);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _updateAnimationProgress: function() {
 | 
			
		||||
        if (this._images[1])
 | 
			
		||||
            this._images[1].opacity = this._animation.transitionProgress * 255;
 | 
			
		||||
 | 
			
		||||
        this._queueUpdateAnimation();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _updateAnimation: function() {
 | 
			
		||||
        this._updateAnimationTimeoutId = 0;
 | 
			
		||||
 | 
			
		||||
        this._animation.update(this._layoutManager.monitors[this._monitorIndex]);
 | 
			
		||||
        let files = this._animation.keyFrameFiles;
 | 
			
		||||
 | 
			
		||||
        if (files.length == 0) {
 | 
			
		||||
        let finish = Lang.bind(this, function() {
 | 
			
		||||
            this._setLoaded();
 | 
			
		||||
            if (files.length > 1) {
 | 
			
		||||
                this.background.set_blend(files[0], files[1],
 | 
			
		||||
                                          this._animation.transitionProgress,
 | 
			
		||||
                                          this._style);
 | 
			
		||||
            } else if (files.length > 0) {
 | 
			
		||||
                this.background.set_filename(files[0], this._style);
 | 
			
		||||
            } else {
 | 
			
		||||
                this.background.set_filename(null, this._style);
 | 
			
		||||
            }
 | 
			
		||||
            this._queueUpdateAnimation();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        let cache = Meta.BackgroundImageCache.get_default();
 | 
			
		||||
        let numPendingImages = files.length;
 | 
			
		||||
        let images = [];
 | 
			
		||||
        for (let i = 0; i < files.length; i++) {
 | 
			
		||||
            if (this._images[i] && this._images[i].content &&
 | 
			
		||||
                this._images[i].content.get_filename() == files[i]) {
 | 
			
		||||
 | 
			
		||||
            this._watchFile(files[i]);
 | 
			
		||||
            let image = cache.load(files[i]);
 | 
			
		||||
            images.push(image);
 | 
			
		||||
            if (image.is_loaded()) {
 | 
			
		||||
                numPendingImages--;
 | 
			
		||||
                if (numPendingImages == 0)
 | 
			
		||||
                    this._updateAnimationProgress();
 | 
			
		||||
                continue;
 | 
			
		||||
                    finish();
 | 
			
		||||
            } else {
 | 
			
		||||
                let id = image.connect('loaded',
 | 
			
		||||
                                       Lang.bind(this, function() {
 | 
			
		||||
                                           image.disconnect(id);
 | 
			
		||||
                                           numPendingImages--;
 | 
			
		||||
                                           if (numPendingImages == 0)
 | 
			
		||||
                                               finish();
 | 
			
		||||
                                       }));
 | 
			
		||||
            }
 | 
			
		||||
            this._cache.getImageContent({ monitorIndex: this._monitorIndex,
 | 
			
		||||
                                          effects: this._effects,
 | 
			
		||||
                                          style: this._style,
 | 
			
		||||
                                          filename: files[i],
 | 
			
		||||
                                          cancellable: this._cancellable,
 | 
			
		||||
                                          onFinished: Lang.bind(this, function(content, i) {
 | 
			
		||||
                                              numPendingImages--;
 | 
			
		||||
 | 
			
		||||
                                              if (!content) {
 | 
			
		||||
                                                  this._setLoaded();
 | 
			
		||||
                                                  if (numPendingImages == 0)
 | 
			
		||||
                                                      this._updateAnimationProgress();
 | 
			
		||||
                                                  return;
 | 
			
		||||
                                              }
 | 
			
		||||
 | 
			
		||||
                                              this._ensureImage(i);
 | 
			
		||||
                                              this._updateImage(i, content, files[i]);
 | 
			
		||||
 | 
			
		||||
                                              if (numPendingImages == 0) {
 | 
			
		||||
                                                  this._setLoaded();
 | 
			
		||||
                                                  this._updateAnimationProgress();
 | 
			
		||||
                                              }
 | 
			
		||||
                                          }, i)
 | 
			
		||||
                                        });
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
@@ -551,25 +390,26 @@ const Background = new Lang.Class({
 | 
			
		||||
                                                 }
 | 
			
		||||
 | 
			
		||||
                                                 this._updateAnimation();
 | 
			
		||||
                                                 this._watchCacheFile(filename);
 | 
			
		||||
                                                 this._watchFile(filename);
 | 
			
		||||
                                             })
 | 
			
		||||
                                           });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _loadImage: function(filename) {
 | 
			
		||||
        this._cache.getImageContent({ monitorIndex: this._monitorIndex,
 | 
			
		||||
                                      effects: this._effects,
 | 
			
		||||
                                      style: this._style,
 | 
			
		||||
                                      filename: filename,
 | 
			
		||||
                                      cancellable: this._cancellable,
 | 
			
		||||
                                      onFinished: Lang.bind(this, function(content) {
 | 
			
		||||
                                          if (content) {
 | 
			
		||||
                                              this._ensureImage(0);
 | 
			
		||||
                                              this._updateImage(0, content, filename);
 | 
			
		||||
                                          }
 | 
			
		||||
                                          this._setLoaded();
 | 
			
		||||
                                      })
 | 
			
		||||
                                    });
 | 
			
		||||
        this.background.set_filename(filename, this._style);
 | 
			
		||||
        this._watchFile(filename);
 | 
			
		||||
 | 
			
		||||
        let cache = Meta.BackgroundImageCache.get_default();
 | 
			
		||||
        let image = cache.load(filename);
 | 
			
		||||
        if (image.is_loaded())
 | 
			
		||||
            this._setLoaded();
 | 
			
		||||
        else {
 | 
			
		||||
            let id = image.connect('loaded',
 | 
			
		||||
                                   Lang.bind(this, function() {
 | 
			
		||||
                                       this._setLoaded();
 | 
			
		||||
                                       image.disconnect(id);
 | 
			
		||||
                                   }));
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _loadFile: function(filename) {
 | 
			
		||||
@@ -584,30 +424,58 @@ const Background = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        this._loadPattern();
 | 
			
		||||
 | 
			
		||||
        let filename;
 | 
			
		||||
        if (this._overrideImage != null) {
 | 
			
		||||
            filename = this._overrideImage;
 | 
			
		||||
            this._style = GDesktopEnums.BackgroundStyle.WALLPAPER; // Hardcode
 | 
			
		||||
        } else {
 | 
			
		||||
            this._style = this._settings.get_enum(BACKGROUND_STYLE_KEY);
 | 
			
		||||
            if (this._style == GDesktopEnums.BackgroundStyle.NONE) {
 | 
			
		||||
                this._setLoaded();
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let uri = this._settings.get_string(PICTURE_URI_KEY);
 | 
			
		||||
            if (GLib.uri_parse_scheme(uri) != null)
 | 
			
		||||
                filename = Gio.File.new_for_uri(uri).get_path();
 | 
			
		||||
            else
 | 
			
		||||
                filename = uri;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!filename) {
 | 
			
		||||
        if (!this._filename) {
 | 
			
		||||
            this._setLoaded();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._loadFile(filename);
 | 
			
		||||
        this._loadFile(this._filename);
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
Signals.addSignalMethods(Background.prototype);
 | 
			
		||||
 | 
			
		||||
const BackgroundActor = new Lang.Class({
 | 
			
		||||
    Name: 'Background',
 | 
			
		||||
 | 
			
		||||
    _init: function(params) {
 | 
			
		||||
        params = Params.parse(params, { background: null,
 | 
			
		||||
                                        monitorIndex: 0,
 | 
			
		||||
                                        vignette: false });
 | 
			
		||||
 | 
			
		||||
        this.actor = new Meta.BackgroundActor({ 'meta-screen': global.screen,
 | 
			
		||||
                                                'monitor': params.monitorIndex,
 | 
			
		||||
                                                'background': params.background.background });
 | 
			
		||||
        this.actor._delegate = this;
 | 
			
		||||
 | 
			
		||||
        this._vignette = params.vignette;
 | 
			
		||||
        this._brightness = 1.0;
 | 
			
		||||
        this._vignetteSharpness = 0.2;
 | 
			
		||||
 | 
			
		||||
        if (this._vignette)
 | 
			
		||||
            this.actor.add_vignette(this._vignetteSharpness, this._brightness);
 | 
			
		||||
 | 
			
		||||
        if (params.background.isLoaded) {
 | 
			
		||||
            this._setLoaded();
 | 
			
		||||
        } else {
 | 
			
		||||
            let loadedSignalId = params.background.connect('loaded',
 | 
			
		||||
                Lang.bind(this, function() {
 | 
			
		||||
                    params.background.disconnect(loadedSignalId);
 | 
			
		||||
                    this._setLoaded();
 | 
			
		||||
                }));
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _setLoaded: function() {
 | 
			
		||||
        if (this.isLoaded)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this.isLoaded = true;
 | 
			
		||||
 | 
			
		||||
        let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
 | 
			
		||||
            this.emit('loaded');
 | 
			
		||||
            return GLib.SOURCE_REMOVE;
 | 
			
		||||
        }));
 | 
			
		||||
        GLib.Source.set_name_by_id(id, '[gnome-shell] this.emit');
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get brightness() {
 | 
			
		||||
@@ -616,15 +484,8 @@ const Background = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
    set brightness(factor) {
 | 
			
		||||
        this._brightness = factor;
 | 
			
		||||
        if (this._pattern && this._pattern.content)
 | 
			
		||||
            this._pattern.content.brightness = factor;
 | 
			
		||||
 | 
			
		||||
        let keys = Object.keys(this._images);
 | 
			
		||||
        for (let i = 0; i < keys.length; i++) {
 | 
			
		||||
            let image = this._images[keys[i]];
 | 
			
		||||
            if (image && image.content)
 | 
			
		||||
                image.content.brightness = factor;
 | 
			
		||||
        }
 | 
			
		||||
        if (this._vignette)
 | 
			
		||||
            this.actor.add_vignette(this._brightness, this._vignetteSharpness);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get vignetteSharpness() {
 | 
			
		||||
@@ -633,47 +494,115 @@ const Background = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
    set vignetteSharpness(sharpness) {
 | 
			
		||||
        this._vignetteSharpness = sharpness;
 | 
			
		||||
        if (this._pattern && this._pattern.content)
 | 
			
		||||
            this._pattern.content.vignette_sharpness = sharpness;
 | 
			
		||||
 | 
			
		||||
        let keys = Object.keys(this._images);
 | 
			
		||||
        for (let i = 0; i < keys.length; i++) {
 | 
			
		||||
            let image = this._images[keys[i]];
 | 
			
		||||
            if (image && image.content)
 | 
			
		||||
                image.content.vignette_sharpness = sharpness;
 | 
			
		||||
        }
 | 
			
		||||
        if (this._vignette)
 | 
			
		||||
            this.actor.add_vignette(this._brightness, this._vignetteSharpness);
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
Signals.addSignalMethods(Background.prototype);
 | 
			
		||||
Signals.addSignalMethods(BackgroundActor.prototype);
 | 
			
		||||
 | 
			
		||||
let _systemBackground;
 | 
			
		||||
 | 
			
		||||
const SystemBackground = new Lang.Class({
 | 
			
		||||
    Name: 'SystemBackground',
 | 
			
		||||
 | 
			
		||||
    _init: function() {
 | 
			
		||||
        this._cache = getBackgroundCache();
 | 
			
		||||
        this.actor = new Meta.BackgroundActor();
 | 
			
		||||
        let filename = global.datadir + '/theme/noise-texture.png';
 | 
			
		||||
 | 
			
		||||
        this._cache.getImageContent({ style: GDesktopEnums.BackgroundStyle.WALLPAPER,
 | 
			
		||||
                                      filename: global.datadir + '/theme/noise-texture.png',
 | 
			
		||||
                                      effects: Meta.BackgroundEffects.NONE,
 | 
			
		||||
                                      onFinished: Lang.bind(this, function(content) {
 | 
			
		||||
                                          this.actor.content = content;
 | 
			
		||||
                                          this.emit('loaded');
 | 
			
		||||
                                      })
 | 
			
		||||
                                    });
 | 
			
		||||
        if (_systemBackground == null) {
 | 
			
		||||
            _systemBackground = new Meta.Background({ 'meta-screen': global.screen });
 | 
			
		||||
            _systemBackground.set_filename(filename, GDesktopEnums.BackgroundStyle.WALLPAPER);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
 | 
			
		||||
    },
 | 
			
		||||
        this.actor = new Meta.BackgroundActor({ 'meta-screen': global.screen,
 | 
			
		||||
                                                'monitor': 0,
 | 
			
		||||
                                                'background': _systemBackground });
 | 
			
		||||
 | 
			
		||||
    _onDestroy: function() {
 | 
			
		||||
        let content = this.actor.content;
 | 
			
		||||
 | 
			
		||||
        if (content)
 | 
			
		||||
            this._cache.removeImageContent(content);
 | 
			
		||||
        let cache = Meta.BackgroundImageCache.get_default();
 | 
			
		||||
        let image = cache.load(filename);
 | 
			
		||||
        if (image.is_loaded()) {
 | 
			
		||||
            image = null;
 | 
			
		||||
            let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
 | 
			
		||||
                this.emit('loaded');
 | 
			
		||||
                return GLib.SOURCE_REMOVE;
 | 
			
		||||
            }));
 | 
			
		||||
            GLib.Source.set_name_by_id(id, '[gnome-shell] SystemBackground.loaded');
 | 
			
		||||
        } else {
 | 
			
		||||
            let id = image.connect('loaded',
 | 
			
		||||
                                   Lang.bind(this, function() {
 | 
			
		||||
                                       this.emit('loaded');
 | 
			
		||||
                                       image.disconnect(id);
 | 
			
		||||
                                       image = null;
 | 
			
		||||
                                   }));
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
Signals.addSignalMethods(SystemBackground.prototype);
 | 
			
		||||
 | 
			
		||||
const BackgroundSource = new Lang.Class({
 | 
			
		||||
    Name: 'BackgroundSource',
 | 
			
		||||
 | 
			
		||||
    _init: function(layoutManager, settingsSchema) {
 | 
			
		||||
        // Allow override the background image setting for performance testing
 | 
			
		||||
        this._layoutManager = layoutManager;
 | 
			
		||||
        this._overrideImage = GLib.getenv('SHELL_BACKGROUND_IMAGE');
 | 
			
		||||
        this._settings = new Gio.Settings({ schema_id: settingsSchema });
 | 
			
		||||
        this._backgrounds = [];
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getBackground: function(monitorIndex) {
 | 
			
		||||
        let filename = null;
 | 
			
		||||
        let style;
 | 
			
		||||
 | 
			
		||||
        if (this._overrideImage != null) {
 | 
			
		||||
            filename = this._overrideImage;
 | 
			
		||||
            style = GDesktopEnums.BackgroundStyle.ZOOM; // Hardcode
 | 
			
		||||
        } else {
 | 
			
		||||
            style = this._settings.get_enum(BACKGROUND_STYLE_KEY);
 | 
			
		||||
            if (style != GDesktopEnums.BackgroundStyle.NONE) {
 | 
			
		||||
                let uri = this._settings.get_string(PICTURE_URI_KEY);
 | 
			
		||||
                if (GLib.uri_parse_scheme(uri) != null)
 | 
			
		||||
                    filename = Gio.File.new_for_uri(uri).get_path();
 | 
			
		||||
                else
 | 
			
		||||
                    filename = uri;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Animated backgrounds are (potentially) per-monitor, since
 | 
			
		||||
        // they can have variants that depend on the aspect ratio and
 | 
			
		||||
        // size of the monitor; for other backgrounds we can use the
 | 
			
		||||
        // same background object for all monitors.
 | 
			
		||||
        if (filename == null || !filename.endsWith('.xml'))
 | 
			
		||||
            monitorIndex = 0;
 | 
			
		||||
 | 
			
		||||
        if (!(monitorIndex in this._backgrounds)) {
 | 
			
		||||
            let background = new Background({
 | 
			
		||||
                monitorIndex: monitorIndex,
 | 
			
		||||
                layoutManager: this._layoutManager,
 | 
			
		||||
                settings: this._settings,
 | 
			
		||||
                filename: filename,
 | 
			
		||||
                style: style
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            let changedId = background.connect('changed', Lang.bind(this, function() {
 | 
			
		||||
                background.disconnect(changedId);
 | 
			
		||||
                background.destroy();
 | 
			
		||||
                delete this._backgrounds[monitorIndex];
 | 
			
		||||
            }));
 | 
			
		||||
 | 
			
		||||
            this._backgrounds[monitorIndex] = background;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this._backgrounds[monitorIndex];
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    destroy: function() {
 | 
			
		||||
        for (let monitorIndex in this._backgrounds)
 | 
			
		||||
            this._backgrounds[monitorIndex].destroy();
 | 
			
		||||
 | 
			
		||||
        this._backgrounds = null;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const Animation = new Lang.Class({
 | 
			
		||||
    Name: 'Animation',
 | 
			
		||||
 | 
			
		||||
@@ -731,16 +660,17 @@ const BackgroundManager = new Lang.Class({
 | 
			
		||||
        params = Params.parse(params, { container: null,
 | 
			
		||||
                                        layoutManager: Main.layoutManager,
 | 
			
		||||
                                        monitorIndex: null,
 | 
			
		||||
                                        effects: Meta.BackgroundEffects.NONE,
 | 
			
		||||
                                        vignette: false,
 | 
			
		||||
                                        controlPosition: true,
 | 
			
		||||
                                        settingsSchema: BACKGROUND_SCHEMA });
 | 
			
		||||
 | 
			
		||||
        // Allow override the background image setting for performance testing
 | 
			
		||||
        this._overrideImage = GLib.getenv('SHELL_BACKGROUND_IMAGE');
 | 
			
		||||
        this._settings = new Gio.Settings({ schema_id: params.settingsSchema });
 | 
			
		||||
        let cache = getBackgroundCache();
 | 
			
		||||
        this._settingsSchema = params.settingsSchema;
 | 
			
		||||
        this._backgroundSource = cache.getBackgroundSource(params.layoutManager, params.settingsSchema);
 | 
			
		||||
 | 
			
		||||
        this._container = params.container;
 | 
			
		||||
        this._layoutManager = params.layoutManager;
 | 
			
		||||
        this._effects = params.effects;
 | 
			
		||||
        this._vignette = params.vignette;
 | 
			
		||||
        this._monitorIndex = params.monitorIndex;
 | 
			
		||||
        this._controlPosition = params.controlPosition;
 | 
			
		||||
 | 
			
		||||
@@ -749,6 +679,10 @@ const BackgroundManager = new Lang.Class({
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    destroy: function() {
 | 
			
		||||
        let cache = getBackgroundCache();
 | 
			
		||||
        cache.releaseBackgroundSource(this._settingsSchema);
 | 
			
		||||
        this._backgroundSource = null;
 | 
			
		||||
 | 
			
		||||
        if (this._newBackground) {
 | 
			
		||||
            this._newBackground.actor.destroy();
 | 
			
		||||
            this._newBackground = null;
 | 
			
		||||
@@ -795,36 +729,35 @@ const BackgroundManager = new Lang.Class({
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _createBackground: function() {
 | 
			
		||||
        let background = new Background({ monitorIndex: this._monitorIndex,
 | 
			
		||||
                                          layoutManager: this._layoutManager,
 | 
			
		||||
                                          effects: this._effects,
 | 
			
		||||
                                          settings: this._settings,
 | 
			
		||||
                                          overrideImage: this._overrideImage });
 | 
			
		||||
        this._container.add_child(background.actor);
 | 
			
		||||
        let background = this._backgroundSource.getBackground(this._monitorIndex);
 | 
			
		||||
        let backgroundActor = new BackgroundActor({ background: background,
 | 
			
		||||
                                                    monitorIndex: this._monitorIndex,
 | 
			
		||||
                                                    vignette: this._vignette });
 | 
			
		||||
        this._container.add_child(backgroundActor.actor);
 | 
			
		||||
 | 
			
		||||
        let monitor = this._layoutManager.monitors[this._monitorIndex];
 | 
			
		||||
 | 
			
		||||
        background.actor.set_size(monitor.width, monitor.height);
 | 
			
		||||
        backgroundActor.actor.set_size(monitor.width, monitor.height);
 | 
			
		||||
        if (this._controlPosition) {
 | 
			
		||||
            background.actor.set_position(monitor.x, monitor.y);
 | 
			
		||||
            background.actor.lower_bottom();
 | 
			
		||||
            backgroundActor.actor.set_position(monitor.x, monitor.y);
 | 
			
		||||
            backgroundActor.actor.lower_bottom();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        background.changeSignalId = background.connect('changed', Lang.bind(this, function() {
 | 
			
		||||
            background.disconnect(background.changeSignalId);
 | 
			
		||||
            background.changeSignalId = 0;
 | 
			
		||||
        let changeSignalId = background.connect('changed', Lang.bind(this, function() {
 | 
			
		||||
            background.disconnect(changeSignalId);
 | 
			
		||||
            changeSignalId = null;
 | 
			
		||||
            this._updateBackground();
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        background.actor.connect('destroy', Lang.bind(this, function() {
 | 
			
		||||
            if (background.changeSignalId)
 | 
			
		||||
                background.disconnect(background.changeSignalId);
 | 
			
		||||
        backgroundActor.actor.connect('destroy', Lang.bind(this, function() {
 | 
			
		||||
            if (changeSignalId)
 | 
			
		||||
                background.disconnect(changeSignalId);
 | 
			
		||||
 | 
			
		||||
            if (background.loadedSignalId)
 | 
			
		||||
                background.disconnect(background.loadedSignalId);
 | 
			
		||||
            if (backgroundActor.loadedSignalId)
 | 
			
		||||
                background.disconnect(loadedSignalId);
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        return background;
 | 
			
		||||
        return backgroundActor;
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
Signals.addSignalMethods(BackgroundManager.prototype);
 | 
			
		||||
 
 | 
			
		||||
@@ -185,7 +185,7 @@ const Overview = new Lang.Class({
 | 
			
		||||
        for (let i = 0; i < Main.layoutManager.monitors.length; i++) {
 | 
			
		||||
            let bgManager = new Background.BackgroundManager({ container: this._backgroundGroup,
 | 
			
		||||
                                                               monitorIndex: i,
 | 
			
		||||
                                                               effects: Meta.BackgroundEffects.VIGNETTE });
 | 
			
		||||
                                                               vignette: true });
 | 
			
		||||
            this._bgManagers.push(bgManager);
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
@@ -444,14 +444,12 @@ function clamp(value, min, max) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * To test screen shield, make sure to kill gnome-screensaver.
 | 
			
		||||
 *
 | 
			
		||||
 * If you are setting org.gnome.desktop.session.idle-delay directly in dconf,
 | 
			
		||||
 * rather than through System Settings, you also need to set
 | 
			
		||||
 * org.gnome.settings-daemon.plugins.power.sleep-display-ac and
 | 
			
		||||
 * org.gnome.settings-daemon.plugins.power.sleep-display-battery to the same value.
 | 
			
		||||
 * This will ensure that the screen blanks at the right time when it fades out.
 | 
			
		||||
 * https://bugzilla.gnome.org/show_bug.cgi?id=668703 explains the dependance.
 | 
			
		||||
 * https://bugzilla.gnome.org/show_bug.cgi?id=668703 explains the dependency.
 | 
			
		||||
 */
 | 
			
		||||
const ScreenShield = new Lang.Class({
 | 
			
		||||
    Name: 'ScreenShield',
 | 
			
		||||
 
 | 
			
		||||
@@ -489,15 +489,6 @@ const GridSearchResults = new Lang.Class({
 | 
			
		||||
        return this._grid.columnsForWidth(availableWidth) * this._grid.getRowLimit();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _renderResults: function(metas) {
 | 
			
		||||
        for (let i = 0; i < metas.length; i++) {
 | 
			
		||||
            let display = new GridSearchResult(this.provider, metas[i]);
 | 
			
		||||
            display.connect('activate', Lang.bind(this, this._activateResult));
 | 
			
		||||
            display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
 | 
			
		||||
            this._grid.addItem(display);
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _clearResultDisplay: function () {
 | 
			
		||||
        this._grid.removeAll();
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
@@ -519,6 +519,7 @@ const WindowOverlay = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        Tweener.removeTweens(button);
 | 
			
		||||
        Tweener.removeTweens(border);
 | 
			
		||||
        Tweener.removeTweens(title);
 | 
			
		||||
 | 
			
		||||
        let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -306,7 +306,7 @@ const WorkspaceThumbnail = new Lang.Class({
 | 
			
		||||
    _createBackground: function() {
 | 
			
		||||
        this._bgManager = new Background.BackgroundManager({ monitorIndex: Main.layoutManager.primaryIndex,
 | 
			
		||||
                                                             container: this._contents,
 | 
			
		||||
                                                             effects: Meta.BackgroundEffects.NONE });
 | 
			
		||||
                                                             vignette: false });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    setPorthole: function(x, y, width, height) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										333
									
								
								po/gl.po
									
									
									
									
									
								
							
							
						
						
									
										333
									
								
								po/gl.po
									
									
									
									
									
								
							@@ -11,8 +11,8 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell master\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2014-07-01 17:52+0200\n"
 | 
			
		||||
"PO-Revision-Date: 2014-07-01 17:56+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2014-08-25 23:06+0200\n"
 | 
			
		||||
"PO-Revision-Date: 2014-08-25 23:08+0200\n"
 | 
			
		||||
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
 | 
			
		||||
"Language-Team: gnome-l10n-gl@gnome.org\n"
 | 
			
		||||
"Language: gl\n"
 | 
			
		||||
@@ -226,7 +226,7 @@ msgstr "Combinación de teclas para enfocar a notificación activa."
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
 | 
			
		||||
msgid ""
 | 
			
		||||
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Atallo de teclado que pausa e reinicia todo os xemelgos executándose."
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
 | 
			
		||||
msgid "Which keyboard to use"
 | 
			
		||||
@@ -237,31 +237,10 @@ msgid "The type of keyboard to use."
 | 
			
		||||
msgstr "O tipo de teclado a usar."
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
 | 
			
		||||
msgid "The maximum accuracy level of location."
 | 
			
		||||
msgstr "O nivel de exactitude máxima para a localización."
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
 | 
			
		||||
msgid ""
 | 
			
		||||
"Configures the maximum level of location accuracy applications are allowed "
 | 
			
		||||
"to see. Valid options are 'off' (disable location tracking), 'country', "
 | 
			
		||||
"'city', 'neighborhood', 'street', and 'exact' (typically requires GPS "
 | 
			
		||||
"receiver). Please keep in mind that this only controls what GeoClue will "
 | 
			
		||||
"allow applications to see and they can find user's location on their own "
 | 
			
		||||
"using network resources (albeit with street-level accuracy at best)."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Configura o nivel máximo de exactitude que os aplicativos de localización "
 | 
			
		||||
"poden ver. As opcións válidas son 'off' (desactiva o seguimento de "
 | 
			
		||||
"localización), 'country', 'city', 'neighborhood', 'street', e "
 | 
			
		||||
"'exact' (normalmente requiren dun GPS). Teña en conta que isto só controla o "
 | 
			
		||||
"que Geoclue lle permitirá aos aplicativos ver e que eles poden buscar a "
 | 
			
		||||
"localizaócin do usuario usando os seus propios recursos de rede (con "
 | 
			
		||||
"exactitude a nivel de rúa no mellor caso)."
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
 | 
			
		||||
msgid "Limit switcher to current workspace."
 | 
			
		||||
msgstr "Restrinxir o trocador ao espazo de traballo actual."
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
 | 
			
		||||
msgid ""
 | 
			
		||||
"If true, only applications that have windows on the current workspace are "
 | 
			
		||||
"shown in the switcher. Otherwise, all applications are included."
 | 
			
		||||
@@ -269,11 +248,11 @@ msgstr ""
 | 
			
		||||
"Se é verdadeiro, só se mostran no trocador os aplicativos que teñen xanelas "
 | 
			
		||||
"no espazo de traballo actual. Doutra maneira inclúense todos os aplicativos."
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
 | 
			
		||||
msgid "The application icon mode."
 | 
			
		||||
msgstr "O modo da icona do aplicativo."
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
 | 
			
		||||
msgid ""
 | 
			
		||||
"Configures how the windows are shown in the switcher. Valid possibilities "
 | 
			
		||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
 | 
			
		||||
@@ -283,7 +262,7 @@ msgstr ""
 | 
			
		||||
"son «thumbnail-only» (mostra unha miniatura da xanela, «app-icon-only» (só "
 | 
			
		||||
"mostra a icona do aplicativo) ou «both» (móstranse ambas cosas)."
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
 | 
			
		||||
msgid ""
 | 
			
		||||
"If true, only windows from the current workspace are shown in the switcher. "
 | 
			
		||||
"Otherwise, all windows are included."
 | 
			
		||||
@@ -291,29 +270,29 @@ msgstr ""
 | 
			
		||||
"Se é verdadeiro, só se mostrarán no trocador as xanelas do espazo de "
 | 
			
		||||
"traballo actual. Doutra maneira inclúense todos os aplicativos."
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
 | 
			
		||||
msgid "Attach modal dialog to the parent window"
 | 
			
		||||
msgstr "Anexar o diálogo modal á xanela pai"
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
 | 
			
		||||
msgid ""
 | 
			
		||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Esta chave sobrescribe a chave en org.gnome.mutter cando executa GNOME Shell."
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
 | 
			
		||||
msgid "Enable edge tiling when dropping windows on screen edges"
 | 
			
		||||
msgstr "Activar o mosaico nos bordos ao arrastrar xanelas aos bordos da xanela"
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
 | 
			
		||||
msgid "Workspaces are managed dynamically"
 | 
			
		||||
msgstr "Os espazos de traballo xestiónanse dinamicamente"
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
 | 
			
		||||
msgid "Workspaces only on primary monitor"
 | 
			
		||||
msgstr "Espazos de traballo só no monitor primario"
 | 
			
		||||
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
 | 
			
		||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
 | 
			
		||||
msgid "Delay focus changes in mouse mode until the pointer stops moving"
 | 
			
		||||
msgstr "Atrasar os cambios de foco no modo rato até que o punteiro se pare"
 | 
			
		||||
 | 
			
		||||
@@ -321,16 +300,16 @@ msgstr "Atrasar os cambios de foco no modo rato até que o punteiro se pare"
 | 
			
		||||
msgid "Captive Portal"
 | 
			
		||||
msgstr "Portal cautivo"
 | 
			
		||||
 | 
			
		||||
#: ../js/extensionPrefs/main.js:125
 | 
			
		||||
#: ../js/extensionPrefs/main.js:127
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "There was an error loading the preferences dialog for %s:"
 | 
			
		||||
msgstr "Produciuse un erro ao cargar o diálogo de preferenzas para %s:"
 | 
			
		||||
 | 
			
		||||
#: ../js/extensionPrefs/main.js:157
 | 
			
		||||
#: ../js/extensionPrefs/main.js:159
 | 
			
		||||
msgid "GNOME Shell Extensions"
 | 
			
		||||
msgstr "Extensións de GNOME Shell"
 | 
			
		||||
 | 
			
		||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:142
 | 
			
		||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
 | 
			
		||||
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
 | 
			
		||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
 | 
			
		||||
#: ../js/ui/status/network.js:915
 | 
			
		||||
@@ -364,8 +343,8 @@ msgstr "Non está na lista?"
 | 
			
		||||
msgid "(e.g., user or %s)"
 | 
			
		||||
msgstr "(p.ex., usuario ou %s)"
 | 
			
		||||
 | 
			
		||||
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:268
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:286
 | 
			
		||||
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:269
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:287
 | 
			
		||||
msgid "Username: "
 | 
			
		||||
msgstr "Nome de usuario: "
 | 
			
		||||
 | 
			
		||||
@@ -394,49 +373,49 @@ msgstr "Non foi posíbel analizar a orde:"
 | 
			
		||||
msgid "Execution of “%s” failed:"
 | 
			
		||||
msgstr "Produciuse un fallo na execución de «%s»:"
 | 
			
		||||
 | 
			
		||||
#: ../js/portalHelper/main.js:84
 | 
			
		||||
#: ../js/portalHelper/main.js:85
 | 
			
		||||
msgid "Web Authentication Redirect"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Redirección web de autenticación"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/appDisplay.js:641
 | 
			
		||||
#: ../js/ui/appDisplay.js:660
 | 
			
		||||
msgid "Frequently used applications will appear here"
 | 
			
		||||
msgstr "Os aplicativos usados recentemente aparecerán aquí"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/appDisplay.js:752
 | 
			
		||||
#: ../js/ui/appDisplay.js:771
 | 
			
		||||
msgid "Frequent"
 | 
			
		||||
msgstr "Frecuentes"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/appDisplay.js:759
 | 
			
		||||
#: ../js/ui/appDisplay.js:778
 | 
			
		||||
msgid "All"
 | 
			
		||||
msgstr "Todos"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/appDisplay.js:1570
 | 
			
		||||
#: ../js/ui/appDisplay.js:1650
 | 
			
		||||
msgid "New Window"
 | 
			
		||||
msgstr "Xanela nova"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/appDisplay.js:1592 ../js/ui/dash.js:285
 | 
			
		||||
#: ../js/ui/appDisplay.js:1673 ../js/ui/dash.js:285
 | 
			
		||||
msgid "Remove from Favorites"
 | 
			
		||||
msgstr "Retirar dos marcadores"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/appDisplay.js:1598
 | 
			
		||||
#: ../js/ui/appDisplay.js:1679
 | 
			
		||||
msgid "Add to Favorites"
 | 
			
		||||
msgstr "Engadir aos favoritos"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/appDisplay.js:1607
 | 
			
		||||
#: ../js/ui/appDisplay.js:1688
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "Mostrar detalles"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/appFavorites.js:87
 | 
			
		||||
#: ../js/ui/appFavorites.js:122
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s foi engadido aos seus favoritos."
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/appFavorites.js:121
 | 
			
		||||
#: ../js/ui/appFavorites.js:156
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "%s retirouse dos seus marcadores."
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:810
 | 
			
		||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:813
 | 
			
		||||
#: ../js/ui/status/system.js:337
 | 
			
		||||
msgid "Settings"
 | 
			
		||||
msgstr "Preferencias"
 | 
			
		||||
@@ -561,44 +540,44 @@ msgctxt "list saturday"
 | 
			
		||||
msgid "S"
 | 
			
		||||
msgstr "S"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/calendar.js:454
 | 
			
		||||
#: ../js/ui/calendar.js:453
 | 
			
		||||
msgid "Previous month"
 | 
			
		||||
msgstr "Anterior mes"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/calendar.js:464
 | 
			
		||||
#: ../js/ui/calendar.js:463
 | 
			
		||||
msgid "Next month"
 | 
			
		||||
msgstr "Seguinte mes"
 | 
			
		||||
 | 
			
		||||
#. Translators: Text to show if there are no events */
 | 
			
		||||
#: ../js/ui/calendar.js:785
 | 
			
		||||
#: ../js/ui/calendar.js:781
 | 
			
		||||
msgid "Nothing Scheduled"
 | 
			
		||||
msgstr "Nada programado"
 | 
			
		||||
 | 
			
		||||
#. Translators: Shown on calendar heading when selected day occurs on current year */
 | 
			
		||||
#: ../js/ui/calendar.js:803
 | 
			
		||||
#: ../js/ui/calendar.js:799
 | 
			
		||||
msgctxt "calendar heading"
 | 
			
		||||
msgid "%A, %B %d"
 | 
			
		||||
msgstr "%A, %d de %B"
 | 
			
		||||
 | 
			
		||||
#. Translators: Shown on calendar heading when selected day occurs on different year */
 | 
			
		||||
#: ../js/ui/calendar.js:806
 | 
			
		||||
#: ../js/ui/calendar.js:802
 | 
			
		||||
msgctxt "calendar heading"
 | 
			
		||||
msgid "%A, %B %d, %Y"
 | 
			
		||||
msgstr "%A, %d de %B de %Y"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/calendar.js:817
 | 
			
		||||
#: ../js/ui/calendar.js:813
 | 
			
		||||
msgid "Today"
 | 
			
		||||
msgstr "Hoxe"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/calendar.js:821
 | 
			
		||||
#: ../js/ui/calendar.js:817
 | 
			
		||||
msgid "Tomorrow"
 | 
			
		||||
msgstr "Mañá"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/calendar.js:832
 | 
			
		||||
#: ../js/ui/calendar.js:828
 | 
			
		||||
msgid "This week"
 | 
			
		||||
msgstr "Esta semana"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/calendar.js:840
 | 
			
		||||
#: ../js/ui/calendar.js:836
 | 
			
		||||
msgid "Next week"
 | 
			
		||||
msgstr "A vindeira semana"
 | 
			
		||||
 | 
			
		||||
@@ -623,48 +602,48 @@ msgstr "Abrir con %s"
 | 
			
		||||
msgid "Eject"
 | 
			
		||||
msgstr "Expulsar"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/keyring.js:91 ../js/ui/components/polkitAgent.js:285
 | 
			
		||||
#: ../js/ui/components/keyring.js:93 ../js/ui/components/polkitAgent.js:285
 | 
			
		||||
msgid "Password:"
 | 
			
		||||
msgstr "Contrasinal:"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/keyring.js:110
 | 
			
		||||
#: ../js/ui/components/keyring.js:113
 | 
			
		||||
msgid "Type again:"
 | 
			
		||||
msgstr "Escriba de novo:"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:137 ../js/ui/status/network.js:277
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277
 | 
			
		||||
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918
 | 
			
		||||
msgid "Connect"
 | 
			
		||||
msgstr "Conectar"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:230
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:242
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:270
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:290
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:300
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:231
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:243
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:271
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:291
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:301
 | 
			
		||||
msgid "Password: "
 | 
			
		||||
msgstr "Contrasinal: "
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:235
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:236
 | 
			
		||||
msgid "Key: "
 | 
			
		||||
msgstr "Chave: "
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:274
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:275
 | 
			
		||||
msgid "Identity: "
 | 
			
		||||
msgstr "Identidade: "
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:276
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:277
 | 
			
		||||
msgid "Private key password: "
 | 
			
		||||
msgstr "Contrasinal da chave privada: "
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:288
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:289
 | 
			
		||||
msgid "Service: "
 | 
			
		||||
msgstr "Servizo: "
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:317
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:318
 | 
			
		||||
msgid "Authentication required by wireless network"
 | 
			
		||||
msgstr "A rede sen fíos require autenticación"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:318
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:319
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Passwords or encryption keys are required to access the wireless network "
 | 
			
		||||
@@ -673,35 +652,35 @@ msgstr ""
 | 
			
		||||
"Requírense contrasinais ou chaves de cifrado para acceder á rede sen fíos "
 | 
			
		||||
"«%s»."
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:322
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:323
 | 
			
		||||
msgid "Wired 802.1X authentication"
 | 
			
		||||
msgstr "Autenticación con fíos 802.1X"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:324
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:325
 | 
			
		||||
msgid "Network name: "
 | 
			
		||||
msgstr "Nome da rede:"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:329
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:330
 | 
			
		||||
msgid "DSL authentication"
 | 
			
		||||
msgstr "Autenticación DSL"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:336
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:337
 | 
			
		||||
msgid "PIN code required"
 | 
			
		||||
msgstr "Requírese un código PIN"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:337
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:338
 | 
			
		||||
msgid "PIN code is needed for the mobile broadband device"
 | 
			
		||||
msgstr "É necesario un código PIN para o dispositivo de banda larga móbil"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:338
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:339
 | 
			
		||||
msgid "PIN: "
 | 
			
		||||
msgstr "PIN:"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:344
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:345
 | 
			
		||||
msgid "Mobile broadband network password"
 | 
			
		||||
msgstr "Contrasinal da rede de banda larga móbil"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:345
 | 
			
		||||
#: ../js/ui/components/networkAgent.js:346
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "A password is required to connect to “%s”."
 | 
			
		||||
msgstr "Requírese un contrasinal para conectarse a «%s»."
 | 
			
		||||
@@ -751,77 +730,77 @@ msgid "Mute"
 | 
			
		||||
msgstr "Silenciar"
 | 
			
		||||
 | 
			
		||||
#. Translators: Time in 24h format */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:957
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:953
 | 
			
		||||
msgid "%H∶%M"
 | 
			
		||||
msgstr "%H∶%M"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is the word "Yesterday" followed by a
 | 
			
		||||
#. time string in 24h format. i.e. "Yesterday, 14:30" */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:964
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:960
 | 
			
		||||
msgid "Yesterday, %H∶%M"
 | 
			
		||||
msgstr "Onte, %H:%M"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is the week day name followed by a time
 | 
			
		||||
#. string in 24h format. i.e. "Monday, 14:30" */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:971
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:967
 | 
			
		||||
msgid "%A, %H∶%M"
 | 
			
		||||
msgstr "%A ás %H:%M"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is the month name and day number
 | 
			
		||||
#. followed by a time string in 24h format.
 | 
			
		||||
#. i.e. "May 25, 14:30" */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:978
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:974
 | 
			
		||||
msgid "%B %d, %H∶%M"
 | 
			
		||||
msgstr "%d de %B ás %H:%M"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is the month name, day number, year
 | 
			
		||||
#. number followed by a time string in 24h format.
 | 
			
		||||
#. i.e. "May 25 2012, 14:30" */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:984
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:980
 | 
			
		||||
msgid "%B %d %Y, %H∶%M"
 | 
			
		||||
msgstr "%d de %B de %Y ás %H:%M"
 | 
			
		||||
 | 
			
		||||
#. Translators: Time in 24h format */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:990
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:986
 | 
			
		||||
msgid "%l∶%M %p"
 | 
			
		||||
msgstr "%l:%M %p"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is the word "Yesterday" followed by a
 | 
			
		||||
#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:997
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:993
 | 
			
		||||
msgid "Yesterday, %l∶%M %p"
 | 
			
		||||
msgstr "Onte, %H:%M"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is the week day name followed by a time
 | 
			
		||||
#. string in 12h format. i.e. "Monday, 2:30 pm" */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1004
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1000
 | 
			
		||||
msgid "%A, %l∶%M %p"
 | 
			
		||||
msgstr "%A, %l∶%M %p"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is the month name and day number
 | 
			
		||||
#. followed by a time string in 12h format.
 | 
			
		||||
#. i.e. "May 25, 2:30 pm" */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1011
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1007
 | 
			
		||||
msgid "%B %d, %l∶%M %p"
 | 
			
		||||
msgstr "%d de %B, %l∶%M %p"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is the month name, day number, year
 | 
			
		||||
#. number followed by a time string in 12h format.
 | 
			
		||||
#. i.e. "May 25 2012, 2:30 pm"*/
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1017
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1013
 | 
			
		||||
msgid "%B %d %Y, %l∶%M %p"
 | 
			
		||||
msgstr "%d de %B de %Y, %l∶%M %p"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is the other person changing their old IM name to their new
 | 
			
		||||
#. IM name. */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1049
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1045
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s is now known as %s"
 | 
			
		||||
msgstr "Agora %s chámase %s"
 | 
			
		||||
 | 
			
		||||
#. translators: argument is a room name like
 | 
			
		||||
#. * room@jabber.org for example. */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1153
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1149
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Invitation to %s"
 | 
			
		||||
msgstr "Convite a %s"
 | 
			
		||||
@@ -829,38 +808,38 @@ msgstr "Convite a %s"
 | 
			
		||||
#. translators: first argument is the name of a contact and the second
 | 
			
		||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
 | 
			
		||||
#. * for example. */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1161
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1157
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s is inviting you to join %s"
 | 
			
		||||
msgstr "%s estalle convidando a unirse a %s"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1163
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1198
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1232
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1290
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1159
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1194
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1228
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1286
 | 
			
		||||
msgid "Decline"
 | 
			
		||||
msgstr "Rexeitar"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1169
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1238
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1295
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1165
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1234
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1291
 | 
			
		||||
msgid "Accept"
 | 
			
		||||
msgstr "Aceptar"
 | 
			
		||||
 | 
			
		||||
#. translators: argument is a contact name like Alice for example. */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1188
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1184
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Video call from %s"
 | 
			
		||||
msgstr "Videochamada de %s"
 | 
			
		||||
 | 
			
		||||
#. translators: argument is a contact name like Alice for example. */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1191
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1187
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Call from %s"
 | 
			
		||||
msgstr "Chamada de %s"
 | 
			
		||||
 | 
			
		||||
#. translators: this is a button label (verb), not a noun */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1205
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1201
 | 
			
		||||
msgid "Answer"
 | 
			
		||||
msgstr "Responder"
 | 
			
		||||
 | 
			
		||||
@@ -869,112 +848,112 @@ msgstr "Responder"
 | 
			
		||||
#. * file name. The string will be something
 | 
			
		||||
#. * like: "Alice is sending you test.ogg"
 | 
			
		||||
#. */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1226
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1222
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s is sending you %s"
 | 
			
		||||
msgstr "%s esta enviándolle %s"
 | 
			
		||||
 | 
			
		||||
#. To translators: The parameter is the contact's alias */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1255
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1251
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s would like permission to see when you are online"
 | 
			
		||||
msgstr "%s solicítalle permiso para ver cando está en liña"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1341
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1337
 | 
			
		||||
msgid "Network error"
 | 
			
		||||
msgstr "Erro da rede"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1343
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1339
 | 
			
		||||
msgid "Authentication failed"
 | 
			
		||||
msgstr "Fallou a autenticación"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1345
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1341
 | 
			
		||||
msgid "Encryption error"
 | 
			
		||||
msgstr "Erro de cifrado"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1347
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1343
 | 
			
		||||
msgid "Certificate not provided"
 | 
			
		||||
msgstr "Certificado non fornecido"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1349
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1345
 | 
			
		||||
msgid "Certificate untrusted"
 | 
			
		||||
msgstr "Non se confía no certificado"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1351
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1347
 | 
			
		||||
msgid "Certificate expired"
 | 
			
		||||
msgstr "Certificado caducado"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1353
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1349
 | 
			
		||||
msgid "Certificate not activated"
 | 
			
		||||
msgstr "Certificado non activado"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1355
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1351
 | 
			
		||||
msgid "Certificate hostname mismatch"
 | 
			
		||||
msgstr "O nome do servidor do certificado non coincide"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1357
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1353
 | 
			
		||||
msgid "Certificate fingerprint mismatch"
 | 
			
		||||
msgstr "A pegada do certificado non coincide"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1359
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1355
 | 
			
		||||
msgid "Certificate self-signed"
 | 
			
		||||
msgstr "Certificado autoasinado"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1361
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1357
 | 
			
		||||
msgid "Status is set to offline"
 | 
			
		||||
msgstr "O estado está definido a «desconectado»"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1363
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1359
 | 
			
		||||
msgid "Encryption is not available"
 | 
			
		||||
msgstr "O cifrado non está dispoñíbel"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1365
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1361
 | 
			
		||||
msgid "Certificate is invalid"
 | 
			
		||||
msgstr "O certificado non é válido"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1367
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1363
 | 
			
		||||
msgid "Connection has been refused"
 | 
			
		||||
msgstr "Rexeitouse a conexión"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1369
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1365
 | 
			
		||||
msgid "Connection can't be established"
 | 
			
		||||
msgstr "Non é posíbel estabelecer a conexión"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1371
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1367
 | 
			
		||||
msgid "Connection has been lost"
 | 
			
		||||
msgstr "Perdeuse a conexión"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1373
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1369
 | 
			
		||||
msgid "This account is already connected to the server"
 | 
			
		||||
msgstr "Esta cuenta xa está conectada ao servidor"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1375
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1371
 | 
			
		||||
msgid ""
 | 
			
		||||
"Connection has been replaced by a new connection using the same resource"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Substituíuse a conexión por unha nova conexión empregando o mesmo recurso"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1377
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1373
 | 
			
		||||
msgid "The account already exists on the server"
 | 
			
		||||
msgstr "Esta conta xa existe no servidor"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1379
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1375
 | 
			
		||||
msgid "Server is currently too busy to handle the connection"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Nestes intres o servidor está moi ocupado tentando xestionar a conexión"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1381
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1377
 | 
			
		||||
msgid "Certificate has been revoked"
 | 
			
		||||
msgstr "Revogouse o certificado"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1383
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1379
 | 
			
		||||
msgid ""
 | 
			
		||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"O certificado usa un algoritmo de cifrado inseguro ou é criptográficamente "
 | 
			
		||||
"débil"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1385
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1381
 | 
			
		||||
msgid ""
 | 
			
		||||
"The length of the server certificate, or the depth of the server certificate "
 | 
			
		||||
"chain, exceed the limits imposed by the cryptography library"
 | 
			
		||||
@@ -983,26 +962,26 @@ msgstr ""
 | 
			
		||||
"certificado do servidor excede os límites impostos pola biblioteca de "
 | 
			
		||||
"criptografía."
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1387
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1383
 | 
			
		||||
msgid "Internal error"
 | 
			
		||||
msgstr "Erro interno"
 | 
			
		||||
 | 
			
		||||
#. translators: argument is the account name, like
 | 
			
		||||
#. * name@jabber.org for example. */
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1397
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1393
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Unable to connect to %s"
 | 
			
		||||
msgstr "Non foi posíbel conectarse a %s"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1402
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1398
 | 
			
		||||
msgid "View account"
 | 
			
		||||
msgstr "Ver conta"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1439
 | 
			
		||||
#: ../js/ui/components/telepathyClient.js:1435
 | 
			
		||||
msgid "Unknown reason"
 | 
			
		||||
msgstr "Razón descoñecida"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
 | 
			
		||||
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:228
 | 
			
		||||
msgid "Windows"
 | 
			
		||||
msgstr "Xanelas"
 | 
			
		||||
 | 
			
		||||
@@ -1172,7 +1151,7 @@ msgstr "Instalar"
 | 
			
		||||
msgid "Download and install “%s” from extensions.gnome.org?"
 | 
			
		||||
msgstr "Desexa descargar e instalar «%s» desde extensions.gnome.org?"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/keyboard.js:645 ../js/ui/status/keyboard.js:339
 | 
			
		||||
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
 | 
			
		||||
msgid "Keyboard"
 | 
			
		||||
msgstr "Teclado"
 | 
			
		||||
 | 
			
		||||
@@ -1194,8 +1173,8 @@ msgstr "Ocultar erros"
 | 
			
		||||
msgid "Show Errors"
 | 
			
		||||
msgstr "Mostrar erros"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:59
 | 
			
		||||
#: ../js/ui/status/location.js:167
 | 
			
		||||
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:62
 | 
			
		||||
#: ../js/ui/status/location.js:166
 | 
			
		||||
msgid "Enabled"
 | 
			
		||||
msgstr "Activado"
 | 
			
		||||
 | 
			
		||||
@@ -1203,7 +1182,7 @@ msgstr "Activado"
 | 
			
		||||
#. because it's disabled by rfkill (airplane mode) */
 | 
			
		||||
#. translators:
 | 
			
		||||
#. * The device has been disabled
 | 
			
		||||
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
 | 
			
		||||
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:169
 | 
			
		||||
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
 | 
			
		||||
msgid "Disabled"
 | 
			
		||||
msgstr "Desactivado"
 | 
			
		||||
@@ -1264,12 +1243,12 @@ msgstr "Bandexa de mensaxes"
 | 
			
		||||
msgid "System Information"
 | 
			
		||||
msgstr "Información do sistema"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/notificationDaemon.js:516 ../src/shell-app.c:425
 | 
			
		||||
#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425
 | 
			
		||||
msgctxt "program"
 | 
			
		||||
msgid "Unknown"
 | 
			
		||||
msgstr "Descoñecido"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/overviewControls.js:488 ../js/ui/screenShield.js:151
 | 
			
		||||
#: ../js/ui/overviewControls.js:482 ../js/ui/screenShield.js:151
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%d new message"
 | 
			
		||||
msgid_plural "%d new messages"
 | 
			
		||||
@@ -1292,32 +1271,36 @@ msgstr "Vista xeral"
 | 
			
		||||
msgid "Type to search…"
 | 
			
		||||
msgstr "Escriba para buscar…"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/panel.js:516
 | 
			
		||||
#: ../js/ui/panel.js:515
 | 
			
		||||
msgid "Quit"
 | 
			
		||||
msgstr "Saír"
 | 
			
		||||
 | 
			
		||||
#. Translators: If there is no suitable word for "Activities"
 | 
			
		||||
#. in your language, you can use the word for "Overview". */
 | 
			
		||||
#: ../js/ui/panel.js:568
 | 
			
		||||
#: ../js/ui/panel.js:567
 | 
			
		||||
msgid "Activities"
 | 
			
		||||
msgstr "Actividades"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/panel.js:915
 | 
			
		||||
#: ../js/ui/panel.js:918
 | 
			
		||||
msgid "Top Bar"
 | 
			
		||||
msgstr "Barra superior"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/popupMenu.js:274
 | 
			
		||||
#: ../js/ui/popupMenu.js:269
 | 
			
		||||
msgid "toggle-switch-us"
 | 
			
		||||
msgstr "toggle-switch-intl"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/runDialog.js:74
 | 
			
		||||
#: ../js/ui/runDialog.js:70
 | 
			
		||||
msgid "Enter a Command"
 | 
			
		||||
msgstr "Escriba unha orde"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/runDialog.js:114 ../js/ui/windowMenu.js:120
 | 
			
		||||
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120
 | 
			
		||||
msgid "Close"
 | 
			
		||||
msgstr "Pechar"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/runDialog.js:277
 | 
			
		||||
msgid "Restarting…"
 | 
			
		||||
msgstr "Restimando…"
 | 
			
		||||
 | 
			
		||||
#. Translators: This is a time format for a date in
 | 
			
		||||
#. long format */
 | 
			
		||||
#: ../js/ui/screenShield.js:88
 | 
			
		||||
@@ -1331,19 +1314,19 @@ msgid_plural "%d new notifications"
 | 
			
		||||
msgstr[0] "%d notificación nova"
 | 
			
		||||
msgstr[1] "%d notificacións novas"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:345
 | 
			
		||||
#: ../js/ui/screenShield.js:472 ../js/ui/status/system.js:345
 | 
			
		||||
msgid "Lock"
 | 
			
		||||
msgstr "Bloquear"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/screenShield.js:708
 | 
			
		||||
#: ../js/ui/screenShield.js:706
 | 
			
		||||
msgid "GNOME needs to lock the screen"
 | 
			
		||||
msgstr "GNOME precisa bloquear a pantalla"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1312
 | 
			
		||||
#: ../js/ui/screenShield.js:833 ../js/ui/screenShield.js:1304
 | 
			
		||||
msgid "Unable to lock"
 | 
			
		||||
msgstr "Non foi posíbel bloquear"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1313
 | 
			
		||||
#: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1305
 | 
			
		||||
msgid "Lock was blocked by an application"
 | 
			
		||||
msgstr "Un aplicativo impediu o bloqueo"
 | 
			
		||||
 | 
			
		||||
@@ -1453,26 +1436,26 @@ msgstr "Non conectado"
 | 
			
		||||
msgid "Brightness"
 | 
			
		||||
msgstr "Brillo"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/status/keyboard.js:407
 | 
			
		||||
#: ../js/ui/status/keyboard.js:406
 | 
			
		||||
msgid "Show Keyboard Layout"
 | 
			
		||||
msgstr "Mostrar a distribución do teclado"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/status/location.js:53
 | 
			
		||||
#: ../js/ui/status/location.js:56
 | 
			
		||||
msgid "Location"
 | 
			
		||||
msgstr "Localización"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/status/location.js:60 ../js/ui/status/location.js:168
 | 
			
		||||
#: ../js/ui/status/location.js:63 ../js/ui/status/location.js:167
 | 
			
		||||
msgid "Disable"
 | 
			
		||||
msgstr "Desactivar"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/status/location.js:165
 | 
			
		||||
msgid "Enable"
 | 
			
		||||
msgstr "Activar"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/status/location.js:167
 | 
			
		||||
#: ../js/ui/status/location.js:166
 | 
			
		||||
msgid "In Use"
 | 
			
		||||
msgstr "En uso"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/status/location.js:170
 | 
			
		||||
msgid "Enable"
 | 
			
		||||
msgstr "Activar"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/status/network.js:101
 | 
			
		||||
msgid "<unknown>"
 | 
			
		||||
msgstr "<descoñecido>"
 | 
			
		||||
@@ -1704,11 +1687,11 @@ msgstr "Iniciar sesión como outro usuario"
 | 
			
		||||
msgid "Unlock Window"
 | 
			
		||||
msgstr "Desbloquear xanela"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/viewSelector.js:100
 | 
			
		||||
#: ../js/ui/viewSelector.js:232
 | 
			
		||||
msgid "Applications"
 | 
			
		||||
msgstr "Aplicativos"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/viewSelector.js:104
 | 
			
		||||
#: ../js/ui/viewSelector.js:236
 | 
			
		||||
msgid "Search"
 | 
			
		||||
msgstr "Buscar"
 | 
			
		||||
 | 
			
		||||
@@ -1717,22 +1700,22 @@ msgstr "Buscar"
 | 
			
		||||
msgid "“%s” is ready"
 | 
			
		||||
msgstr "«%s» está preparado"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/windowManager.js:57
 | 
			
		||||
#: ../js/ui/windowManager.js:65
 | 
			
		||||
msgid "Do you want to keep these display settings?"
 | 
			
		||||
msgstr "Desexa manter estas preferencias de pantalla?"
 | 
			
		||||
 | 
			
		||||
#. Translators: this and the following message should be limited in lenght,
 | 
			
		||||
#. to avoid ellipsizing the labels.
 | 
			
		||||
#. */
 | 
			
		||||
#: ../js/ui/windowManager.js:76
 | 
			
		||||
#: ../js/ui/windowManager.js:84
 | 
			
		||||
msgid "Revert Settings"
 | 
			
		||||
msgstr "Reverter preferencias"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/windowManager.js:80
 | 
			
		||||
#: ../js/ui/windowManager.js:88
 | 
			
		||||
msgid "Keep Changes"
 | 
			
		||||
msgstr "Manter cambios"
 | 
			
		||||
 | 
			
		||||
#: ../js/ui/windowManager.js:99
 | 
			
		||||
#: ../js/ui/windowManager.js:107
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Settings changes will revert in %d second"
 | 
			
		||||
msgid_plural "Settings changes will revert in %d seconds"
 | 
			
		||||
@@ -1840,6 +1823,26 @@ msgstr "O contrasinal non pode estar baleiro"
 | 
			
		||||
msgid "Authentication dialog was dismissed by the user"
 | 
			
		||||
msgstr "O usuario rexeitou o diálogo de autenticación"
 | 
			
		||||
 | 
			
		||||
#~ msgid "The maximum accuracy level of location."
 | 
			
		||||
#~ msgstr "O nivel de exactitude máxima para a localización."
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Configures the maximum level of location accuracy applications are "
 | 
			
		||||
#~ "allowed to see. Valid options are 'off' (disable location tracking), "
 | 
			
		||||
#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically "
 | 
			
		||||
#~ "requires GPS receiver). Please keep in mind that this only controls what "
 | 
			
		||||
#~ "GeoClue will allow applications to see and they can find user's location "
 | 
			
		||||
#~ "on their own using network resources (albeit with street-level accuracy "
 | 
			
		||||
#~ "at best)."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Configura o nivel máximo de exactitude que os aplicativos de localización "
 | 
			
		||||
#~ "poden ver. As opcións válidas son 'off' (desactiva o seguimento de "
 | 
			
		||||
#~ "localización), 'country', 'city', 'neighborhood', 'street', e "
 | 
			
		||||
#~ "'exact' (normalmente requiren dun GPS). Teña en conta que isto só "
 | 
			
		||||
#~ "controla o que Geoclue lle permitirá aos aplicativos ver e que eles poden "
 | 
			
		||||
#~ "buscar a localizaócin do usuario usando os seus propios recursos de rede "
 | 
			
		||||
#~ "(con exactitude a nivel de rúa no mellor caso)."
 | 
			
		||||
 | 
			
		||||
#~ msgid "Arrangement of buttons on the titlebar"
 | 
			
		||||
#~ msgstr "Distribución dos botóns na barra de títulos"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user