Compare commits
32 Commits
issue267
...
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 |
@ -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
|
18
NEWS
18
NEWS
@ -1,3 +1,21 @@
|
||||
3.29.2
|
||||
======
|
||||
* Guard against untimely keyboard map changes [Carlos; #240]
|
||||
* Fix icons in search provider results [Florian; #249]
|
||||
* Fix blurriness of OSD under some resolutions [Silvère; #782011]
|
||||
* Fix lagging pointer when zoomed [Daniel; #682013]
|
||||
* Misc. bug fixes [Milan, Xiaoguang, Florian, Mario, Ole; #244, #787871,
|
||||
#781471, #136, #214, #294]
|
||||
|
||||
Contributors:
|
||||
Ole Jørgen Brønner, Milan Crha, Carlos Garnacho, Yussuf Khalil,
|
||||
Silvère Latchurié, Florian Müllner, Mario Sanchez Prada, Ray Strode,
|
||||
Daniel van Vugt, Xiaoguang Wang
|
||||
|
||||
Translators:
|
||||
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]
|
||||
|
@ -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%);
|
||||
@ -1867,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 {
|
||||
|
@ -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();
|
||||
|
@ -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,26 +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;
|
||||
}
|
||||
|
||||
let dataDirs = GLib.get_system_data_dirs();
|
||||
for (let i = 0; i < dataDirs.length; i++) {
|
||||
let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'theme', name]);
|
||||
let stylesheet = Gio.file_new_for_path(path);
|
||||
if (stylesheet.query_exists(null))
|
||||
stylesheet = _findThemeDirByVersion(dataDirs[i], major, minor, name)
|
||||
if (stylesheet != null)
|
||||
return stylesheet;
|
||||
}
|
||||
|
||||
stylesheet = Gio.File.new_for_path(global.datadir + '/theme/' + name);
|
||||
if (stylesheet.query_exists(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',
|
||||
|
||||
|
@ -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,7 +49,6 @@ const BoltDeviceInterface = '<node> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
const BoltClientProxy = Gio.DBusProxy.makeProxyWrapper(BoltClientInterface);
|
||||
const BoltDeviceProxy = Gio.DBusProxy.makeProxyWrapper(BoltDeviceInterface);
|
||||
|
||||
/* */
|
||||
@ -78,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';
|
||||
|
||||
@ -87,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));
|
||||
|
||||
|
@ -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,
|
||||
|
@ -1,5 +1,5 @@
|
||||
project('gnome-shell', 'c',
|
||||
version: '3.29.1',
|
||||
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.29.1'
|
||||
mutter_req = '>= 3.29.2'
|
||||
polkit_req = '>= 0.100'
|
||||
schemas_req = '>= 3.21.3'
|
||||
startup_req = '>= 0.11'
|
||||
|
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
|
||||
|
@ -1190,37 +1190,12 @@ app_child_setup (gpointer user_data)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
_shell_app_watch_callback (GPid pid,
|
||||
gint status,
|
||||
ShellApp *app)
|
||||
{
|
||||
if (app->state == SHELL_APP_STATE_STARTING)
|
||||
{
|
||||
ShellWindowTracker *tracker = shell_window_tracker_get_default ();
|
||||
GSList *startup_sequences = shell_window_tracker_get_startup_sequences (tracker);
|
||||
GSList *iter = NULL;
|
||||
|
||||
for (iter = startup_sequences; iter; iter = g_slist_next (iter))
|
||||
{
|
||||
ShellStartupSequence *sequence = (ShellStartupSequence*) iter->data;
|
||||
ShellApp *startup_app = shell_startup_sequence_get_app (sequence);
|
||||
if (startup_app == app)
|
||||
shell_startup_sequence_complete (sequence);
|
||||
}
|
||||
|
||||
shell_app_state_transition (app, SHELL_APP_STATE_STOPPED);
|
||||
}
|
||||
|
||||
g_spawn_close_pid (pid);
|
||||
}
|
||||
|
||||
static void
|
||||
wait_pid (GDesktopAppInfo *appinfo,
|
||||
GPid pid,
|
||||
ShellApp *app)
|
||||
gpointer user_data)
|
||||
{
|
||||
g_child_watch_add (pid, (GChildWatchFunc) _shell_app_watch_callback, app);
|
||||
g_child_watch_add (pid, (GChildWatchFunc) g_spawn_close_pid, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1267,8 +1242,7 @@ shell_app_launch (ShellApp *app,
|
||||
#else
|
||||
NULL, NULL,
|
||||
#endif
|
||||
(GDesktopAppLaunchCallback) wait_pid,
|
||||
app,
|
||||
wait_pid, NULL,
|
||||
error);
|
||||
g_object_unref (context);
|
||||
|
||||
|
@ -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))
|
||||
|
@ -906,11 +906,6 @@ shell_startup_sequence_create_icon (ShellStartupSequence *sequence, guint size)
|
||||
return texture;
|
||||
}
|
||||
|
||||
void
|
||||
shell_startup_sequence_complete (ShellStartupSequence *sequence)
|
||||
{
|
||||
sn_startup_sequence_complete ((SnStartupSequence*)sequence);
|
||||
}
|
||||
|
||||
/**
|
||||
* shell_window_tracker_get_default:
|
||||
|
@ -36,7 +36,6 @@ const char *shell_startup_sequence_get_name (ShellStartupSequence *sequence);
|
||||
gboolean shell_startup_sequence_get_completed (ShellStartupSequence *sequence);
|
||||
int shell_startup_sequence_get_workspace (ShellStartupSequence *sequence);
|
||||
ClutterActor *shell_startup_sequence_create_icon (ShellStartupSequence *sequence, guint size);
|
||||
void shell_startup_sequence_complete (ShellStartupSequence *sequence);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@ -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);
|
||||
|
@ -117,6 +117,7 @@ _st_set_text_from_style (ClutterText *text,
|
||||
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);
|
||||
@ -151,6 +152,13 @@ _st_set_text_from_style (ClutterText *text,
|
||||
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
|
||||
|
@ -3019,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
|
||||
|
@ -232,6 +232,8 @@ double st_theme_node_get_letter_spacing (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