Compare commits
	
		
			35 Commits
		
	
	
		
			3.29.2
			...
			wip/textur
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					0507fef4cd | ||
| 
						 | 
					68c631223c | ||
| 
						 | 
					97b38c1950 | ||
| 
						 | 
					b098930e6d | ||
| 
						 | 
					45da60516c | ||
| 
						 | 
					c4b1ba48f2 | ||
| 
						 | 
					6ed21e1ce0 | ||
| 
						 | 
					9c51c87d8c | ||
| 
						 | 
					db2245d60b | ||
| 
						 | 
					f26cc3ac23 | ||
| 
						 | 
					02c5b4b947 | ||
| 
						 | 
					df57829ea1 | ||
| 
						 | 
					da96408098 | ||
| 
						 | 
					4b2e0247af | ||
| 
						 | 
					2c617e5a3a | ||
| 
						 | 
					4ff7e84c51 | ||
| 
						 | 
					9f76b6e4a2 | ||
| 
						 | 
					0ac0f7e85b | ||
| 
						 | 
					73b00ff1a7 | ||
| 
						 | 
					a52597ac5b | ||
| 
						 | 
					9a2597f80b | ||
| 
						 | 
					e1ed4b25e1 | ||
| 
						 | 
					c70b18764b | ||
| 
						 | 
					4398516520 | ||
| 
						 | 
					220514d10e | ||
| 
						 | 
					18312d9ccd | ||
| 
						 | 
					234b1441e4 | ||
| 
						 | 
					e909db5848 | ||
| 
						 | 
					702338bc7d | ||
| 
						 | 
					7c9dbc66d9 | ||
| 
						 | 
					0d031dc20f | ||
| 
						 | 
					b476e851b7 | ||
| 
						 | 
					a27be6a540 | ||
| 
						 | 
					4b6a57fabe | ||
| 
						 | 
					92758890bb | 
@@ -1,16 +1,19 @@
 | 
			
		||||
# Coding guide
 | 
			
		||||
Coding guide
 | 
			
		||||
============
 | 
			
		||||
 | 
			
		||||
Our goal is to have all JavaScript code in GNOME follow a consistent style. In
 | 
			
		||||
a dynamic language like JavaScript, it is essential to be rigorous about style
 | 
			
		||||
(and unit tests), or you rapidly end up with a spaghetti-code mess.
 | 
			
		||||
 | 
			
		||||
## A quick note
 | 
			
		||||
A quick note
 | 
			
		||||
------------
 | 
			
		||||
 | 
			
		||||
Life isn't fun if you can't break the rules. If a rule seems unnecessarily
 | 
			
		||||
restrictive while you're coding, ignore it, and let the patch reviewer decide
 | 
			
		||||
what to do.
 | 
			
		||||
 | 
			
		||||
## Indentation and whitespace
 | 
			
		||||
Indentation and whitespace
 | 
			
		||||
--------------------------
 | 
			
		||||
 | 
			
		||||
Use four-space indents. Braces are on the same line as their associated
 | 
			
		||||
statements.  You should only omit braces if *both* sides of the statement are
 | 
			
		||||
@@ -19,7 +22,7 @@ on one line.
 | 
			
		||||
* One space after the `function` keyword.  No space between the function name
 | 
			
		||||
* in a declaration or a call.  One space before the parens in the `if`
 | 
			
		||||
