Compare commits
	
		
			78 Commits
		
	
	
		
			3.28.2
			...
			theme-sear
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					9ab35786f6 | ||
| 
						 | 
					5fe349d5ba | ||
| 
						 | 
					1f03599d1c | ||
| 
						 | 
					a24999b7a3 | ||
| 
						 | 
					8237a1f6e0 | ||
| 
						 | 
					f9dec475a1 | ||
| 
						 | 
					68b01a8f56 | ||
| 
						 | 
					f56ba0877a | ||
| 
						 | 
					5ac6201d91 | ||
| 
						 | 
					a21a22fdb5 | ||
| 
						 | 
					a0fa50ac31 | ||
| 
						 | 
					b1dd746443 | ||
| 
						 | 
					c15e163eb1 | ||
| 
						 | 
					7a3927c168 | ||
| 
						 | 
					6eed4e31d7 | ||
| 
						 | 
					f0557ea05c | ||
| 
						 | 
					44894262f4 | ||
| 
						 | 
					b03bcc85aa | ||
| 
						 | 
					70057c6a55 | ||
| 
						 | 
					86bd5b281d | ||
| 
						 | 
					ad3e9ab205 | ||
| 
						 | 
					02bbf409ea | ||
| 
						 | 
					f56e4e177e | ||
| 
						 | 
					fc26559f2c | ||
| 
						 | 
					fdaddbd1e0 | ||
| 
						 | 
					04f61567ba | ||
| 
						 | 
					a0785cdbc1 | ||
| 
						 | 
					94101e8bb8 | ||
| 
						 | 
					f13dbf2f26 | ||
| 
						 | 
					bae6f06e4e | ||
| 
						 | 
					d8b9e23502 | ||
| 
						 | 
					7d59eaa67e | ||
| 
						 | 
					c0a453f64f | ||
| 
						 | 
					5336175736 | ||
| 
						 | 
					2997e4950b | ||
| 
						 | 
					a49fb90d86 | ||
| 
						 | 
					ffc0eb1de2 | ||
| 
						 | 
					853c81eb62 | ||
| 
						 | 
					594cc7cbef | ||
| 
						 | 
					0932324d39 | ||
| 
						 | 
					2d6cf236c4 | ||
| 
						 | 
					642107a28f | ||
| 
						 | 
					581b38ecf4 | ||
| 
						 | 
					fbc03cc262 | ||
| 
						 | 
					a6ff195893 | ||
| 
						 | 
					f411724064 | ||
| 
						 | 
					39f43a4cd4 | ||
| 
						 | 
					c82cb918ae | ||
| 
						 | 
					38cdaa6c20 | ||
| 
						 | 
					0327069e83 | ||
| 
						 | 
					7601b029c8 | ||
| 
						 | 
					fb509dfc25 | ||
| 
						 | 
					874a91968f | ||
| 
						 | 
					0963ccddba | ||
| 
						 | 
					c4e0f6df08 | ||
| 
						 | 
					58aafe9520 | ||
| 
						 | 
					a46df7f8ec | ||
| 
						 | 
					1dd16618d1 | ||
| 
						 | 
					a4190f83ac | ||
| 
						 | 
					a8e17f73ec | ||
| 
						 | 
					86a741c1ee | ||
| 
						 | 
					5cc6fef689 | ||
| 
						 | 
					522a5fe480 | ||
| 
						 | 
					b1239b1257 | ||
| 
						 | 
					58063d9ee1 | ||
| 
						 | 
					d7aba2dece | ||
| 
						 | 
					35fced27df | ||
| 
						 | 
					be76b19300 | ||
| 
						 | 
					376d696b8b | ||
| 
						 | 
					695d61968d | ||
| 
						 | 
					d6d09fd3c8 | ||
| 
						 | 
					f1b1501f9b | ||
| 
						 | 
					cdbc99e992 | ||
| 
						 | 
					69afe7785d | ||
| 
						 | 
					b99e304f1e | ||
| 
						 | 
					c29bd46e7a | ||
| 
						 | 
					5fcf40b973 | ||
| 
						 | 
					a198dfe3d8 | 
@@ -1,19 +1,16 @@
 | 
			
		||||
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
 | 
			
		||||
@@ -22,7 +19,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;
 | 
			
		||||
 | 
			
		||||
@@ -39,22 +36,20 @@ 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.
 | 
			
		||||
 | 
			
		||||
@@ -67,14 +62,13 @@ 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.
 | 
			
		||||
@@ -85,7 +79,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;
 | 
			
		||||
@@ -95,23 +89,22 @@ 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
 | 
			
		||||
--------------------
 | 
			
		||||
## 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];
 | 
			
		||||
@@ -121,17 +114,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,
 | 
			
		||||
@@ -146,6 +139,7 @@ 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.
 | 
			
		||||
@@ -162,13 +156,12 @@ 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,
 | 
			
		||||
@@ -188,9 +181,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
 | 
			
		||||
@@ -204,8 +197,7 @@ 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
 | 
			
		||||
@@ -214,7 +206,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',
 | 
			
		||||
 | 
			
		||||
@@ -229,6 +221,7 @@ 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
 | 
			
		||||
@@ -236,16 +229,14 @@ 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"
 | 
			
		||||
@@ -254,15 +245,16 @@ 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;
 | 
			
		||||
 | 
			
		||||
@@ -276,19 +268,21 @@ 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:
 | 
			
		||||