* statements, or `while`, or `for` loops.
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
    function foo(a, b) {
 | 
			
		||||
        let bar;
 | 
			
		||||
 | 
			
		||||
@@ -36,20 +39,22 @@ on one line.
 | 
			
		||||
            print(20);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Semicolons
 | 
			
		||||
Semicolons
 | 
			
		||||
----------
 | 
			
		||||
 | 
			
		||||
JavaScript allows omitting semicolons at the end of lines, but don't. Always
 | 
			
		||||
end statements with a semicolon.
 | 
			
		||||
 | 
			
		||||
## js2-mode
 | 
			
		||||
js2-mode
 | 
			
		||||
--------
 | 
			
		||||
 | 
			
		||||
If using Emacs, do not use js2-mode. It is outdated and hasn't worked for a
 | 
			
		||||
while. emacs now has a built-in JavaScript mode, js-mode, based on
 | 
			
		||||
espresso-mode. It is the de facto emacs mode for JavaScript.
 | 
			
		||||
 | 
			
		||||
## File naming and creation
 | 
			
		||||
File naming and creation
 | 
			
		||||
------------------------
 | 
			
		||||
 | 
			
		||||
For JavaScript files, use lowerCamelCase-style names, with a `.js` extension.
 | 
			
		||||
 | 
			
		||||
@@ -62,13 +67,14 @@ library name followed by a dash, e.g. `shell-app-system.c`. Create a
 | 
			
		||||
`-private.h` header when you want to share code internally in the
 | 
			
		||||
library. These headers are not installed, distributed or introspected.
 | 
			
		||||
 | 
			
		||||
## Imports
 | 
			
		||||
Imports
 | 
			
		||||
-------
 | 
			
		||||
 | 
			
		||||
Use UpperCamelCase when importing modules to distinguish them from ordinary
 | 
			
		||||
variables, e.g.
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
    const GLib = imports.gi.GLib;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Imports should be categorized into one of two places. The top-most import block
 | 
			
		||||
should contain only "environment imports". These are either modules from
 | 
			
		||||
gobject-introspection or modules added by gjs itself.
 | 
			
		||||
@@ -79,7 +85,7 @@ e.g. `imports.ui.popupMenu`.
 | 
			
		||||
 | 
			
		||||
Each import block should be sorted alphabetically. Don't import modules you
 | 
			
		||||
don't use.
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
    const GLib = imports.gi.GLib;
 | 
			
		||||
    const Gio = imports.gi.Gio;
 | 
			
		||||
    const Lang = imports.lang;
 | 
			
		||||
@@ -89,22 +95,23 @@ don't use.
 | 
			
		||||
    const Params = imports.misc.params;
 | 
			
		||||
    const Tweener = imports.ui.tweener;
 | 
			
		||||
    const Util = imports.misc.util;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The alphabetical ordering should be done independently of the location of the
 | 
			
		||||
location. Never reference `imports` in actual code.
 | 
			
		||||
 | 
			
		||||
## Constants
 | 
			
		||||
Constants
 | 
			
		||||
---------
 | 
			
		||||
 | 
			
		||||
We use CONSTANTS_CASE to define constants. All constants should be directly
 | 
			
		||||
under the imports:
 | 
			
		||||
```javascript
 | 
			
		||||
    const MY_DBUS_INTERFACE = 'org.my.Interface';
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Variable declaration
 | 
			
		||||
    const MY_DBUS_INTERFACE = 'org.my.Interface';
 | 
			
		||||
 | 
			
		||||
Variable declaration
 | 
			
		||||
--------------------
 | 
			
		||||
 | 
			
		||||
Always use either `const` or `let` when defining a variable.
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
    // Iterating over an array
 | 
			
		||||
    for (let i = 0; i < arr.length; ++i) {
 | 
			
		||||
        let item = arr[i];
 | 
			
		||||
@@ -114,17 +121,17 @@ Always use either `const` or `let` when defining a variable.
 | 
			
		||||
    for (let prop in someobj) {
 | 
			
		||||
        ...
 | 
			
		||||
    }
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
If you use "var" then the variable is added to function scope, not block scope.
 | 
			
		||||
See [What's new in JavaScript 1.7](https://developer.mozilla.org/en/JavaScript/New_in_JavaScript/1.7#Block_scope_with_let_%28Merge_into_let_Statement%29)
 | 
			
		||||
 | 
			
		||||
## Classes
 | 
			
		||||
Classes
 | 
			
		||||
-------
 | 
			
		||||
 | 
			
		||||
There are many approaches to classes in JavaScript. We use our own class framework
 | 
			
		||||
(sigh), which is built in gjs. The advantage is that it supports inheriting from
 | 
			
		||||
GObjects, although this feature isn't used very often in the Shell itself.
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
    var IconLabelMenuItem = new Lang.Class({
 | 
			
		||||
        Name: 'IconLabelMenuItem',
 | 
			
		||||
        Extends: PopupMenu.PopupMenuBaseItem,
 | 
			
		||||
@@ -139,7 +146,6 @@ GObjects, although this feature isn't used very often in the Shell itself.
 | 
			
		||||
            log("menu opened!");
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
* 'Name' is required. 'Extends' is optional. If you leave it out, you will
 | 
			
		||||
  automatically inherit from Object.
 | 
			
		||||
@@ -156,12 +162,13 @@ GObjects, although this feature isn't used very often in the Shell itself.
 | 
			
		||||
  still a giant function call, even though it may resemble a more
 | 
			
		||||
  conventional syntax.
 | 
			
		||||
 | 
			
		||||
## GObject Introspection
 | 
			
		||||
GObject Introspection
 | 
			
		||||
---------------------
 | 
			
		||||
 | 
			
		||||
GObject Introspection is a powerful feature that allows us to have native
 | 
			
		||||
bindings for almost any library built around GObject. If a library requires
 | 
			
		||||
you to inherit from a type to use it, you can do so:
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
    var MyClutterActor = new Lang.Class({
 | 
			
		||||
        Name: 'MyClutterActor',
 | 
			
		||||
        Extends: Clutter.Actor,
 | 
			
		||||
@@ -181,9 +188,9 @@ you to inherit from a type to use it, you can do so:
 | 
			
		||||
                            alloc.x2, alloc.y2);
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Translatable strings, `environment.js`
 | 
			
		||||
Translatable strings, `environment.js`
 | 
			
		||||
--------------------------------------
 | 
			
		||||
 | 
			
		||||
We use gettext to translate the GNOME Shell into all the languages that GNOME
 | 
			
		||||
supports. The `gettext` function is aliased globally as `_`, you do not need to
 | 
			
		||||
@@ -197,7 +204,8 @@ and "double quotes" for strings that the user may see. This allows us to
 | 
			
		||||
quickly find untranslated or mistranslated strings by grepping through the
 | 
			
		||||
sources for double quotes without a gettext call around them.
 | 
			
		||||
 | 
			
		||||
## `actor` and `_delegate`
 | 
			
		||||
`actor` and `_delegate`
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
gjs allows us to set so-called "expando properties" on introspected objects,
 | 
			
		||||
allowing us to treat them like any other. Because the Shell was built before
 | 
			
		||||
@@ -206,7 +214,7 @@ that has a property called `actor`. We call this wrapper class the "delegate".
 | 
			
		||||
 | 
			
		||||
We sometimes use expando properties to set a property called `_delegate` on
 | 
			
		||||
the actor itself:
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
    var MyClass = new Lang.Class({
 | 
			
		||||
        Name: 'MyClass',
 | 
			
		||||
 | 
			
		||||
@@ -221,7 +229,6 @@ the actor itself:
 | 
			
		||||
            actor.set_label("You clicked the button!");
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The 'delegate' property is important for anything which trying to get the
 | 
			
		||||
delegate object from an associated actor. For instance, the drag and drop
 | 
			
		||||
@@ -229,14 +236,16 @@ system calls the `handleDragOver` function on the delegate of a "drop target"
 | 
			
		||||
when the user drags an item over it. If you do not set the `_delegate`
 | 
			
		||||
property, your actor will not be able to be dropped onto.
 | 
			
		||||
 | 
			
		||||
## Functional style
 | 
			
		||||
Functional style
 | 
			
		||||
----------------
 | 
			
		||||
 | 
			
		||||
JavaScript Array objects offer a lot of common functional programming
 | 
			
		||||
capabilities such as forEach, map, filter and so on. You can use these when
 | 
			
		||||
they make sense, but please don't have a spaghetti mess of function programming
 | 
			
		||||
messed in a procedural style. Use your best judgment.
 | 
			
		||||
 | 
			
		||||
## Closures
 | 
			
		||||
Closures
 | 
			
		||||
--------
 | 
			
		||||
 | 
			
		||||
`this` will not be captured in a closure, it is relative to how the closure is
 | 
			
		||||
invoked, not to the value of this where the closure is created, because "this"
 | 
			
		||||
@@ -245,16 +254,15 @@ variable that can be captured in closures.
 | 
			
		||||
 | 
			
		||||
All closures should be wrapped with Function.prototype.bind or use arrow
 | 
			
		||||
notation.
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
    const Lang = imports.lang;
 | 
			
		||||
 | 
			
		||||
    let closure1 = () => { this._fnorbate(); };
 | 
			
		||||
    let closure2 = this._fnorbate.bind(this);
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
A more realistic example would be connecting to a signal on a method of a
 | 
			
		||||
prototype:
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
    const Lang = imports.lang;
 | 
			
		||||
    const FnorbLib = imports.fborbLib;
 | 
			
		||||
 | 
			
		||||
@@ -268,21 +276,19 @@ prototype:
 | 
			
		||||
            this._updateFnorb();
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Object literal syntax
 | 
			
		||||
Object literal syntax
 | 
			
		||||
---------------------
 | 
			
		||||
 | 
			
		||||
In JavaScript, these are equivalent:
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
    foo = { 'bar': 42 };
 | 
			
		||||
    foo = { bar: 42 };
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
and so are these:
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
    var b = foo['bar'];
 | 
			
		||||
    var b = foo.bar;
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
If your usage of an object is like an object, then you're defining "member
 | 
			
		||||
variables." For member variables, use the no-quotes no-brackets syntax: `{ bar:
 | 
			
		||||
@@ -292,13 +298,14 @@ If your usage of an object is like a hash table (and thus conceptually the keys
 | 
			
		||||
can have special chars in them), don't use quotes, but use brackets: `{ bar: 42
 | 
			
		||||
}`, `foo['bar']`.
 | 
			
		||||
 | 
			
		||||
## Getters, setters, and Tweener
 | 
			
		||||
Getters, setters, and Tweener
 | 
			
		||||
-----------------------------
 | 
			
		||||
 | 
			
		||||
Getters and setters should be used when you are dealing with an API that is
 | 
			
		||||
designed around setting properties, like Tweener. If you want to animate an
 | 
			
		||||
arbitrary property, create a getter and setter, and use Tweener to animate the
 | 
			
		||||
property.
 | 
			
		||||
```javascript
 | 
			
		||||
 | 
			
		||||
    var ANIMATION_TIME = 2000;
 | 
			
		||||
 | 
			
		||||
    var MyClass = new Lang.Class({
 | 
			
		||||
@@ -324,4 +331,3 @@ property.
 | 
			
		||||
                     { position: 100,
 | 
			
		||||
                       time: ANIMATION_TIME,
 | 
			
		||||
                       transition: 'easeOutQuad' });
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										7
									
								
								MAINTAINERS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								MAINTAINERS
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
Owen Taylor
 | 
			
		||||
E-mail: otaylor@redhat.com
 | 
			
		||||
Userid: otaylor
 | 
			
		||||
 | 
			
		||||
Colin Walters
 | 
			
		||||
E-mail: walters@verbum.org
 | 
			
		||||
Userid: walters
 | 
			
		||||
							
								
								
									
										34
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,34 +1,30 @@
 | 
			
		||||
3.29.2
 | 
			
		||||
3.28.3
 | 
			
		||||
======
 | 
			
		||||
* Guard against untimely keyboard map changes [Carlos; #240]
 | 
			
		||||
* Fix icons in search provider results [Florian; #249]
 | 
			
		||||
* Fix blurriness of OSD under some resolutions [Silvère; #782011]
 | 
			
		||||
* Fix lagging pointer when zoomed [Daniel; #682013]
 | 
			
		||||
* Misc. bug fixes [Milan, Xiaoguang, Florian, Mario, Ole; #244, #787871,
 | 
			
		||||
  #781471, #136, #214, #294]
 | 
			
		||||
* Fix "Clear All" for calendar events [Florian; #325]
 | 
			
		||||
* Misc. bug fixes [Florian, Mario, Marco; #136, #214, #788931, #791233]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Ole Jørgen Brønner, Milan Crha, Carlos Garnacho, Yussuf Khalil,
 | 
			
		||||
  Silvère Latchurié, Florian Müllner, Mario Sanchez Prada, Ray Strode,
 | 
			
		||||
  Daniel van Vugt, Xiaoguang Wang
 | 
			
		||||
  Carlos Garnacho, Florian Müllner, Mario Sanchez Prada, Joe Rabinoff,
 | 
			
		||||
  Didier Roche, Marco Trevisan (Treviño), Daniel van Vugt
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Rafael Fontenelle [pt_BR], Kukuh Syafaat [id], Marcos Lans [gl],
 | 
			
		||||
  Anders Jonsson [sv], Mingcong Bai [zh_CN]
 | 
			
		||||
  Pieter Schalk Schoeman [af], Gun Chleoc [gd]
 | 
			
		||||
 | 
			
		||||
3.29.1
 | 
			
		||||
3.28.2
 | 
			
		||||
======
 | 
			
		||||
* Support icons in app-menu [Florian; #760985]
 | 
			
		||||
* Misc. bug fixes [Marco, Florian, Lubomir; #792687, #221, !63]
 | 
			
		||||
* Fix lock-up on cancelling polkit dialog [Florian; #221]
 | 
			
		||||
* Guard against untimely keyboard map changes [Carlos; #240]
 | 
			
		||||
* Fix blurriness of OSD under some resolutions [Silvère; #782011]
 | 
			
		||||
* Fix icons in search provider results [Florian; #249]
 | 
			
		||||
* Misc. bug fixes [Marco, Florian; #792687, #781471]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Piotr Drąg, Takao Fujiwara, Christian Kellner, Florian Müllner,
 | 
			
		||||
  Mario Sanchez Prada, Lubomir Rintel, Didier Roche, Marco Trevisan (Treviño),
 | 
			
		||||
  verdre
 | 
			
		||||
  Carlos Garnacho, Silvère Latchurié, Florian Müllner, Mario Sanchez Prada,
 | 
			
		||||
  Ray Strode, Marco Trevisan (Treviño)
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  gogo [hr], Stas Solovey [ru], Matej Urbančič [sl], Daniel Șerbănescu [ro],
 | 
			
		||||
  Fabio Tomat [fur], Marek Cernocky [cs], Daniel Mustieles [es]
 | 
			
		||||
  Stas Solovey [ru], Rafael Fontenelle [pt_BR]
 | 
			
		||||
 | 
			
		||||
3.28.1
 | 
			
		||||
======
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,3 @@
 | 
			
		||||
# GNOME Shell
 | 
			
		||||
GNOME Shell provides core user interface functions for the GNOME 3 desktop,
 | 
			
		||||
like switching to windows and launching applications. GNOME Shell takes
 | 
			
		||||
advantage of the capabilities of modern graphics hardware and introduces
 | 
			
		||||
@@ -7,14 +6,15 @@ easy to use experience.
 | 
			
		||||
 | 
			
		||||
For more information about GNOME Shell, including instructions on how
 | 
			
		||||
to build GNOME Shell from source and how to get involved with the project,
 | 
			
		||||
see the [project wiki][wiki]
 | 
			
		||||
see:
 | 
			
		||||
 | 
			
		||||
Bugs should be reported to the GNOME [bug tracking system][bug-tracker].
 | 
			
		||||
 https://wiki.gnome.org/Projects/GnomeShell
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
Bugs should be reported at http://bugzilla.gnome.org against the 'gnome-shell'
 | 
			
		||||
product.
 | 
			
		||||
 | 
			
		||||
License
 | 
			
		||||
=======
 | 
			
		||||
GNOME Shell is distributed under the terms of the GNU General Public License,
 | 
			
		||||
version 2 or later. See the [COPYING][license] file for details.
 | 
			
		||||
version 2 or later. See the COPYING file for details.
 | 
			
		||||
 | 
			
		||||
[project-wiki]: https://wiki.gnome.org/Projects/GnomeShell
 | 
			
		||||
[bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell/issues
 | 
			
		||||
[license]: COPYING
 | 
			
		||||
@@ -4,14 +4,14 @@ the extensions repository to provide good integration, letting the website
 | 
			
		||||
know which extensions are enabled and disabled, and allowing the website to
 | 
			
		||||
enable, disable and install them.
 | 
			
		||||
 | 
			
		||||
Bugs should be reported to the GNOME [bug tracking system][bug-tracker].
 | 
			
		||||
Bugs should be reported at http://bugzilla.gnome.org against the 'gnome-shell'
 | 
			
		||||
product.
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
License
 | 
			
		||||
=======
 | 
			
		||||
The GNOME Shell Browser Plugin, like GNOME Shell itself is distributed under
 | 
			
		||||
the GNU General Public License, version 2 or later. The plugin also contains
 | 
			
		||||
header files from the "NPAPI SDK" project, tri-licensed under MPL 1.1, GPL 2.0
 | 
			
		||||
and LGPL 2.1. These headers are third-party sources and can be retrieved from:
 | 
			
		||||
 | 
			
		||||
  http://code.google.com/p/npapi-sdk/
 | 
			
		||||
 | 
			
		||||
[bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell/issues
 | 
			
		||||
@@ -39,7 +39,7 @@
 | 
			
		||||
      </description>
 | 
			
		||||
    </key>
 | 
			
		||||
    <key name="favorite-apps" type="as">
 | 
			
		||||
      <default>[ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
 | 
			
		||||
      <default>[ 'firefox.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
 | 
			
		||||
      <summary>List of desktop file IDs for favorite applications</summary>
 | 
			
		||||
      <description>
 | 
			
		||||
        The applications corresponding to these identifiers
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								data/theme/HACKING
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								data/theme/HACKING
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
To generate the css files, from the project directory:
 | 
			
		||||
 | 
			
		||||
sass --sourcemap=none --update .
 | 
			
		||||
							
								
								
									
										31
									
								
								data/theme/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								data/theme/README
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
Summary
 | 
			
		||||
-------
 | 
			
		||||
 | 
			
		||||
* Do not edit the CSS directly, edit the source SCSS files and the CSS files will be generated
 | 
			
		||||
  automatically when building with meson + ninja and left inside the build directory to be
 | 
			
		||||
  incorporated into the gresource XML (you'll need to have sassc installed).
 | 
			
		||||
 | 
			
		||||
How to tweak the theme
 | 
			
		||||
----------------------
 | 
			
		||||
 | 
			
		||||
Adwaita is a complex theme, so to keep it maintainable it's written and processed in SASS, the
 | 
			
		||||
generated CSS is then transformed into a gresource file during gtk build and used at runtime in a 
 | 
			
		||||
non-legible or editable form.
 | 
			
		||||
 | 
			
		||||
It is very likely your change will happen in the _common.scss file. That's where all the widget 
 | 
			
		||||
selectors are defined. Here's a rundown of the "supporting" stylesheets, that are unlikely to be the 
 | 
			
		||||
right place for a drive by stylesheet fix:
 | 
			
		||||
 | 
			
		||||
_colors.scss        - global color definitions. We keep the number of defined colors to a necessary minimum, 
 | 
			
		||||
                      most colors are derived from a handful of basics. It is an exact copy of the gtk+ 
 | 
			
		||||
                      counterpart. Light theme is used for the classic theme and dark is for GNOME3 shell 
 | 
			
		||||
                      default.
 | 
			
		||||
 | 
			
		||||
_drawing.scss       - drawing helper mixings/functions to allow easier definition of widget drawing under
 | 
			
		||||
                      specific context. This is why Adwaita isn't 15000 LOC.
 | 
			
		||||
 | 
			
		||||
_common.scss        - actual definitions of style for each widget. This is where you are likely to add/remove
 | 
			
		||||
                      your changes.
 | 
			
		||||
                      
 | 
			
		||||
You can read about SASS at http://sass-lang.com/documentation/. Once you make your changes to the
 | 
			
		||||
_common.scss file, you can run ninja to generate the final CSS files.
 | 
			
		||||
@@ -1,32 +0,0 @@
 | 
			
		||||
## Summary
 | 
			
		||||
 | 
			
		||||
Do not edit the CSS directly, edit the source SCSS files and the CSS files
 | 
			
		||||
will be generated automatically when building with meson + ninja and left
 | 
			
		||||
inside the build directory to be incorporated into the gresource XML (you'll
 | 
			
		||||
need to have sassc installed).
 | 
			
		||||
 | 
			
		||||
## How to tweak the theme
 | 
			
		||||
 | 
			
		||||
Adwaita is a complex theme, so to keep it maintainable it's written and
 | 
			
		||||
processed in SASS, the generated CSS is then transformed into a gresource
 | 
			
		||||
file during gtk build and used at runtime in a non-legible or editable form.
 | 
			
		||||
 | 
			
		||||
It is very likely your change will happen in the [_common.scss][common] file.
 | 
			
		||||
That's where all the widget selectors are defined. Here's a rundown of
 | 
			
		||||
the "supporting" stylesheets, that are unlikely to be the right place
 | 
			
		||||
for a drive by stylesheet fix:
 | 
			
		||||
 | 
			
		||||
| File                     | Description       |
 | 
			
		||||
| ------------------------ | ----------------- |
 | 
			
		||||
| [_colors.scss][colors]   | global color definitions. We keep the number of defined colors to a necessary minimum,  most colors are derived from a handful of basics. It is an exact copy of the gtk+ counterpart. Light theme is used for the classic theme and dark is for GNOME3 shell default. |
 | 
			
		||||
| [_drawing.scss][drawing] | drawing helper mixings/functions to allow easier definition of widget drawing under specific context. This is why Adwaita isn't 15000 LOC. |
 | 
			
		||||
| [_common.scss][common]   | actual definitions of style for each widget. This is where you are likely to add/remove your changes. |
 | 
			
		||||
 | 
			
		||||
You can read about SASS on its [web page][sass-web]. Once you make your
 | 
			
		||||
changes to the [_common.scss][common] file, you can run ninja to generate the
 | 
			
		||||
final CSS files.
 | 
			
		||||
 | 
			
		||||
[common]: data/theme/gnome-shell-sass/_common.scss
 | 
			
		||||
[colors]: data/theme/gnome-shell-sass/_colors.scss
 | 
			
		||||
[drawing]: data/theme/gnome-shell-sass/_drawing.scss
 | 
			
		||||
[sass-web]: http://sass-lang.com/documentation/
 | 
			
		||||
							
								
								
									
										6
									
								
								data/theme/gnome-shell-sass/HACKING
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								data/theme/gnome-shell-sass/HACKING
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
--- Generating the css file ---
 | 
			
		||||
 | 
			
		||||
You need sass to generate the css file.
 | 
			
		||||
 | 
			
		||||
To generate them run from a command line in the project directory:
 | 
			
		||||
sass --sourcemap=none --update ./
 | 
			
		||||
							
								
								
									
										7
									
								
								data/theme/gnome-shell-sass/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								data/theme/gnome-shell-sass/README
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
GNOME Shell Sass is a project intended to allow the sharing of the theme sources in sass between gnome-shell and other projects like gnome-shell-extensions.
 | 
			
		||||
 | 
			
		||||
License
 | 
			
		||||
=======
 | 
			
		||||
GNOME Shell Sass is distributed under the terms of the GNU General Public License,
 | 
			
		||||
version 2 or later. See the COPYING file for details.
 | 
			
		||||
 | 
			
		||||
@@ -1,16 +0,0 @@
 | 
			
		||||
# GNOME Shell Sass
 | 
			
		||||
GNOME Shell Sass is a project intended to allow the sharing of the
 | 
			
		||||
theme sources in sass between gnome-shell and other projects like
 | 
			
		||||
gnome-shell-extensions.
 | 
			
		||||
 | 
			
		||||
Any changes should be done in the [GNOME Shell subtree][shell-subtree]
 | 
			
		||||
and not the stand-alone [gnome-shell-sass repository][sass-repo]. They
 | 
			
		||||
will then be synchronized periodically before releases.
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
GNOME Shell Sass is distributed under the terms of the GNU General Public
 | 
			
		||||
License, version 2 or later. See the [COPYING][license] file for details.
 | 
			
		||||
 | 
			
		||||
[shell-subtree]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/master/data/theme/gnome-shell-sass
 | 
			
		||||
[sass-repo]: https://gitlab.gnome.org/GNOME/gnome-shell-sass
 | 
			
		||||
[license]: COPYING
 | 
			
		||||
@@ -824,6 +824,8 @@ StScrollBar {
 | 
			
		||||
 | 
			
		||||
  .screencast-indicator { color: $warning_color; }
 | 
			
		||||
 | 
			
		||||
  .remote-access-indicator { color: $warning_color; }
 | 
			
		||||
 | 
			
		||||
  &.solid {
 | 
			
		||||
    background-color: black;
 | 
			
		||||
    /* transition from transparent to solid */
 | 
			
		||||
@@ -1788,19 +1790,20 @@ StScrollBar {
 | 
			
		||||
  .login-dialog-user-list-view { -st-vfade-offset: 1em; }
 | 
			
		||||
  .login-dialog-user-list {
 | 
			
		||||
    spacing: 12px;
 | 
			
		||||
    padding: .2em;
 | 
			
		||||
    width: 23em;
 | 
			
		||||
    &:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; }
 | 
			
		||||
    &:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; }
 | 
			
		||||
  }
 | 
			
		||||
  .login-dialog-user-list-item {
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
    padding: 6px;
 | 
			
		||||
    padding: .2em;
 | 
			
		||||
    color: darken($osd_fg_color,30%);
 | 
			
		||||
    &:ltr .user-widget { padding-right: 1em; }
 | 
			
		||||
    &:rtl .user-widget { padding-left: 1em; }
 | 
			
		||||
    &:ltr { padding-right: 1em; }
 | 
			
		||||
    &:rtl { padding-left: 1em; }
 | 
			
		||||
    .login-dialog-timed-login-indicator {
 | 
			
		||||
      height: 2px;
 | 
			
		||||
      margin-top: 6px;
 | 
			
		||||
      margin: 2px 0 0 0;
 | 
			
		||||
      background-color: $osd_fg_color;
 | 
			
		||||
    }
 | 
			
		||||
    &:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; }
 | 
			
		||||
@@ -1815,8 +1818,8 @@ StScrollBar {
 | 
			
		||||
    padding-left: 15px;
 | 
			
		||||
  }
 | 
			
		||||
    .user-widget-label {
 | 
			
		||||
      &:ltr { padding-left: 14px; }
 | 
			
		||||
      &:rtl { padding-right: 14px; }
 | 
			
		||||
      &:ltr { padding-left: 18px; }
 | 
			
		||||
      &:rtl { padding-right: 18px; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  .login-dialog-prompt-layout {
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@ const GLib = imports.gi.GLib;
 | 
			
		||||
const GObject = imports.gi.GObject;
 | 
			
		||||
const Gtk = imports.gi.Gtk;
 | 
			
		||||
const Lang = imports.lang;
 | 
			
		||||
const Mainloop = imports.mainloop;
 | 
			
		||||
const Meta = imports.gi.Meta;
 | 
			
		||||
const Pango = imports.gi.Pango;
 | 
			
		||||
const Shell = imports.gi.Shell;
 | 
			
		||||
@@ -85,8 +86,7 @@ var UserListItem = new Lang.Class({
 | 
			
		||||
                                             GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
 | 
			
		||||
        this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator',
 | 
			
		||||
                                                 scale_x: 0,
 | 
			
		||||
                                                 visible: false });
 | 
			
		||||
                                                 scale_x: 0 });
 | 
			
		||||
        layout.add(this._timedLoginIndicator);
 | 
			
		||||
 | 
			
		||||
        this.actor.connect('clicked', this._onClicked.bind(this));
 | 
			
		||||
@@ -126,8 +126,6 @@ var UserListItem = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        this.hideTimedLoginIndicator();
 | 
			
		||||
 | 
			
		||||
        this._timedLoginIndicator.visible = true;
 | 
			
		||||
 | 
			
		||||
        let startTime = GLib.get_monotonic_time();
 | 
			
		||||
 | 
			
		||||
        this._timedLoginTimeoutId = GLib.timeout_add (GLib.PRIORITY_DEFAULT, 33,
 | 
			
		||||
@@ -154,8 +152,6 @@ var UserListItem = new Lang.Class({
 | 
			
		||||
            GLib.source_remove(this._timedLoginTimeoutId);
 | 
			
		||||
            this._timedLoginTimeoutId = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._timedLoginIndicator.visible = false;
 | 
			
		||||
        this._timedLoginIndicator.scale_x = 0.;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
@@ -995,81 +991,59 @@ var LoginDialog = new Lang.Class({
 | 
			
		||||
        return hold;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _showTimedLoginAnimation() {
 | 
			
		||||
        this._timedLoginItem.actor.grab_key_focus();
 | 
			
		||||
        return this._timedLoginItem.showTimedLoginIndicator(this._timedLoginAnimationTime);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _blockTimedLoginUntilIdle() {
 | 
			
		||||
        // This blocks timed login from starting until a few
 | 
			
		||||
        // seconds after the user stops interacting with the
 | 
			
		||||
        // login screen.
 | 
			
		||||
        //
 | 
			
		||||
        // We skip this step if the timed login delay is very
 | 
			
		||||
        // short.
 | 
			
		||||
        if ((this._timedLoginDelay - _TIMED_LOGIN_IDLE_THRESHOLD) <= 0)
 | 
			
		||||
          return null;
 | 
			
		||||
 | 
			
		||||
        let hold = new Batch.Hold();
 | 
			
		||||
 | 
			
		||||
        this._timedLoginIdleTimeOutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, _TIMED_LOGIN_IDLE_THRESHOLD,
 | 
			
		||||
        this._timedLoginIdleTimeOutId = Mainloop.timeout_add_seconds(_TIMED_LOGIN_IDLE_THRESHOLD,
 | 
			
		||||
            () => {
 | 
			
		||||
                this._timedLoginIdleTimeOutId = 0;
 | 
			
		||||
                this._timedLoginAnimationTime -= _TIMED_LOGIN_IDLE_THRESHOLD;
 | 
			
		||||
                hold.release();
 | 
			
		||||
                return GLib.SOURCE_REMOVE;
 | 
			
		||||
            });
 | 
			
		||||
        GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginIdleTimeOutId');
 | 
			
		||||
        GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginAnimationTime');
 | 
			
		||||
        return hold;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _startTimedLogin(userName, delay) {
 | 
			
		||||
        let firstRun = true;
 | 
			
		||||
 | 
			
		||||
        // Cancel execution of old batch
 | 
			
		||||
        if (this._timedLoginBatch) {
 | 
			
		||||
            this._timedLoginBatch.cancel();
 | 
			
		||||
            this._timedLoginBatch = null;
 | 
			
		||||
            firstRun = false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Reset previous idle-timeout
 | 
			
		||||
        if (this._timedLoginIdleTimeOutId) {
 | 
			
		||||
            GLib.source_remove(this._timedLoginIdleTimeOutId);
 | 
			
		||||
            this._timedLoginIdleTimeOutId = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        let loginItem = null;
 | 
			
		||||
        let animationTime;
 | 
			
		||||
        this._timedLoginItem = null;
 | 
			
		||||
        this._timedLoginDelay = delay;
 | 
			
		||||
        this._timedLoginAnimationTime = delay;
 | 
			
		||||
 | 
			
		||||
        let tasks = [() => this._waitForItemForUser(userName),
 | 
			
		||||
 | 
			
		||||
                     () => {
 | 
			
		||||
                         loginItem = this._userList.getItemFromUserName(userName);
 | 
			
		||||
 | 
			
		||||
                         // If there is an animation running on the item, reset it.
 | 
			
		||||
                         loginItem.hideTimedLoginIndicator();
 | 
			
		||||
                         this._timedLoginItem = this._userList.getItemFromUserName(userName);
 | 
			
		||||
                     },
 | 
			
		||||
 | 
			
		||||
                     () => {
 | 
			
		||||
                         // If we're just starting out, start on the right item.
 | 
			
		||||
                         // If we're just starting out, start on the right
 | 
			
		||||
                         // item.
 | 
			
		||||
                         if (!this._userManager.is_loaded) {
 | 
			
		||||
                             this._userList.jumpToItem(loginItem);
 | 
			
		||||
                             this._userList.jumpToItem(this._timedLoginItem);
 | 
			
		||||
                         }
 | 
			
		||||
                     },
 | 
			
		||||
 | 
			
		||||
                     this._blockTimedLoginUntilIdle,
 | 
			
		||||
 | 
			
		||||
                     () => {
 | 
			
		||||
                         // This blocks the timed login animation until a few
 | 
			
		||||
                         // seconds after the user stops interacting with the
 | 
			
		||||
                         // login screen.
 | 
			
		||||
 | 
			
		||||
                         // We skip this step if the timed login delay is very short.
 | 
			
		||||
                         if (delay > _TIMED_LOGIN_IDLE_THRESHOLD) {
 | 
			
		||||
                             animationTime = delay - _TIMED_LOGIN_IDLE_THRESHOLD;
 | 
			
		||||
                             return this._blockTimedLoginUntilIdle();
 | 
			
		||||
                         } else {
 | 
			
		||||
                             animationTime = delay;
 | 
			
		||||
                         }
 | 
			
		||||
                         this._userList.scrollToItem(this._timedLoginItem);
 | 
			
		||||
                     },
 | 
			
		||||
 | 
			
		||||
                     () => {
 | 
			
		||||
                         // If idle timeout is done, make sure the timed login indicator is shown
 | 
			
		||||
                         if (delay > _TIMED_LOGIN_IDLE_THRESHOLD &&
 | 
			
		||||
                             this._authPrompt.actor.visible)
 | 
			
		||||
                             this._authPrompt.cancel();
 | 
			
		||||
 | 
			
		||||
                         if (delay > _TIMED_LOGIN_IDLE_THRESHOLD || firstRun) {
 | 
			
		||||
                             this._userList.scrollToItem(loginItem);
 | 
			
		||||
                             loginItem.actor.grab_key_focus();
 | 
			
		||||
                         }
 | 
			
		||||
                     },
 | 
			
		||||
 | 
			
		||||
                     () => loginItem.showTimedLoginIndicator(animationTime),
 | 
			
		||||
                     this._showTimedLoginAnimation,
 | 
			
		||||
 | 
			
		||||
                     () => {
 | 
			
		||||
                         this._timedLoginBatch = null;
 | 
			
		||||
@@ -1081,17 +1055,37 @@ var LoginDialog = new Lang.Class({
 | 
			
		||||
        return this._timedLoginBatch.run();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _onTimedLoginRequested(client, userName, seconds) {
 | 
			
		||||
        if (this._timedLoginBatch)
 | 
			
		||||
            return;
 | 
			
		||||
    _resetTimedLogin() {
 | 
			
		||||
        if (this._timedLoginBatch) {
 | 
			
		||||
            this._timedLoginBatch.cancel();
 | 
			
		||||
            this._timedLoginBatch = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (this._timedLoginItem)
 | 
			
		||||
            this._timedLoginItem.hideTimedLoginIndicator();
 | 
			
		||||
 | 
			
		||||
        let userName = this._timedLoginItem.user.get_user_name();
 | 
			
		||||
 | 
			
		||||
        if (userName)
 | 
			
		||||
            this._startTimedLogin(userName, this._timedLoginDelay);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _onTimedLoginRequested(client, userName, seconds) {
 | 
			
		||||
        this._startTimedLogin(userName, seconds);
 | 
			
		||||
 | 
			
		||||
        // Restart timed login on user interaction
 | 
			
		||||
        global.stage.connect('captured-event', (actor, event) => {
 | 
			
		||||
           if (this._timedLoginDelay == undefined)
 | 
			
		||||
               return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 | 
			
		||||
           if (event.type() == Clutter.EventType.KEY_PRESS ||
 | 
			
		||||
               event.type() == Clutter.EventType.BUTTON_PRESS) {
 | 
			
		||||
               this._startTimedLogin(userName, seconds);
 | 
			
		||||
               if (this._timedLoginBatch) {
 | 
			
		||||
                   this._timedLoginBatch.cancel();
 | 
			
		||||
                   this._timedLoginBatch = null;
 | 
			
		||||
               }
 | 
			
		||||
           } else if (event.type() == Clutter.EventType.KEY_RELEASE ||
 | 
			
		||||
                      event.type() == Clutter.EventType.BUTTON_RELEASE) {
 | 
			
		||||
               this._resetTimedLogin();
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
           return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 
 | 
			
		||||
@@ -130,6 +130,7 @@
 | 
			
		||||
    <file>ui/status/rfkill.js</file>
 | 
			
		||||
    <file>ui/status/volume.js</file>
 | 
			
		||||
    <file>ui/status/bluetooth.js</file>
 | 
			
		||||
    <file>ui/status/remoteAccess.js</file>
 | 
			
		||||
    <file>ui/status/screencast.js</file>
 | 
			
		||||
    <file>ui/status/system.js</file>
 | 
			
		||||
    <file>ui/status/thunderbolt.js</file>
 | 
			
		||||
 
 | 
			
		||||
@@ -115,6 +115,11 @@ var IBusManager = new Lang.Class({
 | 
			
		||||
                                                         object_path: IBus.PATH_PANEL });
 | 
			
		||||
            this._candidatePopup.setPanelService(this._panelService);
 | 
			
		||||
            this._panelService.connect('update-property', this._updateProperty.bind(this));
 | 
			
		||||
            this._panelService.connect('set-cursor-location', (ps, x, y, w, h) => {
 | 
			
		||||
                let cursorLocation = { x, y, width: w, height: h };
 | 
			
		||||
                this.emit('set-cursor-location', cursorLocation);
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            try {
 | 
			
		||||
                // IBus versions older than 1.5.10 have a bug which
 | 
			
		||||
                // causes spurious set-content-type emissions when
 | 
			
		||||
 
 | 
			
		||||
@@ -136,7 +136,8 @@ function run() {
 | 
			
		||||
    global.frame_finish_timestamp = true;
 | 
			
		||||
 | 
			
		||||
    for (let k = 0; k < 5; k++)
 | 
			
		||||
        yield Scripting.createTestWindow({ maximized: true });
 | 
			
		||||
        yield Scripting.createTestWindow(640, 480,
 | 
			
		||||
                                         { maximized: true });
 | 
			
		||||
    yield Scripting.waitTestWindows();
 | 
			
		||||
 | 
			
		||||
    yield Scripting.sleep(1000);
 | 
			
		||||
@@ -157,7 +158,8 @@ function run() {
 | 
			
		||||
    yield Scripting.destroyTestWindows();
 | 
			
		||||
    Main.overview.hide();
 | 
			
		||||
 | 
			
		||||
    yield Scripting.createTestWindow({ maximized: true,
 | 
			
		||||
    yield Scripting.createTestWindow(640, 480,
 | 
			
		||||
                                     { maximized: true,
 | 
			
		||||
                                       redraws: true});
 | 
			
		||||
    yield Scripting.waitTestWindows();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -41,6 +41,7 @@ const RENAMED_DESKTOP_IDS = {
 | 
			
		||||
    'gnotravex.desktop': 'gnome-tetravex.desktop',
 | 
			
		||||
    'gnotski.desktop': 'gnome-klotski.desktop',
 | 
			
		||||
    'gtali.desktop': 'tali.desktop',
 | 
			
		||||
    'mozilla-firefox.desktop': 'firefox.desktop',
 | 
			
		||||
    'nautilus.desktop': 'org.gnome.Nautilus.desktop',
 | 
			
		||||
    'polari.desktop': 'org.gnome.Polari.desktop',
 | 
			
		||||
    'totem.desktop': 'org.gnome.Totem.desktop',
 | 
			
		||||
 
 | 
			
		||||
@@ -264,7 +264,7 @@ var Background = new Lang.Class({
 | 
			
		||||
            (lm, aboutToSuspend) => {
 | 
			
		||||
                if (aboutToSuspend)
 | 
			
		||||
                    return;
 | 
			
		||||
                this._refreshAnimation();
 | 
			
		||||
                this.emit('changed');
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        this._settingsChangedSignalId = this._settings.connect('changed', () => {
 | 
			
		||||
 
 | 
			
		||||
@@ -821,6 +821,8 @@ var EventsSection = new Lang.Class({
 | 
			
		||||
        this._desktopSettings.connect('changed', this._reloadEvents.bind(this));
 | 
			
		||||
        this._eventSource = new EmptyEventSource();
 | 
			
		||||
 | 
			
		||||
        this._messageById = new Map();
 | 
			
		||||
 | 
			
		||||
        this.parent();
 | 
			
		||||
 | 
			
		||||
        this._title = new St.Button({ style_class: 'events-section-title',
 | 
			
		||||
@@ -875,20 +877,32 @@ var EventsSection = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        this._reloading = true;
 | 
			
		||||
 | 
			
		||||
        this._list.destroy_all_children();
 | 
			
		||||
 | 
			
		||||
        let periodBegin = _getBeginningOfDay(this._date);
 | 
			
		||||
        let periodEnd = _getEndOfDay(this._date);
 | 
			
		||||
        let events = this._eventSource.getEvents(periodBegin, periodEnd);
 | 
			
		||||
 | 
			
		||||
        let ids = events.map(e => e.id);
 | 
			
		||||
        this._messageById.forEach((message, id) => {
 | 
			
		||||
            if (ids.includes(id))
 | 
			
		||||
                return;
 | 
			
		||||
            this._messageById.delete(id);
 | 
			
		||||
            this.removeMessage(message);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        for (let i = 0; i < events.length; i++) {
 | 
			
		||||
            let event = events[i];
 | 
			
		||||
 | 
			
		||||
            let message = new EventMessage(event, this._date);
 | 
			
		||||
            message.connect('close', () => {
 | 
			
		||||
                this._ignoreEvent(event);
 | 
			
		||||
            });
 | 
			
		||||
            this.addMessage(message, false);
 | 
			
		||||
            let message = this._messageById.get(event.id);
 | 
			
		||||
            if (!message) {
 | 
			
		||||
                message = new EventMessage(event, this._date);
 | 
			
		||||
                message.connect('close', () => {
 | 
			
		||||
                    this._ignoreEvent(event);
 | 
			
		||||
                });
 | 
			
		||||
                this._messageById.set(event.id, message);
 | 
			
		||||
                this.addMessage(message, false);
 | 
			
		||||
            } else {
 | 
			
		||||
                this.moveMessage(message, i, false);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._reloading = false;
 | 
			
		||||
 
 | 
			
		||||
@@ -604,17 +604,12 @@ var NetworkAgent = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        this._native.connect('new-request', this._newRequest.bind(this));
 | 
			
		||||
        this._native.connect('cancel-request', this._cancelRequest.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._initialized = false;
 | 
			
		||||
        this._native.init_async(GLib.PRIORITY_DEFAULT, null, (o, res) => {
 | 
			
		||||
            try {
 | 
			
		||||
                this._native.init_finish(res);
 | 
			
		||||
                this._initialized = true;
 | 
			
		||||
            } catch(e) {
 | 
			
		||||
                this._native = null;
 | 
			
		||||
                logError(e, 'error initializing the NetworkManager Agent');
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        try {
 | 
			
		||||
            this._native.init(null);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            this._native = null;
 | 
			
		||||
            logError(e, 'error initializing the NetworkManager Agent');
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    enable() {
 | 
			
		||||
@@ -622,7 +617,7 @@ var NetworkAgent = new Lang.Class({
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._native.auto_register = true;
 | 
			
		||||
        if (this._initialized && !this._native.registered)
 | 
			
		||||
        if (!this._native.registered)
 | 
			
		||||
            this._native.register_async(null, null);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
@@ -645,7 +640,7 @@ var NetworkAgent = new Lang.Class({
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._native.auto_register = false;
 | 
			
		||||
        if (this._initialized && this._native.registered)
 | 
			
		||||
        if (this._native.registered)
 | 
			
		||||
            this._native.unregister_async(null, null);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -166,7 +166,7 @@ var CandidatePopup = new Lang.Class({
 | 
			
		||||
            this._panelService.cursor_down();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._candidateArea.connect('candidate-clicked', (area, index, button, state) => {
 | 
			
		||||
        this._candidateArea.connect('candidate-clicked', () => {
 | 
			
		||||
            this._panelService.candidate_clicked(index, button, state);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const FocusCaretTracker = imports.ui.focusCaretTracker;
 | 
			
		||||
const Atspi = imports.gi.Atspi;
 | 
			
		||||
const Clutter = imports.gi.Clutter;
 | 
			
		||||
const Gdk = imports.gi.Gdk;
 | 
			
		||||
@@ -13,6 +12,7 @@ const Signals = imports.signals;
 | 
			
		||||
const St = imports.gi.St;
 | 
			
		||||
const InputSourceManager = imports.ui.status.keyboard;
 | 
			
		||||
 | 
			
		||||
const IBusManager = imports.misc.ibusManager;
 | 
			
		||||
const BoxPointer = imports.ui.boxpointer;
 | 
			
		||||
const Layout = imports.ui.layout;
 | 
			
		||||
const Main = imports.ui.main;
 | 
			
		||||
@@ -261,6 +261,7 @@ var Key = new Lang.Class({
 | 
			
		||||
        this._extended_keyboard = null;
 | 
			
		||||
        this._pressTimeoutId = 0;
 | 
			
		||||
        this._capturedPress = false;
 | 
			
		||||
 | 
			
		||||
        this._capturedEventId = 0;
 | 
			
		||||
        this._unmapId = 0;
 | 
			
		||||
        this._longPress = false;
 | 
			
		||||
@@ -484,6 +485,71 @@ var KeyboardModel = new Lang.Class({
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
var FocusTracker = new Lang.Class({
 | 
			
		||||
    Name: 'FocusTracker',
 | 
			
		||||
 | 
			
		||||
    _init() {
 | 
			
		||||
        this._currentWindow = null;
 | 
			
		||||
        this._currentWindowPositionId = 0;
 | 
			
		||||
 | 
			
		||||
        global.screen.get_display().connect('notify::focus-window', () => {
 | 
			
		||||
            this._setCurrentWindow(global.screen.get_display().focus_window);
 | 
			
		||||
            this.emit('window-changed', this._currentWindow);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        /* Valid for wayland clients */
 | 
			
		||||
        Main.inputMethod.connect('cursor-location-changed', (o, rect) => {
 | 
			
		||||
            let newRect = { x: rect.get_x(), y: rect.get_y(), width: rect.get_width(), height: rect.get_height() };
 | 
			
		||||
            this._setCurrentRect(newRect);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._ibusManager = IBusManager.getIBusManager();
 | 
			
		||||
        this._ibusManager.connect('set-cursor-location', (manager, rect) => {
 | 
			
		||||
            /* Valid for X11 clients only */
 | 
			
		||||
            if (Main.inputMethod.currentFocus)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            this._setCurrentRect(rect);
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get currentWindow() {
 | 
			
		||||
        return this._currentWindow;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _setCurrentWindow(window) {
 | 
			
		||||
        if (this._currentWindow)
 | 
			
		||||
            this._currentWindow.disconnect(this._currentWindowPositionId);
 | 
			
		||||
 | 
			
		||||
        this._currentWindow = window;
 | 
			
		||||
        if (window) {
 | 
			
		||||
            this._currentWindowPositionId = this._currentWindow.connect('position-changed', () => {
 | 
			
		||||
                if (global.display.get_grab_op() == Meta.GrabOp.NONE)
 | 
			
		||||
                    this.emit('position-changed');
 | 
			
		||||
                else
 | 
			
		||||
                    this.emit('reset');
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _setCurrentRect(rect) {
 | 
			
		||||
        let frameRect = this._currentWindow.get_frame_rect();
 | 
			
		||||
        rect.x -= frameRect.x;
 | 
			
		||||
        rect.y -= frameRect.y;
 | 
			
		||||
 | 
			
		||||
        this._rect = rect;
 | 
			
		||||
        this.emit('position-changed');
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getCurrentRect() {
 | 
			
		||||
        let frameRect = this._currentWindow.get_frame_rect();
 | 
			
		||||
        let rect = { x: this._rect.x + frameRect.x, y: this._rect.y + frameRect.y, width: this._rect.width, height: this._rect.height };
 | 
			
		||||
 | 
			
		||||
        return rect;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
Signals.addSignalMethods(FocusTracker.prototype);
 | 
			
		||||
 | 
			
		||||
var Keyboard = new Lang.Class({
 | 
			
		||||
    Name: 'Keyboard',
 | 
			
		||||
 | 
			
		||||
@@ -491,15 +557,10 @@ var Keyboard = new Lang.Class({
 | 
			
		||||
        this.actor = null;
 | 
			
		||||
        this._focusInExtendedKeys = false;
 | 
			
		||||
 | 
			
		||||
        this._focusCaretTracker = new FocusCaretTracker.FocusCaretTracker();
 | 
			
		||||
        this._focusCaretTracker.connect('focus-changed', this._onFocusChanged.bind(this));
 | 
			
		||||
        this._focusCaretTracker.connect('caret-moved', this._onCaretMoved.bind(this));
 | 
			
		||||
        this._languagePopup = null;
 | 
			
		||||
        this._currentAccessible = null;
 | 
			
		||||
        this._caretTrackingEnabled = false;
 | 
			
		||||
        this._updateCaretPositionId = 0;
 | 
			
		||||
        this._currentFocusWindow = null;
 | 
			
		||||
        this._originalWindowY = null;
 | 
			
		||||
        this._animFocusedWindow = null;
 | 
			
		||||
        this._delayedAnimFocusWindow = null;
 | 
			
		||||
 | 
			
		||||
        this._enableKeyboard = false; // a11y settings value
 | 
			
		||||
        this._enabled = false; // enabled state (by setting or device type)
 | 
			
		||||
@@ -510,6 +571,14 @@ var Keyboard = new Lang.Class({
 | 
			
		||||
        this._lastDeviceId = null;
 | 
			
		||||
        this._suggestions = null;
 | 
			
		||||
 | 
			
		||||
        this._focusTracker = new FocusTracker();
 | 
			
		||||
        this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this));
 | 
			
		||||
        this._focusTracker.connect('reset', () => {
 | 
			
		||||
            this._delayedAnimFocusWindow = null;
 | 
			
		||||
            this._animFocusedWindow = null;
 | 
			
		||||
            this._oskFocusWindow = null;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        Meta.get_backend().connect('last-device-changed', 
 | 
			
		||||
            (backend, deviceId) => {
 | 
			
		||||
                let manager = Clutter.DeviceManager.get_default();
 | 
			
		||||
@@ -532,102 +601,15 @@ var Keyboard = new Lang.Class({
 | 
			
		||||
        this._keyboardRestingId = 0;
 | 
			
		||||
 | 
			
		||||
        Main.layoutManager.connect('monitors-changed', this._relayout.bind(this));
 | 
			
		||||
        //Main.inputMethod.connect('cursor-location-changed', (o, rect) => {
 | 
			
		||||
        //    if (this._keyboardVisible) {
 | 
			
		||||
        //        let currentWindow = global.screen.get_display().focus_window;
 | 
			
		||||
        //        this.setCursorLocation(currentWindow, rect.get_x(), rect.get_y(),
 | 
			
		||||
        //                               rect.get_width(), rect.get_height());
 | 
			
		||||
        //    }
 | 
			
		||||
        //});
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get visible() {
 | 
			
		||||
        return this._keyboardVisible;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _setCaretTrackerEnabled(enabled) {
 | 
			
		||||
        if (this._caretTrackingEnabled == enabled)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._caretTrackingEnabled = enabled;
 | 
			
		||||
 | 
			
		||||
        if (enabled) {
 | 
			
		||||
            this._focusCaretTracker.registerFocusListener();
 | 
			
		||||
            this._focusCaretTracker.registerCaretListener();
 | 
			
		||||
        } else {
 | 
			
		||||
            this._focusCaretTracker.deregisterFocusListener();
 | 
			
		||||
            this._focusCaretTracker.deregisterCaretListener();
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _updateCaretPosition(accessible) {
 | 
			
		||||
        if (this._updateCaretPositionId)
 | 
			
		||||
            GLib.source_remove(this._updateCaretPositionId);
 | 
			
		||||
        if (!this._keyboardRequested)
 | 
			
		||||
            return;
 | 
			
		||||
        this._updateCaretPositionId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
 | 
			
		||||
            this._updateCaretPositionId = 0;
 | 
			
		||||
 | 
			
		||||
            let currentWindow = global.screen.get_display().focus_window;
 | 
			
		||||
            if (!currentWindow) {
 | 
			
		||||
                this.setCursorLocation(null);
 | 
			
		||||
                return GLib.SOURCE_REMOVE;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            let windowRect = currentWindow.get_frame_rect();
 | 
			
		||||
            let text = accessible.get_text_iface();
 | 
			
		||||
            let component = accessible.get_component_iface();
 | 
			
		||||
 | 
			
		||||
            try {
 | 
			
		||||
                let caretOffset = text.get_caret_offset();
 | 
			
		||||
                let caretRect = text.get_character_extents(caretOffset, Atspi.CoordType.WINDOW);
 | 
			
		||||
                let focusRect = component.get_extents(Atspi.CoordType.WINDOW);
 | 
			
		||||
 | 
			
		||||
                if (caretRect.width == 0 && caretRect.height == 0)
 | 
			
		||||
                    caretRect = focusRect;
 | 
			
		||||
 | 
			
		||||
                this.setCursorLocation(currentWindow, caretRect.x, caretRect.y, caretRect.width, caretRect.height);
 | 
			
		||||
            } catch (e) {
 | 
			
		||||
                log('Error updating caret position for OSK: ' + e.message);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return GLib.SOURCE_REMOVE;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        GLib.Source.set_name_by_id(this._updateCaretPositionId, '[gnome-shell] this._updateCaretPosition');
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _focusIsTextEntry(accessible) {
 | 
			
		||||
        try {
 | 
			
		||||
            let role = accessible.get_role();
 | 
			
		||||
            let stateSet = accessible.get_state_set();
 | 
			
		||||
            return stateSet.contains(Atspi.StateType.EDITABLE) || role == Atspi.Role.TERMINAL;
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
            log('Error determining accessible role: ' + e.message);
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _onFocusChanged(caretTracker, event) {
 | 
			
		||||
        let accessible = event.source;
 | 
			
		||||
        if (!this._focusIsTextEntry(accessible))
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let focused = event.detail1 != 0;
 | 
			
		||||
        if (focused) {
 | 
			
		||||
            this._currentAccessible = accessible;
 | 
			
		||||
            this._updateCaretPosition(accessible);
 | 
			
		||||
            this.show(Main.layoutManager.focusIndex);
 | 
			
		||||
        } else if (this._currentAccessible == accessible) {
 | 
			
		||||
            this._currentAccessible = null;
 | 
			
		||||
            this.hide();
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _onCaretMoved(caretTracker, event) {
 | 
			
		||||
        let accessible = event.source;
 | 
			
		||||
        if (this._currentAccessible == accessible)
 | 
			
		||||
            this._updateCaretPosition(accessible);
 | 
			
		||||
    _onFocusPositionChanged(focusTracker) {
 | 
			
		||||
        let rect = focusTracker.getCurrentRect();
 | 
			
		||||
        this.setCursorLocation(focusTracker.currentWindow, rect.x, rect.y, rect.width, rect.height);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _lastDeviceIsTouchscreen() {
 | 
			
		||||
@@ -650,8 +632,6 @@ var Keyboard = new Lang.Class({
 | 
			
		||||
        if (!this._enabled && !this._keyboardController)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._setCaretTrackerEnabled(this._enabled);
 | 
			
		||||
 | 
			
		||||
        if (this._enabled && !this._keyboardController)
 | 
			
		||||
            this._setupKeyboard();
 | 
			
		||||
        else if (!this._enabled)
 | 
			
		||||
@@ -1027,11 +1007,14 @@ var Keyboard = new Lang.Class({
 | 
			
		||||
        if (!this._keyboardRequested)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (this._currentAccessible)
 | 
			
		||||
            this._updateCaretPosition(this._currentAccessible);
 | 
			
		||||
        Main.layoutManager.keyboardIndex = monitor;
 | 
			
		||||
        this._relayout();
 | 
			
		||||
        Main.layoutManager.showKeyboard();
 | 
			
		||||
 | 
			
		||||
        if (this._delayedAnimFocusWindow) {
 | 
			
		||||
            this._setAnimationWindow(this._delayedAnimFocusWindow);
 | 
			
		||||
            this._delayedAnimFocusWindow = null;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    hide() {
 | 
			
		||||
@@ -1102,8 +1085,9 @@ var Keyboard = new Lang.Class({
 | 
			
		||||
        window.move_frame(true, frameRect.x, frameRect.y);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _animateWindow(window, show, deltaY) {
 | 
			
		||||
    _animateWindow(window, show) {
 | 
			
		||||
        let windowActor = window.get_compositor_private();
 | 
			
		||||
        let deltaY = Main.layoutManager.keyboardBox.height;
 | 
			
		||||
        if (!windowActor)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
@@ -1124,35 +1108,39 @@ var Keyboard = new Lang.Class({
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    setCursorLocation(window, x, y , w, h) {
 | 
			
		||||
        if (window == this._oskFocusWindow)
 | 
			
		||||
    _setAnimationWindow(window) {
 | 
			
		||||
        if (this._animFocusedWindow == window)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (this._oskFocusWindow) {
 | 
			
		||||
            let display = global.screen.get_display();
 | 
			
		||||
        if (this._animFocusedWindow)
 | 
			
		||||
            this._animateWindow(this._animFocusedWindow, false);
 | 
			
		||||
        if (window)
 | 
			
		||||
            this._animateWindow(window, true);
 | 
			
		||||
 | 
			
		||||
            if (display.get_grab_op() == Meta.GrabOp.NONE ||
 | 
			
		||||
                display.get_focus_window() != this._oskFocusWindow)
 | 
			
		||||
                this._animateWindow(this._oskFocusWindow, false, this._oskFocusWindowDelta);
 | 
			
		||||
        this._animFocusedWindow = window;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
            this._oskFocusWindow = null;
 | 
			
		||||
            this._oskFocusWindowDelta = null;
 | 
			
		||||
        }
 | 
			
		||||
    setCursorLocation(window, x, y , w, h) {
 | 
			
		||||
        let monitor = Main.layoutManager.keyboardMonitor;
 | 
			
		||||
 | 
			
		||||
        if (window) {
 | 
			
		||||
            let monitor = Main.layoutManager.keyboardMonitor;
 | 
			
		||||
        if (window && monitor) {
 | 
			
		||||
            let keyboardHeight = Main.layoutManager.keyboardBox.height;
 | 
			
		||||
            let frameRect = window.get_frame_rect();
 | 
			
		||||
            let windowActor = window.get_compositor_private();
 | 
			
		||||
            let delta = 0;
 | 
			
		||||
            let focusObscured = false;
 | 
			
		||||
 | 
			
		||||
            if (frameRect.y + y + h >= monitor.height - keyboardHeight)
 | 
			
		||||
                delta = keyboardHeight;
 | 
			
		||||
 | 
			
		||||
            this._animateWindow(window, true, delta);
 | 
			
		||||
            this._oskFocusWindow = window;
 | 
			
		||||
            this._oskFocusWindowDelta = delta;
 | 
			
		||||
            if (y + h >= monitor.y + monitor.height - keyboardHeight) {
 | 
			
		||||
                if (this._keyboardVisible)
 | 
			
		||||
                    this._setAnimationWindow(window);
 | 
			
		||||
                else
 | 
			
		||||
                    this._delayedAnimFocusWindow = window;
 | 
			
		||||
            } else if (y < keyboardHeight) {
 | 
			
		||||
                this._delayedAnimFocusWindow = null;
 | 
			
		||||
                this._setAnimationWindow(null);
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            this._setAnimationWindow(null);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._oskFocusWindow = window;
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -207,7 +207,13 @@ function _initializeUI() {
 | 
			
		||||
        return true;
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    global.display.connect('gl-video-memory-purged', loadTheme);
 | 
			
		||||
    global.display.connect('gl-video-memory-purged', () => {
 | 
			
		||||
	let cache = St.TextureCache.get_default();
 | 
			
		||||
 | 
			
		||||
        cache.clear();
 | 
			
		||||
 | 
			
		||||
        loadTheme();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // Provide the bus object for gnome-session to
 | 
			
		||||
    // initiate logouts.
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,6 @@ function _fixMarkup(text, allowMarkup) {
 | 
			
		||||
 | 
			
		||||
        // Support <b>, <i>, and <u>, escape anything else
 | 
			
		||||
        // so it displays as raw markup.
 | 
			
		||||
        // Ref: https://developer.gnome.org/notification-spec/#markup
 | 
			
		||||
        _text = _text.replace(/<(?!\/?[biu]>)/g, '<');
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
 
 | 
			
		||||
@@ -315,10 +315,10 @@ var NotificationApplicationPolicy = new Lang.Class({
 | 
			
		||||
// You can add a secondary icon to the banner with 'secondaryGIcon'. There
 | 
			
		||||
// is no fallback for this icon.
 | 
			
		||||
//
 | 
			
		||||
// If @params contains 'bannerMarkup', with the value %true, a subset (<b>,
 | 
			
		||||
// <i> and <u>) of the markup in [1] will be interpreted within @banner. If
 | 
			
		||||
// the parameter is not present, then anything that looks like markup
 | 
			
		||||
// in @banner will appear literally in the output.
 | 
			
		||||
// If @params contains 'bannerMarkup', with the value %true, then
 | 
			
		||||
// the corresponding element is assumed to use pango markup. If the
 | 
			
		||||
// parameter is not present for an element, then anything that looks
 | 
			
		||||
// like markup in that element will appear literally in the output.
 | 
			
		||||
//
 | 
			
		||||
// If @params contains a 'clear' parameter with the value %true, then
 | 
			
		||||
// the content and the action area of the notification will be cleared.
 | 
			
		||||
@@ -328,8 +328,6 @@ var NotificationApplicationPolicy = new Lang.Class({
 | 
			
		||||
// If @params contains 'soundName' or 'soundFile', the corresponding
 | 
			
		||||
// event sound is played when the notification is shown (if the policy for
 | 
			
		||||
// @source allows playing sounds).
 | 
			
		||||
//
 | 
			
		||||
// [1] https://developer.gnome.org/notification-spec/#markup 
 | 
			
		||||
var Notification = new Lang.Class({
 | 
			
		||||
    Name: 'Notification',
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -709,6 +709,7 @@ var AggregateMenu = new Lang.Class({
 | 
			
		||||
            this._bluetooth = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._remoteAccess = new imports.ui.status.remoteAccess.RemoteAccessApplet();
 | 
			
		||||
        this._power = new imports.ui.status.power.Indicator();
 | 
			
		||||
        this._rfkill = new imports.ui.status.rfkill.Indicator();
 | 
			
		||||
        this._volume = new imports.ui.status.volume.Indicator();
 | 
			
		||||
@@ -729,6 +730,7 @@ var AggregateMenu = new Lang.Class({
 | 
			
		||||
        if (this._bluetooth) {
 | 
			
		||||
            this._indicators.add_child(this._bluetooth.indicators);
 | 
			
		||||
        }
 | 
			
		||||
        this._indicators.add_child(this._remoteAccess.indicators);
 | 
			
		||||
        this._indicators.add_child(this._rfkill.indicators);
 | 
			
		||||
        this._indicators.add_child(this._volume.indicators);
 | 
			
		||||
        this._indicators.add_child(this._power.indicators);
 | 
			
		||||
@@ -743,6 +745,7 @@ var AggregateMenu = new Lang.Class({
 | 
			
		||||
        if (this._bluetooth) {
 | 
			
		||||
            this.menu.addMenuItem(this._bluetooth.menu);
 | 
			
		||||
        }
 | 
			
		||||
        this.menu.addMenuItem(this._remoteAccess.menu);
 | 
			
		||||
        this.menu.addMenuItem(this._location.menu);
 | 
			
		||||
        this.menu.addMenuItem(this._rfkill.menu);
 | 
			
		||||
        this.menu.addMenuItem(this._power.menu);
 | 
			
		||||
 
 | 
			
		||||
@@ -119,9 +119,6 @@ var RemoteMenuItemMapper = new Lang.Class({
 | 
			
		||||
        this._trackerItem = trackerItem;
 | 
			
		||||
 | 
			
		||||
        this.menuItem = new PopupMenu.PopupBaseMenuItem();
 | 
			
		||||
        this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
 | 
			
		||||
        this.menuItem.actor.add_child(this._icon);
 | 
			
		||||
 | 
			
		||||
        this._label = new St.Label();
 | 
			
		||||
        this.menuItem.actor.add_child(this._label);
 | 
			
		||||
        this.menuItem.actor.label_actor = this._label;
 | 
			
		||||
@@ -132,13 +129,11 @@ var RemoteMenuItemMapper = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        this._trackerItem.bind_property('visible', this.menuItem.actor, 'visible', GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
 | 
			
		||||
        this._trackerItem.connect('notify::icon', this._updateIcon.bind(this));
 | 
			
		||||
        this._trackerItem.connect('notify::label', this._updateLabel.bind(this));
 | 
			
		||||
        this._trackerItem.connect('notify::sensitive', this._updateSensitivity.bind(this));
 | 
			
		||||
        this._trackerItem.connect('notify::role', this._updateRole.bind(this));
 | 
			
		||||
        this._trackerItem.connect('notify::toggled', this._updateDecoration.bind(this));
 | 
			
		||||
 | 
			
		||||
        this._updateIcon();
 | 
			
		||||
        this._updateLabel();
 | 
			
		||||
        this._updateSensitivity();
 | 
			
		||||
        this._updateRole();
 | 
			
		||||
@@ -148,11 +143,6 @@ var RemoteMenuItemMapper = new Lang.Class({
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _updateIcon() {
 | 
			
		||||
        this._icon.gicon = this._trackerItem.icon;
 | 
			
		||||
        this._icon.visible = (this._icon.gicon != null);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _updateLabel() {
 | 
			
		||||
        this._label.text = stripMnemonics(this._trackerItem.label);
 | 
			
		||||
    },
 | 
			
		||||
 
 | 
			
		||||
@@ -133,7 +133,7 @@ function _callRemote(obj, method, ...args) {
 | 
			
		||||
 * because of the normal X asynchronous mapping process, to actually wait
 | 
			
		||||
 * until the window has been mapped and exposed, use waitTestWindows().
 | 
			
		||||
 */
 | 
			
		||||
function createTestWindow(params) {
 | 
			
		||||
function createTestWindow(width, height, params) {
 | 
			
		||||
    params = Params.parse(params, { width: 640,
 | 
			
		||||
                                    height: 480,
 | 
			
		||||
                                    alpha: false,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										81
									
								
								js/ui/status/remoteAccess.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								js/ui/status/remoteAccess.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,81 @@
 | 
			
		||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
 | 
			
		||||
 | 
			
		||||
const Lang = imports.lang;
 | 
			
		||||
const Meta = imports.gi.Meta;
 | 
			
		||||
 | 
			
		||||
const PanelMenu = imports.ui.panelMenu;
 | 
			
		||||
const PopupMenu = imports.ui.popupMenu;
 | 
			
		||||
 | 
			
		||||
var RemoteAccessApplet = new Lang.Class({
 | 
			
		||||
    Name: 'RemoteAccessApplet',
 | 
			
		||||
    Extends: PanelMenu.SystemIndicator,
 | 
			
		||||
 | 
			
		||||
    _init() {
 | 
			
		||||
        this.parent();
 | 
			
		||||
 | 
			
		||||
        let backend = Meta.get_backend();
 | 
			
		||||
        let controller = backend.get_remote_access_controller();
 | 
			
		||||
 | 
			
		||||
        if (!controller)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        // We can't possibly know about all types of screen sharing on X11, so
 | 
			
		||||
        // showing these controls on X11 might give a false sense of security.
 | 
			
		||||
        // Thus, only enable these controls when using Wayland, where we are
 | 
			
		||||
        // in control of sharing.
 | 
			
		||||
        if (!Meta.is_wayland_compositor())
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._handles = new Set();
 | 
			
		||||
        this._indicator = null;
 | 
			
		||||
        this._menuSection = null;
 | 
			
		||||
 | 
			
		||||
        controller.connect('new-handle', (controller, handle) => {
 | 
			
		||||
            this._onNewHandle(handle);
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _ensureControls() {
 | 
			
		||||
        if (this._indicator)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._indicator = this._addIndicator();
 | 
			
		||||
        this._indicator.icon_name = 'screen-shared-symbolic';
 | 
			
		||||
        this._indicator.add_style_class_name('remote-access-indicator');
 | 
			
		||||
        this._item =
 | 
			
		||||
            new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"),
 | 
			
		||||
                                               true);
 | 
			
		||||
        this._item.menu.addAction(_("Turn off"),
 | 
			
		||||
                                  () => {
 | 
			
		||||
                                      for (let handle of this._handles)
 | 
			
		||||
                                            handle.stop();
 | 
			
		||||
                                  });
 | 
			
		||||
        this._item.icon.icon_name = 'screen-shared-symbolic';
 | 
			
		||||
        this.menu.addMenuItem(this._item);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _sync() {
 | 
			
		||||
        if (this._handles.size == 0) {
 | 
			
		||||
            this._indicator.visible = false;
 | 
			
		||||
            this._item.actor.visible = false;
 | 
			
		||||
        } else {
 | 
			
		||||
            this._indicator.visible = true;
 | 
			
		||||
            this._item.actor.visible = true;
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _onStopped(handle) {
 | 
			
		||||
        this._handles.delete(handle);
 | 
			
		||||
        this._sync();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _onNewHandle(handle) {
 | 
			
		||||
        this._handles.add(handle);
 | 
			
		||||
        handle.connect('stopped', this._onStopped.bind(this));
 | 
			
		||||
 | 
			
		||||
        if (this._handles.size == 1) {
 | 
			
		||||
            this._ensureControls();
 | 
			
		||||
            this._sync();
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
@@ -56,11 +56,12 @@ const BoltDeviceProxy = Gio.DBusProxy.makeProxyWrapper(BoltDeviceInterface);
 | 
			
		||||
 | 
			
		||||
var Status = {
 | 
			
		||||
    DISCONNECTED: 'disconnected',
 | 
			
		||||
    CONNECTING: 'connecting',
 | 
			
		||||
    CONNECTED: 'connected',
 | 
			
		||||
    AUTHORIZING: 'authorizing',
 | 
			
		||||
    AUTH_ERROR: 'auth-error',
 | 
			
		||||
    AUTHORIZED: 'authorized'
 | 
			
		||||
    AUTHORIZED: 'authorized',
 | 
			
		||||
    AUTHORIZED_SECURE: 'authorized-secure',
 | 
			
		||||
    AUTHORIZED_NEWKEY: 'authorized-newkey'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var Policy = {
 | 
			
		||||
@@ -69,7 +70,7 @@ var Policy = {
 | 
			
		||||
    AUTO: 'auto'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var AuthCtrl = {
 | 
			
		||||
var AuthFlags = {
 | 
			
		||||
    NONE: 'none',
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -140,10 +141,9 @@ var Client = new Lang.Class({
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    enrollDevice(id, policy, callback) {
 | 
			
		||||
	this._proxy.EnrollDeviceRemote(id, policy, AuthCtrl.NONE,
 | 
			
		||||
	this._proxy.EnrollDeviceRemote(id, policy, AuthFlags.NONE,
 | 
			
		||||
                                       (res, error) => {
 | 
			
		||||
	    if (error) {
 | 
			
		||||
		Gio.DBusError.strip_remote_error(error);
 | 
			
		||||
		callback(null, error);
 | 
			
		||||
		return;
 | 
			
		||||
	    }
 | 
			
		||||
@@ -228,7 +228,7 @@ var AuthRobot = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
    _onEnrollDone(device, error) {
 | 
			
		||||
	if (error)
 | 
			
		||||
	    this.emit('enroll-failed', device, error);
 | 
			
		||||
	    this.emit('enroll-failed', error, device);
 | 
			
		||||
 | 
			
		||||
	/* TODO: scan the list of devices to be authorized for children
 | 
			
		||||
	 *  of this device and remove them (and their children and
 | 
			
		||||
@@ -354,7 +354,7 @@ var Indicator = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
    _onEnrollFailed(obj, device, error) {
 | 
			
		||||
	const title = _('Thunderbolt authorization error');
 | 
			
		||||
	const body = _('Could not authorize the Thunderbolt device: %s'.format(error.message));
 | 
			
		||||
	const body = _('Could not authorize the thunderbolt device: %s'.format(error.message));
 | 
			
		||||
	this._notify(title, body);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,7 @@ const EdgeDragAction = imports.ui.edgeDragAction;
 | 
			
		||||
const CloseDialog = imports.ui.closeDialog;
 | 
			
		||||
const SwitchMonitor = imports.ui.switchMonitor;
 | 
			
		||||
 | 
			
		||||
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
 | 
			
		||||
var SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
 | 
			
		||||
var MINIMIZE_WINDOW_ANIMATION_TIME = 0.2;
 | 
			
		||||
var SHOW_WINDOW_ANIMATION_TIME = 0.15;
 | 
			
		||||
var DIALOG_SHOW_WINDOW_ANIMATION_TIME = 0.1;
 | 
			
		||||
 
 | 
			
		||||
@@ -1431,34 +1431,26 @@ var Workspace = new Lang.Class({
 | 
			
		||||
    _doRemoveWindow(metaWin) {
 | 
			
		||||
        let win = metaWin.get_compositor_private();
 | 
			
		||||
 | 
			
		||||
        // find the position of the window in our list
 | 
			
		||||
        let index = this._lookupIndex (metaWin);
 | 
			
		||||
        let clone = this._removeWindowClone(metaWin);
 | 
			
		||||
 | 
			
		||||
        if (index == -1)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let clone = this._windows[index];
 | 
			
		||||
 | 
			
		||||
        this._windows.splice(index, 1);
 | 
			
		||||
        this._windowOverlays.splice(index, 1);
 | 
			
		||||
 | 
			
		||||
        // If metaWin.get_compositor_private() returned non-NULL, that
 | 
			
		||||
        // means the window still exists (and is just being moved to
 | 
			
		||||
        // another workspace or something), so set its overviewHint
 | 
			
		||||
        // accordingly. (If it returned NULL, then the window is being
 | 
			
		||||
        // destroyed; we'd like to animate this, but it's too late at
 | 
			
		||||
        // this point.)
 | 
			
		||||
        if (win) {
 | 
			
		||||
            let [stageX, stageY] = clone.actor.get_transformed_position();
 | 
			
		||||
            let [stageWidth, stageHeight] = clone.actor.get_transformed_size();
 | 
			
		||||
            win._overviewHint = {
 | 
			
		||||
                x: stageX,
 | 
			
		||||
                y: stageY,
 | 
			
		||||
                scale: stageWidth / clone.actor.width
 | 
			
		||||
            };
 | 
			
		||||
        if (clone) {
 | 
			
		||||
            // If metaWin.get_compositor_private() returned non-NULL, that
 | 
			
		||||
            // means the window still exists (and is just being moved to
 | 
			
		||||
            // another workspace or something), so set its overviewHint
 | 
			
		||||
            // accordingly. (If it returned NULL, then the window is being
 | 
			
		||||
            // destroyed; we'd like to animate this, but it's too late at
 | 
			
		||||
            // this point.)
 | 
			
		||||
            if (win) {
 | 
			
		||||
                let [stageX, stageY] = clone.actor.get_transformed_position();
 | 
			
		||||
                let [stageWidth, stageHeight] = clone.actor.get_transformed_size();
 | 
			
		||||
                win._overviewHint = {
 | 
			
		||||
                    x: stageX,
 | 
			
		||||
                    y: stageY,
 | 
			
		||||
                    scale: stageWidth / clone.actor.width
 | 
			
		||||
                };
 | 
			
		||||
            }
 | 
			
		||||
            clone.destroy();
 | 
			
		||||
        }
 | 
			
		||||
        clone.destroy();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        // We need to reposition the windows; to avoid shuffling windows
 | 
			
		||||
        // around while the user is interacting with the workspace, we delay
 | 
			
		||||
@@ -1848,6 +1840,9 @@ var Workspace = new Lang.Class({
 | 
			
		||||
        clone.connect('size-changed', () => {
 | 
			
		||||
            this._recalculateWindowPositions(WindowPositionFlags.NONE);
 | 
			
		||||
        });
 | 
			
		||||
        clone.actor.connect('destroy', () => {
 | 
			
		||||
            this._removeWindowClone(clone.metaWindow);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.actor.add_actor(clone.actor);
 | 
			
		||||
 | 
			
		||||
@@ -1869,6 +1864,17 @@ var Workspace = new Lang.Class({
 | 
			
		||||
        return [clone, overlay];
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _removeWindowClone(metaWin) {
 | 
			
		||||
        // find the position of the window in our list
 | 
			
		||||
        let index = this._lookupIndex (metaWin);
 | 
			
		||||
 | 
			
		||||
        if (index == -1)
 | 
			
		||||
            return null;
 | 
			
		||||
 | 
			
		||||
        this._windowOverlays.splice(index, 1);
 | 
			
		||||
        return this._windows.splice(index, 1).pop();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _onShowOverlayClose(windowOverlay) {
 | 
			
		||||
        for (let i = 0; i < this._windowOverlays.length; i++) {
 | 
			
		||||
            let overlay = this._windowOverlays[i];
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@ var WORKSPACE_CUT_SIZE = 10;
 | 
			
		||||
 | 
			
		||||
var WORKSPACE_KEEP_ALIVE_TIME = 100;
 | 
			
		||||
 | 
			
		||||
const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
 | 
			
		||||
var OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
 | 
			
		||||
 | 
			
		||||
/* A layout manager that requests size only for primary_actor, but then allocates
 | 
			
		||||
   all using a fixed layout */
 | 
			
		||||
@@ -241,7 +241,7 @@ var WindowClone = new Lang.Class({
 | 
			
		||||
Signals.addSignalMethods(WindowClone.prototype);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const ThumbnailState = {
 | 
			
		||||
var ThumbnailState = {
 | 
			
		||||
    NEW   :         0,
 | 
			
		||||
    ANIMATING_IN :  1,
 | 
			
		||||
    NORMAL:         2,
 | 
			
		||||
@@ -372,18 +372,9 @@ var WorkspaceThumbnail = new Lang.Class({
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _doRemoveWindow(metaWin) {
 | 
			
		||||
        let win = metaWin.get_compositor_private();
 | 
			
		||||
 | 
			
		||||
        // find the position of the window in our list
 | 
			
		||||
        let index = this._lookupIndex (metaWin);
 | 
			
		||||
 | 
			
		||||
        if (index == -1)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        let clone = this._windows[index];
 | 
			
		||||
        this._windows.splice(index, 1);
 | 
			
		||||
 | 
			
		||||
        clone.destroy();
 | 
			
		||||
        let clone = this._removeWindowClone(metaWin);
 | 
			
		||||
        if (clone)
 | 
			
		||||
            clone.destroy();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _doAddWindow(metaWin) {
 | 
			
		||||
@@ -535,6 +526,9 @@ var WorkspaceThumbnail = new Lang.Class({
 | 
			
		||||
        clone.connect('drag-end', () => {
 | 
			
		||||
            Main.overview.endWindowDrag(clone.metaWindow);
 | 
			
		||||
        });
 | 
			
		||||
        clone.actor.connect('destroy', () => {
 | 
			
		||||
            this._removeWindowClone(clone.metaWindow);
 | 
			
		||||
        });
 | 
			
		||||
        this._contents.add_actor(clone.actor);
 | 
			
		||||
 | 
			
		||||
        if (this._windows.length == 0)
 | 
			
		||||
@@ -547,6 +541,16 @@ var WorkspaceThumbnail = new Lang.Class({
 | 
			
		||||
        return clone;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _removeWindowClone(metaWin) {
 | 
			
		||||
        // find the position of the window in our list
 | 
			
		||||
        let index = this._lookupIndex (metaWin);
 | 
			
		||||
 | 
			
		||||
        if (index == -1)
 | 
			
		||||
            return null;
 | 
			
		||||
 | 
			
		||||
        return this._windows.splice(index, 1).pop();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    activate(time) {
 | 
			
		||||
        if (this.state > ThumbnailState.NORMAL)
 | 
			
		||||
            return;
 | 
			
		||||
@@ -884,9 +888,6 @@ var ThumbnailsBox = new Lang.Class({
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _destroyThumbnails() {
 | 
			
		||||
        if (this._thumbnails.length == 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        if (this._switchWorkspaceNotifyId > 0) {
 | 
			
		||||
            global.window_manager.disconnect(this._switchWorkspaceNotifyId);
 | 
			
		||||
            this._switchWorkspaceNotifyId = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
project('gnome-shell', 'c',
 | 
			
		||||
  version: '3.29.2',
 | 
			
		||||
  version: '3.28.3',
 | 
			
		||||
  meson_version: '>= 0.42.0',
 | 
			
		||||
  license: 'GPLv2+'
 | 
			
		||||
)
 | 
			
		||||
@@ -23,7 +23,7 @@ gi_req = '>= 1.49.1'
 | 
			
		||||
gjs_req = '>= 1.47.0'
 | 
			
		||||
gtk_req = '>= 3.15.0'
 | 
			
		||||
json_glib_req = '>= 0.13.2'
 | 
			
		||||
mutter_req = '>= 3.29.2'
 | 
			
		||||
mutter_req = '>= 3.28.0'
 | 
			
		||||
polkit_req = '>= 0.100'
 | 
			
		||||
schemas_req = '>= 3.21.3'
 | 
			
		||||
startup_req = '>= 0.11'
 | 
			
		||||
@@ -31,7 +31,7 @@ ibus_req = '>= 1.5.2'
 | 
			
		||||
 | 
			
		||||
bt_req = '>= 3.9.0'
 | 
			
		||||
gst_req = '>= 0.11.92'
 | 
			
		||||
nm_req = '>= 1.10.4'
 | 
			
		||||
nm_req = '>= 0.9.8'
 | 
			
		||||
secret_req = '>= 0.18'
 | 
			
		||||
 | 
			
		||||
gnome = import('gnome')
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										62
									
								
								po/cs.po
									
									
									
									
									
								
							
							
						
						
									
										62
									
								
								po/cs.po
									
									
									
									
									
								
							@@ -11,8 +11,8 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-13 19:54+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-04-24 17:32+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2018-02-26 12:57+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-02-26 17:57+0100\n"
 | 
			
		||||
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
 | 
			
		||||
"Language-Team: čeština <gnome-cs-list@gnome.org>\n"
 | 
			
		||||
"Language: cs\n"
 | 
			
		||||
@@ -332,7 +332,7 @@ msgstr ""
 | 
			
		||||
"Nastala chyba při načítání dialogového okna předvoleb pro rozšíření %s:"
 | 
			
		||||
 | 
			
		||||
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
 | 
			
		||||
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
 | 
			
		||||
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
 | 
			
		||||
msgid "Cancel"
 | 
			
		||||
@@ -667,12 +667,12 @@ msgstr "Přidat mezi oblíbené"
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "Zobrazit podrobnosti"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#: js/ui/appFavorites.js:138
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s byl přidán mezi oblíbené."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "%s byl odstraněn z oblíbených."
 | 
			
		||||
@@ -867,7 +867,7 @@ msgstr "Externí svazek odpojen"
 | 
			
		||||
msgid "Open with %s"
 | 
			
		||||
msgstr "Otevřít pomocí %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
 | 
			
		||||
msgid "Password:"
 | 
			
		||||
msgstr "Heslo:"
 | 
			
		||||
 | 
			
		||||
@@ -955,15 +955,15 @@ msgstr "Pro připojení k „%s“ je vyžadováno heslo."
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "Network Manager"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
#: js/ui/components/polkitAgent.js:43
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "Je vyžadováno ověření"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "Správce"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
msgid "Authenticate"
 | 
			
		||||
msgstr "Ověřit"
 | 
			
		||||
 | 
			
		||||
@@ -971,7 +971,7 @@ msgstr "Ověřit"
 | 
			
		||||
#. * requested authentication was not gained; this can happen
 | 
			
		||||
#. * because of an authentication error (like invalid password),
 | 
			
		||||
#. * for instance.
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
msgid "Sorry, that didn’t work. Please try again."
 | 
			
		||||
msgstr "Ověření bohužel nebylo úspěšné. Zkuste to prosím znovu."
 | 
			
		||||
 | 
			
		||||
@@ -1021,7 +1021,7 @@ msgstr "Přidat světový čas…"
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "Světové hodiny"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
#: js/ui/dateMenu.js:225
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "Počasí"
 | 
			
		||||
 | 
			
		||||
@@ -1029,7 +1029,7 @@ msgstr "Počasí"
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#: js/ui/dateMenu.js:289
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s all day."
 | 
			
		||||
msgstr "%s celý den."
 | 
			
		||||
@@ -1038,7 +1038,7 @@ msgstr "%s celý den."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#: js/ui/dateMenu.js:295
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s later."
 | 
			
		||||
msgstr "%s, později %s."
 | 
			
		||||
@@ -1047,30 +1047,30 @@ msgstr "%s, později %s."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#: js/ui/dateMenu.js:301
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s, pak %s a později %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Vybrat místo…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Načítá se…"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "Pocitově jako %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Připojit se kvůli informacím o počasí"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "Informace o počasí nejsou nyní dostupné"
 | 
			
		||||
 | 
			
		||||
@@ -1986,16 +1986,16 @@ msgstr "Uspat do paměti"
 | 
			
		||||
msgid "Power Off"
 | 
			
		||||
msgstr "Vypnout"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:294
 | 
			
		||||
#: js/ui/status/thunderbolt.js:272
 | 
			
		||||
msgid "Thunderbolt"
 | 
			
		||||
msgstr "Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#. we are done
 | 
			
		||||
#: js/ui/status/thunderbolt.js:350
 | 
			
		||||
#: js/ui/status/thunderbolt.js:328
 | 
			
		||||
msgid "Unknown Thunderbolt device"
 | 
			
		||||
msgstr "Neznámé zařízení Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:351
 | 
			
		||||
#: js/ui/status/thunderbolt.js:329
 | 
			
		||||
msgid ""
 | 
			
		||||
"New device has been detected while you were away. Please disconnect and "
 | 
			
		||||
"reconnect the device to start using it."
 | 
			
		||||
@@ -2003,13 +2003,13 @@ msgstr ""
 | 
			
		||||
"Zatímco jste byli pryč, bylo nalezeno nové zařízení. Odpojte jej prosím a "
 | 
			
		||||
"znovu připojte, abyste jej mohli používat."
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:356
 | 
			
		||||
#: js/ui/status/thunderbolt.js:334
 | 
			
		||||
msgid "Thunderbolt authorization error"
 | 
			
		||||
msgstr "Chyba ověření Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:357
 | 
			
		||||
#: js/ui/status/thunderbolt.js:335
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Could not authorize the Thunderbolt device: %s"
 | 
			
		||||
msgid "Could not authorize the thunderbolt device: %s"
 | 
			
		||||
msgstr "Nezdařilo se provést ověření zařízení Thunderbolt: %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/volume.js:128
 | 
			
		||||
@@ -2233,3 +2233,15 @@ msgstr[2] "%u vstupů"
 | 
			
		||||
#: subprojects/gvc/gvc-mixer-control.c:2738
 | 
			
		||||
msgid "System Sounds"
 | 
			
		||||
msgstr "Systémové zvuky"
 | 
			
		||||
 | 
			
		||||
#~ msgctxt "search-result"
 | 
			
		||||
#~ msgid "Power off"
 | 
			
		||||
#~ msgstr "Vypnout"
 | 
			
		||||
 | 
			
		||||
#~ msgctxt "search-result"
 | 
			
		||||
#~ msgid "Log out"
 | 
			
		||||
#~ msgstr "Odhlásit se"
 | 
			
		||||
 | 
			
		||||
#~ msgctxt "search-result"
 | 
			
		||||
#~ msgid "Switch user"
 | 
			
		||||
#~ msgstr "Přepnout uživatele"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										51
									
								
								po/es.po
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								po/es.po
									
									
									
									
									
								
							@@ -9,8 +9,8 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell.master\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-13 19:54+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-04-25 12:54+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2018-02-22 09:24+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-02-23 08:26+0100\n"
 | 
			
		||||
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
 | 
			
		||||
"Language-Team: es <gnome-es-list@gnome.org>\n"
 | 
			
		||||
"Language: es\n"
 | 
			
		||||
@@ -346,7 +346,7 @@ msgid "There was an error loading the preferences dialog for %s:"
 | 
			
		||||
msgstr "Hubo un error al lanzar el diálogo de preferencias para %s:"
 | 
			
		||||
 | 
			
		||||
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
 | 
			
		||||
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
 | 
			
		||||
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
 | 
			
		||||
msgid "Cancel"
 | 
			
		||||
@@ -665,12 +665,12 @@ msgstr "Añadir a los favoritos"
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "Mostrar detalles"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#: js/ui/appFavorites.js:138
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "Se ha añadido %s a sus favoritos."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "Se ha quitado %s de sus favoritos."
 | 
			
		||||
@@ -865,7 +865,7 @@ msgstr "Dispositivo externo desconectado"
 | 
			
		||||
msgid "Open with %s"
 | 
			
		||||
msgstr "Abrir con %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
 | 
			
		||||
msgid "Password:"
 | 
			
		||||
msgstr "Contraseña:"
 | 
			
		||||
 | 
			
		||||
@@ -953,15 +953,15 @@ msgstr "Se requiere una contraseña para conectarse a «%s»."
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "Gestor de la red"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
#: js/ui/components/polkitAgent.js:43
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "Se necesita autenticación"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "Administrador"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
msgid "Authenticate"
 | 
			
		||||
msgstr "Autenticar"
 | 
			
		||||
 | 
			
		||||
@@ -969,7 +969,7 @@ msgstr "Autenticar"
 | 
			
		||||
#. * requested authentication was not gained; this can happen
 | 
			
		||||
#. * because of an authentication error (like invalid password),
 | 
			
		||||
#. * for instance.
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
msgid "Sorry, that didn’t work. Please try again."
 | 
			
		||||
msgstr "Eso no ha funcionado. Inténtelo de nuevo."
 | 
			
		||||
 | 
			
		||||
@@ -1017,7 +1017,7 @@ msgstr "Añadir relojes del mundo…"
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "Relojes del mundo"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
#: js/ui/dateMenu.js:225
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "Meteorología"
 | 
			
		||||
 | 
			
		||||
@@ -1025,7 +1025,7 @@ msgstr "Meteorología"
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#: js/ui/dateMenu.js:289
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s all day."
 | 
			
		||||
msgstr "%s todo el día."
 | 
			
		||||
@@ -1034,7 +1034,7 @@ msgstr "%s todo el día."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#: js/ui/dateMenu.js:295
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s later."
 | 
			
		||||
msgstr "%s, luego %s."
 | 
			
		||||
@@ -1043,30 +1043,30 @@ msgstr "%s, luego %s."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#: js/ui/dateMenu.js:301
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s, luego %s seguido de %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Seleccionar ubicación…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Cargando…"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "Sensación térmica de %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Conectarse para obtener la información meteorológica"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "La información meteorológica no está disponible actualmente."
 | 
			
		||||
 | 
			
		||||
@@ -1968,16 +1968,16 @@ msgstr "Suspender"
 | 
			
		||||
msgid "Power Off"
 | 
			
		||||
msgstr "Apagar"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:294
 | 
			
		||||
#: js/ui/status/thunderbolt.js:272
 | 
			
		||||
msgid "Thunderbolt"
 | 
			
		||||
msgstr "Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#. we are done
 | 
			
		||||
#: js/ui/status/thunderbolt.js:350
 | 
			
		||||
#: js/ui/status/thunderbolt.js:328
 | 
			
		||||
msgid "Unknown Thunderbolt device"
 | 
			
		||||
msgstr "Dispositivo Thunderbolt desconocido"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:351
 | 
			
		||||
#: js/ui/status/thunderbolt.js:329
 | 
			
		||||
msgid ""
 | 
			
		||||
"New device has been detected while you were away. Please disconnect and "
 | 
			
		||||
"reconnect the device to start using it."
 | 
			
		||||
@@ -1985,14 +1985,13 @@ msgstr ""
 | 
			
		||||
"Se ha detectado un dispositivo nuevo mientras estaba fuera. Desconéctelo y "
 | 
			
		||||
"vuélvalo a conectar para empezar a usarlo."
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:356
 | 
			
		||||
#: js/ui/status/thunderbolt.js:334
 | 
			
		||||
msgid "Thunderbolt authorization error"
 | 
			
		||||
msgstr "Error de autorización de Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:357
 | 
			
		||||
#: js/ui/status/thunderbolt.js:335
 | 
			
		||||
#, javascript-format
 | 
			
		||||
#| msgid "Could not authorize the thunderbolt device: %s"
 | 
			
		||||
msgid "Could not authorize the Thunderbolt device: %s"
 | 
			
		||||
msgid "Could not authorize the thunderbolt device: %s"
 | 
			
		||||
msgstr "No se pudo autorizar el dispositivo Thunderbolt: %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/volume.js:128
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										54
									
								
								po/hr.po
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								po/hr.po
									
									
									
									
									
								
							@@ -7,8 +7,8 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell master\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-13 19:54+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-04-16 14:30+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2018-02-26 17:00+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-03-07 22:46+0100\n"
 | 
			
		||||
"Last-Translator: gogo <trebelnik2@gmail.com>\n"
 | 
			
		||||
"Language-Team: Croatian <hr@li.org>\n"
 | 
			
		||||
"Language: hr\n"
 | 
			
		||||
@@ -337,7 +337,7 @@ msgid "There was an error loading the preferences dialog for %s:"
 | 
			
		||||
msgstr "Dogodila se greška učitavanja dijaloga osobitosti za %s:"
 | 
			
		||||
 | 
			
		||||
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
 | 
			
		||||
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
 | 
			
		||||
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
 | 
			
		||||
msgid "Cancel"
 | 
			
		||||
@@ -663,12 +663,12 @@ msgstr "Dodaj u omiljene"
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "Prikaži pojedinosti"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#: js/ui/appFavorites.js:138
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s je dodan u omiljene."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "%s je uklonjen iz omiljenih."
 | 
			
		||||
@@ -863,7 +863,7 @@ msgstr "Vanjski uređaj odspojen"
 | 
			
		||||
msgid "Open with %s"
 | 
			
		||||
msgstr "Otvori s(a) %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
 | 
			
		||||
msgid "Password:"
 | 
			
		||||
msgstr "Lozinka:"
 | 
			
		||||
 | 
			
		||||
@@ -950,15 +950,15 @@ msgstr "Potrebna je lozinka za povezivanje s “%s”."
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "Mrežni upravitelj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
#: js/ui/components/polkitAgent.js:43
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "Potrebna je ovjera"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "Administrator"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
msgid "Authenticate"
 | 
			
		||||
msgstr "Ovjeri"
 | 
			
		||||
 | 
			
		||||
@@ -966,7 +966,7 @@ msgstr "Ovjeri"
 | 
			
		||||
#. * requested authentication was not gained; this can happen
 | 
			
		||||
#. * because of an authentication error (like invalid password),
 | 
			
		||||
#. * for instance.
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
msgid "Sorry, that didn’t work. Please try again."
 | 
			
		||||
msgstr "Nažalost, to ne radi. Pokušajte ponovno."
 | 
			
		||||
 | 
			
		||||
@@ -1014,7 +1014,7 @@ msgstr "Dodaj satove iz svijeta…"
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "Svjetski satovi"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
#: js/ui/dateMenu.js:225
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "Vrijeme"
 | 
			
		||||
 | 
			
		||||
@@ -1022,7 +1022,7 @@ msgstr "Vrijeme"
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#: js/ui/dateMenu.js:289
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s all day."
 | 
			
		||||
msgstr "%s cijeli dan."
 | 
			
		||||
@@ -1031,7 +1031,7 @@ msgstr "%s cijeli dan."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#: js/ui/dateMenu.js:295
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s later."
 | 
			
		||||
msgstr "%s, zatim %s kasnije."
 | 
			
		||||
@@ -1040,30 +1040,30 @@ msgstr "%s, zatim %s kasnije."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#: js/ui/dateMenu.js:301
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s, zatim %s, praćena s %s kasnije."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Odaberi lokaciju…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Pretraživanje…"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "Kao da je %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Posjetite za opširnije vremenske informacije"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "Vremenske informacije su trenutno nedostupne"
 | 
			
		||||
 | 
			
		||||
@@ -1977,16 +1977,16 @@ msgstr "Suspendiraj"
 | 
			
		||||
msgid "Power Off"
 | 
			
		||||
msgstr "Isključivanje"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:294
 | 
			
		||||
#: js/ui/status/thunderbolt.js:272
 | 
			
		||||
msgid "Thunderbolt"
 | 
			
		||||
msgstr "Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#. we are done
 | 
			
		||||
#: js/ui/status/thunderbolt.js:350
 | 
			
		||||
#: js/ui/status/thunderbolt.js:328
 | 
			
		||||
msgid "Unknown Thunderbolt device"
 | 
			
		||||
msgstr "Nepoznati Thunderbolt uređaj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:351
 | 
			
		||||
#: js/ui/status/thunderbolt.js:329
 | 
			
		||||
msgid ""
 | 
			
		||||
"New device has been detected while you were away. Please disconnect and "
 | 
			
		||||
"reconnect the device to start using it."
 | 
			
		||||
@@ -1994,14 +1994,14 @@ msgstr ""
 | 
			
		||||
"Otkriven je novi uređaj dok ste bili odsutni. Odspojite i ponovno spojite "
 | 
			
		||||
"uređaj kako bi ga mogli koristiti."
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:356
 | 
			
		||||
#: js/ui/status/thunderbolt.js:334
 | 
			
		||||
msgid "Thunderbolt authorization error"
 | 
			
		||||
msgstr "Greška Thunderbolt odobravanja"
 | 
			
		||||
msgstr "Greška Thunderbolt ovjere"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:357
 | 
			
		||||
#: js/ui/status/thunderbolt.js:335
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Could not authorize the Thunderbolt device: %s"
 | 
			
		||||
msgstr "Nemoguće odobravanje Thunderbolt uređaja: %s"
 | 
			
		||||
msgid "Could not authorize the thunderbolt device: %s"
 | 
			
		||||
msgstr "Nemoguća ovjera Thunderbolt uređaja: %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/volume.js:128
 | 
			
		||||
msgid "Volume changed"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										87
									
								
								po/sl.po
									
									
									
									
									
								
							
							
						
						
									
										87
									
								
								po/sl.po
									
									
									
									
									
								
							@@ -8,8 +8,8 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell master\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-17 15:11+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-04-17 18:32+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2018-03-18 10:36+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-03-19 21:42+0100\n"
 | 
			
		||||
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
 | 
			
		||||
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
 | 
			
		||||
"Language: sl\n"
 | 
			
		||||
@@ -66,19 +66,19 @@ msgstr "Upravljanje oken in zaganjanje programov"
 | 
			
		||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Omogoči dostop do orodij razvijalcev in preizkuševalcev programske opreme "
 | 
			
		||||
"prek vnosnega polja Alt-F2."
 | 
			
		||||
"preko Alt-F2 vnosnega polja."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:9
 | 
			
		||||
msgid ""
 | 
			
		||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
 | 
			
		||||
"dialog."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Dovoli dostop do razhroščevanja in drugih orodij nadzora prek vnosnega polja "
 | 
			
		||||
"Alt-F2."
 | 
			
		||||
"Dovoli dostop do razhroščevanja in drugih orodij nadzora preko Alt-F2 "
 | 
			
		||||
"vnosnega polja."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:16
 | 
			
		||||
msgid "UUIDs of extensions to enable"
 | 
			
		||||
msgstr "Določila razširitev UUID, ki bodo omogočene"
 | 
			
		||||
msgstr "Določila UUID razširitev, ki bodo omogočene"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:17
 | 
			
		||||
msgid ""
 | 
			
		||||
@@ -87,9 +87,10 @@ msgid ""
 | 
			
		||||
"list. You can also manipulate this list with the EnableExtension and "
 | 
			
		||||
"DisableExtension D-Bus methods on org.gnome.Shell."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Razširitve lupine GNOME imajo nastavljeno določilo UUID; ključ določa seznam "
 | 
			
		||||
"razširitev, ki naj bodo naložene ob zagonu. Upravljanje seznama je mogoče "
 | 
			
		||||
"tudi prek vodila D-BUs na org.gnome.Shell."
 | 
			
		||||
"Razširitve lupine GNOME imajo določila UUID; ključ določa seznam razširitev, "
 | 
			
		||||
"ki bodo naložene. Razširitev, ki se naj naloži, mora biti zavedena na tem "
 | 
			
		||||
"seznamu. Upravljanje seznama je mogoče tudi preko vodila D-BUs na org.gnome."
 | 
			
		||||
"Shell."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:26
 | 
			
		||||
msgid "Disable user extensions"
 | 
			
		||||
@@ -114,8 +115,8 @@ msgid ""
 | 
			
		||||
"load all extensions regardless of the versions they claim to support."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Lupina GNOME naloži le razširitve, ki so skladne z nameščeno različico. "
 | 
			
		||||
"Izbrana možnost onemogoči preverjanje, zato so lahko naložene tudi "
 | 
			
		||||
"razširitve, katerih skladnost ni potrjena."
 | 
			
		||||
"Izbrana možnost onemogoči preverjanje skladnosti, zato so lahko naložene "
 | 
			
		||||
"tudi razširitve, katerih skladnost ni potrjena."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:43
 | 
			
		||||
msgid "List of desktop file IDs for favorite applications"
 | 
			
		||||
@@ -126,7 +127,7 @@ msgid ""
 | 
			
		||||
"The applications corresponding to these identifiers will be displayed in the "
 | 
			
		||||
"favorites area."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Programi, ki ustrezajo določilom, bodo prikazani v polju priljubljenih "
 | 
			
		||||
"Programi določeni s temi določili bodo prikazani v območju priljubljenih "
 | 
			
		||||
"programov"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:51
 | 
			
		||||
@@ -144,18 +145,18 @@ msgstr "Zgodovina pogovornega okna ukazov (Alt-F2)"
 | 
			
		||||
#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:63
 | 
			
		||||
msgid "History for the looking glass dialog"
 | 
			
		||||
msgstr "Zgodovina za pogovorno okno povečevala"
 | 
			
		||||
msgstr "Zgodovina za pogovorno okno povečevalnega stekla"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:67
 | 
			
		||||
msgid "Always show the “Log out” menu item in the user menu."
 | 
			
		||||
msgstr "Vedno pokaži možnost »Odjave« v uporabniškem meniju."
 | 
			
		||||
msgstr "Vedno pokaži možnost »Odjava« v uporabniškem meniju."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:68
 | 
			
		||||
msgid ""
 | 
			
		||||
"This key overrides the automatic hiding of the “Log out” menu item in single-"
 | 
			
		||||
"user, single-session situations."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Izbira prepiše možnost samodejnega skrivanja gumba za »Odjavo« na sistemskem "
 | 
			
		||||
"Izbira prepiše možnost samodejnega skrivanja predmeta »Odjava« na sistemskem "
 | 
			
		||||
"meniju pri eno-uporabniškem in eno-sejnem zagonu."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:75
 | 
			
		||||
@@ -173,8 +174,8 @@ msgid ""
 | 
			
		||||
"state of the checkbox."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Za priklop oddaljenega datotečnega sistema ali šifrirane naprave bo po "
 | 
			
		||||
"izbiri podana zahteva za vnos gesla. Na pogovornem oknu bo prikazana tudi "
 | 
			
		||||
"možnost »Shrani geslo«. Ta možnost določa privzeto stanje izbirnega polja."
 | 
			
		||||
"izbiri možnosti zahtevano geslo. Na pogovornem oknu bo prikazana možnost "
 | 
			
		||||
"»Shrani geslo«. Ta možnost določa privzeto stanje izbirnega polja."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:85
 | 
			
		||||
msgid ""
 | 
			
		||||
@@ -332,7 +333,7 @@ msgid "There was an error loading the preferences dialog for %s:"
 | 
			
		||||
msgstr "Prišlo je do napake med nalaganjem pogovornega okna z možnostmi za %s:"
 | 
			
		||||
 | 
			
		||||
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
 | 
			
		||||
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
 | 
			
		||||
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
 | 
			
		||||
msgid "Cancel"
 | 
			
		||||
@@ -663,12 +664,12 @@ msgstr "Dodaj med priljubljene"
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "Pokaži besedilo"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#: js/ui/appFavorites.js:138
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "Program »%s« je dodan med priljubljeno."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "Program »%s« je odstranjen iz priljubljenih."
 | 
			
		||||
@@ -839,7 +840,7 @@ msgid ""
 | 
			
		||||
"You may choose to wait a short while for it to continue or force the "
 | 
			
		||||
"application to quit entirely."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Lahko počakate, če se program morda začne spet odzivati, lahko pa vsilite "
 | 
			
		||||
"Lahko še malo počakate, če začne morda program spet delovati, ali pa vsilite "
 | 
			
		||||
"končanje delovanja."
 | 
			
		||||
 | 
			
		||||
#: js/ui/closeDialog.js:61
 | 
			
		||||
@@ -863,13 +864,13 @@ msgstr "Zunanji pogon je odklopljen"
 | 
			
		||||
msgid "Open with %s"
 | 
			
		||||
msgstr "Odpri s programom %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
 | 
			
		||||
msgid "Password:"
 | 
			
		||||
msgstr "Geslo:"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/keyring.js:140
 | 
			
		||||
msgid "Type again:"
 | 
			
		||||
msgstr "Ponovni vpis:"
 | 
			
		||||
msgstr "Vpišite znova:"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:245
 | 
			
		||||
#: js/ui/status/network.js:336 js/ui/status/network.js:922
 | 
			
		||||
@@ -886,19 +887,19 @@ msgstr "Geslo:"
 | 
			
		||||
#. static WEP
 | 
			
		||||
#: js/ui/components/networkAgent.js:210
 | 
			
		||||
msgid "Key: "
 | 
			
		||||
msgstr "Ključ: "
 | 
			
		||||
msgstr "Ključ:"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:249
 | 
			
		||||
msgid "Identity: "
 | 
			
		||||
msgstr "_Istovetnost: "
 | 
			
		||||
msgstr "_Istovetnost:"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:251
 | 
			
		||||
msgid "Private key password: "
 | 
			
		||||
msgstr "Geslo zasebnega ključa: "
 | 
			
		||||
msgstr "Geslo zasebnega ključa:"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:263
 | 
			
		||||
msgid "Service: "
 | 
			
		||||
msgstr "Storitev: "
 | 
			
		||||
msgstr "Storitev:"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659
 | 
			
		||||
msgid "Authentication required by wireless network"
 | 
			
		||||
@@ -919,7 +920,7 @@ msgstr "Žična overitev 802.1X"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:299
 | 
			
		||||
msgid "Network name: "
 | 
			
		||||
msgstr "Naziv omrežja: "
 | 
			
		||||
msgstr "Naziv omrežja:"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667
 | 
			
		||||
msgid "DSL authentication"
 | 
			
		||||
@@ -951,15 +952,15 @@ msgstr "Za povezavo z omrežjem »%s« je zahtevano geslo."
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "Upravljalnik omrežij"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
#: js/ui/components/polkitAgent.js:43
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "Zahtevana je overitev"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "Skrbnik"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
msgid "Authenticate"
 | 
			
		||||
msgstr "Overi"
 | 
			
		||||
 | 
			
		||||
@@ -967,7 +968,7 @@ msgstr "Overi"
 | 
			
		||||
#. * requested authentication was not gained; this can happen
 | 
			
		||||
#. * because of an authentication error (like invalid password),
 | 
			
		||||
#. * for instance.
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
msgid "Sorry, that didn’t work. Please try again."
 | 
			
		||||
msgstr "Overitev je spodletela.. Poskusite znova."
 | 
			
		||||
 | 
			
		||||
@@ -1015,7 +1016,7 @@ msgstr "Dodaj svetovni čas ..."
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "Svetovni časi"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
#: js/ui/dateMenu.js:225
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "Vreme"
 | 
			
		||||
 | 
			
		||||
@@ -1023,7 +1024,7 @@ msgstr "Vreme"
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#: js/ui/dateMenu.js:289
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s all day."
 | 
			
		||||
msgstr "%s – ves dan."
 | 
			
		||||
@@ -1032,7 +1033,7 @@ msgstr "%s – ves dan."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#: js/ui/dateMenu.js:295
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s later."
 | 
			
		||||
msgstr "%s, sledi %s."
 | 
			
		||||
@@ -1041,30 +1042,30 @@ msgstr "%s, sledi %s."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#: js/ui/dateMenu.js:301
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s, sledi %s, kasneje tudi %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Izbor mesta ..."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Poteka nalaganje ..."
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "Občuti se kot %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Preglej splet za podrobnosti o vremenu."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "Podatki o vremenu trenutno niso na voljo."
 | 
			
		||||
 | 
			
		||||
@@ -2013,8 +2014,8 @@ msgstr "Napaka overitve naprave Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:357
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Could not authorize the Thunderbolt device: %s"
 | 
			
		||||
msgstr "Naprave Thunderbolt ni mogoče overiti: %s"
 | 
			
		||||
msgid "Could not authorize the thunderbolt device: %s"
 | 
			
		||||
msgstr "Naprave thunderbolt ni mogoče overiti: %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/volume.js:128
 | 
			
		||||
msgid "Volume changed"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										52
									
								
								po/sv.po
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								po/sv.po
									
									
									
									
									
								
							@@ -11,8 +11,8 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-13 19:54+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-05-20 19:24+0200\n"
 | 
			
		||||
"POT-Creation-Date: 2018-02-21 14:13+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-02-22 15:56+0100\n"
 | 
			
		||||
"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
 | 
			
		||||
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
 | 
			
		||||
"Language: sv\n"
 | 
			
		||||
@@ -20,7 +20,7 @@ msgstr ""
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
			
		||||
"X-Generator: Poedit 2.0.7\n"
 | 
			
		||||
"X-Generator: Poedit 2.0.6\n"
 | 
			
		||||
 | 
			
		||||
#: data/50-gnome-shell-system.xml:6
 | 
			
		||||
msgid "System"
 | 
			
		||||
@@ -332,7 +332,7 @@ msgid "There was an error loading the preferences dialog for %s:"
 | 
			
		||||
msgstr "Det uppstod ett fel vid inläsning av inställningsdialogen för %s:"
 | 
			
		||||
 | 
			
		||||
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
 | 
			
		||||
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
 | 
			
		||||
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
 | 
			
		||||
msgid "Cancel"
 | 
			
		||||
@@ -652,12 +652,12 @@ msgstr "Lägg till som favorit"
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "Visa detaljer"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#: js/ui/appFavorites.js:138
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s har lagts till i dina favoriter."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "%s har tagits bort från dina favoriter."
 | 
			
		||||
@@ -852,7 +852,7 @@ msgstr "Extern disk frånkopplad"
 | 
			
		||||
msgid "Open with %s"
 | 
			
		||||
msgstr "Öppna med %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
 | 
			
		||||
msgid "Password:"
 | 
			
		||||
msgstr "Lösenord:"
 | 
			
		||||
 | 
			
		||||
@@ -940,15 +940,15 @@ msgstr "Ett lösenord krävs för att ansluta till ”%s”."
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "Nätverkshanterare"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
#: js/ui/components/polkitAgent.js:43
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "Autentisering krävs"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "Administratör"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
msgid "Authenticate"
 | 
			
		||||
msgstr "Autentisera"
 | 
			
		||||
 | 
			
		||||
@@ -956,7 +956,7 @@ msgstr "Autentisera"
 | 
			
		||||
#. * requested authentication was not gained; this can happen
 | 
			
		||||
#. * because of an authentication error (like invalid password),
 | 
			
		||||
#. * for instance.
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
msgid "Sorry, that didn’t work. Please try again."
 | 
			
		||||
msgstr "Tyvärr, det fungerade inte. Försök igen."
 | 
			
		||||
 | 
			
		||||
@@ -1004,7 +1004,7 @@ msgstr "Lägg till världsklockor…"
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "Världsklockor"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
#: js/ui/dateMenu.js:225
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "Väder"
 | 
			
		||||
 | 
			
		||||
@@ -1012,7 +1012,7 @@ msgstr "Väder"
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#: js/ui/dateMenu.js:289
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s all day."
 | 
			
		||||
msgstr "%s hela dagen."
 | 
			
		||||
@@ -1021,7 +1021,7 @@ msgstr "%s hela dagen."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#: js/ui/dateMenu.js:295
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s later."
 | 
			
		||||
msgstr "%s, sedan %s senare."
 | 
			
		||||
@@ -1030,30 +1030,30 @@ msgstr "%s, sedan %s senare."
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#: js/ui/dateMenu.js:301
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s, sedan %s, följt av %s senare."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Välj en plats…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Läser in…"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "Känns som %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Anslut till nätet för väderinformation"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "Väderinformation är för närvarande inte tillgänglig"
 | 
			
		||||
 | 
			
		||||
@@ -1953,16 +1953,16 @@ msgstr "Vänteläge"
 | 
			
		||||
msgid "Power Off"
 | 
			
		||||
msgstr "Stäng av"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:294
 | 
			
		||||
#: js/ui/status/thunderbolt.js:272
 | 
			
		||||
msgid "Thunderbolt"
 | 
			
		||||
msgstr "Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#. we are done
 | 
			
		||||
#: js/ui/status/thunderbolt.js:350
 | 
			
		||||
#: js/ui/status/thunderbolt.js:328
 | 
			
		||||
msgid "Unknown Thunderbolt device"
 | 
			
		||||
msgstr "Okänd Thunderbolt-enhet"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:351
 | 
			
		||||
#: js/ui/status/thunderbolt.js:329
 | 
			
		||||
msgid ""
 | 
			
		||||
"New device has been detected while you were away. Please disconnect and "
 | 
			
		||||
"reconnect the device to start using it."
 | 
			
		||||
@@ -1970,13 +1970,13 @@ msgstr ""
 | 
			
		||||
"En ny enhet har upptäckts medan du var borta. Koppla från och anslut enheten "
 | 
			
		||||
"igen för att börja använda den."
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:356
 | 
			
		||||
#: js/ui/status/thunderbolt.js:334
 | 
			
		||||
msgid "Thunderbolt authorization error"
 | 
			
		||||
msgstr "Thunderbolt-auktoriseringsfel"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:357
 | 
			
		||||
#: js/ui/status/thunderbolt.js:335
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Could not authorize the Thunderbolt device: %s"
 | 
			
		||||
msgid "Could not authorize the thunderbolt device: %s"
 | 
			
		||||
msgstr "Kunde inte auktorisera Thunderbolt-enheten: %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/volume.js:128
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										44
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								po/zh_CN.po
									
									
									
									
									
								
							@@ -23,16 +23,16 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell master\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-13 19:54+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-05-10 12:11-0500\n"
 | 
			
		||||
"Last-Translator: Mingcong Bai <jeffbai@aosc.xyz>\n"
 | 
			
		||||
"POT-Creation-Date: 2018-03-05 21:11+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-02-15 01:42+0800\n"
 | 
			
		||||
"Last-Translator: Dingzhong Chen <wsxy162@gmail.com>\n"
 | 
			
		||||
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
 | 
			
		||||
"Language: zh_CN\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"Plural-Forms: nplurals=1; plural=0;\n"
 | 
			
		||||
"X-Generator: Poedit 2.0.6\n"
 | 
			
		||||
"X-Generator: Gtranslator 2.91.7\n"
 | 
			
		||||
 | 
			
		||||
#: data/50-gnome-shell-system.xml:6
 | 
			
		||||
msgid "System"
 | 
			
		||||
@@ -320,7 +320,7 @@ msgid "There was an error loading the preferences dialog for %s:"
 | 
			
		||||
msgstr "载入 %s 的首选项对话框时出错:"
 | 
			
		||||
 | 
			
		||||
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
 | 
			
		||||
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
 | 
			
		||||
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
 | 
			
		||||
msgid "Cancel"
 | 
			
		||||
@@ -631,12 +631,12 @@ msgstr "添加到收藏夹"
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "显示细节"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#: js/ui/appFavorites.js:138
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s 已经添加到了您的收藏夹。"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "%s 已经从您的收藏夹移除。"
 | 
			
		||||
@@ -829,7 +829,7 @@ msgstr "外部驱动器已断开"
 | 
			
		||||
msgid "Open with %s"
 | 
			
		||||
msgstr "使用 %s 打开"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
 | 
			
		||||
msgid "Password:"
 | 
			
		||||
msgstr "密码:"
 | 
			
		||||
 | 
			
		||||
@@ -915,15 +915,15 @@ msgstr "连接到“%s”需要密码。"
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "网络管理器"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
#: js/ui/components/polkitAgent.js:43
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "需要认证"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "管理员"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
msgid "Authenticate"
 | 
			
		||||
msgstr "认证"
 | 
			
		||||
 | 
			
		||||
@@ -932,7 +932,7 @@ msgstr "认证"
 | 
			
		||||
#. * requested authentication was not gained; this can happen
 | 
			
		||||
#. * because of an authentication error (like invalid password),
 | 
			
		||||
#. * for instance.
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
msgid "Sorry, that didn’t work. Please try again."
 | 
			
		||||
msgstr "抱歉,认证失败。请重试。"
 | 
			
		||||
 | 
			
		||||
@@ -980,7 +980,7 @@ msgstr "添加世界时钟…"
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "世界时钟"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
#: js/ui/dateMenu.js:225
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "天气"
 | 
			
		||||
 | 
			
		||||
@@ -988,7 +988,7 @@ msgstr "天气"
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#: js/ui/dateMenu.js:289
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s all day."
 | 
			
		||||
msgstr "全天%s。"
 | 
			
		||||
@@ -997,7 +997,7 @@ msgstr "全天%s。"
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#: js/ui/dateMenu.js:295
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s later."
 | 
			
		||||
msgstr "%s转%s。"
 | 
			
		||||
@@ -1006,30 +1006,30 @@ msgstr "%s转%s。"
 | 
			
		||||
#. libgweather for the possible condition strings. If at all
 | 
			
		||||
#. possible, the sentence should match the grammatical case etc. of
 | 
			
		||||
#. the inserted conditions.
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#: js/ui/dateMenu.js:301
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s转%s,随后转%s。"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "选择地点…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "正在载入…"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "体感温度 %s。"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "通过互联网查看天气信息"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "天气信息目前不可用"
 | 
			
		||||
 | 
			
		||||
@@ -1930,7 +1930,7 @@ msgstr "Thunderbolt 授权错误"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:357
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Could not authorize the Thunderbolt device: %s"
 | 
			
		||||
msgid "Could not authorize the thunderbolt device: %s"
 | 
			
		||||
msgstr "无法授权 Thunderbolt 设备:%s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/volume.js:128
 | 
			
		||||
 
 | 
			
		||||
@@ -590,11 +590,6 @@ app_load_events (App *app)
 | 
			
		||||
  g_list_free (app->live_views);
 | 
			
		||||
  app->live_views = NULL;
 | 
			
		||||
 | 
			
		||||
  if (!app->since || !app->until)
 | 
			
		||||
    {
 | 
			
		||||
      print_debug ("Skipping load of events, no time interval set yet");
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
  /* timezone could have changed */
 | 
			
		||||
  app_update_timezone (app);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -347,10 +347,10 @@ if options.perf == None:
 | 
			
		||||
        options.perf = 'core'
 | 
			
		||||
 | 
			
		||||
if options.extra_filter is None:
 | 
			
		||||
    options.extra_filter = []
 | 
			
		||||
 | 
			
		||||
if options.perf == 'hwtest':
 | 
			
		||||
    options.extra_filter.append('Gedit')
 | 
			
		||||
    if options.hwtest:
 | 
			
		||||
        options.extra_filter = ['Gedit']
 | 
			
		||||
    else:
 | 
			
		||||
        options.extra_filter = []
 | 
			
		||||
 | 
			
		||||
if args:
 | 
			
		||||
    parser.print_usage()
 | 
			
		||||
 
 | 
			
		||||
@@ -399,9 +399,6 @@ get_gl_vendor (void)
 | 
			
		||||
gboolean
 | 
			
		||||
shell_util_need_background_refresh (void)
 | 
			
		||||
{
 | 
			
		||||
  if (!clutter_check_windowing_backend (CLUTTER_WINDOWING_X11))
 | 
			
		||||
    return FALSE;
 | 
			
		||||
 | 
			
		||||
  if (g_strcmp0 (get_gl_vendor (), "NVIDIA Corporation") == 0)
 | 
			
		||||
    return TRUE;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -308,8 +308,9 @@ st_entry_style_changed (StWidget *self)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  theme_node = st_widget_get_theme_node (self);
 | 
			
		||||
 | 
			
		||||
  _st_set_text_from_style (CLUTTER_TEXT (priv->entry), theme_node);
 | 
			
		||||
 
 | 
			
		||||
  st_theme_node_get_foreground_color (theme_node, &color);
 | 
			
		||||
  clutter_text_set_color (CLUTTER_TEXT (priv->entry), &color);
 | 
			
		||||
 | 
			
		||||
  if (st_theme_node_lookup_length (theme_node, "caret-size", TRUE, &size))
 | 
			
		||||
    clutter_text_set_cursor_size (CLUTTER_TEXT (priv->entry), (int)(.5 + size));
 | 
			
		||||
 
 | 
			
		||||
@@ -180,6 +180,7 @@ st_label_dispose (GObject   *object)
 | 
			
		||||
{
 | 
			
		||||
  StLabelPrivate *priv = ST_LABEL (object)->priv;
 | 
			
		||||
 | 
			
		||||
  priv->label = NULL;
 | 
			
		||||
  g_clear_pointer (&priv->text_shadow_pipeline, cogl_object_unref);
 | 
			
		||||
 | 
			
		||||
  G_OBJECT_CLASS (st_label_parent_class)->dispose (object);
 | 
			
		||||
 
 | 
			
		||||
@@ -116,7 +116,6 @@ _st_set_text_from_style (ClutterText *text,
 | 
			
		||||
  PangoAttrList *attribs = NULL;
 | 
			
		||||
  const PangoFontDescription *font;
 | 
			
		||||
  StTextAlign align;
 | 
			
		||||
  gdouble spacing;
 | 
			
		||||
 | 
			
		||||
  st_theme_node_get_foreground_color (theme_node, &color);
 | 
			
		||||
  clutter_text_set_color (text, &color);
 | 
			
		||||
@@ -124,11 +123,11 @@ _st_set_text_from_style (ClutterText *text,
 | 
			
		||||
  font = st_theme_node_get_font (theme_node);
 | 
			
		||||
  clutter_text_set_font_description (text, (PangoFontDescription *) font);
 | 
			
		||||
 | 
			
		||||
  attribs = pango_attr_list_new ();
 | 
			
		||||
 | 
			
		||||
  decoration = st_theme_node_get_text_decoration (theme_node);
 | 
			
		||||
  if (decoration)
 | 
			
		||||
    {
 | 
			
		||||
      attribs = pango_attr_list_new ();
 | 
			
		||||
 | 
			
		||||
      if (decoration & ST_TEXT_DECORATION_UNDERLINE)
 | 
			
		||||
        {
 | 
			
		||||
          PangoAttribute *underline = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE);
 | 
			
		||||
@@ -144,13 +143,6 @@ _st_set_text_from_style (ClutterText *text,
 | 
			
		||||
       */
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  spacing = st_theme_node_get_letter_spacing (theme_node);
 | 
			
		||||
  if (spacing)
 | 
			
		||||
    {
 | 
			
		||||
      PangoAttribute *letter_spacing = pango_attr_letter_spacing_new ((int)(.5 + spacing) * PANGO_SCALE);
 | 
			
		||||
      pango_attr_list_insert (attribs, letter_spacing);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  clutter_text_set_attributes (text, attribs);
 | 
			
		||||
 | 
			
		||||
  if (attribs)
 | 
			
		||||
 
 | 
			
		||||
@@ -37,6 +37,7 @@ struct _StTextureCachePrivate
 | 
			
		||||
 | 
			
		||||
  /* Things that were loaded with a cache policy != NONE */
 | 
			
		||||
  GHashTable *keyed_cache; /* char * -> CoglTexture* */
 | 
			
		||||
  GHashTable *keyed_surface_cache; /* char * -> cairo_surface_t* */
 | 
			
		||||
 | 
			
		||||
  /* Presently this is used to de-duplicate requests for GIcons and async URIs. */
 | 
			
		||||
  GHashTable *outstanding_requests; /* char * -> AsyncTextureLoadData * */
 | 
			
		||||
@@ -104,6 +105,18 @@ st_texture_cache_class_init (StTextureCacheClass *klass)
 | 
			
		||||
                  G_TYPE_NONE, 1, G_TYPE_FILE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Evicts all cached textures */
 | 
			
		||||
void
 | 
			
		||||
st_texture_cache_clear (StTextureCache *cache)
 | 
			
		||||
{
 | 
			
		||||
  GHashTableIter iter;
 | 
			
		||||
  gpointer key;
 | 
			
		||||
  gpointer value;
 | 
			
		||||
 | 
			
		||||
  g_hash_table_remove_all (cache->priv->keyed_cache);
 | 
			
		||||
  g_signal_emit (cache, signals[ICON_THEME_CHANGED], 0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Evicts all cached textures for named icons */
 | 
			
		||||
static void
 | 
			
		||||
st_texture_cache_evict_icons (StTextureCache *cache)
 | 
			
		||||
@@ -145,6 +158,10 @@ st_texture_cache_init (StTextureCache *self)
 | 
			
		||||
 | 
			
		||||
  self->priv->keyed_cache = g_hash_table_new_full (g_str_hash, g_str_equal,
 | 
			
		||||
                                                   g_free, cogl_object_unref);
 | 
			
		||||
  self->priv->keyed_surface_cache = g_hash_table_new_full (g_str_hash,
 | 
			
		||||
                                                           g_str_equal,
 | 
			
		||||
                                                           g_free,
 | 
			
		||||
                                                           (GDestroyNotify) cairo_surface_destroy);
 | 
			
		||||
  self->priv->outstanding_requests = g_hash_table_new_full (g_str_hash, g_str_equal,
 | 
			
		||||
                                                            g_free, NULL);
 | 
			
		||||
  self->priv->file_monitors = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal,
 | 
			
		||||
@@ -166,6 +183,7 @@ st_texture_cache_dispose (GObject *object)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  g_clear_pointer (&self->priv->keyed_cache, g_hash_table_destroy);
 | 
			
		||||
  g_clear_pointer (&self->priv->keyed_surface_cache, g_hash_table_destroy);
 | 
			
		||||
  g_clear_pointer (&self->priv->outstanding_requests, g_hash_table_destroy);
 | 
			
		||||
  g_clear_pointer (&self->priv->file_monitors, g_hash_table_destroy);
 | 
			
		||||
 | 
			
		||||
@@ -520,6 +538,8 @@ finish_texture_load (AsyncTextureLoadData *data,
 | 
			
		||||
    goto out;
 | 
			
		||||
 | 
			
		||||
  texdata = pixbuf_to_cogl_texture (pixbuf);
 | 
			
		||||
  if (!texdata)
 | 
			
		||||
    goto out;
 | 
			
		||||
 | 
			
		||||
  if (data->policy != ST_TEXTURE_CACHE_POLICY_NONE)
 | 
			
		||||
    {
 | 
			
		||||
@@ -986,7 +1006,7 @@ file_changed_cb (GFileMonitor      *monitor,
 | 
			
		||||
  g_free (key);
 | 
			
		||||
 | 
			
		||||
  key = g_strdup_printf (CACHE_PREFIX_FILE_FOR_CAIRO "%u", file_hash);
 | 
			
		||||
  g_hash_table_remove (cache->priv->keyed_cache, key);
 | 
			
		||||
  g_hash_table_remove (cache->priv->keyed_surface_cache, key);
 | 
			
		||||
  g_free (key);
 | 
			
		||||
 | 
			
		||||
  g_signal_emit (cache, signals[TEXTURE_FILE_CHANGED], 0, file);
 | 
			
		||||
@@ -1273,6 +1293,9 @@ st_texture_cache_load_file_sync_to_cogl_texture (StTextureCache *cache,
 | 
			
		||||
      texdata = pixbuf_to_cogl_texture (pixbuf);
 | 
			
		||||
      g_object_unref (pixbuf);
 | 
			
		||||
 | 
			
		||||
      if (!texdata)
 | 
			
		||||
        goto out;
 | 
			
		||||
 | 
			
		||||
      if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
 | 
			
		||||
        {
 | 
			
		||||
          cogl_object_ref (texdata);
 | 
			
		||||
@@ -1304,7 +1327,7 @@ st_texture_cache_load_file_sync_to_cairo_surface (StTextureCache        *cache,
 | 
			
		||||
 | 
			
		||||
  key = g_strdup_printf (CACHE_PREFIX_FILE_FOR_CAIRO "%u", g_file_hash (file));
 | 
			
		||||
 | 
			
		||||
  surface = g_hash_table_lookup (cache->priv->keyed_cache, key);
 | 
			
		||||
  surface = g_hash_table_lookup (cache->priv->keyed_surface_cache, key);
 | 
			
		||||
 | 
			
		||||
  if (surface == NULL)
 | 
			
		||||
    {
 | 
			
		||||
@@ -1318,7 +1341,8 @@ st_texture_cache_load_file_sync_to_cairo_surface (StTextureCache        *cache,
 | 
			
		||||
      if (policy == ST_TEXTURE_CACHE_POLICY_FOREVER)
 | 
			
		||||
        {
 | 
			
		||||
          cairo_surface_reference (surface);
 | 
			
		||||
          g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), surface);
 | 
			
		||||
          g_hash_table_insert (cache->priv->keyed_surface_cache,
 | 
			
		||||
                               g_strdup (key), surface);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
 
 | 
			
		||||
@@ -52,6 +52,7 @@ typedef enum {
 | 
			
		||||
} StTextureCachePolicy;
 | 
			
		||||
 | 
			
		||||
StTextureCache* st_texture_cache_get_default (void);
 | 
			
		||||
void st_texture_cache_clear (StTextureCache *cache);
 | 
			
		||||
 | 
			
		||||
ClutterActor *
 | 
			
		||||
st_texture_cache_load_sliced_image (StTextureCache *cache,
 | 
			
		||||
 
 | 
			
		||||
@@ -2545,28 +2545,6 @@ st_theme_node_get_text_align(StThemeNode *node)
 | 
			
		||||
  return ST_TEXT_ALIGN_LEFT;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * st_theme_node_get_letter_spacing:
 | 
			
		||||
 * @node: a #StThemeNode
 | 
			
		||||
 *
 | 
			
		||||
 * Gets the value for the letter-spacing style property, in pixels.
 | 
			
		||||
 *
 | 
			
		||||
 * Return value: the value of the letter-spacing property, if
 | 
			
		||||
 *   found, or zero if such property has not been found.
 | 
			
		||||
 */
 | 
			
		||||
gdouble
 | 
			
		||||
st_theme_node_get_letter_spacing (StThemeNode *node)
 | 
			
		||||
{
 | 
			
		||||
  gdouble spacing = 0.;
 | 
			
		||||
 | 
			
		||||
  g_return_val_if_fail (ST_IS_THEME_NODE (node), spacing);
 | 
			
		||||
 | 
			
		||||
  ensure_properties (node);
 | 
			
		||||
 | 
			
		||||
  st_theme_node_lookup_length (node, "letter-spacing", FALSE, &spacing);
 | 
			
		||||
  return spacing;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static gboolean
 | 
			
		||||
font_family_from_terms (CRTerm *term,
 | 
			
		||||
                        char  **family)
 | 
			
		||||
 
 | 
			
		||||
@@ -223,8 +223,6 @@ StTextDecoration st_theme_node_get_text_decoration (StThemeNode *node);
 | 
			
		||||
 | 
			
		||||
StTextAlign st_theme_node_get_text_align (StThemeNode *node);
 | 
			
		||||
 | 
			
		||||
double st_theme_node_get_letter_spacing (StThemeNode *node);
 | 
			
		||||
 | 
			
		||||
/* Font rule processing is pretty complicated, so we just hardcode it
 | 
			
		||||
 * under the standard font/font-family/font-size/etc names. This means
 | 
			
		||||
 * you can't have multiple separate styled fonts for a single item,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user