@@ -298,14 +292,13 @@ 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({
 | 
			
		||||
@@ -331,3 +324,4 @@ property.
 | 
			
		||||
                     { position: 100,
 | 
			
		||||
                       time: ANIMATION_TIME,
 | 
			
		||||
                       transition: 'easeOutQuad' });
 | 
			
		||||
```
 | 
			
		||||
@@ -1,7 +0,0 @@
 | 
			
		||||
Owen Taylor
 | 
			
		||||
E-mail: otaylor@redhat.com
 | 
			
		||||
Userid: otaylor
 | 
			
		||||
 | 
			
		||||
Colin Walters
 | 
			
		||||
E-mail: walters@verbum.org
 | 
			
		||||
Userid: walters
 | 
			
		||||
							
								
								
									
										31
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								NEWS
									
									
									
									
									
								
							@@ -1,17 +1,34 @@
 | 
			
		||||
3.28.2
 | 
			
		||||
3.29.2
 | 
			
		||||
======
 | 
			
		||||
* 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]
 | 
			
		||||
* 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]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Carlos Garnacho, Silvère Latchurié, Florian Müllner, Mario Sanchez Prada,
 | 
			
		||||
  Ray Strode, Marco Trevisan (Treviño)
 | 
			
		||||
  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
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  Stas Solovey [ru], Rafael Fontenelle [pt_BR]
 | 
			
		||||
  Rafael Fontenelle [pt_BR], Kukuh Syafaat [id], Marcos Lans [gl],
 | 
			
		||||
  Anders Jonsson [sv], Mingcong Bai [zh_CN]
 | 
			
		||||
 | 
			
		||||
3.29.1
 | 
			
		||||
======
 | 
			
		||||
* Support icons in app-menu [Florian; #760985]
 | 
			
		||||
* Misc. bug fixes [Marco, Florian, Lubomir; #792687, #221, !63]
 | 
			
		||||
 | 
			
		||||
Contributors:
 | 
			
		||||
  Piotr Drąg, Takao Fujiwara, Christian Kellner, Florian Müllner,
 | 
			
		||||
  Mario Sanchez Prada, Lubomir Rintel, Didier Roche, Marco Trevisan (Treviño),
 | 
			
		||||
  verdre
 | 
			
		||||
 | 
			
		||||
Translators:
 | 
			
		||||
  gogo [hr], Stas Solovey [ru], Matej Urbančič [sl], Daniel Șerbănescu [ro],
 | 
			
		||||
  Fabio Tomat [fur], Marek Cernocky [cs], Daniel Mustieles [es]
 | 
			
		||||
 | 
			
		||||
3.28.1
 | 
			
		||||
======
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
# 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
 | 
			
		||||
@@ -6,15 +7,14 @@ 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:
 | 
			
		||||
see the [project wiki][wiki]
 | 
			
		||||
 | 
			
		||||
 https://wiki.gnome.org/Projects/GnomeShell
 | 
			
		||||
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
 | 
			
		||||
GNOME Shell is distributed under the terms of the GNU General Public License,
 | 
			
		||||
version 2 or later. See the COPYING file for details.
 | 
			
		||||
version 2 or later. See the [COPYING][license] 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 at http://bugzilla.gnome.org against the 'gnome-shell'
 | 
			
		||||
product.
 | 
			
		||||
Bugs should be reported to the GNOME [bug tracking system][bug-tracker].
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
To generate the css files, from the project directory:
 | 
			
		||||
 | 
			
		||||
sass --sourcemap=none --update .
 | 
			
		||||
@@ -1,31 +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 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.
 | 
			
		||||
							
								
								
									
										32
									
								
								data/theme/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								data/theme/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
## 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/
 | 
			
		||||
@@ -1,6 +0,0 @@
 | 
			
		||||
--- 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 ./
 | 
			
		||||
@@ -1,7 +0,0 @@
 | 
			
		||||
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.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										16
									
								
								data/theme/gnome-shell-sass/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								data/theme/gnome-shell-sass/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
# 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
 | 
			
		||||
@@ -733,6 +733,7 @@ StScrollBar {
 | 
			
		||||
  transition-duration: 500ms;
 | 
			
		||||
  font-weight: bold;
 | 
			
		||||
  height: 1.86em;
 | 
			
		||||
  font-feature-settings: "tnum";
 | 
			
		||||
 | 
			
		||||
  &.unlock-screen,
 | 
			
		||||
  &.login-screen,
 | 
			
		||||
@@ -958,6 +959,7 @@ StScrollBar {
 | 
			
		||||
      padding: 0.1em;
 | 
			
		||||
      margin: 2px;
 | 
			
		||||
      border-radius: 1.4em;
 | 
			
		||||
      font-feature-settings: "tnum";
 | 
			
		||||
      &:hover,&:focus { background-color: lighten($bg_color,5%); }
 | 
			
		||||
      &:active,&:selected {
 | 
			
		||||
        color: lighten($selected_fg_color,5%);
 | 
			
		||||
@@ -1788,20 +1790,19 @@ 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: .2em;
 | 
			
		||||
    padding: 6px;
 | 
			
		||||
    color: darken($osd_fg_color,30%);
 | 
			
		||||
    &:ltr { padding-right: 1em; }
 | 
			
		||||
    &:rtl { padding-left: 1em; }
 | 
			
		||||
    &:ltr .user-widget { padding-right: 1em; }
 | 
			
		||||
    &:rtl .user-widget { padding-left: 1em; }
 | 
			
		||||
    .login-dialog-timed-login-indicator {
 | 
			
		||||
      height: 2px;
 | 
			
		||||
      margin: 2px 0 0 0;
 | 
			
		||||
      margin-top: 6px;
 | 
			
		||||
      background-color: $osd_fg_color;
 | 
			
		||||
    }
 | 
			
		||||
    &:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; }
 | 
			
		||||
@@ -1816,8 +1817,8 @@ StScrollBar {
 | 
			
		||||
    padding-left: 15px;
 | 
			
		||||
  }
 | 
			
		||||
    .user-widget-label {
 | 
			
		||||
      &:ltr { padding-left: 18px; }
 | 
			
		||||
      &:rtl { padding-right: 18px; }
 | 
			
		||||
      &:ltr { padding-left: 14px; }
 | 
			
		||||
      &:rtl { padding-right: 14px; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  .login-dialog-prompt-layout {
 | 
			
		||||
@@ -1868,6 +1869,7 @@ StScrollBar {
 | 
			
		||||
.screen-shield-clock-time {
 | 
			
		||||
  font-size: 72pt;
 | 
			
		||||
  text-shadow: 0px 2px 2px rgba(0,0,0,0.4);
 | 
			
		||||
  font-feature-settings: "tnum";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.screen-shield-clock-date { 
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,6 @@ 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;
 | 
			
		||||
@@ -86,7 +85,8 @@ var UserListItem = new Lang.Class({
 | 
			
		||||
                                             GObject.BindingFlags.SYNC_CREATE);
 | 
			
		||||
 | 
			
		||||
        this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator',
 | 
			
		||||
                                                 scale_x: 0 });
 | 
			
		||||
                                                 scale_x: 0,
 | 
			
		||||
                                                 visible: false });
 | 
			
		||||
        layout.add(this._timedLoginIndicator);
 | 
			
		||||
 | 
			
		||||
        this.actor.connect('clicked', this._onClicked.bind(this));
 | 
			
		||||
@@ -126,6 +126,8 @@ 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,
 | 
			
		||||
@@ -152,6 +154,8 @@ var UserListItem = new Lang.Class({
 | 
			
		||||
            GLib.source_remove(this._timedLoginTimeoutId);
 | 
			
		||||
            this._timedLoginTimeoutId = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this._timedLoginIndicator.visible = false;
 | 
			
		||||
        this._timedLoginIndicator.scale_x = 0.;
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
@@ -991,59 +995,81 @@ 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 = Mainloop.timeout_add_seconds(_TIMED_LOGIN_IDLE_THRESHOLD,
 | 
			
		||||
        this._timedLoginIdleTimeOutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, _TIMED_LOGIN_IDLE_THRESHOLD,
 | 
			
		||||
            () => {
 | 
			
		||||
                this._timedLoginAnimationTime -= _TIMED_LOGIN_IDLE_THRESHOLD;
 | 
			
		||||
                this._timedLoginIdleTimeOutId = 0;
 | 
			
		||||
                hold.release();
 | 
			
		||||
                return GLib.SOURCE_REMOVE;
 | 
			
		||||
            });
 | 
			
		||||
        GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginAnimationTime');
 | 
			
		||||
        GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginIdleTimeOutId');
 | 
			
		||||
        return hold;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _startTimedLogin(userName, delay) {
 | 
			
		||||
        this._timedLoginItem = null;
 | 
			
		||||
        this._timedLoginDelay = delay;
 | 
			
		||||
        this._timedLoginAnimationTime = 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;
 | 
			
		||||
 | 
			
		||||
        let tasks = [() => this._waitForItemForUser(userName),
 | 
			
		||||
 | 
			
		||||
                     () => {
 | 
			
		||||
                         this._timedLoginItem = this._userList.getItemFromUserName(userName);
 | 
			
		||||
                         loginItem = this._userList.getItemFromUserName(userName);
 | 
			
		||||
 | 
			
		||||
                         // If there is an animation running on the item, reset it.
 | 
			
		||||
                         loginItem.hideTimedLoginIndicator();
 | 
			
		||||
                     },
 | 
			
		||||
 | 
			
		||||
                     () => {
 | 
			
		||||
                         // 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(this._timedLoginItem);
 | 
			
		||||
                             this._userList.jumpToItem(loginItem);
 | 
			
		||||
                         }
 | 
			
		||||
                     },
 | 
			
		||||
 | 
			
		||||
                     this._blockTimedLoginUntilIdle,
 | 
			
		||||
 | 
			
		||||
                     () => {
 | 
			
		||||
                         this._userList.scrollToItem(this._timedLoginItem);
 | 
			
		||||
                         // 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._showTimedLoginAnimation,
 | 
			
		||||
                     () => {
 | 
			
		||||
                         // 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._timedLoginBatch = null;
 | 
			
		||||
@@ -1055,37 +1081,17 @@ var LoginDialog = new Lang.Class({
 | 
			
		||||
        return this._timedLoginBatch.run();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _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) {
 | 
			
		||||
        if (this._timedLoginBatch)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        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) {
 | 
			
		||||
               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();
 | 
			
		||||
               this._startTimedLogin(userName, seconds);
 | 
			
		||||
           }
 | 
			
		||||
 | 
			
		||||
           return Clutter.EVENT_PROPAGATE;
 | 
			
		||||
 
 | 
			
		||||
@@ -136,8 +136,7 @@ function run() {
 | 
			
		||||
    global.frame_finish_timestamp = true;
 | 
			
		||||
 | 
			
		||||
    for (let k = 0; k < 5; k++)
 | 
			
		||||
        yield Scripting.createTestWindow(640, 480,
 | 
			
		||||
                                         { maximized: true });
 | 
			
		||||
        yield Scripting.createTestWindow({ maximized: true });
 | 
			
		||||
    yield Scripting.waitTestWindows();
 | 
			
		||||
 | 
			
		||||
    yield Scripting.sleep(1000);
 | 
			
		||||
@@ -158,8 +157,7 @@ function run() {
 | 
			
		||||
    yield Scripting.destroyTestWindows();
 | 
			
		||||
    Main.overview.hide();
 | 
			
		||||
 | 
			
		||||
    yield Scripting.createTestWindow(640, 480,
 | 
			
		||||
                                     { maximized: true,
 | 
			
		||||
    yield Scripting.createTestWindow({ maximized: true,
 | 
			
		||||
                                       redraws: true});
 | 
			
		||||
    yield Scripting.waitTestWindows();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1778,10 +1778,11 @@ var AppIcon = new Lang.Class({
 | 
			
		||||
    activate(button) {
 | 
			
		||||
        let event = Clutter.get_current_event();
 | 
			
		||||
        let modifiers = event ? event.get_state() : 0;
 | 
			
		||||
        let openNewWindow = this.app.can_open_new_window () &&
 | 
			
		||||
                            modifiers & Clutter.ModifierType.CONTROL_MASK &&
 | 
			
		||||
                            this.app.state == Shell.AppState.RUNNING ||
 | 
			
		||||
                            button && button == 2;
 | 
			
		||||
        let isMiddleButton = button && button == Clutter.BUTTON_MIDDLE;
 | 
			
		||||
        let isCtrlPressed = (modifiers & Clutter.ModifierType.CONTROL_MASK) != 0;
 | 
			
		||||
        let openNewWindow = this.app.can_open_new_window() &&
 | 
			
		||||
                            this.app.state == Shell.AppState.RUNNING &&
 | 
			
		||||
                            (isCtrlPressed || isMiddleButton);
 | 
			
		||||
 | 
			
		||||
        if (this.app.state == Shell.AppState.STOPPED || openNewWindow)
 | 
			
		||||
            this.animateLaunch();
 | 
			
		||||
@@ -1870,7 +1871,9 @@ var AppIconMenu = new Lang.Class({
 | 
			
		||||
                this._appendSeparator();
 | 
			
		||||
                separatorShown = true;
 | 
			
		||||
            }
 | 
			
		||||
            let item = this._appendMenuItem(window.title);
 | 
			
		||||
            let title = window.title ? window.title
 | 
			
		||||
                                     : this._source.app.get_name();
 | 
			
		||||
            let item = this._appendMenuItem(title);
 | 
			
		||||
            item.connect('activate', () => {
 | 
			
		||||
                this.emit('activate-window', window);
 | 
			
		||||
            });
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@
 | 
			
		||||
 | 
			
		||||
const Clutter = imports.gi.Clutter;
 | 
			
		||||
const Gio = imports.gi.Gio;
 | 
			
		||||
const GLib = imports.gi.GLib;
 | 
			
		||||
const GObject = imports.gi.GObject;
 | 
			
		||||
const Lang = imports.lang;
 | 
			
		||||
const Meta = imports.gi.Meta;
 | 
			
		||||
@@ -13,6 +14,7 @@ const Tweener = imports.ui.tweener;
 | 
			
		||||
 | 
			
		||||
var FROZEN_WINDOW_BRIGHTNESS = -0.3
 | 
			
		||||
var DIALOG_TRANSITION_TIME = 0.15
 | 
			
		||||
var ALIVE_TIMEOUT = 5000;
 | 
			
		||||
 | 
			
		||||
var CloseDialog = new Lang.Class({
 | 
			
		||||
    Name: 'CloseDialog',
 | 
			
		||||
@@ -26,6 +28,7 @@ var CloseDialog = new Lang.Class({
 | 
			
		||||
        this.parent();
 | 
			
		||||
        this._window = window;
 | 
			
		||||
        this._dialog = null;
 | 
			
		||||
        this._timeoutId = 0;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    get window() {
 | 
			
		||||
@@ -97,6 +100,14 @@ var CloseDialog = new Lang.Class({
 | 
			
		||||
        if (this._dialog != null)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        Meta.disable_unredirect_for_screen(global.screen);
 | 
			
		||||
 | 
			
		||||
        this._timeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, ALIVE_TIMEOUT,
 | 
			
		||||
            () => {
 | 
			
		||||
                this._window.check_alive(global.display.get_current_time_roundtrip());
 | 
			
		||||
                return GLib.SOURCE_CONTINUE;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        this._addWindowEffect();
 | 
			
		||||
        this._initDialog();
 | 
			
		||||
 | 
			
		||||
@@ -117,6 +128,11 @@ var CloseDialog = new Lang.Class({
 | 
			
		||||
        if (this._dialog == null)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        Meta.enable_unredirect_for_screen(global.screen);
 | 
			
		||||
 | 
			
		||||
        GLib.source_remove(this._timeoutId);
 | 
			
		||||
        this._timeoutId = 0;
 | 
			
		||||
 | 
			
		||||
        let dialog = this._dialog;
 | 
			
		||||
        this._dialog = null;
 | 
			
		||||
        this._removeWindowEffect();
 | 
			
		||||
 
 | 
			
		||||
@@ -604,12 +604,17 @@ var NetworkAgent = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
        this._native.connect('new-request', this._newRequest.bind(this));
 | 
			
		||||
        this._native.connect('cancel-request', this._cancelRequest.bind(this));
 | 
			
		||||
        try {
 | 
			
		||||
            this._native.init(null);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
            this._native = null;
 | 
			
		||||
            logError(e, 'error initializing the NetworkManager Agent');
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        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');
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    enable() {
 | 
			
		||||
@@ -617,7 +622,7 @@ var NetworkAgent = new Lang.Class({
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._native.auto_register = true;
 | 
			
		||||
        if (!this._native.registered)
 | 
			
		||||
        if (this._initialized && !this._native.registered)
 | 
			
		||||
            this._native.register_async(null, null);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
@@ -640,7 +645,7 @@ var NetworkAgent = new Lang.Class({
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        this._native.auto_register = false;
 | 
			
		||||
        if (this._native.registered)
 | 
			
		||||
        if (this._initialized && this._native.registered)
 | 
			
		||||
            this._native.unregister_async(null, null);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
@@ -655,7 +660,7 @@ var NetworkAgent = new Lang.Class({
 | 
			
		||||
        switch (connectionType) {
 | 
			
		||||
        case '802-11-wireless':
 | 
			
		||||
            let wirelessSetting = connection.get_setting_wireless();
 | 
			
		||||
            let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid());
 | 
			
		||||
            let ssid = NM.utils_ssid_to_utf8(wirelessSetting.get_ssid().get_data());
 | 
			
		||||
            title = _("Authentication required by wireless network");
 | 
			
		||||
            body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
 | 
			
		||||
            break;
 | 
			
		||||
 
 | 
			
		||||
@@ -166,7 +166,7 @@ var CandidatePopup = new Lang.Class({
 | 
			
		||||
            this._panelService.cursor_down();
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this._candidateArea.connect('candidate-clicked', () => {
 | 
			
		||||
        this._candidateArea.connect('candidate-clicked', (area, index, button, state) => {
 | 
			
		||||
            this._panelService.candidate_clicked(index, button, state);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,7 +19,6 @@ const MagnifierDBus = imports.ui.magnifierDBus;
 | 
			
		||||
const Params = imports.misc.params;
 | 
			
		||||
const PointerWatcher = imports.ui.pointerWatcher;
 | 
			
		||||
 | 
			
		||||
var MOUSE_POLL_FREQUENCY = 50;
 | 
			
		||||
var CROSSHAIRS_CLIP_SIZE = [100, 100];
 | 
			
		||||
var NO_CHANGE = 0.0;
 | 
			
		||||
 | 
			
		||||
@@ -152,8 +151,10 @@ var Magnifier = new Lang.Class({
 | 
			
		||||
     * Turn on mouse tracking, if not already doing so.
 | 
			
		||||
     */
 | 
			
		||||
    startTrackingMouse() {
 | 
			
		||||
        if (!this._pointerWatch)
 | 
			
		||||
            this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(MOUSE_POLL_FREQUENCY, this.scrollToMousePos.bind(this));
 | 
			
		||||
        if (!this._pointerWatch) {
 | 
			
		||||
            let interval = 1000 / Clutter.get_default_frame_rate();
 | 
			
		||||
            this._pointerWatch = PointerWatcher.getPointerWatcher().addWatch(interval, this.scrollToMousePos.bind(this));
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ const St = imports.gi.St;
 | 
			
		||||
const AccessDialog = imports.ui.accessDialog;
 | 
			
		||||
const AudioDeviceSelection = imports.ui.audioDeviceSelection;
 | 
			
		||||
const Components = imports.ui.components;
 | 
			
		||||
const Config = imports.misc.config;
 | 
			
		||||
const CtrlAltTab = imports.ui.ctrlAltTab;
 | 
			
		||||
const EndSessionDialog = imports.ui.endSessionDialog;
 | 
			
		||||
const Environment = imports.ui.environment;
 | 
			
		||||
@@ -249,18 +250,61 @@ function _initializeUI() {
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _findThemeDirByVersion(dir, major, minor, name) {
 | 
			
		||||
    let path;
 | 
			
		||||
    let stylesheet;
 | 
			
		||||
    let subpath;
 | 
			
		||||
 | 
			
		||||
    /* Don't search back to before we introduced this support */
 | 
			
		||||
    let max_minor = (major == 3) ? 28 : 0;
 | 
			
		||||
 | 
			
		||||
    for (let i = minor; i >= max_minor; i = i - 2) {
 | 
			
		||||
        subpath = major + '.' + i;
 | 
			
		||||
        path = GLib.build_filenamev([dir, 'gnome-shell', subpath, 'theme', name]);
 | 
			
		||||
        stylesheet = Gio.file_new_for_path(path);
 | 
			
		||||
 | 
			
		||||
        log('Checking for ' + path);
 | 
			
		||||
 | 
			
		||||
        if (stylesheet.query_exists(null)) {
 | 
			
		||||
            log('Using ' + path);
 | 
			
		||||
            return stylesheet;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    path = GLib.build_filenamev([dir, 'gnome-shell', 'theme', name]);
 | 
			
		||||
    stylesheet = Gio.file_new_for_path(path);
 | 
			
		||||
 | 
			
		||||
    if (stylesheet.query_exists(null)) {
 | 
			
		||||
        log('Using unversioned' + path);
 | 
			
		||||
        return stylesheet;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return null;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _getStylesheet(name) {
 | 
			
		||||
    let stylesheet;
 | 
			
		||||
 | 
			
		||||
    let [major, minor] = Config.PACKAGE_VERSION.split('.');
 | 
			
		||||
 | 
			
		||||
    // Directories are versioned according to the stable version
 | 
			
		||||
    if ((minor % 2) == 1)
 | 
			
		||||
        minor++;
 | 
			
		||||
 | 
			
		||||
    stylesheet = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/' + name);
 | 
			
		||||
    if (stylesheet.query_exists(null))
 | 
			
		||||
    if (stylesheet.query_exists(null)) {
 | 
			
		||||
        log('Using built-in default theme ' + name)
 | 
			
		||||
        return stylesheet;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    stylesheet = Gio.File.new_for_path(global.datadir + '/theme/' + name);
 | 
			
		||||
    if (stylesheet.query_exists(null))
 | 
			
		||||
        return stylesheet;
 | 
			
		||||
    let dataDirs = GLib.get_system_data_dirs();
 | 
			
		||||
    for (let i = 0; i < dataDirs.length; i++) {
 | 
			
		||||
        stylesheet = _findThemeDirByVersion(dataDirs[i], major, minor, name)
 | 
			
		||||
        if (stylesheet != null)
 | 
			
		||||
            return stylesheet;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return null;
 | 
			
		||||
    return _findThemeDirByVersion(global.datadir, major, minor, name);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function _getDefaultStylesheet() {
 | 
			
		||||
 
 | 
			
		||||
@@ -27,6 +27,7 @@ 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, 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 '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 a 'clear' parameter with the value %true, then
 | 
			
		||||
// the content and the action area of the notification will be cleared.
 | 
			
		||||
@@ -328,6 +328,8 @@ 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',
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -119,6 +119,9 @@ 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;
 | 
			
		||||
@@ -129,11 +132,13 @@ 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();
 | 
			
		||||
@@ -143,6 +148,11 @@ 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(width, height, params) {
 | 
			
		||||
function createTestWindow(params) {
 | 
			
		||||
    params = Params.parse(params, { width: 640,
 | 
			
		||||
                                    height: 480,
 | 
			
		||||
                                    alpha: false,
 | 
			
		||||
 
 | 
			
		||||
@@ -995,8 +995,16 @@ var NMWirelessDialog = new Lang.Class({
 | 
			
		||||
        else if (!oneHasConnection && twoHasConnection)
 | 
			
		||||
            return 1;
 | 
			
		||||
 | 
			
		||||
        let oneStrength = one.accessPoints[0].strength;
 | 
			
		||||
        let twoStrength = two.accessPoints[0].strength;
 | 
			
		||||
        let oneAp = one.accessPoints[0] || null;
 | 
			
		||||
        let twoAp = two.accessPoints[0] || null;
 | 
			
		||||
 | 
			
		||||
        if (oneAp != null && twoAp == null)
 | 
			
		||||
            return -1;
 | 
			
		||||
        else if (oneAp == null && twoAp != null)
 | 
			
		||||
            return 1;
 | 
			
		||||
 | 
			
		||||
        let oneStrength = oneAp.strength;
 | 
			
		||||
        let twoStrength = twoAp.strength;
 | 
			
		||||
 | 
			
		||||
        // place stronger connections first
 | 
			
		||||
        if (oneStrength != twoStrength)
 | 
			
		||||
@@ -1156,6 +1164,11 @@ var NMWirelessDialog = new Lang.Class({
 | 
			
		||||
            Util.ensureActorVisibleInScrollView(this._scrollView, network.item.actor);
 | 
			
		||||
            this._selectNetwork(network);
 | 
			
		||||
        });
 | 
			
		||||
        network.item.actor.connect('destroy', () => {
 | 
			
		||||
            let keyFocus = global.stage.key_focus;
 | 
			
		||||
            if (keyFocus && keyFocus.contains(network.item.actor))
 | 
			
		||||
                this._itemBox.grab_key_focus();
 | 
			
		||||
        });
 | 
			
		||||
    },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@@ -1944,6 +1957,7 @@ var NMApplet = new Lang.Class({
 | 
			
		||||
        this.indicators.visible = this._client.nm_running;
 | 
			
		||||
        this.menu.actor.visible = this._client.networking_enabled;
 | 
			
		||||
 | 
			
		||||
        this._updateIcon();
 | 
			
		||||
        this._syncConnectivity();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -49,19 +49,17 @@ const BoltDeviceInterface = '<node> \
 | 
			
		||||
  </interface> \
 | 
			
		||||
</node>';
 | 
			
		||||
 | 
			
		||||
const BoltClientProxy = Gio.DBusProxy.makeProxyWrapper(BoltClientInterface);
 | 
			
		||||
const BoltDeviceProxy = Gio.DBusProxy.makeProxyWrapper(BoltDeviceInterface);
 | 
			
		||||
 | 
			
		||||
/*  */
 | 
			
		||||
 | 
			
		||||
var Status = {
 | 
			
		||||
    DISCONNECTED: 'disconnected',
 | 
			
		||||
    CONNECTING: 'connecting',
 | 
			
		||||
    CONNECTED: 'connected',
 | 
			
		||||
    AUTHORIZING: 'authorizing',
 | 
			
		||||
    AUTH_ERROR: 'auth-error',
 | 
			
		||||
    AUTHORIZED: 'authorized',
 | 
			
		||||
    AUTHORIZED_SECURE: 'authorized-secure',
 | 
			
		||||
    AUTHORIZED_NEWKEY: 'authorized-newkey'
 | 
			
		||||
    AUTHORIZED: 'authorized'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var Policy = {
 | 
			
		||||
@@ -70,7 +68,7 @@ var Policy = {
 | 
			
		||||
    AUTO: 'auto'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
var AuthFlags = {
 | 
			
		||||
var AuthCtrl = {
 | 
			
		||||
    NONE: 'none',
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -79,6 +77,7 @@ var AuthMode = {
 | 
			
		||||
    ENABLED: 'enabled'
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const BOLT_DBUS_CLIENT_IFACE = 'org.freedesktop.bolt1.Manager';
 | 
			
		||||
const BOLT_DBUS_NAME = 'org.freedesktop.bolt';
 | 
			
		||||
const BOLT_DBUS_PATH = '/org/freedesktop/bolt';
 | 
			
		||||
 | 
			
		||||
@@ -88,22 +87,26 @@ var Client = new Lang.Class({
 | 
			
		||||
    _init() {
 | 
			
		||||
 | 
			
		||||
	this._proxy = null;
 | 
			
		||||
        new BoltClientProxy(
 | 
			
		||||
	    Gio.DBus.system,
 | 
			
		||||
	    BOLT_DBUS_NAME,
 | 
			
		||||
	    BOLT_DBUS_PATH,
 | 
			
		||||
	    this._onProxyReady.bind(this)
 | 
			
		||||
	);
 | 
			
		||||
        let nodeInfo = Gio.DBusNodeInfo.new_for_xml(BoltClientInterface);
 | 
			
		||||
        Gio.DBusProxy.new(Gio.DBus.system,
 | 
			
		||||
                          Gio.DBusProxyFlags.DO_NOT_AUTO_START,
 | 
			
		||||
                          nodeInfo.lookup_interface(BOLT_DBUS_CLIENT_IFACE),
 | 
			
		||||
                          BOLT_DBUS_NAME,
 | 
			
		||||
                          BOLT_DBUS_PATH,
 | 
			
		||||
                          BOLT_DBUS_CLIENT_IFACE,
 | 
			
		||||
                          null,
 | 
			
		||||
                          this._onProxyReady.bind(this));
 | 
			
		||||
 | 
			
		||||
	this.probing = false;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _onProxyReady(proxy, error) {
 | 
			
		||||
	if (error !== null) {
 | 
			
		||||
	    log('error creating bolt proxy: %s'.format(error.message));
 | 
			
		||||
	    return;
 | 
			
		||||
	}
 | 
			
		||||
	this._proxy = proxy;
 | 
			
		||||
    _onProxyReady(o, res) {
 | 
			
		||||
        try {
 | 
			
		||||
	    this._proxy = Gio.DBusProxy.new_finish(res);
 | 
			
		||||
        } catch(e) {
 | 
			
		||||
	    log('error creating bolt proxy: %s'.format(e.message));
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
	this._propsChangedId = this._proxy.connect('g-properties-changed', this._onPropertiesChanged.bind(this));
 | 
			
		||||
	this._deviceAddedId = this._proxy.connectSignal('DeviceAdded', this._onDeviceAdded.bind(this));
 | 
			
		||||
 | 
			
		||||
@@ -141,9 +144,10 @@ var Client = new Lang.Class({
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    enrollDevice(id, policy, callback) {
 | 
			
		||||
	this._proxy.EnrollDeviceRemote(id, policy, AuthFlags.NONE,
 | 
			
		||||
	this._proxy.EnrollDeviceRemote(id, policy, AuthCtrl.NONE,
 | 
			
		||||
                                       (res, error) => {
 | 
			
		||||
	    if (error) {
 | 
			
		||||
		Gio.DBusError.strip_remote_error(error);
 | 
			
		||||
		callback(null, error);
 | 
			
		||||
		return;
 | 
			
		||||
	    }
 | 
			
		||||
@@ -228,7 +232,7 @@ var AuthRobot = new Lang.Class({
 | 
			
		||||
 | 
			
		||||
    _onEnrollDone(device, error) {
 | 
			
		||||
	if (error)
 | 
			
		||||
	    this.emit('enroll-failed', error, device);
 | 
			
		||||
	    this.emit('enroll-failed', device, error);
 | 
			
		||||
 | 
			
		||||
	/* TODO: scan the list of devices to be authorized for children
 | 
			
		||||
	 *  of this device and remove them (and their children and
 | 
			
		||||
@@ -354,7 +358,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;
 | 
			
		||||
 
 | 
			
		||||
@@ -447,12 +447,13 @@ var WindowOverlay = new Lang.Class({
 | 
			
		||||
        this.border = new St.Bin({ style_class: 'window-clone-border' });
 | 
			
		||||
 | 
			
		||||
        let title = new St.Label({ style_class: 'window-caption',
 | 
			
		||||
                                   text: metaWindow.title });
 | 
			
		||||
                                   text: this._getCaption() });
 | 
			
		||||
        title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
 | 
			
		||||
        windowClone.actor.label_actor = title;
 | 
			
		||||
 | 
			
		||||
        this._updateCaptionId = metaWindow.connect('notify::title', w => {
 | 
			
		||||
            this.title.text = w.title;
 | 
			
		||||
            this.title.text = this._getCaption();
 | 
			
		||||
            this.relayout(false);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@@ -565,6 +566,16 @@ var WindowOverlay = new Lang.Class({
 | 
			
		||||
        }
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _getCaption() {
 | 
			
		||||
        let metaWindow = this._windowClone.metaWindow;
 | 
			
		||||
        if (metaWindow.title)
 | 
			
		||||
            return metaWindow.title;
 | 
			
		||||
 | 
			
		||||
        let tracker = Shell.WindowTracker.get_default();
 | 
			
		||||
        let app = tracker.get_window_app(metaWindow);
 | 
			
		||||
        return app.get_name();
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _animateOverlayActor(actor, x, y, width, height) {
 | 
			
		||||
        let params = { x: x,
 | 
			
		||||
                       y: y,
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
@@ -884,6 +884,9 @@ 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.28.2',
 | 
			
		||||
  version: '3.29.2',
 | 
			
		||||
  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.28.0'
 | 
			
		||||
mutter_req = '>= 3.29.2'
 | 
			
		||||
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 = '>= 0.9.8'
 | 
			
		||||
nm_req = '>= 1.10.4'
 | 
			
		||||
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-02-26 12:57+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-02-26 17:57+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-13 19:54+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-04-24 17:32+0200\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:148
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: 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:138
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s byl přidán mezi oblíbené."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#, 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:284
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
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:43
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "Je vyžadováno ověření"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "Správce"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
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:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 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:225
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
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:289
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#, 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:295
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#, 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:301
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s, pak %s a později %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Vybrat místo…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Načítá se…"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "Pocitově jako %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Připojit se kvůli informacím o počasí"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
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:272
 | 
			
		||||
#: js/ui/status/thunderbolt.js:294
 | 
			
		||||
msgid "Thunderbolt"
 | 
			
		||||
msgstr "Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#. we are done
 | 
			
		||||
#: js/ui/status/thunderbolt.js:328
 | 
			
		||||
#: js/ui/status/thunderbolt.js:350
 | 
			
		||||
msgid "Unknown Thunderbolt device"
 | 
			
		||||
msgstr "Neznámé zařízení Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:329
 | 
			
		||||
#: js/ui/status/thunderbolt.js:351
 | 
			
		||||
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:334
 | 
			
		||||
#: js/ui/status/thunderbolt.js:356
 | 
			
		||||
msgid "Thunderbolt authorization error"
 | 
			
		||||
msgstr "Chyba ověření Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:335
 | 
			
		||||
#: 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 "Nezdařilo se provést ověření zařízení Thunderbolt: %s"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/volume.js:128
 | 
			
		||||
@@ -2233,15 +2233,3 @@ 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-02-22 09:24+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-02-23 08:26+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-13 19:54+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-04-25 12:54+0200\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:148
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: 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:138
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "Se ha añadido %s a sus favoritos."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#, 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:284
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
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:43
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "Se necesita autenticación"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "Administrador"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
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:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 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:225
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
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:289
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#, 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:295
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#, 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:301
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s, luego %s seguido de %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Seleccionar ubicación…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Cargando…"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "Sensación térmica de %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Conectarse para obtener la información meteorológica"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
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:272
 | 
			
		||||
#: js/ui/status/thunderbolt.js:294
 | 
			
		||||
msgid "Thunderbolt"
 | 
			
		||||
msgstr "Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#. we are done
 | 
			
		||||
#: js/ui/status/thunderbolt.js:328
 | 
			
		||||
#: js/ui/status/thunderbolt.js:350
 | 
			
		||||
msgid "Unknown Thunderbolt device"
 | 
			
		||||
msgstr "Dispositivo Thunderbolt desconocido"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:329
 | 
			
		||||
#: js/ui/status/thunderbolt.js:351
 | 
			
		||||
msgid ""
 | 
			
		||||
"New device has been detected while you were away. Please disconnect and "
 | 
			
		||||
"reconnect the device to start using it."
 | 
			
		||||
@@ -1985,13 +1985,14 @@ 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:334
 | 
			
		||||
#: js/ui/status/thunderbolt.js:356
 | 
			
		||||
msgid "Thunderbolt authorization error"
 | 
			
		||||
msgstr "Error de autorización de Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:335
 | 
			
		||||
#: js/ui/status/thunderbolt.js:357
 | 
			
		||||
#, 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-02-26 17:00+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-03-07 22:46+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-13 19:54+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-04-16 14:30+0200\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:148
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: 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:138
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s je dodan u omiljene."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#, 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:284
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
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:43
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "Potrebna je ovjera"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "Administrator"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
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:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 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:225
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
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:289
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#, 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:295
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#, 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:301
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s, zatim %s, praćena s %s kasnije."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Odaberi lokaciju…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Pretraživanje…"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "Kao da je %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Posjetite za opširnije vremenske informacije"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
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:272
 | 
			
		||||
#: js/ui/status/thunderbolt.js:294
 | 
			
		||||
msgid "Thunderbolt"
 | 
			
		||||
msgstr "Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#. we are done
 | 
			
		||||
#: js/ui/status/thunderbolt.js:328
 | 
			
		||||
#: js/ui/status/thunderbolt.js:350
 | 
			
		||||
msgid "Unknown Thunderbolt device"
 | 
			
		||||
msgstr "Nepoznati Thunderbolt uređaj"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:329
 | 
			
		||||
#: js/ui/status/thunderbolt.js:351
 | 
			
		||||
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:334
 | 
			
		||||
#: js/ui/status/thunderbolt.js:356
 | 
			
		||||
msgid "Thunderbolt authorization error"
 | 
			
		||||
msgstr "Greška Thunderbolt ovjere"
 | 
			
		||||
msgstr "Greška Thunderbolt odobravanja"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:335
 | 
			
		||||
#: js/ui/status/thunderbolt.js:357
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Could not authorize the thunderbolt device: %s"
 | 
			
		||||
msgstr "Nemoguća ovjera Thunderbolt uređaja: %s"
 | 
			
		||||
msgid "Could not authorize the Thunderbolt device: %s"
 | 
			
		||||
msgstr "Nemoguće odobravanje 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-03-18 10:36+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-03-19 21:42+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-17 15:11+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-04-17 18:32+0200\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 "
 | 
			
		||||
"preko Alt-F2 vnosnega polja."
 | 
			
		||||
"prek vnosnega polja Alt-F2."
 | 
			
		||||
 | 
			
		||||
#: 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 preko Alt-F2 "
 | 
			
		||||
"vnosnega polja."
 | 
			
		||||
"Dovoli dostop do razhroščevanja in drugih orodij nadzora prek vnosnega polja "
 | 
			
		||||
"Alt-F2."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:16
 | 
			
		||||
msgid "UUIDs of extensions to enable"
 | 
			
		||||
msgstr "Določila UUID razširitev, ki bodo omogočene"
 | 
			
		||||
msgstr "Določila razširitev UUID, ki bodo omogočene"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:17
 | 
			
		||||
msgid ""
 | 
			
		||||
@@ -87,10 +87,9 @@ 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 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."
 | 
			
		||||
"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."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:26
 | 
			
		||||
msgid "Disable user extensions"
 | 
			
		||||
@@ -115,8 +114,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 skladnosti, zato so lahko naložene "
 | 
			
		||||
"tudi razširitve, katerih skladnost ni potrjena."
 | 
			
		||||
"Izbrana možnost onemogoči preverjanje, 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"
 | 
			
		||||
@@ -127,7 +126,7 @@ msgid ""
 | 
			
		||||
"The applications corresponding to these identifiers will be displayed in the "
 | 
			
		||||
"favorites area."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Programi določeni s temi določili bodo prikazani v območju priljubljenih "
 | 
			
		||||
"Programi, ki ustrezajo določilom, bodo prikazani v polju priljubljenih "
 | 
			
		||||
"programov"
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:51
 | 
			
		||||
@@ -145,18 +144,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čevalnega stekla"
 | 
			
		||||
msgstr "Zgodovina za pogovorno okno povečevala"
 | 
			
		||||
 | 
			
		||||
#: 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 »Odjava« v uporabniškem meniju."
 | 
			
		||||
msgstr "Vedno pokaži možnost »Odjave« 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 predmeta »Odjava« na sistemskem "
 | 
			
		||||
"Izbira prepiše možnost samodejnega skrivanja gumba za »Odjavo« na sistemskem "
 | 
			
		||||
"meniju pri eno-uporabniškem in eno-sejnem zagonu."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:75
 | 
			
		||||
@@ -174,8 +173,8 @@ msgid ""
 | 
			
		||||
"state of the checkbox."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Za priklop oddaljenega datotečnega sistema ali šifrirane naprave bo po "
 | 
			
		||||
"izbiri možnosti zahtevano geslo. Na pogovornem oknu bo prikazana možnost "
 | 
			
		||||
"»Shrani geslo«. Ta možnost določa privzeto stanje izbirnega polja."
 | 
			
		||||
"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."
 | 
			
		||||
 | 
			
		||||
#: data/org.gnome.shell.gschema.xml.in:85
 | 
			
		||||
msgid ""
 | 
			
		||||
@@ -333,7 +332,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:148
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
 | 
			
		||||
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
 | 
			
		||||
msgid "Cancel"
 | 
			
		||||
@@ -664,12 +663,12 @@ msgstr "Dodaj med priljubljene"
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "Pokaži besedilo"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:138
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "Program »%s« je dodan med priljubljeno."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "Program »%s« je odstranjen iz priljubljenih."
 | 
			
		||||
@@ -840,7 +839,7 @@ msgid ""
 | 
			
		||||
"You may choose to wait a short while for it to continue or force the "
 | 
			
		||||
"application to quit entirely."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Lahko še malo počakate, če začne morda program spet delovati, ali pa vsilite "
 | 
			
		||||
"Lahko počakate, če se program morda začne spet odzivati, lahko pa vsilite "
 | 
			
		||||
"končanje delovanja."
 | 
			
		||||
 | 
			
		||||
#: js/ui/closeDialog.js:61
 | 
			
		||||
@@ -864,13 +863,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:284
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
msgid "Password:"
 | 
			
		||||
msgstr "Geslo:"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/keyring.js:140
 | 
			
		||||
msgid "Type again:"
 | 
			
		||||
msgstr "Vpišite znova:"
 | 
			
		||||
msgstr "Ponovni vpis:"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:245
 | 
			
		||||
#: js/ui/status/network.js:336 js/ui/status/network.js:922
 | 
			
		||||
@@ -887,19 +886,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"
 | 
			
		||||
@@ -920,7 +919,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"
 | 
			
		||||
@@ -952,15 +951,15 @@ msgstr "Za povezavo z omrežjem »%s« je zahtevano geslo."
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "Upravljalnik omrežij"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:43
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "Zahtevana je overitev"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "Skrbnik"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
msgid "Authenticate"
 | 
			
		||||
msgstr "Overi"
 | 
			
		||||
 | 
			
		||||
@@ -968,7 +967,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:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327
 | 
			
		||||
msgid "Sorry, that didn’t work. Please try again."
 | 
			
		||||
msgstr "Overitev je spodletela.. Poskusite znova."
 | 
			
		||||
 | 
			
		||||
@@ -1016,7 +1015,7 @@ msgstr "Dodaj svetovni čas ..."
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "Svetovni časi"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:225
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "Vreme"
 | 
			
		||||
 | 
			
		||||
@@ -1024,7 +1023,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:289
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s all day."
 | 
			
		||||
msgstr "%s – ves dan."
 | 
			
		||||
@@ -1033,7 +1032,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:295
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s later."
 | 
			
		||||
msgstr "%s, sledi %s."
 | 
			
		||||
@@ -1042,30 +1041,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:301
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s, sledi %s, kasneje tudi %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Izbor mesta ..."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Poteka nalaganje ..."
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "Občuti se kot %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Preglej splet za podrobnosti o vremenu."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "Podatki o vremenu trenutno niso na voljo."
 | 
			
		||||
 | 
			
		||||
@@ -2014,8 +2013,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-02-21 14:13+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-02-22 15:56+0100\n"
 | 
			
		||||
"POT-Creation-Date: 2018-04-13 19:54+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-05-20 19:24+0200\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.6\n"
 | 
			
		||||
"X-Generator: Poedit 2.0.7\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:148
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: 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:138
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s har lagts till i dina favoriter."
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#, 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:284
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
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:43
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "Autentisering krävs"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "Administratör"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
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:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 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:225
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
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:289
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#, 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:295
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#, 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:301
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s, sedan %s, följt av %s senare."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "Välj en plats…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "Läser in…"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "Känns som %s."
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "Anslut till nätet för väderinformation"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
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:272
 | 
			
		||||
#: js/ui/status/thunderbolt.js:294
 | 
			
		||||
msgid "Thunderbolt"
 | 
			
		||||
msgstr "Thunderbolt"
 | 
			
		||||
 | 
			
		||||
#. we are done
 | 
			
		||||
#: js/ui/status/thunderbolt.js:328
 | 
			
		||||
#: js/ui/status/thunderbolt.js:350
 | 
			
		||||
msgid "Unknown Thunderbolt device"
 | 
			
		||||
msgstr "Okänd Thunderbolt-enhet"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:329
 | 
			
		||||
#: js/ui/status/thunderbolt.js:351
 | 
			
		||||
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:334
 | 
			
		||||
#: js/ui/status/thunderbolt.js:356
 | 
			
		||||
msgid "Thunderbolt authorization error"
 | 
			
		||||
msgstr "Thunderbolt-auktoriseringsfel"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/thunderbolt.js:335
 | 
			
		||||
#: 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 "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-03-05 21:11+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-02-15 01:42+0800\n"
 | 
			
		||||
"Last-Translator: Dingzhong Chen <wsxy162@gmail.com>\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"
 | 
			
		||||
"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: Gtranslator 2.91.7\n"
 | 
			
		||||
"X-Generator: Poedit 2.0.6\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:148
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: 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:138
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s 已经添加到了您的收藏夹。"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#, 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:284
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295
 | 
			
		||||
msgid "Password:"
 | 
			
		||||
msgstr "密码:"
 | 
			
		||||
 | 
			
		||||
@@ -915,15 +915,15 @@ msgstr "连接到“%s”需要密码。"
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "网络管理器"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:43
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "需要认证"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "管理员"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
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:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:281 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:225
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
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:289
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#, 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:295
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#, 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:301
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s转%s,随后转%s。"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "选择地点…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "正在载入…"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "体感温度 %s。"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "通过互联网查看天气信息"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										134
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
							
						
						
									
										134
									
								
								po/zh_TW.po
									
									
									
									
									
								
							@@ -8,8 +8,8 @@ msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: gnome-shell 3.3.90\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
 | 
			
		||||
"POT-Creation-Date: 2018-03-05 21:11+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-03-10 20:30+0800\n"
 | 
			
		||||
"POT-Creation-Date: 2018-06-08 17:30+0000\n"
 | 
			
		||||
"PO-Revision-Date: 2018-06-09 11:17+0800\n"
 | 
			
		||||
"Last-Translator: Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>\n"
 | 
			
		||||
"Language-Team: Chinese (Taiwan) <zh-l10n@lists.linux.org.tw>\n"
 | 
			
		||||
"Language: zh_TW\n"
 | 
			
		||||
@@ -17,7 +17,7 @@ msgstr ""
 | 
			
		||||
"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: Poedit 2.0.8\n"
 | 
			
		||||
 | 
			
		||||
#: data/50-gnome-shell-system.xml:6
 | 
			
		||||
msgid "System"
 | 
			
		||||
@@ -308,7 +308,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:148
 | 
			
		||||
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153
 | 
			
		||||
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
 | 
			
		||||
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
 | 
			
		||||
msgid "Cancel"
 | 
			
		||||
@@ -328,20 +328,20 @@ msgctxt "button"
 | 
			
		||||
msgid "Sign In"
 | 
			
		||||
msgstr "登入"
 | 
			
		||||
 | 
			
		||||
#: js/gdm/loginDialog.js:315
 | 
			
		||||
#: js/gdm/loginDialog.js:319
 | 
			
		||||
msgid "Choose Session"
 | 
			
		||||
msgstr "選擇工作階段"
 | 
			
		||||
 | 
			
		||||
#. translators: this message is shown below the user list on the
 | 
			
		||||
#. login screen. It can be activated to reveal an entry for
 | 
			
		||||
#. manually entering the username.
 | 
			
		||||
#: js/gdm/loginDialog.js:458
 | 
			
		||||
#: js/gdm/loginDialog.js:462
 | 
			
		||||
msgid "Not listed?"
 | 
			
		||||
msgstr "沒有列出來?"
 | 
			
		||||
 | 
			
		||||
#. Translators: this message is shown below the username entry field
 | 
			
		||||
#. to clue the user in on how to login to the local network realm
 | 
			
		||||
#: js/gdm/loginDialog.js:887
 | 
			
		||||
#: js/gdm/loginDialog.js:891
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "(e.g., user or %s)"
 | 
			
		||||
msgstr "(例如: user 或 %s)"
 | 
			
		||||
@@ -349,12 +349,12 @@ msgstr "(例如: user 或 %s)"
 | 
			
		||||
#. TTLS and PEAP are actually much more complicated, but this complication
 | 
			
		||||
#. is not visible here since we only care about phase2 authentication
 | 
			
		||||
#. (and don't even care of which one)
 | 
			
		||||
#: js/gdm/loginDialog.js:892 js/ui/components/networkAgent.js:243
 | 
			
		||||
#: js/gdm/loginDialog.js:896 js/ui/components/networkAgent.js:243
 | 
			
		||||
#: js/ui/components/networkAgent.js:261
 | 
			
		||||
msgid "Username: "
 | 
			
		||||
msgstr "使用者名稱:"
 | 
			
		||||
 | 
			
		||||
#: js/gdm/loginDialog.js:1228
 | 
			
		||||
#: js/gdm/loginDialog.js:1234
 | 
			
		||||
msgid "Login Window"
 | 
			
		||||
msgstr "登入視窗"
 | 
			
		||||
 | 
			
		||||
@@ -601,32 +601,32 @@ msgstr "常用"
 | 
			
		||||
msgid "All"
 | 
			
		||||
msgstr "全部"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1886
 | 
			
		||||
#: js/ui/appDisplay.js:1889
 | 
			
		||||
msgid "New Window"
 | 
			
		||||
msgstr "新視窗"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1900
 | 
			
		||||
#: js/ui/appDisplay.js:1903
 | 
			
		||||
msgid "Launch using Dedicated Graphics Card"
 | 
			
		||||
msgstr "使用獨立顯卡啟動"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1927 js/ui/dash.js:285
 | 
			
		||||
#: js/ui/appDisplay.js:1930 js/ui/dash.js:285
 | 
			
		||||
msgid "Remove from Favorites"
 | 
			
		||||
msgstr "自喜好中移除"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1933
 | 
			
		||||
#: js/ui/appDisplay.js:1936
 | 
			
		||||
msgid "Add to Favorites"
 | 
			
		||||
msgstr "加入喜好"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appDisplay.js:1943
 | 
			
		||||
#: js/ui/appDisplay.js:1946
 | 
			
		||||
msgid "Show Details"
 | 
			
		||||
msgstr "顯示詳細資訊"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:138
 | 
			
		||||
#: js/ui/appFavorites.js:140
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been added to your favorites."
 | 
			
		||||
msgstr "%s 已加入您的喜好中。"
 | 
			
		||||
 | 
			
		||||
#: js/ui/appFavorites.js:172
 | 
			
		||||
#: js/ui/appFavorites.js:174
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s has been removed from your favorites."
 | 
			
		||||
msgstr "%s 已經從您的喜好中移除。"
 | 
			
		||||
@@ -787,22 +787,22 @@ msgid "Clear All"
 | 
			
		||||
msgstr "全部清除"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is an application name
 | 
			
		||||
#: js/ui/closeDialog.js:44
 | 
			
		||||
#: js/ui/closeDialog.js:47
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "“%s” is not responding."
 | 
			
		||||
msgstr "「%s」沒有回應。"
 | 
			
		||||
 | 
			
		||||
#: js/ui/closeDialog.js:45
 | 
			
		||||
#: js/ui/closeDialog.js:48
 | 
			
		||||
msgid ""
 | 
			
		||||
"You may choose to wait a short while for it to continue or force the "
 | 
			
		||||
"application to quit entirely."
 | 
			
		||||
msgstr "您可以選擇再等一下讓它繼續,或是強制讓應用程式立刻退出。"
 | 
			
		||||
 | 
			
		||||
#: js/ui/closeDialog.js:61
 | 
			
		||||
#: js/ui/closeDialog.js:64
 | 
			
		||||
msgid "Force Quit"
 | 
			
		||||
msgstr "強制退出"
 | 
			
		||||
 | 
			
		||||
#: js/ui/closeDialog.js:64
 | 
			
		||||
#: js/ui/closeDialog.js:67
 | 
			
		||||
msgid "Wait"
 | 
			
		||||
msgstr "等待"
 | 
			
		||||
 | 
			
		||||
@@ -819,7 +819,7 @@ msgstr "外部裝置已拔除"
 | 
			
		||||
msgid "Open with %s"
 | 
			
		||||
msgstr "用 %s 開啟"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
 | 
			
		||||
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:297
 | 
			
		||||
msgid "Password:"
 | 
			
		||||
msgstr "密碼: "
 | 
			
		||||
 | 
			
		||||
@@ -856,18 +856,18 @@ msgstr "私密金鑰密碼:"
 | 
			
		||||
msgid "Service: "
 | 
			
		||||
msgstr "服務:"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659
 | 
			
		||||
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:664
 | 
			
		||||
msgid "Authentication required by wireless network"
 | 
			
		||||
msgstr "無線網路所需要的核對"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:660
 | 
			
		||||
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:665
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid ""
 | 
			
		||||
"Passwords or encryption keys are required to access the wireless network "
 | 
			
		||||
"“%s”."
 | 
			
		||||
msgstr "需要密碼或是加密金鑰來存取無線網路「%s」。"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663
 | 
			
		||||
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:668
 | 
			
		||||
msgid "Wired 802.1X authentication"
 | 
			
		||||
msgstr "有線網路 802.1X 核對"
 | 
			
		||||
 | 
			
		||||
@@ -875,15 +875,15 @@ msgstr "有線網路 802.1X 核對"
 | 
			
		||||
msgid "Network name: "
 | 
			
		||||
msgstr "網路名稱:"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667
 | 
			
		||||
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:672
 | 
			
		||||
msgid "DSL authentication"
 | 
			
		||||
msgstr "DSL 核對"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673
 | 
			
		||||
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:678
 | 
			
		||||
msgid "PIN code required"
 | 
			
		||||
msgstr "需要 PIN 碼"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674
 | 
			
		||||
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:679
 | 
			
		||||
msgid "PIN code is needed for the mobile broadband device"
 | 
			
		||||
msgstr "這個行動寬頻裝置需要 PIN 碼"
 | 
			
		||||
 | 
			
		||||
@@ -891,29 +891,29 @@ msgstr "這個行動寬頻裝置需要 PIN 碼"
 | 
			
		||||
msgid "PIN: "
 | 
			
		||||
msgstr "PIN: "
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680
 | 
			
		||||
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:685
 | 
			
		||||
msgid "Mobile broadband network password"
 | 
			
		||||
msgstr "行動寬頻網路密碼"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:664
 | 
			
		||||
#: js/ui/components/networkAgent.js:668 js/ui/components/networkAgent.js:681
 | 
			
		||||
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:669
 | 
			
		||||
#: js/ui/components/networkAgent.js:673 js/ui/components/networkAgent.js:686
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "A password is required to connect to “%s”."
 | 
			
		||||
msgstr "連線至「%s」需要密碼。"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1691
 | 
			
		||||
#: js/ui/components/networkAgent.js:653 js/ui/status/network.js:1704
 | 
			
		||||
msgid "Network Manager"
 | 
			
		||||
msgstr "網路管理員"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:43
 | 
			
		||||
#: js/ui/components/polkitAgent.js:48
 | 
			
		||||
msgid "Authentication Required"
 | 
			
		||||
msgstr "要求核對"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:71
 | 
			
		||||
#: js/ui/components/polkitAgent.js:76
 | 
			
		||||
msgid "Administrator"
 | 
			
		||||
msgstr "管理員"
 | 
			
		||||
 | 
			
		||||
#: js/ui/components/polkitAgent.js:151
 | 
			
		||||
#: js/ui/components/polkitAgent.js:156
 | 
			
		||||
msgid "Authenticate"
 | 
			
		||||
msgstr "核對"
 | 
			
		||||
 | 
			
		||||
@@ -921,7 +921,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:270 js/ui/shellMountOperation.js:327
 | 
			
		||||
#: js/ui/components/polkitAgent.js:283 js/ui/shellMountOperation.js:327
 | 
			
		||||
msgid "Sorry, that didn’t work. Please try again."
 | 
			
		||||
msgstr "抱歉,那沒有作用。請再試一次。"
 | 
			
		||||
 | 
			
		||||
@@ -969,7 +969,7 @@ msgstr "加入世界時鐘…"
 | 
			
		||||
msgid "World Clocks"
 | 
			
		||||
msgstr "世界時鐘"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:225
 | 
			
		||||
#: js/ui/dateMenu.js:227
 | 
			
		||||
msgid "Weather"
 | 
			
		||||
msgstr "天氣"
 | 
			
		||||
 | 
			
		||||
@@ -977,7 +977,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:289
 | 
			
		||||
#: js/ui/dateMenu.js:291
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s all day."
 | 
			
		||||
msgstr "全天%s。"
 | 
			
		||||
@@ -986,7 +986,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:295
 | 
			
		||||
#: js/ui/dateMenu.js:297
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s later."
 | 
			
		||||
msgstr "%s,較晚%s。"
 | 
			
		||||
@@ -995,30 +995,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:301
 | 
			
		||||
#: js/ui/dateMenu.js:303
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s, then %s, followed by %s later."
 | 
			
		||||
msgstr "%s,然後%s,接著較晚%s。"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:312
 | 
			
		||||
#: js/ui/dateMenu.js:314
 | 
			
		||||
msgid "Select a location…"
 | 
			
		||||
msgstr "選擇位置…"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:315
 | 
			
		||||
#: js/ui/dateMenu.js:317
 | 
			
		||||
msgid "Loading…"
 | 
			
		||||
msgstr "載入中…"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a temperature with unit, e.g. "23℃"
 | 
			
		||||
#: js/ui/dateMenu.js:321
 | 
			
		||||
#: js/ui/dateMenu.js:323
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "Feels like %s."
 | 
			
		||||
msgstr "體感溫度 %s。"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:324
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
msgid "Go online for weather information"
 | 
			
		||||
msgstr "上線以取得天氣資訊"
 | 
			
		||||
 | 
			
		||||
#: js/ui/dateMenu.js:326
 | 
			
		||||
#: js/ui/dateMenu.js:328
 | 
			
		||||
msgid "Weather information is currently unavailable"
 | 
			
		||||
msgstr "天氣資訊目前不可使用"
 | 
			
		||||
 | 
			
		||||
@@ -1239,13 +1239,13 @@ msgid "Leave On"
 | 
			
		||||
msgstr "離開"
 | 
			
		||||
 | 
			
		||||
#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143
 | 
			
		||||
#: js/ui/status/network.js:1281
 | 
			
		||||
#: js/ui/status/network.js:1294
 | 
			
		||||
msgid "Turn On"
 | 
			
		||||
msgstr "開啟"
 | 
			
		||||
 | 
			
		||||
#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143
 | 
			
		||||
#: js/ui/status/network.js:154 js/ui/status/network.js:337
 | 
			
		||||
#: js/ui/status/network.js:1281 js/ui/status/network.js:1396
 | 
			
		||||
#: js/ui/status/network.js:1294 js/ui/status/network.js:1409
 | 
			
		||||
#: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90
 | 
			
		||||
#: js/ui/status/rfkill.js:117
 | 
			
		||||
msgid "Turn Off"
 | 
			
		||||
@@ -1307,7 +1307,7 @@ msgstr "檢示來源"
 | 
			
		||||
msgid "Web Page"
 | 
			
		||||
msgstr "網頁"
 | 
			
		||||
 | 
			
		||||
#: js/ui/messageTray.js:1493
 | 
			
		||||
#: js/ui/messageTray.js:1495
 | 
			
		||||
msgid "System Information"
 | 
			
		||||
msgstr "系統資訊"
 | 
			
		||||
 | 
			
		||||
@@ -1622,7 +1622,7 @@ msgid "<unknown>"
 | 
			
		||||
msgstr "<不明>"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:441 js/ui/status/network.js:1310
 | 
			
		||||
#: js/ui/status/network.js:441 js/ui/status/network.js:1323
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Off"
 | 
			
		||||
msgstr "%s 關閉"
 | 
			
		||||
@@ -1648,7 +1648,7 @@ msgid "%s Disconnecting"
 | 
			
		||||
msgstr "%s 正在斷線"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:459 js/ui/status/network.js:1302
 | 
			
		||||
#: js/ui/status/network.js:459 js/ui/status/network.js:1315
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Connecting"
 | 
			
		||||
msgstr "正連線到 %s"
 | 
			
		||||
@@ -1688,7 +1688,7 @@ msgid "Mobile Broadband Settings"
 | 
			
		||||
msgstr "行動寬頻設定值"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:578 js/ui/status/network.js:1307
 | 
			
		||||
#: js/ui/status/network.js:578 js/ui/status/network.js:1320
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Hardware Disabled"
 | 
			
		||||
msgstr "%s 硬體已停用"
 | 
			
		||||
@@ -1744,78 +1744,78 @@ msgstr "沒有網路"
 | 
			
		||||
msgid "Use hardware switch to turn off"
 | 
			
		||||
msgstr "使用硬體開關來關閉"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1173
 | 
			
		||||
#: js/ui/status/network.js:1186
 | 
			
		||||
msgid "Select Network"
 | 
			
		||||
msgstr "選擇網路"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1179
 | 
			
		||||
#: js/ui/status/network.js:1192
 | 
			
		||||
msgid "Wi-Fi Settings"
 | 
			
		||||
msgstr "Wi-Fi 設定值"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:1298
 | 
			
		||||
#: js/ui/status/network.js:1311
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Hotspot Active"
 | 
			
		||||
msgstr "%s 熱點有效"
 | 
			
		||||
 | 
			
		||||
#. Translators: %s is a network identifier
 | 
			
		||||
#: js/ui/status/network.js:1313
 | 
			
		||||
#: js/ui/status/network.js:1326
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Not Connected"
 | 
			
		||||
msgstr "%s 未連線"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1413
 | 
			
		||||
#: js/ui/status/network.js:1426
 | 
			
		||||
msgid "connecting…"
 | 
			
		||||
msgstr "連線中…"
 | 
			
		||||
 | 
			
		||||
#. Translators: this is for network connections that require some kind of key or password
 | 
			
		||||
#: js/ui/status/network.js:1416
 | 
			
		||||
#: js/ui/status/network.js:1429
 | 
			
		||||
msgid "authentication required"
 | 
			
		||||
msgstr "要求核對"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1418
 | 
			
		||||
#: js/ui/status/network.js:1431
 | 
			
		||||
msgid "connection failed"
 | 
			
		||||
msgstr "連線失敗"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1472
 | 
			
		||||
#: js/ui/status/network.js:1485
 | 
			
		||||
msgid "VPN Settings"
 | 
			
		||||
msgstr "VPN 設定值"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1485
 | 
			
		||||
#: js/ui/status/network.js:1498
 | 
			
		||||
msgid "VPN"
 | 
			
		||||
msgstr "VPN"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1495
 | 
			
		||||
#: js/ui/status/network.js:1508
 | 
			
		||||
msgid "VPN Off"
 | 
			
		||||
msgstr "VPN 關閉"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1559 js/ui/status/rfkill.js:93
 | 
			
		||||
#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93
 | 
			
		||||
msgid "Network Settings"
 | 
			
		||||
msgstr "網路設定值"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1588
 | 
			
		||||
#: js/ui/status/network.js:1601
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Wired Connection"
 | 
			
		||||
msgid_plural "%s Wired Connections"
 | 
			
		||||
msgstr[0] "%s 個有線網路連線"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1592
 | 
			
		||||
#: js/ui/status/network.js:1605
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Wi-Fi Connection"
 | 
			
		||||
msgid_plural "%s Wi-Fi Connections"
 | 
			
		||||
msgstr[0] "%s 個 Wi-Fi 連線"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1596
 | 
			
		||||
#: js/ui/status/network.js:1609
 | 
			
		||||
#, javascript-format
 | 
			
		||||
msgid "%s Modem Connection"
 | 
			
		||||
msgid_plural "%s Modem Connections"
 | 
			
		||||
msgstr[0] "%s 個數據機連線"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1728
 | 
			
		||||
#: js/ui/status/network.js:1741
 | 
			
		||||
msgid "Connection failed"
 | 
			
		||||
msgstr "連線失敗"
 | 
			
		||||
 | 
			
		||||
#: js/ui/status/network.js:1729
 | 
			
		||||
#: js/ui/status/network.js:1742
 | 
			
		||||
msgid "Activation of network connection failed"
 | 
			
		||||
msgstr "啟動網路連線失敗"
 | 
			
		||||
 | 
			
		||||
@@ -1918,7 +1918,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,6 +590,11 @@ 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:
 | 
			
		||||
    if options.hwtest:
 | 
			
		||||
        options.extra_filter = ['Gedit']
 | 
			
		||||
    else:
 | 
			
		||||
        options.extra_filter = []
 | 
			
		||||
    options.extra_filter = []
 | 
			
		||||
 | 
			
		||||
if options.perf == 'hwtest':
 | 
			
		||||
    options.extra_filter.append('Gedit')
 | 
			
		||||
 | 
			
		||||
if args:
 | 
			
		||||
    parser.print_usage()
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,8 @@ struct _ShellScreenshotPrivate
 | 
			
		||||
  char *filename;
 | 
			
		||||
  char *filename_used;
 | 
			
		||||
 | 
			
		||||
  GDateTime *datetime;
 | 
			
		||||
 | 
			
		||||
  cairo_surface_t *image;
 | 
			
		||||
  cairo_rectangle_int_t screenshot_area;
 | 
			
		||||
 | 
			
		||||
@@ -72,6 +74,7 @@ on_screenshot_written (GObject      *source,
 | 
			
		||||
  g_clear_pointer (&priv->image, cairo_surface_destroy);
 | 
			
		||||
  g_clear_pointer (&priv->filename, g_free);
 | 
			
		||||
  g_clear_pointer (&priv->filename_used, g_free);
 | 
			
		||||
  g_clear_pointer (&priv->datetime, g_date_time_unref);
 | 
			
		||||
 | 
			
		||||
  meta_enable_unredirect_for_screen (shell_global_get_screen (priv->global));
 | 
			
		||||
}
 | 
			
		||||
@@ -175,6 +178,7 @@ write_screenshot_thread (GTask        *result,
 | 
			
		||||
  GOutputStream *stream;
 | 
			
		||||
  ShellScreenshot *screenshot = SHELL_SCREENSHOT (object);
 | 
			
		||||
  ShellScreenshotPrivate *priv;
 | 
			
		||||
  char *creation_time;
 | 
			
		||||
 | 
			
		||||
  g_assert (screenshot != NULL);
 | 
			
		||||
 | 
			
		||||
@@ -193,14 +197,18 @@ write_screenshot_thread (GTask        *result,
 | 
			
		||||
                                            0, 0,
 | 
			
		||||
                                            cairo_image_surface_get_width (priv->image),
 | 
			
		||||
                                            cairo_image_surface_get_height (priv->image));
 | 
			
		||||
      creation_time = g_date_time_format (priv->datetime, "%c");
 | 
			
		||||
 | 
			
		||||
      if (gdk_pixbuf_save_to_stream (pixbuf, stream, "png", NULL, NULL,
 | 
			
		||||
                                    "tEXt::Software", "gnome-screenshot", NULL))
 | 
			
		||||
                                     "tEXt::Software", "gnome-screenshot",
 | 
			
		||||
                                     "tEXt::Creation Time", creation_time,
 | 
			
		||||
                                     NULL))
 | 
			
		||||
        status = CAIRO_STATUS_SUCCESS;
 | 
			
		||||
      else
 | 
			
		||||
        status = CAIRO_STATUS_WRITE_ERROR;
 | 
			
		||||
 | 
			
		||||
      g_object_unref (pixbuf);
 | 
			
		||||
      g_free (creation_time);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -241,6 +249,7 @@ do_grab_screenshot (ShellScreenshot *screenshot,
 | 
			
		||||
                                                       n_captures,
 | 
			
		||||
                                                       x, y,
 | 
			
		||||
                                                       width, height);
 | 
			
		||||
  priv->datetime = g_date_time_new_now_local ();
 | 
			
		||||
 | 
			
		||||
  for (i = 0; i < n_captures; i++)
 | 
			
		||||
    cairo_surface_destroy (captures[i].image);
 | 
			
		||||
@@ -432,6 +441,7 @@ grab_window_screenshot (ClutterActor *stage,
 | 
			
		||||
 | 
			
		||||
  stex = META_SHAPED_TEXTURE (meta_window_actor_get_texture (META_WINDOW_ACTOR (window_actor)));
 | 
			
		||||
  priv->image = meta_shaped_texture_get_image (stex, &clip);
 | 
			
		||||
  priv->datetime = g_date_time_new_now_local ();
 | 
			
		||||
 | 
			
		||||
  settings = g_settings_new (A11Y_APPS_SCHEMA);
 | 
			
		||||
  if (priv->include_cursor && !g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY))
 | 
			
		||||
 
 | 
			
		||||
@@ -308,9 +308,8 @@ st_entry_style_changed (StWidget *self)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  theme_node = st_widget_get_theme_node (self);
 | 
			
		||||
 
 | 
			
		||||
  st_theme_node_get_foreground_color (theme_node, &color);
 | 
			
		||||
  clutter_text_set_color (CLUTTER_TEXT (priv->entry), &color);
 | 
			
		||||
 | 
			
		||||
  _st_set_text_from_style (CLUTTER_TEXT (priv->entry), theme_node);
 | 
			
		||||
 | 
			
		||||
  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,6 +116,8 @@ _st_set_text_from_style (ClutterText *text,
 | 
			
		||||
  PangoAttrList *attribs = NULL;
 | 
			
		||||
  const PangoFontDescription *font;
 | 
			
		||||
  StTextAlign align;
 | 
			
		||||
  gdouble spacing;
 | 
			
		||||
  gchar *font_features;
 | 
			
		||||
 | 
			
		||||
  st_theme_node_get_foreground_color (theme_node, &color);
 | 
			
		||||
  clutter_text_set_color (text, &color);
 | 
			
		||||
@@ -123,11 +125,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);
 | 
			
		||||
@@ -143,6 +145,20 @@ _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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  font_features = st_theme_node_get_font_features (theme_node);
 | 
			
		||||
  if (font_features)
 | 
			
		||||
    {
 | 
			
		||||
      pango_attr_list_insert (attribs, pango_attr_font_features_new (font_features));
 | 
			
		||||
      g_free (font_features);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  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 * */
 | 
			
		||||
@@ -145,6 +146,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 +171,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 +526,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 +994,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 +1281,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 +1315,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 +1329,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
 | 
			
		||||
 
 | 
			
		||||
@@ -2545,6 +2545,28 @@ 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)
 | 
			
		||||
@@ -2997,6 +3019,39 @@ st_theme_node_get_font (StThemeNode *node)
 | 
			
		||||
  return node->font_desc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
gchar *
 | 
			
		||||
st_theme_node_get_font_features (StThemeNode *node)
 | 
			
		||||
{
 | 
			
		||||
  int i;
 | 
			
		||||
 | 
			
		||||
  ensure_properties (node);
 | 
			
		||||
 | 
			
		||||
  for (i = node->n_properties - 1; i >= 0; i--)
 | 
			
		||||
    {
 | 
			
		||||
      CRDeclaration *decl = node->properties[i];
 | 
			
		||||
 | 
			
		||||
      if (strcmp (decl->property->stryng->str, "font-feature-settings") == 0)
 | 
			
		||||
        {
 | 
			
		||||
          CRTerm *term = decl->value;
 | 
			
		||||
 | 
			
		||||
          if (!term->next && term->type == TERM_IDENT)
 | 
			
		||||
            {
 | 
			
		||||
              gchar *ident = term->content.str->stryng->str;
 | 
			
		||||
 | 
			
		||||
              if (strcmp (ident, "inherit") == 0)
 | 
			
		||||
                break;
 | 
			
		||||
 | 
			
		||||
              if (strcmp (ident, "normal") == 0)
 | 
			
		||||
                return NULL;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          return (gchar *)cr_term_to_string (term);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  return node->parent_node ? st_theme_node_get_font_features (node->parent_node) : NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * st_theme_node_get_border_image:
 | 
			
		||||
 * @node: a #StThemeNode
 | 
			
		||||
 
 | 
			
		||||
@@ -223,6 +223,8 @@ 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,
 | 
			
		||||
@@ -230,6 +232,8 @@ StTextAlign st_theme_node_get_text_align (StThemeNode *node);
 | 
			
		||||
 */
 | 
			
		||||
const PangoFontDescription *st_theme_node_get_font (StThemeNode *node);
 | 
			
		||||
 | 
			
		||||
gchar *st_theme_node_get_font_features (StThemeNode *node);
 | 
			
		||||
 | 
			
		||||
StBorderImage *st_theme_node_get_border_image (StThemeNode *node);
 | 
			
		||||
StShadow      *st_theme_node_get_box_shadow   (StThemeNode *node);
 | 
			
		||||
StShadow      *st_theme_node_get_text_shadow  (StThemeNode *node);
 | 
			
		||||
 
 | 
			
		||||
@@ -59,6 +59,24 @@ assert_font (StThemeNode *node,
 | 
			
		||||
  g_free (value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
assert_font_features (StThemeNode *node,
 | 
			
		||||
                      const char  *node_description,
 | 
			
		||||
                      const char  *expected)
 | 
			
		||||
{
 | 
			
		||||
  char *value = st_theme_node_get_font_features (node);
 | 
			
		||||
 | 
			
		||||
  if (g_strcmp0 (expected, value) != 0)
 | 
			
		||||
    {
 | 
			
		||||
      g_print ("%s: %s.font-feature-settings: expected: %s, got: %s\n",
 | 
			
		||||
               test, node_description, expected, value);
 | 
			
		||||
      fail = TRUE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  if (value)
 | 
			
		||||
    g_free (value);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static char *
 | 
			
		||||
text_decoration_to_string (StTextDecoration decoration)
 | 
			
		||||
{
 | 
			
		||||
@@ -396,7 +414,7 @@ test_background (void)
 | 
			
		||||
  /* text1 inherits the background image but not the color */
 | 
			
		||||
  assert_background_color (text1,  "text1",  0x00000000);
 | 
			
		||||
  assert_background_image (text1,  "text1",  "st/some-background.png");
 | 
			
		||||
  /* text1 inherits inherits both, but then background: none overrides both */
 | 
			
		||||
  /* text2 inherits both, but then background: none overrides both */
 | 
			
		||||
  assert_background_color (text2,  "text2",  0x00000000);
 | 
			
		||||
  assert_background_image (text2,  "text2",  NULL);
 | 
			
		||||
  /* background-image property */
 | 
			
		||||
@@ -413,6 +431,22 @@ test_font (void)
 | 
			
		||||
  assert_font (text3,  "text3",  "serif Bold Oblique Small-Caps 24px");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
test_font_features (void)
 | 
			
		||||
{
 | 
			
		||||
  test = "font_features";
 | 
			
		||||
  /* group1 has font-feature-settings: "tnum" */
 | 
			
		||||
  assert_font_features (group1, "group1", "\"tnum\"");
 | 
			
		||||
  /* text2 should inherit from group1 */
 | 
			
		||||
  assert_font_features (text2,  "text2", "\"tnum\"");
 | 
			
		||||
  /* group2 has font-feature-settings: "tnum", "zero" */
 | 
			
		||||
  assert_font_features (group2, "group2", "\"tnum\", \"zero\"");
 | 
			
		||||
  /* text3 should inherit from group2 using the inherit keyword */
 | 
			
		||||
  assert_font_features (text3,  "text3",  "\"tnum\", \"zero\"");
 | 
			
		||||
  /* text4 has font-feature-settings: normal */
 | 
			
		||||
  assert_font_features (text4,  "text4",  NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
test_pseudo_class (void)
 | 
			
		||||
{
 | 
			
		||||
@@ -554,6 +588,7 @@ main (int argc, char **argv)
 | 
			
		||||
  test_border ();
 | 
			
		||||
  test_background ();
 | 
			
		||||
  test_font ();
 | 
			
		||||
  test_font_features ();
 | 
			
		||||
  test_pseudo_class ();
 | 
			
		||||
  test_inline_style ();
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,6 +13,8 @@ stage {
 | 
			
		||||
    margin-left: 1in;
 | 
			
		||||
 | 
			
		||||
    background: #ff0000 url('some-background.png');
 | 
			
		||||
 | 
			
		||||
    font-feature-settings: "tnum";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#text1 {
 | 
			
		||||
@@ -35,6 +37,7 @@ ClutterTexture.special-text {
 | 
			
		||||
 | 
			
		||||
#group2 {
 | 
			
		||||
    font: italic 12px serif;
 | 
			
		||||
    font-feature-settings: "tnum", "zero";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#text3 {
 | 
			
		||||
@@ -42,6 +45,11 @@ ClutterTexture.special-text {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    font-style: oblique;
 | 
			
		||||
    font-size: 200%;
 | 
			
		||||
    font-feature-settings: "pnum";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#text4 {
 | 
			
		||||
    font-feature-settings: normal;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClutterTexture {
 | 
			
		||||
@@ -60,6 +68,10 @@ stage > #text2 {
 | 
			
		||||
    color: #ff0000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#group2 > #text3 {
 | 
			
		||||
    font-feature-settings: inherit;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#group2 {
 | 
			
		||||
    background-image: url('other-background.png');
 | 
			
		||||
    padding: 1px 2px 3px 4px;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user