Compare commits

..

35 Commits

Author SHA1 Message Date
Ray Strode
0507fef4cd st-texture-cache: purge on resume
With the proprietary nvidia driver, textures get garbled on suspend,
so the texture cache needs to evict all textures in that situation.
2019-01-15 12:54:32 -05:00
Ray Strode
68c631223c background: rebuild background, not just animation on resume
Previously, we would only refresh the animation on resume
(to handle clock skew).

But we actually need to rebuild the background, too, on nvidia,
so we should just do a full background change.
2019-01-15 12:52:49 -05:00
Ray Strode
97b38c1950 background: refresh after suspend on wayland
At the moment we only refresh after suspend on Xorg.

We need to do it on wayland, too.
2019-01-15 12:51:16 -05:00
Jonas Ådahl
b098930e6d remoteAccess: Make indicator orange
Make the indicator for active remote access use the warning color, to
indicate the severity of allowing remote access.

This only makes the indicator icon orange; the icon in the system menu
is still white.
2019-01-08 13:00:35 -05:00
Jonas Ådahl
45da60516c Add remote access indication and control
Add an indicator for when there is something access the display server
remotely. This could be 1) remote desktop, 2) screen cast or 3) remote
control, but all effectively applications using
org.freedesktop.portal.ScreenCast or org.gnome.portal.RemoteDesktop as
well as gnome-remote-desktop using the corresponding org.gnome.Mutter
APIs directly.

As it is now, it'll simply show a single icon for when anything is
having an active session, and a single action "Turn off" that'll close
every active session.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/160
2019-01-08 13:00:35 -05:00
Ray Strode
c4b1ba48f2 gnome-shell-favourite-apps-firefox.patch 2019-01-08 13:00:35 -05:00
Florian Müllner
6ed21e1ce0 Bump version to 3.28.3
Update NEWS.
2018-07-18 22:53:05 +02:00
Florian Müllner
9c51c87d8c events: Re-use event messages where possible
Destroying and recreating the entire events list on every change is not only
wasteful, it also breaks the clear functionality as messages scheduled for
removal are replaced with "new" messages after the first message has been
removed.

Address both issues by keeping track of all messages and re-use them
whenever possible.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/325
2018-07-13 23:03:42 +02:00
Florian Müllner
db2245d60b workspaceThumbnail: Don't keep stale clones in list
If a clone gets destroyed before the corresponding MetaWindow is
removed from the workspace, we will still find it in the list of
clones and try to destroy it again. Avoid the resulting warnings
by updating the list of clones immediately when a clone is destroyed.

https://bugzilla.gnome.org/show_bug.cgi?id=791233
2018-07-13 15:11:43 +02:00
Florian Müllner
f26cc3ac23 workspace: Don't keep stale clones in list
If a clone gets destroyed before the corresponding MetaWindow is
removed from the workspace, we will still find it in the list of
clones and try to destroy it again. Avoid the resulting warnings
by updating the list of clones immediately when a clone is destroyed.

https://bugzilla.gnome.org/show_bug.cgi?id=791233
2018-07-13 15:11:43 +02:00
Marco Trevisan (Treviño)
02c5b4b947 workspaceThumbnail: remove unused private win reference 2018-07-13 15:11:43 +02:00
Carlos Garnacho
df57829ea1 keyboard: Implement standalone FocusTracker
And stop using FocusCaretTracker for caret position purposes. This
new object uses 1) the text-input protocol in wayland and 2) Info
from IBusPanelService for X11 (which is meant to work for XIM too).

This drops the usage of AtspiEventListener for OSK purposes, which
is best to avoid.
2018-07-11 18:52:27 +02:00
Didier Roche
da96408098 ui: Theme lookup should respect XDG_DATA_DIRS
Modes, extensions and other GNOME Shell assets are searched in appropriate
subdirectories of each directory in XDG_DATA_DIRS, falling back
to global.datadir.
However, this isn't the case for themes, which are currently always expected
in global.datadir, even when referenced by a mode in a different XDG_DATA_DIR.

The fix is to have the theme finding pattern follow the same logic as other
elements.
Fixes #167.


(cherry picked from commit d6d09fd3c8)
2018-06-20 23:24:07 +00:00
Marco Trevisan (Treviño)
4b2e0247af st-texture-cache: Save cairo surfaces to a different map
The default keyed_surface is meant to handle CoglTextures thus we can't
add cairo surfaces to it, as the DestroyNotify function won't handle them.

Then the quicker way is to just add another Hash table for handling
such types of textures, with proper destroy function.


(cherry picked from commit 1f03599d1c)
2018-06-20 23:00:20 +00:00
Marco Trevisan (Treviño)
2c617e5a3a st-texture-cache: Don't add NULL textures to cache
This might cause a crash when cleaning up the cache as the hash table has
cogl_object_unref as DestroyNotify function but that assumes that
the passed object is a valid CoglObject.

Fixes: #210


(cherry picked from commit a24999b7a3)
2018-06-20 22:59:29 +00:00
Joe Rabinoff
4ff7e84c51 Change "const" to "var"
These variables are in fact used from other modules, so gjs complains about them
being const.


(cherry picked from commit 8237a1f6e0)
2018-06-20 22:30:17 +00:00
Daniel van Vugt
9f76b6e4a2 magnifier.js: Fix zoom juddering
Make Zoom respond to the mouse silky-smoothly.

It was previously hard-coded to: 1000/50 = 20 FPS.

https://bugzilla.gnome.org/show_bug.cgi?id=682013
https://launchpad.net/bugs/1691675


(cherry picked from commit 94101e8bb8)
2018-06-07 08:42:32 +00:00
Gun Chleoc
0ac0f7e85b Update Scottish Gaelic translation 2018-06-01 10:36:10 +00:00
Marco Trevisan (Treviño)
73b00ff1a7 st-label: Unset clutter text instance on disposal
The instance is owned by the actor (being its child), and thus when the
disposal happens for the parent the text is disposed too, thus it's just
safer to nullify its reference so that we won't try to access to invalid
objects later, and this might be the case since the JS objects could be kept
around until they aren't finalized.

https://bugzilla.gnome.org/show_bug.cgi?id=788931


(cherry picked from commit 44894262f4)
2018-05-29 09:57:50 +00:00
Pieter Schalk Schoeman
a52597ac5b Update Afrikaans translation 2018-05-19 20:59:51 +00:00
Mario Sanchez Prada
9a2597f80b network: Update the icon in the panel whenever NM's state changes
Similar to what it's done when the main connection changes, we need
to make sure that the icon in the panel gets updated before calling
_syncConnectivity(), so that the icon gets always updated if needed,
regardless of whether there's an active connection or not.

This is needed because there's at least one case when an icon should
be shown when the computer is not connected to any network: when a
hotspot has been enabled, which can be useful even if there's not
an internet connection to share (e.g. to easily allow connecting
other devices to the computer.

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/issues/214


(cherry picked from commit d8b9e23502)
2018-05-17 20:28:26 +00:00
Florian Müllner
e1ed4b25e1 networkAgent: Fix fallout from libnm port
While the libnm-glib version of the function returns a GByteArray*
that gjs can directly cast to the required gutf8*, the libnm function
returns GBytes* from which we need to explicitly fetch the data.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/136


(cherry picked from commit c0a453f64f)
2018-05-09 14:53:15 +00:00
Florian Müllner
c70b18764b Bump version to 3.28.2
Update NEWS.
2018-05-08 22:18:02 +02:00
Florian Müllner
4398516520 build: Include Cally in St introspection
CallyActor is exposed indirectly via StAccessible's parent type,
so add the dependency to shut up a gjs warning.

https://bugzilla.gnome.org/show_bug.cgi?id=781471
2018-05-08 22:02:11 +02:00
Florian Müllner
220514d10e remoteSearch: Actually return icons
Since commit 3b1330880f, a remote search result's createIcon() method
no longer returns the created icon, whoops ...

https://gitlab.gnome.org/GNOME/gnome-shell/issues/249
2018-05-08 22:02:11 +02:00
Silvère Latchurié
18312d9ccd osdWindow: Fix blurriness at certain resolutions
The y position wasn't rounded, leading to some blurriness at vertical
resolutions that aren't a multiple of 4 (e.g. 1050).

https://bugzilla.gnome.org/show_bug.cgi?id=782011
2018-05-08 22:02:11 +02:00
Ray Strode
234b1441e4 keyboardManager: take group index into account when preserving keymap
commit 642107a2 attempts to avoid resetting the current keymap on
spurious input source changes.

It does this by checking if the current layout id is found in
the new list of layouts and resetting the current layout to the
associated match in the list. By not nullifying the current
layout, it won't get subsequently reset.

Unfortunately, if the order of the list changes, resetting the
current keymap is still necessary, since the order corresponds
with the index of the activated group.

This commit changes the code to nullify the current layout if
its group index changes.

https://bugzilla.redhat.com/show_bug.cgi?id=1573923
2018-05-08 13:56:55 -04:00
Rafael Fontenelle
e909db5848 Update Brazilian Portuguese translation 2018-05-02 18:46:32 +00:00
Carlos Garnacho
702338bc7d keyboardManager: Preserve current keymap across reloads
The IM can pretty much update the input sources anytime (even if
to set the same ones). That ends up triggering rebuilding all user
defined keymaps, and losing modifier state if we are unfortunate
enough that this caught us while pressing one.

One common situation seems to be password entries, resulting in
the wrong character being printed if the first character happens
to require the shift key.

If the current keymap is not found in the newly loaded list,
this._current will end up null, with the same behavior as we get
currently (immediate keymap reload).

https://bugzilla.redhat.com/show_bug.cgi?id=1569211

https://gitlab.gnome.org/GNOME/gnome-shell/issues/240

Closes: #240
2018-04-29 17:52:56 +02:00
Florian Müllner
7c9dbc66d9 polkitAgent: Guard against repeated close() calls
We use the close() method to disconnect signal handlers set up in
init(), however the handler ID is only valid in the first call in
case the method is called more than once.

https://gitlab.gnome.org/GNOME/gnome-shell/issues/221
2018-04-21 22:39:15 +02:00
Stas Solovey
0d031dc20f Update Russian translation 2018-04-19 20:32:53 +00:00
Marco Trevisan (Treviño)
b476e851b7 workspaceThumbnail: only update _porthole if the overview is visible
Otherwise it happens that porthole is computed again after that the
overlay is hidden (triggered by a layout reallocation) and thus not
regenerated again afterwards.

https://bugzilla.gnome.org/show_bug.cgi?id=792687


(cherry picked from commit 5fcf40b973)
2018-04-18 00:35:42 +00:00
Marco Trevisan (Treviño)
a27be6a540 workspaceThumbnail: rebuild thumbnails if workareas size changed
https://bugzilla.gnome.org/show_bug.cgi?id=792687


(cherry picked from commit c29bd46e7a)
2018-04-18 00:34:45 +00:00
Marco Trevisan (Treviño)
4b6a57fabe workspaceThumbnail: initialize porthole based on workArea
https://bugzilla.gnome.org/show_bug.cgi?id=792687


(cherry picked from commit b99e304f1e)
2018-04-18 00:33:39 +00:00
Mario Sanchez Prada
92758890bb popupMenu: Fix wrong call to clutter_actor_add_child()
Specify the horizontal alignment via the x_align property when creating
the StIcon, since this function expects one argument, not two.


(cherry picked from commit cdbc99e992)
2018-04-18 00:32:37 +00:00
91 changed files with 3416 additions and 3762 deletions

0
AUTHORS Normal file
View File

View File

@@ -1,16 +1,19 @@
# Coding guide Coding guide
============
Our goal is to have all JavaScript code in GNOME follow a consistent style. In 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 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. (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 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 restrictive while you're coding, ignore it, and let the patch reviewer decide
what to do. what to do.
## Indentation and whitespace Indentation and whitespace
--------------------------
Use four-space indents. Braces are on the same line as their associated 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 statements. You should only omit braces if *both* sides of the statement are
@@ -19,7 +22,7 @@ on one line.
* One space after the `function` keyword. No space between the function name * 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` * in a declaration or a call. One space before the parens in the `if`
* statements, or `while`, or `for` loops. * statements, or `while`, or `for` loops.
```javascript
function foo(a, b) { function foo(a, b) {
let bar; let bar;
@@ -36,20 +39,22 @@ on one line.
print(20); print(20);
} }
} }
```
## Semicolons Semicolons
----------
JavaScript allows omitting semicolons at the end of lines, but don't. Always JavaScript allows omitting semicolons at the end of lines, but don't. Always
end statements with a semicolon. 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 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 while. emacs now has a built-in JavaScript mode, js-mode, based on
espresso-mode. It is the de facto emacs mode for JavaScript. 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. For JavaScript files, use lowerCamelCase-style names, with a `.js` extension.
@@ -62,13 +67,14 @@ library name followed by a dash, e.g. `shell-app-system.c`. Create a
`-private.h` header when you want to share code internally in the `-private.h` header when you want to share code internally in the
library. These headers are not installed, distributed or introspected. library. These headers are not installed, distributed or introspected.
## Imports Imports
-------
Use UpperCamelCase when importing modules to distinguish them from ordinary Use UpperCamelCase when importing modules to distinguish them from ordinary
variables, e.g. variables, e.g.
```javascript
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
```
Imports should be categorized into one of two places. The top-most import block Imports should be categorized into one of two places. The top-most import block
should contain only "environment imports". These are either modules from should contain only "environment imports". These are either modules from
gobject-introspection or modules added by gjs itself. gobject-introspection or modules added by gjs itself.
@@ -79,7 +85,7 @@ e.g. `imports.ui.popupMenu`.
Each import block should be sorted alphabetically. Don't import modules you Each import block should be sorted alphabetically. Don't import modules you
don't use. don't use.
```javascript
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang; const Lang = imports.lang;
@@ -89,22 +95,23 @@ don't use.
const Params = imports.misc.params; const Params = imports.misc.params;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const Util = imports.misc.util; const Util = imports.misc.util;
```
The alphabetical ordering should be done independently of the location of the The alphabetical ordering should be done independently of the location of the
location. Never reference `imports` in actual code. location. Never reference `imports` in actual code.
## Constants Constants
---------
We use CONSTANTS_CASE to define constants. All constants should be directly We use CONSTANTS_CASE to define constants. All constants should be directly
under the imports: under the imports:
```javascript
const MY_DBUS_INTERFACE = 'org.my.Interface';
```
## Variable declaration const MY_DBUS_INTERFACE = 'org.my.Interface';
Variable declaration
--------------------
Always use either `const` or `let` when defining a variable. Always use either `const` or `let` when defining a variable.
```javascript
// Iterating over an array // Iterating over an array
for (let i = 0; i < arr.length; ++i) { for (let i = 0; i < arr.length; ++i) {
let item = arr[i]; let item = arr[i];
@@ -114,17 +121,17 @@ Always use either `const` or `let` when defining a variable.
for (let prop in someobj) { for (let prop in someobj) {
... ...
} }
```
If you use "var" then the variable is added to function scope, not block scope. 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) 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 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 (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. GObjects, although this feature isn't used very often in the Shell itself.
```javascript
var IconLabelMenuItem = new Lang.Class({ var IconLabelMenuItem = new Lang.Class({
Name: 'IconLabelMenuItem', Name: 'IconLabelMenuItem',
Extends: PopupMenu.PopupMenuBaseItem, Extends: PopupMenu.PopupMenuBaseItem,
@@ -139,7 +146,6 @@ GObjects, although this feature isn't used very often in the Shell itself.
log("menu opened!"); log("menu opened!");
} }
}); });
```
* 'Name' is required. 'Extends' is optional. If you leave it out, you will * 'Name' is required. 'Extends' is optional. If you leave it out, you will
automatically inherit from Object. automatically inherit from Object.
@@ -156,12 +162,13 @@ GObjects, although this feature isn't used very often in the Shell itself.
still a giant function call, even though it may resemble a more still a giant function call, even though it may resemble a more
conventional syntax. conventional syntax.
## GObject Introspection GObject Introspection
---------------------
GObject Introspection is a powerful feature that allows us to have native GObject Introspection is a powerful feature that allows us to have native
bindings for almost any library built around GObject. If a library requires 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: you to inherit from a type to use it, you can do so:
```javascript
var MyClutterActor = new Lang.Class({ var MyClutterActor = new Lang.Class({
Name: 'MyClutterActor', Name: 'MyClutterActor',
Extends: Clutter.Actor, Extends: Clutter.Actor,
@@ -181,9 +188,9 @@ you to inherit from a type to use it, you can do so:
alloc.x2, alloc.y2); 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 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 supports. The `gettext` function is aliased globally as `_`, you do not need to
@@ -197,7 +204,8 @@ and "double quotes" for strings that the user may see. This allows us to
quickly find untranslated or mistranslated strings by grepping through the quickly find untranslated or mistranslated strings by grepping through the
sources for double quotes without a gettext call around them. 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, 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 allowing us to treat them like any other. Because the Shell was built before
@@ -206,7 +214,7 @@ that has a property called `actor`. We call this wrapper class the "delegate".
We sometimes use expando properties to set a property called `_delegate` on We sometimes use expando properties to set a property called `_delegate` on
the actor itself: the actor itself:
```javascript
var MyClass = new Lang.Class({ var MyClass = new Lang.Class({
Name: 'MyClass', Name: 'MyClass',
@@ -221,7 +229,6 @@ the actor itself:
actor.set_label("You clicked the button!"); actor.set_label("You clicked the button!");
} }
}); });
```
The 'delegate' property is important for anything which trying to get the The 'delegate' property is important for anything which trying to get the
delegate object from an associated actor. For instance, the drag and drop delegate object from an associated actor. For instance, the drag and drop
@@ -229,14 +236,16 @@ system calls the `handleDragOver` function on the delegate of a "drop target"
when the user drags an item over it. If you do not set the `_delegate` 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. 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 JavaScript Array objects offer a lot of common functional programming
capabilities such as forEach, map, filter and so on. You can use these when 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 they make sense, but please don't have a spaghetti mess of function programming
messed in a procedural style. Use your best judgment. 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 `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" invoked, not to the value of this where the closure is created, because "this"
@@ -245,16 +254,15 @@ variable that can be captured in closures.
All closures should be wrapped with Function.prototype.bind or use arrow All closures should be wrapped with Function.prototype.bind or use arrow
notation. notation.
```javascript
const Lang = imports.lang; const Lang = imports.lang;
let closure1 = () => { this._fnorbate(); }; let closure1 = () => { this._fnorbate(); };
let closure2 = this._fnorbate.bind(this); let closure2 = this._fnorbate.bind(this);
```
A more realistic example would be connecting to a signal on a method of a A more realistic example would be connecting to a signal on a method of a
prototype: prototype:
```javascript
const Lang = imports.lang; const Lang = imports.lang;
const FnorbLib = imports.fborbLib; const FnorbLib = imports.fborbLib;
@@ -268,21 +276,19 @@ prototype:
this._updateFnorb(); this._updateFnorb();
} }
}); });
```
## Object literal syntax Object literal syntax
---------------------
In JavaScript, these are equivalent: In JavaScript, these are equivalent:
```javascript
foo = { 'bar': 42 }; foo = { 'bar': 42 };
foo = { bar: 42 }; foo = { bar: 42 };
```
and so are these: and so are these:
```javascript
var b = foo['bar']; var b = foo['bar'];
var b = foo.bar; var b = foo.bar;
```
If your usage of an object is like an object, then you're defining "member 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: variables." For member variables, use the no-quotes no-brackets syntax: `{ bar:
@@ -292,13 +298,14 @@ If your usage of an object is like a hash table (and thus conceptually the keys
can have special chars in them), don't use quotes, but use brackets: `{ bar: 42 can have special chars in them), don't use quotes, but use brackets: `{ bar: 42
}`, `foo['bar']`. }`, `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 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 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 arbitrary property, create a getter and setter, and use Tweener to animate the
property. property.
```javascript
var ANIMATION_TIME = 2000; var ANIMATION_TIME = 2000;
var MyClass = new Lang.Class({ var MyClass = new Lang.Class({
@@ -324,4 +331,3 @@ property.
{ position: 100, { position: 100,
time: ANIMATION_TIME, time: ANIMATION_TIME,
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
```

7
MAINTAINERS Normal file
View File

@@ -0,0 +1,7 @@
Owen Taylor
E-mail: otaylor@redhat.com
Userid: otaylor
Colin Walters
E-mail: walters@verbum.org
Userid: walters

50
NEWS
View File

@@ -1,50 +1,30 @@
3.29.3 3.28.3
====== ======
* Save creation time in screenshot metadata [Florian; #790481]
* Improve consistency between ctrl- and middle-click on app icons [Xavier; #316]
* Add support for font-feature-settings CSS property [Ryan; #34]
* Adjust to MetaScreen removal [Jonas; #759538]
* Misc. bug fixes [Florian, Marco, Sam; #298, #788931, #26, #76, !54, #788882,
#791233]
Contributors:
Jonas Ådahl, Ryan Hendrickson, Xavier Johnson, Florian Müllner, Joe Rabinoff,
Sam Spilsbury, Marco Trevisan (Treviño)
Translators:
Gun Chleoc [gd], Yi-Jyun Pan [zh_TW], Cédric Valmary [oc], Jordi Mas [ca]
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] * Fix lagging pointer when zoomed [Daniel; #682013]
* Misc. bug fixes [Milan, Xiaoguang, Florian, Mario, Ole; #244, #787871, * Fix "Clear All" for calendar events [Florian; #325]
#781471, #136, #214, #294] * Misc. bug fixes [Florian, Mario, Marco; #136, #214, #788931, #791233]
Contributors: Contributors:
Ole Jørgen Brønner, Milan Crha, Carlos Garnacho, Yussuf Khalil, Carlos Garnacho, Florian Müllner, Mario Sanchez Prada, Joe Rabinoff,
Silvère Latchurié, Florian Müllner, Mario Sanchez Prada, Ray Strode, Didier Roche, Marco Trevisan (Treviño), Daniel van Vugt
Daniel van Vugt, Xiaoguang Wang
Translators: Translators:
Rafael Fontenelle [pt_BR], Kukuh Syafaat [id], Marcos Lans [gl], Pieter Schalk Schoeman [af], Gun Chleoc [gd]
Anders Jonsson [sv], Mingcong Bai [zh_CN]
3.29.1 3.28.2
====== ======
* Support icons in app-menu [Florian; #760985] * Fix lock-up on cancelling polkit dialog [Florian; #221]
* Misc. bug fixes [Marco, Florian, Lubomir; #792687, #221, !63] * Guard against untimely keyboard map changes [Carlos; #240]
* Fix blurriness of OSD under some resolutions [Silvère; #782011]
* Fix icons in search provider results [Florian; #249]
* Misc. bug fixes [Marco, Florian; #792687, #781471]
Contributors: Contributors:
Piotr Drąg, Takao Fujiwara, Christian Kellner, Florian Müllner, Carlos Garnacho, Silvère Latchurié, Florian Müllner, Mario Sanchez Prada,
Mario Sanchez Prada, Lubomir Rintel, Didier Roche, Marco Trevisan (Treviño), Ray Strode, Marco Trevisan (Treviño)
verdre
Translators: Translators:
gogo [hr], Stas Solovey [ru], Matej Urbančič [sl], Daniel Șerbănescu [ro], Stas Solovey [ru], Rafael Fontenelle [pt_BR]
Fabio Tomat [fur], Marek Cernocky [cs], Daniel Mustieles [es]
3.28.1 3.28.1
====== ======

View File

@@ -1,4 +1,3 @@
# GNOME Shell
GNOME Shell provides core user interface functions for the GNOME 3 desktop, GNOME Shell provides core user interface functions for the GNOME 3 desktop,
like switching to windows and launching applications. GNOME Shell takes like switching to windows and launching applications. GNOME Shell takes
advantage of the capabilities of modern graphics hardware and introduces advantage of the capabilities of modern graphics hardware and introduces
@@ -7,14 +6,15 @@ easy to use experience.
For more information about GNOME Shell, including instructions on how For more information about GNOME Shell, including instructions on how
to build GNOME Shell from source and how to get involved with the project, to build GNOME Shell from source and how to get involved with the project,
see the [project wiki][wiki] see:
Bugs should be reported to the GNOME [bug tracking system][bug-tracker]. https://wiki.gnome.org/Projects/GnomeShell
## License Bugs should be reported at http://bugzilla.gnome.org against the 'gnome-shell'
product.
License
=======
GNOME Shell is distributed under the terms of the GNU General Public License, GNOME Shell is distributed under the terms of the GNU General Public License,
version 2 or later. See the [COPYING][license] file for details. version 2 or later. See the COPYING file for details.
[project-wiki]: https://wiki.gnome.org/Projects/GnomeShell
[bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell/issues
[license]: COPYING

View File

@@ -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 know which extensions are enabled and disabled, and allowing the website to
enable, disable and install them. enable, disable and install them.
Bugs should be reported to the GNOME [bug tracking system][bug-tracker]. Bugs should be reported at http://bugzilla.gnome.org against the 'gnome-shell'
product.
## License License
=======
The GNOME Shell Browser Plugin, like GNOME Shell itself is distributed under The GNOME Shell Browser Plugin, like GNOME Shell itself is distributed under
the GNU General Public License, version 2 or later. The plugin also contains 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 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: and LGPL 2.1. These headers are third-party sources and can be retrieved from:
http://code.google.com/p/npapi-sdk/ http://code.google.com/p/npapi-sdk/
[bug-tracker]: https://gitlab.gnome.org/GNOME/gnome-shell/issues

View File

@@ -39,7 +39,7 @@
</description> </description>
</key> </key>
<key name="favorite-apps" type="as"> <key name="favorite-apps" type="as">
<default>[ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default> <default>[ 'firefox.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
<summary>List of desktop file IDs for favorite applications</summary> <summary>List of desktop file IDs for favorite applications</summary>
<description> <description>
The applications corresponding to these identifiers The applications corresponding to these identifiers

3
data/theme/HACKING Normal file
View File

@@ -0,0 +1,3 @@
To generate the css files, from the project directory:
sass --sourcemap=none --update .

31
data/theme/README Normal file
View File

@@ -0,0 +1,31 @@
Summary
-------
* Do not edit the CSS directly, edit the source SCSS files and the CSS files will be generated
automatically when building with meson + ninja and left inside the build directory to be
incorporated into the gresource XML (you'll need to have sassc installed).
How to tweak the theme
----------------------
Adwaita is a complex theme, so to keep it maintainable it's written and processed in SASS, the
generated CSS is then transformed into a gresource file during gtk build and used at runtime in a
non-legible or editable form.
It is very likely your change will happen in the _common.scss file. That's where all the widget
selectors are defined. Here's a rundown of the "supporting" stylesheets, that are unlikely to be the
right place for a drive by stylesheet fix:
_colors.scss - global color definitions. We keep the number of defined colors to a necessary minimum,
most colors are derived from a handful of basics. It is an exact copy of the gtk+
counterpart. Light theme is used for the classic theme and dark is for GNOME3 shell
default.
_drawing.scss - drawing helper mixings/functions to allow easier definition of widget drawing under
specific context. This is why Adwaita isn't 15000 LOC.
_common.scss - actual definitions of style for each widget. This is where you are likely to add/remove
your changes.
You can read about SASS at http://sass-lang.com/documentation/. Once you make your changes to the
_common.scss file, you can run ninja to generate the final CSS files.

View File

@@ -1,32 +0,0 @@
## Summary
Do not edit the CSS directly, edit the source SCSS files and the CSS files
will be generated automatically when building with meson + ninja and left
inside the build directory to be incorporated into the gresource XML (you'll
need to have sassc installed).
## How to tweak the theme
Adwaita is a complex theme, so to keep it maintainable it's written and
processed in SASS, the generated CSS is then transformed into a gresource
file during gtk build and used at runtime in a non-legible or editable form.
It is very likely your change will happen in the [_common.scss][common] file.
That's where all the widget selectors are defined. Here's a rundown of
the "supporting" stylesheets, that are unlikely to be the right place
for a drive by stylesheet fix:
| File | Description |
| ------------------------ | ----------------- |
| [_colors.scss][colors] | global color definitions. We keep the number of defined colors to a necessary minimum, most colors are derived from a handful of basics. It is an exact copy of the gtk+ counterpart. Light theme is used for the classic theme and dark is for GNOME3 shell default. |
| [_drawing.scss][drawing] | drawing helper mixings/functions to allow easier definition of widget drawing under specific context. This is why Adwaita isn't 15000 LOC. |
| [_common.scss][common] | actual definitions of style for each widget. This is where you are likely to add/remove your changes. |
You can read about SASS on its [web page][sass-web]. Once you make your
changes to the [_common.scss][common] file, you can run ninja to generate the
final CSS files.
[common]: data/theme/gnome-shell-sass/_common.scss
[colors]: data/theme/gnome-shell-sass/_colors.scss
[drawing]: data/theme/gnome-shell-sass/_drawing.scss
[sass-web]: http://sass-lang.com/documentation/

View File

@@ -0,0 +1,6 @@
--- Generating the css file ---
You need sass to generate the css file.
To generate them run from a command line in the project directory:
sass --sourcemap=none --update ./

View File

@@ -0,0 +1,7 @@
GNOME Shell Sass is a project intended to allow the sharing of the theme sources in sass between gnome-shell and other projects like gnome-shell-extensions.
License
=======
GNOME Shell Sass is distributed under the terms of the GNU General Public License,
version 2 or later. See the COPYING file for details.

View File

@@ -1,16 +0,0 @@
# GNOME Shell Sass
GNOME Shell Sass is a project intended to allow the sharing of the
theme sources in sass between gnome-shell and other projects like
gnome-shell-extensions.
Any changes should be done in the [GNOME Shell subtree][shell-subtree]
and not the stand-alone [gnome-shell-sass repository][sass-repo]. They
will then be synchronized periodically before releases.
## License
GNOME Shell Sass is distributed under the terms of the GNU General Public
License, version 2 or later. See the [COPYING][license] file for details.
[shell-subtree]: https://gitlab.gnome.org/GNOME/gnome-shell/tree/master/data/theme/gnome-shell-sass
[sass-repo]: https://gitlab.gnome.org/GNOME/gnome-shell-sass
[license]: COPYING

View File

@@ -733,7 +733,6 @@ StScrollBar {
transition-duration: 500ms; transition-duration: 500ms;
font-weight: bold; font-weight: bold;
height: 1.86em; height: 1.86em;
font-feature-settings: "tnum";
&.unlock-screen, &.unlock-screen,
&.login-screen, &.login-screen,
@@ -825,6 +824,8 @@ StScrollBar {
.screencast-indicator { color: $warning_color; } .screencast-indicator { color: $warning_color; }
.remote-access-indicator { color: $warning_color; }
&.solid { &.solid {
background-color: black; background-color: black;
/* transition from transparent to solid */ /* transition from transparent to solid */
@@ -959,7 +960,6 @@ StScrollBar {
padding: 0.1em; padding: 0.1em;
margin: 2px; margin: 2px;
border-radius: 1.4em; border-radius: 1.4em;
font-feature-settings: "tnum";
&:hover,&:focus { background-color: lighten($bg_color,5%); } &:hover,&:focus { background-color: lighten($bg_color,5%); }
&:active,&:selected { &:active,&:selected {
color: lighten($selected_fg_color,5%); color: lighten($selected_fg_color,5%);
@@ -1790,19 +1790,20 @@ StScrollBar {
.login-dialog-user-list-view { -st-vfade-offset: 1em; } .login-dialog-user-list-view { -st-vfade-offset: 1em; }
.login-dialog-user-list { .login-dialog-user-list {
spacing: 12px; spacing: 12px;
padding: .2em;
width: 23em; width: 23em;
&:expanded .login-dialog-user-list-item:selected { background-color: $selected_bg_color; color: $selected_fg_color; } &: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; } &:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; }
} }
.login-dialog-user-list-item { .login-dialog-user-list-item {
border-radius: 5px; border-radius: 5px;
padding: 6px; padding: .2em;
color: darken($osd_fg_color,30%); color: darken($osd_fg_color,30%);
&:ltr .user-widget { padding-right: 1em; } &:ltr { padding-right: 1em; }
&:rtl .user-widget { padding-left: 1em; } &:rtl { padding-left: 1em; }
.login-dialog-timed-login-indicator { .login-dialog-timed-login-indicator {
height: 2px; height: 2px;
margin-top: 6px; margin: 2px 0 0 0;
background-color: $osd_fg_color; background-color: $osd_fg_color;
} }
&:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; } &:focus .login-dialog-timed-login-indicator { background-color: $selected_fg_color; }
@@ -1817,8 +1818,8 @@ StScrollBar {
padding-left: 15px; padding-left: 15px;
} }
.user-widget-label { .user-widget-label {
&:ltr { padding-left: 14px; } &:ltr { padding-left: 18px; }
&:rtl { padding-right: 14px; } &:rtl { padding-right: 18px; }
} }
.login-dialog-prompt-layout { .login-dialog-prompt-layout {
@@ -1869,7 +1870,6 @@ StScrollBar {
.screen-shield-clock-time { .screen-shield-clock-time {
font-size: 72pt; font-size: 72pt;
text-shadow: 0px 2px 2px rgba(0,0,0,0.4); text-shadow: 0px 2px 2px rgba(0,0,0,0.4);
font-feature-settings: "tnum";
} }
.screen-shield-clock-date { .screen-shield-clock-date {

View File

@@ -25,6 +25,7 @@ const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang; const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@@ -85,8 +86,7 @@ var UserListItem = new Lang.Class({
GObject.BindingFlags.SYNC_CREATE); GObject.BindingFlags.SYNC_CREATE);
this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator', this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator',
scale_x: 0, scale_x: 0 });
visible: false });
layout.add(this._timedLoginIndicator); layout.add(this._timedLoginIndicator);
this.actor.connect('clicked', this._onClicked.bind(this)); this.actor.connect('clicked', this._onClicked.bind(this));
@@ -126,8 +126,6 @@ var UserListItem = new Lang.Class({
this.hideTimedLoginIndicator(); this.hideTimedLoginIndicator();
this._timedLoginIndicator.visible = true;
let startTime = GLib.get_monotonic_time(); let startTime = GLib.get_monotonic_time();
this._timedLoginTimeoutId = GLib.timeout_add (GLib.PRIORITY_DEFAULT, 33, this._timedLoginTimeoutId = GLib.timeout_add (GLib.PRIORITY_DEFAULT, 33,
@@ -154,8 +152,6 @@ var UserListItem = new Lang.Class({
GLib.source_remove(this._timedLoginTimeoutId); GLib.source_remove(this._timedLoginTimeoutId);
this._timedLoginTimeoutId = 0; this._timedLoginTimeoutId = 0;
} }
this._timedLoginIndicator.visible = false;
this._timedLoginIndicator.scale_x = 0.; this._timedLoginIndicator.scale_x = 0.;
} }
}); });
@@ -995,81 +991,59 @@ var LoginDialog = new Lang.Class({
return hold; return hold;
}, },
_showTimedLoginAnimation() {
this._timedLoginItem.actor.grab_key_focus();
return this._timedLoginItem.showTimedLoginIndicator(this._timedLoginAnimationTime);
},
_blockTimedLoginUntilIdle() { _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(); let hold = new Batch.Hold();
this._timedLoginIdleTimeOutId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, _TIMED_LOGIN_IDLE_THRESHOLD, this._timedLoginIdleTimeOutId = Mainloop.timeout_add_seconds(_TIMED_LOGIN_IDLE_THRESHOLD,
() => { () => {
this._timedLoginIdleTimeOutId = 0; this._timedLoginAnimationTime -= _TIMED_LOGIN_IDLE_THRESHOLD;
hold.release(); hold.release();
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginIdleTimeOutId'); GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginAnimationTime');
return hold; return hold;
}, },
_startTimedLogin(userName, delay) { _startTimedLogin(userName, delay) {
let firstRun = true; this._timedLoginItem = null;
this._timedLoginDelay = delay;
// Cancel execution of old batch this._timedLoginAnimationTime = delay;
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), let tasks = [() => this._waitForItemForUser(userName),
() => { () => {
loginItem = this._userList.getItemFromUserName(userName); this._timedLoginItem = 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) { if (!this._userManager.is_loaded) {
this._userList.jumpToItem(loginItem); this._userList.jumpToItem(this._timedLoginItem);
} }
}, },
this._blockTimedLoginUntilIdle,
() => { () => {
// This blocks the timed login animation until a few this._userList.scrollToItem(this._timedLoginItem);
// 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; this._timedLoginBatch = null;
@@ -1081,17 +1055,37 @@ var LoginDialog = new Lang.Class({
return this._timedLoginBatch.run(); return this._timedLoginBatch.run();
}, },
_onTimedLoginRequested(client, userName, seconds) { _resetTimedLogin() {
if (this._timedLoginBatch) if (this._timedLoginBatch) {
return; this._timedLoginBatch.cancel();
this._timedLoginBatch = null;
}
if (this._timedLoginItem)
this._timedLoginItem.hideTimedLoginIndicator();
let userName = this._timedLoginItem.user.get_user_name();
if (userName)
this._startTimedLogin(userName, this._timedLoginDelay);
},
_onTimedLoginRequested(client, userName, seconds) {
this._startTimedLogin(userName, seconds); this._startTimedLogin(userName, seconds);
// Restart timed login on user interaction
global.stage.connect('captured-event', (actor, event) => { global.stage.connect('captured-event', (actor, event) => {
if (this._timedLoginDelay == undefined)
return Clutter.EVENT_PROPAGATE;
if (event.type() == Clutter.EventType.KEY_PRESS || if (event.type() == Clutter.EventType.KEY_PRESS ||
event.type() == Clutter.EventType.BUTTON_PRESS) { event.type() == Clutter.EventType.BUTTON_PRESS) {
this._startTimedLogin(userName, seconds); if (this._timedLoginBatch) {
this._timedLoginBatch.cancel();
this._timedLoginBatch = null;
}
} else if (event.type() == Clutter.EventType.KEY_RELEASE ||
event.type() == Clutter.EventType.BUTTON_RELEASE) {
this._resetTimedLogin();
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;

View File

@@ -130,6 +130,7 @@
<file>ui/status/rfkill.js</file> <file>ui/status/rfkill.js</file>
<file>ui/status/volume.js</file> <file>ui/status/volume.js</file>
<file>ui/status/bluetooth.js</file> <file>ui/status/bluetooth.js</file>
<file>ui/status/remoteAccess.js</file>
<file>ui/status/screencast.js</file> <file>ui/status/screencast.js</file>
<file>ui/status/system.js</file> <file>ui/status/system.js</file>
<file>ui/status/thunderbolt.js</file> <file>ui/status/thunderbolt.js</file>

View File

@@ -115,6 +115,11 @@ var IBusManager = new Lang.Class({
object_path: IBus.PATH_PANEL }); object_path: IBus.PATH_PANEL });
this._candidatePopup.setPanelService(this._panelService); this._candidatePopup.setPanelService(this._panelService);
this._panelService.connect('update-property', this._updateProperty.bind(this)); this._panelService.connect('update-property', this._updateProperty.bind(this));
this._panelService.connect('set-cursor-location', (ps, x, y, w, h) => {
let cursorLocation = { x, y, width: w, height: h };
this.emit('set-cursor-location', cursorLocation);
});
try { try {
// IBus versions older than 1.5.10 have a bug which // IBus versions older than 1.5.10 have a bug which
// causes spurious set-content-type emissions when // causes spurious set-content-type emissions when

View File

@@ -136,7 +136,8 @@ function run() {
global.frame_finish_timestamp = true; global.frame_finish_timestamp = true;
for (let k = 0; k < 5; k++) for (let k = 0; k < 5; k++)
yield Scripting.createTestWindow({ maximized: true }); yield Scripting.createTestWindow(640, 480,
{ maximized: true });
yield Scripting.waitTestWindows(); yield Scripting.waitTestWindows();
yield Scripting.sleep(1000); yield Scripting.sleep(1000);
@@ -157,7 +158,8 @@ function run() {
yield Scripting.destroyTestWindows(); yield Scripting.destroyTestWindows();
Main.overview.hide(); Main.overview.hide();
yield Scripting.createTestWindow({ maximized: true, yield Scripting.createTestWindow(640, 480,
{ maximized: true,
redraws: true}); redraws: true});
yield Scripting.waitTestWindows(); yield Scripting.waitTestWindows();

View File

@@ -502,8 +502,7 @@ var CyclerPopup = new Lang.Class({
_finish() { _finish() {
let window = this._items[this._selectedIndex]; let window = this._items[this._selectedIndex];
let ws = window.get_workspace(); let ws = window.get_workspace();
let workspaceManager = global.workspace_manager; let activeWs = global.screen.get_active_workspace();
let activeWs = workspaceManager.get_active_workspace();
if (window.minimized) { if (window.minimized) {
Main.wm.skipNextEffect(window.get_compositor_private()); Main.wm.skipNextEffect(window.get_compositor_private());
@@ -573,14 +572,7 @@ var WindowSwitcherPopup = new Lang.Class({
}, },
_getWindowList() { _getWindowList() {
let workspace = null; let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
if (this._settings.get_boolean('current-workspace-only')) {
let workspaceManager = global.workspace_manager;
workspace = workspaceManager.get_active_workspace();
}
return getWindows(workspace); return getWindows(workspace);
}, },
@@ -628,14 +620,7 @@ var WindowCyclerPopup = new Lang.Class({
}, },
_getWindows() { _getWindows() {
let workspace = null; let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
if (this._settings.get_boolean('current-workspace-only')) {
let workspaceManager = global.workspace_manager;
workspace = workspaceManager.get_active_workspace();
}
return getWindows(workspace); return getWindows(workspace);
}, },
@@ -684,14 +669,8 @@ var AppSwitcher = new Lang.Class({
let windowTracker = Shell.WindowTracker.get_default(); let windowTracker = Shell.WindowTracker.get_default();
let settings = new Gio.Settings({ schema_id: 'org.gnome.shell.app-switcher' }); let settings = new Gio.Settings({ schema_id: 'org.gnome.shell.app-switcher' });
let workspace = settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace()
let workspace = null; : null;
if (settings.get_boolean('current-workspace-only')) {
let workspaceManager = global.workspace_manager;
workspace = workspaceManager.get_active_workspace();
}
let allWindows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace); let allWindows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
// Construct the AppIcons, add to the popup // Construct the AppIcons, add to the popup

View File

@@ -1778,11 +1778,10 @@ var AppIcon = new Lang.Class({
activate(button) { activate(button) {
let event = Clutter.get_current_event(); let event = Clutter.get_current_event();
let modifiers = event ? event.get_state() : 0; let modifiers = event ? event.get_state() : 0;
let isMiddleButton = button && button == Clutter.BUTTON_MIDDLE; let openNewWindow = this.app.can_open_new_window () &&
let isCtrlPressed = (modifiers & Clutter.ModifierType.CONTROL_MASK) != 0; modifiers & Clutter.ModifierType.CONTROL_MASK &&
let openNewWindow = this.app.can_open_new_window() && this.app.state == Shell.AppState.RUNNING ||
this.app.state == Shell.AppState.RUNNING && button && button == 2;
(isCtrlPressed || isMiddleButton);
if (this.app.state == Shell.AppState.STOPPED || openNewWindow) if (this.app.state == Shell.AppState.STOPPED || openNewWindow)
this.animateLaunch(); this.animateLaunch();
@@ -1862,8 +1861,7 @@ var AppIconMenu = new Lang.Class({
// Display the app windows menu items and the separator between windows // Display the app windows menu items and the separator between windows
// of the current desktop and other windows. // of the current desktop and other windows.
let workspaceManager = global.workspace_manager; let activeWorkspace = global.screen.get_active_workspace();
let activeWorkspace = workspaceManager.get_active_workspace();
let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace; let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace;
for (let i = 0; i < windows.length; i++) { for (let i = 0; i < windows.length; i++) {
@@ -1872,9 +1870,7 @@ var AppIconMenu = new Lang.Class({
this._appendSeparator(); this._appendSeparator();
separatorShown = true; separatorShown = true;
} }
let title = window.title ? window.title let item = this._appendMenuItem(window.title);
: this._source.app.get_name();
let item = this._appendMenuItem(title);
item.connect('activate', () => { item.connect('activate', () => {
this.emit('activate-window', window); this.emit('activate-window', window);
}); });

View File

@@ -41,6 +41,7 @@ const RENAMED_DESKTOP_IDS = {
'gnotravex.desktop': 'gnome-tetravex.desktop', 'gnotravex.desktop': 'gnome-tetravex.desktop',
'gnotski.desktop': 'gnome-klotski.desktop', 'gnotski.desktop': 'gnome-klotski.desktop',
'gtali.desktop': 'tali.desktop', 'gtali.desktop': 'tali.desktop',
'mozilla-firefox.desktop': 'firefox.desktop',
'nautilus.desktop': 'org.gnome.Nautilus.desktop', 'nautilus.desktop': 'org.gnome.Nautilus.desktop',
'polari.desktop': 'org.gnome.Polari.desktop', 'polari.desktop': 'org.gnome.Polari.desktop',
'totem.desktop': 'org.gnome.Totem.desktop', 'totem.desktop': 'org.gnome.Totem.desktop',

View File

@@ -240,7 +240,7 @@ var Background = new Lang.Class({
file: null, file: null,
style: null }); style: null });
this.background = new Meta.Background({ meta_display: global.display }); this.background = new Meta.Background({ meta_screen: global.screen });
this.background._delegate = this; this.background._delegate = this;
this._settings = params.settings; this._settings = params.settings;
@@ -264,7 +264,7 @@ var Background = new Lang.Class({
(lm, aboutToSuspend) => { (lm, aboutToSuspend) => {
if (aboutToSuspend) if (aboutToSuspend)
return; return;
this._refreshAnimation(); this.emit('changed');
}); });
this._settingsChangedSignalId = this._settings.connect('changed', () => { this._settingsChangedSignalId = this._settings.connect('changed', () => {
@@ -499,12 +499,12 @@ var SystemBackground = new Lang.Class({
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/noise-texture.png'); let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/noise-texture.png');
if (_systemBackground == null) { if (_systemBackground == null) {
_systemBackground = new Meta.Background({ meta_display: global.display }); _systemBackground = new Meta.Background({ meta_screen: global.screen });
_systemBackground.set_color(DEFAULT_BACKGROUND_COLOR); _systemBackground.set_color(DEFAULT_BACKGROUND_COLOR);
_systemBackground.set_file(file, GDesktopEnums.BackgroundStyle.WALLPAPER); _systemBackground.set_file(file, GDesktopEnums.BackgroundStyle.WALLPAPER);
} }
this.actor = new Meta.BackgroundActor({ meta_display: global.display, this.actor = new Meta.BackgroundActor({ meta_screen: global.screen,
monitor: 0, monitor: 0,
background: _systemBackground }); background: _systemBackground });
@@ -538,10 +538,8 @@ var BackgroundSource = new Lang.Class({
this._settings = new Gio.Settings({ schema_id: settingsSchema }); this._settings = new Gio.Settings({ schema_id: settingsSchema });
this._backgrounds = []; this._backgrounds = [];
let monitorManager = Meta.MonitorManager.get(); this._monitorsChangedId = global.screen.connect('monitors-changed',
this._monitorsChangedId = this._onMonitorsChanged.bind(this));
monitorManager.connect('monitors-changed',
this._onMonitorsChanged.bind(this));
}, },
_onMonitorsChanged() { _onMonitorsChanged() {
@@ -606,8 +604,7 @@ var BackgroundSource = new Lang.Class({
}, },
destroy() { destroy() {
let monitorManager = Meta.MonitorManager.get(); global.screen.disconnect(this._monitorsChangedId);
monitorManager.disconnect(this._monitorsChangedId);
for (let monitorIndex in this._backgrounds) { for (let monitorIndex in this._backgrounds) {
let background = this._backgrounds[monitorIndex]; let background = this._backgrounds[monitorIndex];
@@ -754,7 +751,7 @@ var BackgroundManager = new Lang.Class({
_createBackgroundActor() { _createBackgroundActor() {
let background = this._backgroundSource.getBackground(this._monitorIndex); let background = this._backgroundSource.getBackground(this._monitorIndex);
let backgroundActor = new Meta.BackgroundActor({ meta_display: global.display, let backgroundActor = new Meta.BackgroundActor({ meta_screen: global.screen,
monitor: this._monitorIndex, monitor: this._monitorIndex,
background: background.background, background: background.background,
vignette: this._vignette, vignette: this._vignette,

View File

@@ -821,6 +821,8 @@ var EventsSection = new Lang.Class({
this._desktopSettings.connect('changed', this._reloadEvents.bind(this)); this._desktopSettings.connect('changed', this._reloadEvents.bind(this));
this._eventSource = new EmptyEventSource(); this._eventSource = new EmptyEventSource();
this._messageById = new Map();
this.parent(); this.parent();
this._title = new St.Button({ style_class: 'events-section-title', this._title = new St.Button({ style_class: 'events-section-title',
@@ -875,20 +877,32 @@ var EventsSection = new Lang.Class({
this._reloading = true; this._reloading = true;
this._list.destroy_all_children();
let periodBegin = _getBeginningOfDay(this._date); let periodBegin = _getBeginningOfDay(this._date);
let periodEnd = _getEndOfDay(this._date); let periodEnd = _getEndOfDay(this._date);
let events = this._eventSource.getEvents(periodBegin, periodEnd); let events = this._eventSource.getEvents(periodBegin, periodEnd);
let ids = events.map(e => e.id);
this._messageById.forEach((message, id) => {
if (ids.includes(id))
return;
this._messageById.delete(id);
this.removeMessage(message);
});
for (let i = 0; i < events.length; i++) { for (let i = 0; i < events.length; i++) {
let event = events[i]; let event = events[i];
let message = new EventMessage(event, this._date); let message = this._messageById.get(event.id);
message.connect('close', () => { if (!message) {
this._ignoreEvent(event); message = new EventMessage(event, this._date);
}); message.connect('close', () => {
this.addMessage(message, false); this._ignoreEvent(event);
});
this._messageById.set(event.id, message);
this.addMessage(message, false);
} else {
this.moveMessage(message, i, false);
}
} }
this._reloading = false; this._reloading = false;

View File

@@ -2,7 +2,6 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Lang = imports.lang; const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
@@ -14,7 +13,6 @@ const Tweener = imports.ui.tweener;
var FROZEN_WINDOW_BRIGHTNESS = -0.3 var FROZEN_WINDOW_BRIGHTNESS = -0.3
var DIALOG_TRANSITION_TIME = 0.15 var DIALOG_TRANSITION_TIME = 0.15
var ALIVE_TIMEOUT = 5000;
var CloseDialog = new Lang.Class({ var CloseDialog = new Lang.Class({
Name: 'CloseDialog', Name: 'CloseDialog',
@@ -28,7 +26,6 @@ var CloseDialog = new Lang.Class({
this.parent(); this.parent();
this._window = window; this._window = window;
this._dialog = null; this._dialog = null;
this._timeoutId = 0;
}, },
get window() { get window() {
@@ -100,14 +97,6 @@ var CloseDialog = new Lang.Class({
if (this._dialog != null) if (this._dialog != null)
return; return;
Meta.disable_unredirect_for_display(global.display);
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._addWindowEffect();
this._initDialog(); this._initDialog();
@@ -128,11 +117,6 @@ var CloseDialog = new Lang.Class({
if (this._dialog == null) if (this._dialog == null)
return; return;
Meta.enable_unredirect_for_display(global.display);
GLib.source_remove(this._timeoutId);
this._timeoutId = 0;
let dialog = this._dialog; let dialog = this._dialog;
this._dialog = null; this._dialog = null;
this._removeWindowEffect(); this._removeWindowEffect();

View File

@@ -604,17 +604,12 @@ var NetworkAgent = new Lang.Class({
this._native.connect('new-request', this._newRequest.bind(this)); this._native.connect('new-request', this._newRequest.bind(this));
this._native.connect('cancel-request', this._cancelRequest.bind(this)); this._native.connect('cancel-request', this._cancelRequest.bind(this));
try {
this._initialized = false; this._native.init(null);
this._native.init_async(GLib.PRIORITY_DEFAULT, null, (o, res) => { } catch(e) {
try { this._native = null;
this._native.init_finish(res); logError(e, 'error initializing the NetworkManager Agent');
this._initialized = true; }
} catch(e) {
this._native = null;
logError(e, 'error initializing the NetworkManager Agent');
}
});
}, },
enable() { enable() {
@@ -622,7 +617,7 @@ var NetworkAgent = new Lang.Class({
return; return;
this._native.auto_register = true; this._native.auto_register = true;
if (this._initialized && !this._native.registered) if (!this._native.registered)
this._native.register_async(null, null); this._native.register_async(null, null);
}, },
@@ -645,7 +640,7 @@ var NetworkAgent = new Lang.Class({
return; return;
this._native.auto_register = false; this._native.auto_register = false;
if (this._initialized && this._native.registered) if (this._native.registered)
this._native.unregister_async(null, null); this._native.unregister_async(null, null);
}, },

View File

@@ -85,11 +85,9 @@ var CtrlAltTabManager = new Lang.Class({
// And add the windows metacity would show in its Ctrl-Alt-Tab list // And add the windows metacity would show in its Ctrl-Alt-Tab list
if (Main.sessionMode.hasWindows && !Main.overview.visible) { if (Main.sessionMode.hasWindows && !Main.overview.visible) {
let display = global.display; let screen = global.screen;
let workspaceManager = global.workspace_manager; let display = screen.get_display();
let activeWorkspace = workspaceManager.get_active_workspace(); let windows = display.get_tab_list(Meta.TabList.DOCKS, screen.get_active_workspace ());
let windows = display.get_tab_list(Meta.TabList.DOCKS,
activeWorkspace);
let windowTracker = Shell.WindowTracker.get_default(); let windowTracker = Shell.WindowTracker.get_default();
let textureCache = St.TextureCache.get_default(); let textureCache = St.TextureCache.get_default();
for (let i = 0; i < windows.length; i++) { for (let i = 0; i < windows.length; i++) {
@@ -133,7 +131,7 @@ var CtrlAltTabManager = new Lang.Class({
}, },
_focusWindows(timestamp) { _focusWindows(timestamp) {
global.display.focus_default_window(timestamp); global.screen.focus_default_window(timestamp);
} }
}); });

View File

@@ -280,7 +280,7 @@ var _Draggable = new Lang.Class({
this._touchSequence = sequence; this._touchSequence = sequence;
this._grabEvents(); this._grabEvents();
global.display.set_cursor(Meta.Cursor.DND_IN_DRAG); global.screen.set_cursor(Meta.Cursor.DND_IN_DRAG);
this._dragX = this._dragStartX = stageX; this._dragX = this._dragStartX = stageX;
this._dragY = this._dragStartY = stageY; this._dragY = this._dragStartY = stageY;
@@ -412,7 +412,7 @@ var _Draggable = new Lang.Class({
if (motionFunc) { if (motionFunc) {
let result = motionFunc(dragEvent); let result = motionFunc(dragEvent);
if (result != DragMotionResult.CONTINUE) { if (result != DragMotionResult.CONTINUE) {
global.display.set_cursor(DRAG_CURSOR_MAP[result]); global.screen.set_cursor(DRAG_CURSOR_MAP[result]);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
} }
} }
@@ -430,13 +430,13 @@ var _Draggable = new Lang.Class({
targY, targY,
0); 0);
if (result != DragMotionResult.CONTINUE) { if (result != DragMotionResult.CONTINUE) {
global.display.set_cursor(DRAG_CURSOR_MAP[result]); global.screen.set_cursor(DRAG_CURSOR_MAP[result]);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
} }
} }
target = target.get_parent(); target = target.get_parent();
} }
global.display.set_cursor(Meta.Cursor.DND_IN_DRAG); global.screen.set_cursor(Meta.Cursor.DND_IN_DRAG);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}, },
@@ -509,7 +509,7 @@ var _Draggable = new Lang.Class({
} }
this._dragInProgress = false; this._dragInProgress = false;
global.display.set_cursor(Meta.Cursor.DEFAULT); global.screen.set_cursor(Meta.Cursor.DEFAULT);
this.emit('drag-end', event.get_time(), true); this.emit('drag-end', event.get_time(), true);
this._dragComplete(); this._dragComplete();
return true; return true;
@@ -561,7 +561,7 @@ var _Draggable = new Lang.Class({
let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation(); let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation();
if (this._actorDestroyed) { if (this._actorDestroyed) {
global.display.set_cursor(Meta.Cursor.DEFAULT); global.screen.set_cursor(Meta.Cursor.DEFAULT);
if (!this._buttonDown) if (!this._buttonDown)
this._dragComplete(); this._dragComplete();
this.emit('drag-end', eventTime, false); this.emit('drag-end', eventTime, false);
@@ -620,7 +620,7 @@ var _Draggable = new Lang.Class({
if (!this._buttonDown) if (!this._buttonDown)
this._dragComplete(); this._dragComplete();
global.display.set_cursor(Meta.Cursor.DEFAULT); global.screen.set_cursor(Meta.Cursor.DEFAULT);
}, },
_onAnimationComplete(dragActor, eventTime) { _onAnimationComplete(dragActor, eventTime) {

View File

@@ -27,9 +27,9 @@ var EdgeDragAction = new Lang.Class({
_getMonitorRect(x, y) { _getMonitorRect(x, y) {
let rect = new Meta.Rectangle({ x: x - 1, y: y - 1, width: 1, height: 1 }); let rect = new Meta.Rectangle({ x: x - 1, y: y - 1, width: 1, height: 1 });
let monitorIndex = global.display.get_monitor_index_for_rect(rect); let monitorIndex = global.screen.get_monitor_index_for_rect(rect);
return global.display.get_monitor_geometry(monitorIndex); return global.screen.get_monitor_geometry(monitorIndex);
}, },
vfunc_gesture_prepare(action, actor) { vfunc_gesture_prepare(action, actor) {

View File

@@ -166,7 +166,7 @@ var CandidatePopup = new Lang.Class({
this._panelService.cursor_down(); this._panelService.cursor_down();
}); });
this._candidateArea.connect('candidate-clicked', (area, index, button, state) => { this._candidateArea.connect('candidate-clicked', () => {
this._panelService.candidate_clicked(index, button, state); this._panelService.candidate_clicked(index, button, state);
}); });

View File

@@ -1,6 +1,5 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const FocusCaretTracker = imports.ui.focusCaretTracker;
const Atspi = imports.gi.Atspi; const Atspi = imports.gi.Atspi;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk; const Gdk = imports.gi.Gdk;
@@ -13,6 +12,7 @@ const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
const InputSourceManager = imports.ui.status.keyboard; const InputSourceManager = imports.ui.status.keyboard;
const IBusManager = imports.misc.ibusManager;
const BoxPointer = imports.ui.boxpointer; const BoxPointer = imports.ui.boxpointer;
const Layout = imports.ui.layout; const Layout = imports.ui.layout;
const Main = imports.ui.main; const Main = imports.ui.main;
@@ -261,6 +261,7 @@ var Key = new Lang.Class({
this._extended_keyboard = null; this._extended_keyboard = null;
this._pressTimeoutId = 0; this._pressTimeoutId = 0;
this._capturedPress = false; this._capturedPress = false;
this._capturedEventId = 0; this._capturedEventId = 0;
this._unmapId = 0; this._unmapId = 0;
this._longPress = false; this._longPress = false;
@@ -484,6 +485,71 @@ var KeyboardModel = new Lang.Class({
} }
}); });
var FocusTracker = new Lang.Class({
Name: 'FocusTracker',
_init() {
this._currentWindow = null;
this._currentWindowPositionId = 0;
global.screen.get_display().connect('notify::focus-window', () => {
this._setCurrentWindow(global.screen.get_display().focus_window);
this.emit('window-changed', this._currentWindow);
});
/* Valid for wayland clients */
Main.inputMethod.connect('cursor-location-changed', (o, rect) => {
let newRect = { x: rect.get_x(), y: rect.get_y(), width: rect.get_width(), height: rect.get_height() };
this._setCurrentRect(newRect);
});
this._ibusManager = IBusManager.getIBusManager();
this._ibusManager.connect('set-cursor-location', (manager, rect) => {
/* Valid for X11 clients only */
if (Main.inputMethod.currentFocus)
return;
this._setCurrentRect(rect);
});
},
get currentWindow() {
return this._currentWindow;
},
_setCurrentWindow(window) {
if (this._currentWindow)
this._currentWindow.disconnect(this._currentWindowPositionId);
this._currentWindow = window;
if (window) {
this._currentWindowPositionId = this._currentWindow.connect('position-changed', () => {
if (global.display.get_grab_op() == Meta.GrabOp.NONE)
this.emit('position-changed');
else
this.emit('reset');
});
}
},
_setCurrentRect(rect) {
let frameRect = this._currentWindow.get_frame_rect();
rect.x -= frameRect.x;
rect.y -= frameRect.y;
this._rect = rect;
this.emit('position-changed');
},
getCurrentRect() {
let frameRect = this._currentWindow.get_frame_rect();
let rect = { x: this._rect.x + frameRect.x, y: this._rect.y + frameRect.y, width: this._rect.width, height: this._rect.height };
return rect;
}
});
Signals.addSignalMethods(FocusTracker.prototype);
var Keyboard = new Lang.Class({ var Keyboard = new Lang.Class({
Name: 'Keyboard', Name: 'Keyboard',
@@ -491,15 +557,10 @@ var Keyboard = new Lang.Class({
this.actor = null; this.actor = null;
this._focusInExtendedKeys = false; this._focusInExtendedKeys = false;
this._focusCaretTracker = new FocusCaretTracker.FocusCaretTracker();
this._focusCaretTracker.connect('focus-changed', this._onFocusChanged.bind(this));
this._focusCaretTracker.connect('caret-moved', this._onCaretMoved.bind(this));
this._languagePopup = null; this._languagePopup = null;
this._currentAccessible = null;
this._caretTrackingEnabled = false;
this._updateCaretPositionId = 0;
this._currentFocusWindow = null; this._currentFocusWindow = null;
this._originalWindowY = null; this._animFocusedWindow = null;
this._delayedAnimFocusWindow = null;
this._enableKeyboard = false; // a11y settings value this._enableKeyboard = false; // a11y settings value
this._enabled = false; // enabled state (by setting or device type) this._enabled = false; // enabled state (by setting or device type)
@@ -510,6 +571,14 @@ var Keyboard = new Lang.Class({
this._lastDeviceId = null; this._lastDeviceId = null;
this._suggestions = null; this._suggestions = null;
this._focusTracker = new FocusTracker();
this._focusTracker.connect('position-changed', this._onFocusPositionChanged.bind(this));
this._focusTracker.connect('reset', () => {
this._delayedAnimFocusWindow = null;
this._animFocusedWindow = null;
this._oskFocusWindow = null;
});
Meta.get_backend().connect('last-device-changed', Meta.get_backend().connect('last-device-changed',
(backend, deviceId) => { (backend, deviceId) => {
let manager = Clutter.DeviceManager.get_default(); let manager = Clutter.DeviceManager.get_default();
@@ -532,102 +601,15 @@ var Keyboard = new Lang.Class({
this._keyboardRestingId = 0; this._keyboardRestingId = 0;
Main.layoutManager.connect('monitors-changed', this._relayout.bind(this)); Main.layoutManager.connect('monitors-changed', this._relayout.bind(this));
//Main.inputMethod.connect('cursor-location-changed', (o, rect) => {
// if (this._keyboardVisible) {
// let currentWindow = global.display.focus_window;
// this.setCursorLocation(currentWindow, rect.get_x(), rect.get_y(),
// rect.get_width(), rect.get_height());
// }
//});
}, },
get visible() { get visible() {
return this._keyboardVisible; return this._keyboardVisible;
}, },
_setCaretTrackerEnabled(enabled) { _onFocusPositionChanged(focusTracker) {
if (this._caretTrackingEnabled == enabled) let rect = focusTracker.getCurrentRect();
return; this.setCursorLocation(focusTracker.currentWindow, rect.x, rect.y, rect.width, rect.height);
this._caretTrackingEnabled = enabled;
if (enabled) {
this._focusCaretTracker.registerFocusListener();
this._focusCaretTracker.registerCaretListener();
} else {
this._focusCaretTracker.deregisterFocusListener();
this._focusCaretTracker.deregisterCaretListener();
}
},
_updateCaretPosition(accessible) {
if (this._updateCaretPositionId)
GLib.source_remove(this._updateCaretPositionId);
if (!this._keyboardRequested)
return;
this._updateCaretPositionId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, () => {
this._updateCaretPositionId = 0;
let currentWindow = global.display.focus_window;
if (!currentWindow) {
this.setCursorLocation(null);
return GLib.SOURCE_REMOVE;
}
let windowRect = currentWindow.get_frame_rect();
let text = accessible.get_text_iface();
let component = accessible.get_component_iface();
try {
let caretOffset = text.get_caret_offset();
let caretRect = text.get_character_extents(caretOffset, Atspi.CoordType.WINDOW);
let focusRect = component.get_extents(Atspi.CoordType.WINDOW);
if (caretRect.width == 0 && caretRect.height == 0)
caretRect = focusRect;
this.setCursorLocation(currentWindow, caretRect.x, caretRect.y, caretRect.width, caretRect.height);
} catch (e) {
log('Error updating caret position for OSK: ' + e.message);
}
return GLib.SOURCE_REMOVE;
});
GLib.Source.set_name_by_id(this._updateCaretPositionId, '[gnome-shell] this._updateCaretPosition');
},
_focusIsTextEntry(accessible) {
try {
let role = accessible.get_role();
let stateSet = accessible.get_state_set();
return stateSet.contains(Atspi.StateType.EDITABLE) || role == Atspi.Role.TERMINAL;
} catch (e) {
log('Error determining accessible role: ' + e.message);
return false;
}
},
_onFocusChanged(caretTracker, event) {
let accessible = event.source;
if (!this._focusIsTextEntry(accessible))
return;
let focused = event.detail1 != 0;
if (focused) {
this._currentAccessible = accessible;
this._updateCaretPosition(accessible);
this.show(Main.layoutManager.focusIndex);
} else if (this._currentAccessible == accessible) {
this._currentAccessible = null;
this.hide();
}
},
_onCaretMoved(caretTracker, event) {
let accessible = event.source;
if (this._currentAccessible == accessible)
this._updateCaretPosition(accessible);
}, },
_lastDeviceIsTouchscreen() { _lastDeviceIsTouchscreen() {
@@ -650,8 +632,6 @@ var Keyboard = new Lang.Class({
if (!this._enabled && !this._keyboardController) if (!this._enabled && !this._keyboardController)
return; return;
this._setCaretTrackerEnabled(this._enabled);
if (this._enabled && !this._keyboardController) if (this._enabled && !this._keyboardController)
this._setupKeyboard(); this._setupKeyboard();
else if (!this._enabled) else if (!this._enabled)
@@ -936,11 +916,9 @@ var Keyboard = new Lang.Class({
}, },
_relayout() { _relayout() {
let monitor = Main.layoutManager.keyboardMonitor; if (this.actor == null)
if (this.actor == null || monitor == null)
return; return;
let monitor = Main.layoutManager.keyboardMonitor;
let maxHeight = monitor.height / 3; let maxHeight = monitor.height / 3;
this.actor.width = monitor.width; this.actor.width = monitor.width;
this.actor.height = maxHeight; this.actor.height = maxHeight;
@@ -1029,11 +1007,14 @@ var Keyboard = new Lang.Class({
if (!this._keyboardRequested) if (!this._keyboardRequested)
return; return;
if (this._currentAccessible)
this._updateCaretPosition(this._currentAccessible);
Main.layoutManager.keyboardIndex = monitor; Main.layoutManager.keyboardIndex = monitor;
this._relayout(); this._relayout();
Main.layoutManager.showKeyboard(); Main.layoutManager.showKeyboard();
if (this._delayedAnimFocusWindow) {
this._setAnimationWindow(this._delayedAnimFocusWindow);
this._delayedAnimFocusWindow = null;
}
}, },
hide() { hide() {
@@ -1104,8 +1085,9 @@ var Keyboard = new Lang.Class({
window.move_frame(true, frameRect.x, frameRect.y); window.move_frame(true, frameRect.x, frameRect.y);
}, },
_animateWindow(window, show, deltaY) { _animateWindow(window, show) {
let windowActor = window.get_compositor_private(); let windowActor = window.get_compositor_private();
let deltaY = Main.layoutManager.keyboardBox.height;
if (!windowActor) if (!windowActor)
return; return;
@@ -1126,35 +1108,39 @@ var Keyboard = new Lang.Class({
} }
}, },
setCursorLocation(window, x, y , w, h) { _setAnimationWindow(window) {
if (window == this._oskFocusWindow) if (this._animFocusedWindow == window)
return; return;
if (this._oskFocusWindow) { if (this._animFocusedWindow)
let display = global.display; this._animateWindow(this._animFocusedWindow, false);
if (window)
this._animateWindow(window, true);
if (display.get_grab_op() == Meta.GrabOp.NONE || this._animFocusedWindow = window;
display.get_focus_window() != this._oskFocusWindow) },
this._animateWindow(this._oskFocusWindow, false, this._oskFocusWindowDelta);
this._oskFocusWindow = null; setCursorLocation(window, x, y , w, h) {
this._oskFocusWindowDelta = null; let monitor = Main.layoutManager.keyboardMonitor;
}
if (window) { if (window && monitor) {
let monitor = Main.layoutManager.keyboardMonitor;
let keyboardHeight = Main.layoutManager.keyboardBox.height; let keyboardHeight = Main.layoutManager.keyboardBox.height;
let frameRect = window.get_frame_rect(); let focusObscured = false;
let windowActor = window.get_compositor_private();
let delta = 0;
if (monitor && frameRect.y + y + h >= monitor.height - keyboardHeight) if (y + h >= monitor.y + monitor.height - keyboardHeight) {
delta = keyboardHeight; if (this._keyboardVisible)
this._setAnimationWindow(window);
this._animateWindow(window, true, delta); else
this._oskFocusWindow = window; this._delayedAnimFocusWindow = window;
this._oskFocusWindowDelta = delta; } else if (y < keyboardHeight) {
this._delayedAnimFocusWindow = null;
this._setAnimationWindow(null);
}
} else {
this._setAnimationWindow(null);
} }
this._oskFocusWindow = window;
}, },
}); });

View File

@@ -109,7 +109,7 @@ var MonitorConstraint = new Lang.Class({
if (!this._workareasChangedId) { if (!this._workareasChangedId) {
this._workareasChangedId = this._workareasChangedId =
global.display.connect('workareas-changed', () => { global.screen.connect('workareas-changed', () => {
if (this._workArea) if (this._workArea)
this.actor.queue_relayout(); this.actor.queue_relayout();
}); });
@@ -120,7 +120,7 @@ var MonitorConstraint = new Lang.Class({
this._monitorsChangedId = 0; this._monitorsChangedId = 0;
if (this._workareasChangedId) if (this._workareasChangedId)
global.display.disconnect(this._workareasChangedId); global.screen.disconnect(this._workareasChangedId);
this._workareasChangedId = 0; this._workareasChangedId = 0;
} }
@@ -142,8 +142,7 @@ var MonitorConstraint = new Lang.Class({
let rect; let rect;
if (this._workArea) { if (this._workArea) {
let workspaceManager = global.workspace_manager; let ws = global.screen.get_workspace_by_index(0);
let ws = workspaceManager.get_workspace_by_index(0);
rect = ws.get_work_area_for_monitor(index); rect = ws.get_work_area_for_monitor(index);
} else { } else {
rect = Main.layoutManager.monitors[index]; rect = Main.layoutManager.monitors[index];
@@ -165,7 +164,7 @@ var Monitor = new Lang.Class({
}, },
get inFullscreen() { get inFullscreen() {
return global.display.get_monitor_in_fullscreen(this.index); return global.screen.get_monitor_in_fullscreen(this.index);
} }
}) })
@@ -260,7 +259,7 @@ var LayoutManager = new Lang.Class({
global.stage.remove_actor(global.top_window_group); global.stage.remove_actor(global.top_window_group);
this.uiGroup.add_actor(global.top_window_group); this.uiGroup.add_actor(global.top_window_group);
let feedbackGroup = Meta.get_feedback_group_for_display(global.display); let feedbackGroup = Meta.get_feedback_group_for_screen(global.screen);
global.stage.remove_actor(feedbackGroup); global.stage.remove_actor(feedbackGroup);
this.uiGroup.add_actor(feedbackGroup); this.uiGroup.add_actor(feedbackGroup);
@@ -270,19 +269,14 @@ var LayoutManager = new Lang.Class({
this._bgManagers = []; this._bgManagers = [];
// Need to update struts on new workspaces when they are added // Need to update struts on new workspaces when they are added
let workspaceManager = global.workspace_manager; global.screen.connect('notify::n-workspaces',
workspaceManager.connect('notify::n-workspaces', this._queueUpdateRegions.bind(this));
this._queueUpdateRegions.bind(this)); global.screen.connect('restacked',
this._windowsRestacked.bind(this));
let display = global.display; global.screen.connect('monitors-changed',
display.connect('restacked', this._monitorsChanged.bind(this));
this._windowsRestacked.bind(this)); global.screen.connect('in-fullscreen-changed',
display.connect('in-fullscreen-changed', this._updateFullscreen.bind(this));
this._updateFullscreen.bind(this));
let monitorManager = Meta.MonitorManager.get();
monitorManager.connect('monitors-changed',
this._monitorsChanged.bind(this));
this._monitorsChanged(); this._monitorsChanged();
// NVIDIA drivers don't preserve FBO contents across // NVIDIA drivers don't preserve FBO contents across
@@ -325,12 +319,12 @@ var LayoutManager = new Lang.Class({
}, },
_updateMonitors() { _updateMonitors() {
let display = global.display; let screen = global.screen;
this.monitors = []; this.monitors = [];
let nMonitors = display.get_n_monitors(); let nMonitors = screen.get_n_monitors();
for (let i = 0; i < nMonitors; i++) for (let i = 0; i < nMonitors; i++)
this.monitors.push(new Monitor(i, display.get_monitor_geometry(i))); this.monitors.push(new Monitor(i, screen.get_monitor_geometry(i)));
if (nMonitors == 0) { if (nMonitors == 0) {
this.primaryIndex = this.bottomIndex = -1; this.primaryIndex = this.bottomIndex = -1;
@@ -339,7 +333,7 @@ var LayoutManager = new Lang.Class({
} else { } else {
// If there are monitors below the primary, then we need // If there are monitors below the primary, then we need
// to split primary from bottom. // to split primary from bottom.
this.primaryIndex = this.bottomIndex = display.get_primary_monitor(); this.primaryIndex = this.bottomIndex = screen.get_primary_monitor();
for (let i = 0; i < this.monitors.length; i++) { for (let i = 0; i < this.monitors.length; i++) {
let monitor = this.monitors[i]; let monitor = this.monitors[i];
if (this._isAboveOrBelowPrimary(monitor)) { if (this._isAboveOrBelowPrimary(monitor)) {
@@ -544,7 +538,7 @@ var LayoutManager = new Lang.Class({
}, },
get currentMonitor() { get currentMonitor() {
let index = global.display.get_current_monitor(); let index = global.screen.get_current_monitor();
return this.monitors[index]; return this.monitors[index];
}, },
@@ -563,8 +557,6 @@ var LayoutManager = new Lang.Class({
}, },
get focusMonitor() { get focusMonitor() {
if (this.focusIndex < 0)
return null;
return this.monitors[this.focusIndex]; return this.monitors[this.focusIndex];
}, },
@@ -917,8 +909,7 @@ var LayoutManager = new Lang.Class({
getWorkAreaForMonitor(monitorIndex) { getWorkAreaForMonitor(monitorIndex) {
// Assume that all workspaces will have the same // Assume that all workspaces will have the same
// struts and pick the first one. // struts and pick the first one.
let workspaceManager = global.workspace_manager; let ws = global.screen.get_workspace_by_index(0);
let ws = workspaceManager.get_workspace_by_index(0);
return ws.get_work_area_for_monitor(monitorIndex); return ws.get_work_area_for_monitor(monitorIndex);
}, },
@@ -928,7 +919,7 @@ var LayoutManager = new Lang.Class({
let [x, y] = actor.get_transformed_position(); let [x, y] = actor.get_transformed_position();
let [w, h] = actor.get_transformed_size(); let [w, h] = actor.get_transformed_size();
let rect = new Meta.Rectangle({ x: x, y: y, width: w, height: h }); let rect = new Meta.Rectangle({ x: x, y: y, width: w, height: h });
return global.display.get_monitor_index_for_rect(rect); return global.screen.get_monitor_index_for_rect(rect);
}, },
findMonitorForActor(actor) { findMonitorForActor(actor) {
@@ -1061,9 +1052,9 @@ var LayoutManager = new Lang.Class({
global.set_stage_input_region(rects); global.set_stage_input_region(rects);
this._isPopupWindowVisible = isPopupMenuVisible; this._isPopupWindowVisible = isPopupMenuVisible;
let workspaceManager = global.workspace_manager; let screen = global.screen;
for (let w = 0; w < workspaceManager.n_workspaces; w++) { for (let w = 0; w < screen.n_workspaces; w++) {
let workspace = workspaceManager.get_workspace_by_index(w); let workspace = screen.get_workspace_by_index(w);
workspace.set_builtin_struts(struts); workspace.set_builtin_struts(struts);
} }

View File

@@ -61,7 +61,7 @@ var Magnifier = new Lang.Class({
this._zoomRegions = []; this._zoomRegions = [];
// Create small clutter tree for the magnified mouse. // Create small clutter tree for the magnified mouse.
let cursorTracker = Meta.CursorTracker.get_for_display(global.display); let cursorTracker = Meta.CursorTracker.get_for_screen(global.screen);
this._mouseSprite = new Clutter.Texture(); this._mouseSprite = new Clutter.Texture();
Shell.util_cursor_tracker_to_clutter(cursorTracker, this._mouseSprite); Shell.util_cursor_tracker_to_clutter(cursorTracker, this._mouseSprite);
this._cursorRoot = new Clutter.Actor(); this._cursorRoot = new Clutter.Actor();
@@ -116,10 +116,10 @@ var Magnifier = new Lang.Class({
if (isActive != activate) { if (isActive != activate) {
if (activate) { if (activate) {
Meta.disable_unredirect_for_display(global.display); Meta.disable_unredirect_for_screen(global.screen);
this.startTrackingMouse(); this.startTrackingMouse();
} else { } else {
Meta.enable_unredirect_for_display(global.display); Meta.enable_unredirect_for_screen(global.screen);
this.stopTrackingMouse(); this.stopTrackingMouse();
} }
} }

View File

@@ -207,7 +207,13 @@ function _initializeUI() {
return true; return true;
}); });
global.display.connect('gl-video-memory-purged', loadTheme); global.display.connect('gl-video-memory-purged', () => {
let cache = St.TextureCache.get_default();
cache.clear();
loadTheme();
});
// Provide the bus object for gnome-session to // Provide the bus object for gnome-session to
// initiate logouts. // initiate logouts.
@@ -429,7 +435,7 @@ function pushModal(actor, params) {
log('pushModal: invocation of begin_modal failed'); log('pushModal: invocation of begin_modal failed');
return false; return false;
} }
Meta.disable_unredirect_for_display(global.display); Meta.disable_unredirect_for_screen(global.screen);
} }
modalCount += 1; modalCount += 1;
@@ -528,7 +534,7 @@ function popModal(actor, timestamp) {
layoutManager.modalEnded(); layoutManager.modalEnded();
global.end_modal(timestamp); global.end_modal(timestamp);
Meta.enable_unredirect_for_display(global.display); Meta.enable_unredirect_for_screen(global.screen);
actionMode = Shell.ActionMode.NORMAL; actionMode = Shell.ActionMode.NORMAL;
} }
@@ -556,15 +562,14 @@ function openRunDialog() {
* and switching out of the overview if it's currently active * and switching out of the overview if it's currently active
*/ */
function activateWindow(window, time, workspaceNum) { function activateWindow(window, time, workspaceNum) {
let workspaceManager = global.workspace_manager; let activeWorkspaceNum = global.screen.get_active_workspace_index();
let activeWorkspaceNum = workspaceManager.get_active_workspace_index();
let windowWorkspaceNum = (workspaceNum !== undefined) ? workspaceNum : window.get_workspace().index(); let windowWorkspaceNum = (workspaceNum !== undefined) ? workspaceNum : window.get_workspace().index();
if (!time) if (!time)
time = global.get_current_time(); time = global.get_current_time();
if (windowWorkspaceNum != activeWorkspaceNum) { if (windowWorkspaceNum != activeWorkspaceNum) {
let workspace = workspaceManager.get_workspace_by_index(windowWorkspaceNum); let workspace = global.screen.get_workspace_by_index(windowWorkspaceNum);
workspace.activate_with_focus(window, time); workspace.activate_with_focus(window, time);
} else { } else {
window.activate(time); window.activate(time);

View File

@@ -27,7 +27,6 @@ function _fixMarkup(text, allowMarkup) {
// Support <b>, <i>, and <u>, escape anything else // Support <b>, <i>, and <u>, escape anything else
// so it displays as raw markup. // so it displays as raw markup.
// Ref: https://developer.gnome.org/notification-spec/#markup
_text = _text.replace(/<(?!\/?[biu]>)/g, '&lt;'); _text = _text.replace(/<(?!\/?[biu]>)/g, '&lt;');
try { try {
@@ -96,10 +95,10 @@ var URLHighlighter = new Lang.Class({
let urlId = this._findUrlAtPos(event); let urlId = this._findUrlAtPos(event);
if (urlId != -1 && !this._cursorChanged) { if (urlId != -1 && !this._cursorChanged) {
global.display.set_cursor(Meta.Cursor.POINTING_HAND); global.screen.set_cursor(Meta.Cursor.POINTING_HAND);
this._cursorChanged = true; this._cursorChanged = true;
} else if (urlId == -1) { } else if (urlId == -1) {
global.display.set_cursor(Meta.Cursor.DEFAULT); global.screen.set_cursor(Meta.Cursor.DEFAULT);
this._cursorChanged = false; this._cursorChanged = false;
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
@@ -110,7 +109,7 @@ var URLHighlighter = new Lang.Class({
if (this._cursorChanged) { if (this._cursorChanged) {
this._cursorChanged = false; this._cursorChanged = false;
global.display.set_cursor(Meta.Cursor.DEFAULT); global.screen.set_cursor(Meta.Cursor.DEFAULT);
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}); });

View File

@@ -315,10 +315,10 @@ var NotificationApplicationPolicy = new Lang.Class({
// You can add a secondary icon to the banner with 'secondaryGIcon'. There // You can add a secondary icon to the banner with 'secondaryGIcon'. There
// is no fallback for this icon. // is no fallback for this icon.
// //
// If @params contains 'bannerMarkup', with the value %true, a subset (<b>, // If @params contains 'bannerMarkup', with the value %true, then
// <i> and <u>) of the markup in [1] will be interpreted within @banner. If // the corresponding element is assumed to use pango markup. If the
// the parameter is not present, then anything that looks like markup // parameter is not present for an element, then anything that looks
// in @banner will appear literally in the output. // like markup in that element will appear literally in the output.
// //
// If @params contains a 'clear' parameter with the value %true, then // If @params contains a 'clear' parameter with the value %true, then
// the content and the action area of the notification will be cleared. // the content and the action area of the notification will be cleared.
@@ -328,8 +328,6 @@ var NotificationApplicationPolicy = new Lang.Class({
// If @params contains 'soundName' or 'soundFile', the corresponding // If @params contains 'soundName' or 'soundFile', the corresponding
// event sound is played when the notification is shown (if the policy for // event sound is played when the notification is shown (if the policy for
// @source allows playing sounds). // @source allows playing sounds).
//
// [1] https://developer.gnome.org/notification-spec/#markup
var Notification = new Lang.Class({ var Notification = new Lang.Class({
Name: 'Notification', Name: 'Notification',
@@ -917,7 +915,7 @@ var MessageTray = new Lang.Class({
Main.layoutManager.addChrome(this.actor, { affectsInputRegion: false }); Main.layoutManager.addChrome(this.actor, { affectsInputRegion: false });
Main.layoutManager.trackChrome(this._bannerBin, { affectsInputRegion: true }); Main.layoutManager.trackChrome(this._bannerBin, { affectsInputRegion: true });
global.display.connect('in-fullscreen-changed', this._updateState.bind(this)); global.screen.connect('in-fullscreen-changed', this._updateState.bind(this));
Main.sessionMode.connect('updated', this._sessionUpdated.bind(this)); Main.sessionMode.connect('updated', this._sessionUpdated.bind(this));

View File

@@ -116,7 +116,7 @@ var ModalDialog = new Lang.Class({
if (onPrimary) if (onPrimary)
this._monitorConstraint.primary = true; this._monitorConstraint.primary = true;
else else
this._monitorConstraint.index = global.display.get_current_monitor(); this._monitorConstraint.index = global.screen.get_current_monitor();
this.state = State.OPENING; this.state = State.OPENING;

View File

@@ -32,7 +32,7 @@ var OsdMonitorLabel = new Lang.Class({
Main.uiGroup.set_child_above_sibling(this._actor, null); Main.uiGroup.set_child_above_sibling(this._actor, null);
this._position(); this._position();
Meta.disable_unredirect_for_display(global.display); Meta.disable_unredirect_for_screen(global.screen);
}, },
_position() { _position() {
@@ -48,7 +48,7 @@ var OsdMonitorLabel = new Lang.Class({
destroy() { destroy() {
this._actor.destroy(); this._actor.destroy();
Meta.enable_unredirect_for_display(global.display); Meta.enable_unredirect_for_screen(global.screen);
} }
}); });

View File

@@ -145,7 +145,7 @@ var OsdWindow = new Lang.Class({
return; return;
if (!this.actor.visible) { if (!this.actor.visible) {
Meta.disable_unredirect_for_display(global.display); Meta.disable_unredirect_for_screen(global.screen);
this.actor.show(); this.actor.show();
this.actor.opacity = 0; this.actor.opacity = 0;
this.actor.get_parent().set_child_above_sibling(this.actor, null); this.actor.get_parent().set_child_above_sibling(this.actor, null);
@@ -179,7 +179,7 @@ var OsdWindow = new Lang.Class({
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: () => { onComplete: () => {
this._reset(); this._reset();
Meta.enable_unredirect_for_display(global.display); Meta.enable_unredirect_for_screen(global.screen);
} }
}); });
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;

View File

@@ -157,7 +157,7 @@ var Overview = new Lang.Class({
Main.xdndHandler.connect('drag-begin', this._onDragBegin.bind(this)); Main.xdndHandler.connect('drag-begin', this._onDragBegin.bind(this));
Main.xdndHandler.connect('drag-end', this._onDragEnd.bind(this)); Main.xdndHandler.connect('drag-end', this._onDragEnd.bind(this));
global.display.connect('restacked', this._onRestacked.bind(this)); global.screen.connect('restacked', this._onRestacked.bind(this));
this._windowSwitchTimeoutId = 0; this._windowSwitchTimeoutId = 0;
this._windowSwitchTimestamp = 0; this._windowSwitchTimestamp = 0;
@@ -286,8 +286,7 @@ var Overview = new Lang.Class({
DND.addDragMonitor(this._dragMonitor); DND.addDragMonitor(this._dragMonitor);
// Remember the workspace we started from // Remember the workspace we started from
let workspaceManager = global.workspace_manager; this._lastActiveWorkspaceIndex = global.screen.get_active_workspace_index();
this._lastActiveWorkspaceIndex = workspaceManager.get_active_workspace_index();
}, },
_onDragEnd(time) { _onDragEnd(time) {
@@ -297,8 +296,7 @@ var Overview = new Lang.Class({
// we have to go back to where we started and hide // we have to go back to where we started and hide
// the overview // the overview
if (this._shown) { if (this._shown) {
let workspaceManager = global.workspace_manager; global.screen.get_workspace_by_index(this._lastActiveWorkspaceIndex).activate(time);
workspaceManager.get_workspace_by_index(this._lastActiveWorkspaceIndex).activate(time);
this.hide(); this.hide();
} }
this._resetWindowSwitchTimeout(); this._resetWindowSwitchTimeout();
@@ -319,9 +317,9 @@ var Overview = new Lang.Class({
let display = Gdk.Display.get_default(); let display = Gdk.Display.get_default();
let deviceManager = display.get_device_manager(); let deviceManager = display.get_device_manager();
let pointer = deviceManager.get_client_pointer(); let pointer = deviceManager.get_client_pointer();
let [gdkScreen, pointerX, pointerY] = pointer.get_position(); let [screen, pointerX, pointerY] = pointer.get_position();
pointer.warp(gdkScreen, pointerX, pointerY); pointer.warp(screen, pointerX, pointerY);
}, },
_onDragMotion(dragEvent) { _onDragMotion(dragEvent) {
@@ -552,7 +550,7 @@ var Overview = new Lang.Class({
this.visibleTarget = true; this.visibleTarget = true;
this._activationTime = GLib.get_monotonic_time() / GLib.USEC_PER_SEC; this._activationTime = GLib.get_monotonic_time() / GLib.USEC_PER_SEC;
Meta.disable_unredirect_for_display(global.display); Meta.disable_unredirect_for_screen(global.screen);
this.viewSelector.show(); this.viewSelector.show();
this._overview.opacity = 0; this._overview.opacity = 0;
@@ -637,7 +635,7 @@ var Overview = new Lang.Class({
_hideDone() { _hideDone() {
// Re-enable unredirection // Re-enable unredirection
Meta.enable_unredirect_for_display(global.display); Meta.enable_unredirect_for_screen(global.screen);
this.viewSelector.hide(); this.viewSelector.hide();
this._desktopFade.hide(); this._desktopFade.hide();

View File

@@ -265,8 +265,7 @@ var AppMenuButton = new Lang.Class({
}, },
_findTargetApp() { _findTargetApp() {
let workspaceManager = global.workspace_manager; let workspace = global.screen.get_active_workspace();
let workspace = workspaceManager.get_active_workspace();
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
let focusedApp = tracker.focus_app; let focusedApp = tracker.focus_app;
if (focusedApp && focusedApp.is_on_workspace(workspace)) if (focusedApp && focusedApp.is_on_workspace(workspace))
@@ -710,6 +709,7 @@ var AggregateMenu = new Lang.Class({
this._bluetooth = null; this._bluetooth = null;
} }
this._remoteAccess = new imports.ui.status.remoteAccess.RemoteAccessApplet();
this._power = new imports.ui.status.power.Indicator(); this._power = new imports.ui.status.power.Indicator();
this._rfkill = new imports.ui.status.rfkill.Indicator(); this._rfkill = new imports.ui.status.rfkill.Indicator();
this._volume = new imports.ui.status.volume.Indicator(); this._volume = new imports.ui.status.volume.Indicator();
@@ -730,6 +730,7 @@ var AggregateMenu = new Lang.Class({
if (this._bluetooth) { if (this._bluetooth) {
this._indicators.add_child(this._bluetooth.indicators); this._indicators.add_child(this._bluetooth.indicators);
} }
this._indicators.add_child(this._remoteAccess.indicators);
this._indicators.add_child(this._rfkill.indicators); this._indicators.add_child(this._rfkill.indicators);
this._indicators.add_child(this._volume.indicators); this._indicators.add_child(this._volume.indicators);
this._indicators.add_child(this._power.indicators); this._indicators.add_child(this._power.indicators);
@@ -744,6 +745,7 @@ var AggregateMenu = new Lang.Class({
if (this._bluetooth) { if (this._bluetooth) {
this.menu.addMenuItem(this._bluetooth.menu); this.menu.addMenuItem(this._bluetooth.menu);
} }
this.menu.addMenuItem(this._remoteAccess.menu);
this.menu.addMenuItem(this._location.menu); this.menu.addMenuItem(this._location.menu);
this.menu.addMenuItem(this._rfkill.menu); this.menu.addMenuItem(this._rfkill.menu);
this.menu.addMenuItem(this._power.menu); this.menu.addMenuItem(this._power.menu);
@@ -819,7 +821,7 @@ var Panel = new Lang.Class({
global.window_group.connect('actor-removed', this._onWindowActorRemoved.bind(this)); global.window_group.connect('actor-removed', this._onWindowActorRemoved.bind(this));
global.window_manager.connect('switch-workspace', this._updateSolidStyle.bind(this)); global.window_manager.connect('switch-workspace', this._updateSolidStyle.bind(this));
global.display.connect('workareas-changed', () => { this.actor.queue_relayout(); }); global.screen.connect('workareas-changed', () => { this.actor.queue_relayout(); });
this._updatePanel(); this._updatePanel();
}, },
@@ -962,7 +964,8 @@ var Panel = new Lang.Class({
if (!allowDrag) if (!allowDrag)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
global.display.begin_grab_op(dragWindow, global.display.begin_grab_op(global.screen,
dragWindow,
Meta.GrabOp.MOVING, Meta.GrabOp.MOVING,
false, /* pointer grab */ false, /* pointer grab */
true, /* frame action */ true, /* frame action */
@@ -977,7 +980,7 @@ var Panel = new Lang.Class({
_onKeyPress(actor, event) { _onKeyPress(actor, event) {
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_Escape) { if (symbol == Clutter.KEY_Escape) {
global.display.focus_default_window(event.get_time()); global.screen.focus_default_window(event.get_time());
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
@@ -1075,8 +1078,7 @@ var Panel = new Lang.Class({
return; return;
/* Get all the windows in the active workspace that are in the primary monitor and visible */ /* Get all the windows in the active workspace that are in the primary monitor and visible */
let workspaceManager = global.workspace_manager; let activeWorkspace = global.screen.get_active_workspace();
let activeWorkspace = workspaceManager.get_active_workspace();
let windows = activeWorkspace.list_windows().filter(metaWindow => { let windows = activeWorkspace.list_windows().filter(metaWindow => {
return metaWindow.is_on_primary_monitor() && return metaWindow.is_on_primary_monitor() &&
metaWindow.showing_on_its_workspace() && metaWindow.showing_on_its_workspace() &&

View File

@@ -119,9 +119,6 @@ var RemoteMenuItemMapper = new Lang.Class({
this._trackerItem = trackerItem; this._trackerItem = trackerItem;
this.menuItem = new PopupMenu.PopupBaseMenuItem(); 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._label = new St.Label();
this.menuItem.actor.add_child(this._label); this.menuItem.actor.add_child(this._label);
this.menuItem.actor.label_actor = this._label; this.menuItem.actor.label_actor = this._label;
@@ -132,13 +129,11 @@ var RemoteMenuItemMapper = new Lang.Class({
this._trackerItem.bind_property('visible', this.menuItem.actor, 'visible', GObject.BindingFlags.SYNC_CREATE); this._trackerItem.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::label', this._updateLabel.bind(this));
this._trackerItem.connect('notify::sensitive', this._updateSensitivity.bind(this)); this._trackerItem.connect('notify::sensitive', this._updateSensitivity.bind(this));
this._trackerItem.connect('notify::role', this._updateRole.bind(this)); this._trackerItem.connect('notify::role', this._updateRole.bind(this));
this._trackerItem.connect('notify::toggled', this._updateDecoration.bind(this)); this._trackerItem.connect('notify::toggled', this._updateDecoration.bind(this));
this._updateIcon();
this._updateLabel(); this._updateLabel();
this._updateSensitivity(); this._updateSensitivity();
this._updateRole(); this._updateRole();
@@ -148,11 +143,6 @@ var RemoteMenuItemMapper = new Lang.Class({
}); });
}, },
_updateIcon() {
this._icon.gicon = this._trackerItem.icon;
this._icon.visible = (this._icon.gicon != null);
},
_updateLabel() { _updateLabel() {
this._label.text = stripMnemonics(this._trackerItem.label); this._label.text = stripMnemonics(this._trackerItem.label);
}, },

View File

@@ -570,7 +570,7 @@ var ScreenShield = new Lang.Class({
this._shortLightbox.connect('shown', this._onShortLightboxShown.bind(this)); this._shortLightbox.connect('shown', this._onShortLightboxShown.bind(this));
this.idleMonitor = Meta.IdleMonitor.get_core(); this.idleMonitor = Meta.IdleMonitor.get_core();
this._cursorTracker = Meta.CursorTracker.get_for_display(global.display); this._cursorTracker = Meta.CursorTracker.get_for_screen(global.screen);
this._syncInhibitor(); this._syncInhibitor();
}, },

View File

@@ -56,7 +56,7 @@ var ScreencastService = new Lang.Class({
let recorder = this._recorders.get(sender); let recorder = this._recorders.get(sender);
if (!recorder) { if (!recorder) {
recorder = new Shell.Recorder({ stage: global.stage, recorder = new Shell.Recorder({ stage: global.stage,
display: global.display }); screen: global.screen });
recorder._watchNameId = recorder._watchNameId =
Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null, Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null,
this._onNameVanished.bind(this)); this._onNameVanished.bind(this));

View File

@@ -261,7 +261,7 @@ var SelectArea = new Lang.Class({
onUngrab: this._onUngrab.bind(this) })) onUngrab: this._onUngrab.bind(this) }))
return; return;
global.display.set_cursor(Meta.Cursor.CROSSHAIR); global.screen.set_cursor(Meta.Cursor.CROSSHAIR);
Main.uiGroup.set_child_above_sibling(this._group, null); Main.uiGroup.set_child_above_sibling(this._group, null);
this._group.visible = true; this._group.visible = true;
}, },
@@ -330,7 +330,7 @@ var SelectArea = new Lang.Class({
}, },
_onUngrab() { _onUngrab() {
global.display.set_cursor(Meta.Cursor.DEFAULT); global.screen.set_cursor(Meta.Cursor.DEFAULT);
this.emit('finished', this._result); this.emit('finished', this._result);
GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { GLib.idle_add(GLib.PRIORITY_DEFAULT, () => {

View File

@@ -133,7 +133,7 @@ function _callRemote(obj, method, ...args) {
* because of the normal X asynchronous mapping process, to actually wait * because of the normal X asynchronous mapping process, to actually wait
* until the window has been mapped and exposed, use waitTestWindows(). * until the window has been mapped and exposed, use waitTestWindows().
*/ */
function createTestWindow(params) { function createTestWindow(width, height, params) {
params = Params.parse(params, { width: 640, params = Params.parse(params, { width: 640,
height: 480, height: 480,
alpha: false, alpha: false,

View File

@@ -398,7 +398,7 @@ var InputSourceManager = new Lang.Class({
return true; return true;
}, },
_switchInputSource(display, window, binding) { _switchInputSource(display, screen, window, binding) {
if (this._mruSources.length < 2) if (this._mruSources.length < 2)
return; return;

View File

@@ -995,16 +995,8 @@ var NMWirelessDialog = new Lang.Class({
else if (!oneHasConnection && twoHasConnection) else if (!oneHasConnection && twoHasConnection)
return 1; return 1;
let oneAp = one.accessPoints[0] || null; let oneStrength = one.accessPoints[0].strength;
let twoAp = two.accessPoints[0] || null; let twoStrength = two.accessPoints[0].strength;
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 // place stronger connections first
if (oneStrength != twoStrength) if (oneStrength != twoStrength)
@@ -1164,11 +1156,6 @@ var NMWirelessDialog = new Lang.Class({
Util.ensureActorVisibleInScrollView(this._scrollView, network.item.actor); Util.ensureActorVisibleInScrollView(this._scrollView, network.item.actor);
this._selectNetwork(network); 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();
});
}, },
}); });

View File

@@ -0,0 +1,81 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
var RemoteAccessApplet = new Lang.Class({
Name: 'RemoteAccessApplet',
Extends: PanelMenu.SystemIndicator,
_init() {
this.parent();
let backend = Meta.get_backend();
let controller = backend.get_remote_access_controller();
if (!controller)
return;
// We can't possibly know about all types of screen sharing on X11, so
// showing these controls on X11 might give a false sense of security.
// Thus, only enable these controls when using Wayland, where we are
// in control of sharing.
if (!Meta.is_wayland_compositor())
return;
this._handles = new Set();
this._indicator = null;
this._menuSection = null;
controller.connect('new-handle', (controller, handle) => {
this._onNewHandle(handle);
});
},
_ensureControls() {
if (this._indicator)
return;
this._indicator = this._addIndicator();
this._indicator.icon_name = 'screen-shared-symbolic';
this._indicator.add_style_class_name('remote-access-indicator');
this._item =
new PopupMenu.PopupSubMenuMenuItem(_("Screen is Being Shared"),
true);
this._item.menu.addAction(_("Turn off"),
() => {
for (let handle of this._handles)
handle.stop();
});
this._item.icon.icon_name = 'screen-shared-symbolic';
this.menu.addMenuItem(this._item);
},
_sync() {
if (this._handles.size == 0) {
this._indicator.visible = false;
this._item.actor.visible = false;
} else {
this._indicator.visible = true;
this._item.actor.visible = true;
}
},
_onStopped(handle) {
this._handles.delete(handle);
this._sync();
},
_onNewHandle(handle) {
this._handles.add(handle);
handle.connect('stopped', this._onStopped.bind(this));
if (this._handles.size == 1) {
this._ensureControls();
this._sync();
}
},
});

View File

@@ -49,17 +49,19 @@ const BoltDeviceInterface = '<node> \
</interface> \ </interface> \
</node>'; </node>';
const BoltClientProxy = Gio.DBusProxy.makeProxyWrapper(BoltClientInterface);
const BoltDeviceProxy = Gio.DBusProxy.makeProxyWrapper(BoltDeviceInterface); const BoltDeviceProxy = Gio.DBusProxy.makeProxyWrapper(BoltDeviceInterface);
/* */ /* */
var Status = { var Status = {
DISCONNECTED: 'disconnected', DISCONNECTED: 'disconnected',
CONNECTING: 'connecting',
CONNECTED: 'connected', CONNECTED: 'connected',
AUTHORIZING: 'authorizing', AUTHORIZING: 'authorizing',
AUTH_ERROR: 'auth-error', AUTH_ERROR: 'auth-error',
AUTHORIZED: 'authorized' AUTHORIZED: 'authorized',
AUTHORIZED_SECURE: 'authorized-secure',
AUTHORIZED_NEWKEY: 'authorized-newkey'
}; };
var Policy = { var Policy = {
@@ -68,7 +70,7 @@ var Policy = {
AUTO: 'auto' AUTO: 'auto'
}; };
var AuthCtrl = { var AuthFlags = {
NONE: 'none', NONE: 'none',
}; };
@@ -77,7 +79,6 @@ var AuthMode = {
ENABLED: 'enabled' ENABLED: 'enabled'
}; };
const BOLT_DBUS_CLIENT_IFACE = 'org.freedesktop.bolt1.Manager';
const BOLT_DBUS_NAME = 'org.freedesktop.bolt'; const BOLT_DBUS_NAME = 'org.freedesktop.bolt';
const BOLT_DBUS_PATH = '/org/freedesktop/bolt'; const BOLT_DBUS_PATH = '/org/freedesktop/bolt';
@@ -87,26 +88,22 @@ var Client = new Lang.Class({
_init() { _init() {
this._proxy = null; this._proxy = null;
let nodeInfo = Gio.DBusNodeInfo.new_for_xml(BoltClientInterface); new BoltClientProxy(
Gio.DBusProxy.new(Gio.DBus.system, Gio.DBus.system,
Gio.DBusProxyFlags.DO_NOT_AUTO_START, BOLT_DBUS_NAME,
nodeInfo.lookup_interface(BOLT_DBUS_CLIENT_IFACE), BOLT_DBUS_PATH,
BOLT_DBUS_NAME, this._onProxyReady.bind(this)
BOLT_DBUS_PATH, );
BOLT_DBUS_CLIENT_IFACE,
null,
this._onProxyReady.bind(this));
this.probing = false; this.probing = false;
}, },
_onProxyReady(o, res) { _onProxyReady(proxy, error) {
try { if (error !== null) {
this._proxy = Gio.DBusProxy.new_finish(res); log('error creating bolt proxy: %s'.format(error.message));
} catch(e) { return;
log('error creating bolt proxy: %s'.format(e.message)); }
return; this._proxy = proxy;
}
this._propsChangedId = this._proxy.connect('g-properties-changed', this._onPropertiesChanged.bind(this)); this._propsChangedId = this._proxy.connect('g-properties-changed', this._onPropertiesChanged.bind(this));
this._deviceAddedId = this._proxy.connectSignal('DeviceAdded', this._onDeviceAdded.bind(this)); this._deviceAddedId = this._proxy.connectSignal('DeviceAdded', this._onDeviceAdded.bind(this));
@@ -144,10 +141,9 @@ var Client = new Lang.Class({
}, },
enrollDevice(id, policy, callback) { enrollDevice(id, policy, callback) {
this._proxy.EnrollDeviceRemote(id, policy, AuthCtrl.NONE, this._proxy.EnrollDeviceRemote(id, policy, AuthFlags.NONE,
(res, error) => { (res, error) => {
if (error) { if (error) {
Gio.DBusError.strip_remote_error(error);
callback(null, error); callback(null, error);
return; return;
} }
@@ -232,7 +228,7 @@ var AuthRobot = new Lang.Class({
_onEnrollDone(device, error) { _onEnrollDone(device, error) {
if (error) if (error)
this.emit('enroll-failed', device, error); this.emit('enroll-failed', error, device);
/* TODO: scan the list of devices to be authorized for children /* TODO: scan the list of devices to be authorized for children
* of this device and remove them (and their children and * of this device and remove them (and their children and
@@ -358,7 +354,7 @@ var Indicator = new Lang.Class({
_onEnrollFailed(obj, device, error) { _onEnrollFailed(obj, device, error) {
const title = _('Thunderbolt authorization 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); this._notify(title, body);
} }

View File

@@ -200,18 +200,12 @@ var WorkspaceTracker = new Lang.Class({
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
tracker.connect('startup-sequence-changed', this._queueCheckWorkspaces.bind(this)); tracker.connect('startup-sequence-changed', this._queueCheckWorkspaces.bind(this));
let workspaceManager = global.workspace_manager; global.screen.connect('notify::n-workspaces', this._nWorkspacesChanged.bind(this));
workspaceManager.connect('notify::n-workspaces', global.window_manager.connect('switch-workspace', this._queueCheckWorkspaces.bind(this));
this._nWorkspacesChanged.bind(this));
global.window_manager.connect('switch-workspace',
this._queueCheckWorkspaces.bind(this));
global.display.connect('window-entered-monitor', global.screen.connect('window-entered-monitor', this._windowEnteredMonitor.bind(this));
this._windowEnteredMonitor.bind(this)); global.screen.connect('window-left-monitor', this._windowLeftMonitor.bind(this));
global.display.connect('window-left-monitor', global.screen.connect('restacked', this._windowsRestacked.bind(this));
this._windowLeftMonitor.bind(this));
global.display.connect('restacked',
this._windowsRestacked.bind(this));
this._workspaceSettings = this._getWorkspaceSettings(); this._workspaceSettings = this._getWorkspaceSettings();
this._workspaceSettings.connect('changed::dynamic-workspaces', this._queueCheckWorkspaces.bind(this)); this._workspaceSettings.connect('changed::dynamic-workspaces', this._queueCheckWorkspaces.bind(this));
@@ -236,7 +230,6 @@ var WorkspaceTracker = new Lang.Class({
}, },
_checkWorkspaces() { _checkWorkspaces() {
let workspaceManager = global.workspace_manager;
let i; let i;
let emptyWorkspaces = []; let emptyWorkspaces = [];
@@ -264,7 +257,7 @@ var WorkspaceTracker = new Lang.Class({
let sequences = Shell.WindowTracker.get_default().get_startup_sequences(); let sequences = Shell.WindowTracker.get_default().get_startup_sequences();
for (i = 0; i < sequences.length; i++) { for (i = 0; i < sequences.length; i++) {
let index = sequences[i].get_workspace(); let index = sequences[i].get_workspace();
if (index >= 0 && index <= workspaceManager.n_workspaces) if (index >= 0 && index <= global.screen.n_workspaces)
emptyWorkspaces[index] = false; emptyWorkspaces[index] = false;
} }
@@ -282,17 +275,17 @@ var WorkspaceTracker = new Lang.Class({
// If we don't have an empty workspace at the end, add one // If we don't have an empty workspace at the end, add one
if (!emptyWorkspaces[emptyWorkspaces.length -1]) { if (!emptyWorkspaces[emptyWorkspaces.length -1]) {
workspaceManager.append_new_workspace(false, global.get_current_time()); global.screen.append_new_workspace(false, global.get_current_time());
emptyWorkspaces.push(false); emptyWorkspaces.push(false);
} }
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); let activeWorkspaceIndex = global.screen.get_active_workspace_index();
emptyWorkspaces[activeWorkspaceIndex] = false; emptyWorkspaces[activeWorkspaceIndex] = false;
// Delete other empty workspaces; do it from the end to avoid index changes // Delete other empty workspaces; do it from the end to avoid index changes
for (i = emptyWorkspaces.length - 2; i >= 0; i--) { for (i = emptyWorkspaces.length - 2; i >= 0; i--) {
if (emptyWorkspaces[i]) if (emptyWorkspaces[i])
workspaceManager.remove_workspace(this._workspaces[i], global.get_current_time()); global.screen.remove_workspace(this._workspaces[i], global.get_current_time());
} }
this._checkWorkspacesId = 0; this._checkWorkspacesId = 0;
@@ -324,14 +317,14 @@ var WorkspaceTracker = new Lang.Class({
GLib.Source.set_name_by_id(id, '[gnome-shell] this._queueCheckWorkspaces'); GLib.Source.set_name_by_id(id, '[gnome-shell] this._queueCheckWorkspaces');
}, },
_windowLeftMonitor(metaDisplay, monitorIndex, metaWin) { _windowLeftMonitor(metaScreen, monitorIndex, metaWin) {
// If the window left the primary monitor, that // If the window left the primary monitor, that
// might make that workspace empty // might make that workspace empty
if (monitorIndex == Main.layoutManager.primaryIndex) if (monitorIndex == Main.layoutManager.primaryIndex)
this._queueCheckWorkspaces(); this._queueCheckWorkspaces();
}, },
_windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) { _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) {
// If the window entered the primary monitor, that // If the window entered the primary monitor, that
// might make that workspace non-empty // might make that workspace non-empty
if (monitorIndex == Main.layoutManager.primaryIndex) if (monitorIndex == Main.layoutManager.primaryIndex)
@@ -351,9 +344,8 @@ var WorkspaceTracker = new Lang.Class({
}, },
_nWorkspacesChanged() { _nWorkspacesChanged() {
let workspaceManager = global.workspace_manager;
let oldNumWorkspaces = this._workspaces.length; let oldNumWorkspaces = this._workspaces.length;
let newNumWorkspaces = workspaceManager.n_workspaces; let newNumWorkspaces = global.screen.n_workspaces;
if (oldNumWorkspaces == newNumWorkspaces) if (oldNumWorkspaces == newNumWorkspaces)
return false; return false;
@@ -364,7 +356,7 @@ var WorkspaceTracker = new Lang.Class({
// Assume workspaces are only added at the end // Assume workspaces are only added at the end
for (w = oldNumWorkspaces; w < newNumWorkspaces; w++) for (w = oldNumWorkspaces; w < newNumWorkspaces; w++)
this._workspaces[w] = workspaceManager.get_workspace_by_index(w); this._workspaces[w] = global.screen.get_workspace_by_index(w);
for (w = oldNumWorkspaces; w < newNumWorkspaces; w++) { for (w = oldNumWorkspaces; w < newNumWorkspaces; w++) {
let workspace = this._workspaces[w]; let workspace = this._workspaces[w];
@@ -378,7 +370,7 @@ var WorkspaceTracker = new Lang.Class({
let removedIndex; let removedIndex;
let removedNum = oldNumWorkspaces - newNumWorkspaces; let removedNum = oldNumWorkspaces - newNumWorkspaces;
for (let w = 0; w < oldNumWorkspaces; w++) { for (let w = 0; w < oldNumWorkspaces; w++) {
let workspace = workspaceManager.get_workspace_by_index(w); let workspace = global.screen.get_workspace_by_index(w);
if (this._workspaces[w] != workspace) { if (this._workspaces[w] != workspace) {
removedIndex = w; removedIndex = w;
break; break;
@@ -722,7 +714,7 @@ var WindowManager = new Lang.Class({
this._shellwm.connect('confirm-display-change', this._confirmDisplayChange.bind(this)); this._shellwm.connect('confirm-display-change', this._confirmDisplayChange.bind(this));
this._shellwm.connect('create-close-dialog', this._createCloseDialog.bind(this)); this._shellwm.connect('create-close-dialog', this._createCloseDialog.bind(this));
this._shellwm.connect('create-inhibit-shortcuts-dialog', this._createInhibitShortcutsDialog.bind(this)); this._shellwm.connect('create-inhibit-shortcuts-dialog', this._createInhibitShortcutsDialog.bind(this));
global.display.connect('restacked', this._syncStacking.bind(this)); global.screen.connect('restacked', this._syncStacking.bind(this));
this._workspaceSwitcherPopup = null; this._workspaceSwitcherPopup = null;
this._tilePreview = null; this._tilePreview = null;
@@ -978,8 +970,8 @@ var WindowManager = new Lang.Class({
if (Main.sessionMode.hasWorkspaces) if (Main.sessionMode.hasWorkspaces)
this._workspaceTracker = new WorkspaceTracker(this); this._workspaceTracker = new WorkspaceTracker(this);
global.workspace_manager.override_workspace_layout(Meta.DisplayCorner.TOPLEFT, global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
false, -1, 1); false, -1, 1);
let gesture = new WorkspaceSwitchAction(); let gesture = new WorkspaceSwitchAction();
gesture.connect('activated', this._actionSwitchWorkspace.bind(this)); gesture.connect('activated', this._actionSwitchWorkspace.bind(this));
@@ -1009,9 +1001,7 @@ var WindowManager = new Lang.Class({
}, },
_actionSwitchWorkspace(action, direction) { _actionSwitchWorkspace(action, direction) {
let workspaceManager = global.workspace_manager; let newWs = global.screen.get_active_workspace().get_neighbor(direction);
let activeWorkspace = workspaceManager.get_active_workspace();
let newWs = activeWorkspace.get_neighbor(direction);
this.actionMoveWorkspace(newWs); this.actionMoveWorkspace(newWs);
}, },
@@ -1027,10 +1017,8 @@ var WindowManager = new Lang.Class({
_switchApp() { _switchApp() {
let windows = global.get_window_actors().filter(actor => { let windows = global.get_window_actors().filter(actor => {
let win = actor.metaWindow; let win = actor.metaWindow;
let workspaceManager = global.workspace_manager;
let activeWorkspace = workspaceManager.get_active_workspace();
return (!win.is_override_redirect() && return (!win.is_override_redirect() &&
win.located_on_workspace(activeWorkspace)); win.located_on_workspace(global.screen.get_active_workspace()));
}); });
if (windows.length == 0) if (windows.length == 0)
@@ -1054,12 +1042,10 @@ var WindowManager = new Lang.Class({
}, },
insertWorkspace(pos) { insertWorkspace(pos) {
let workspaceManager = global.workspace_manager;
if (!Meta.prefs_get_dynamic_workspaces()) if (!Meta.prefs_get_dynamic_workspaces())
return; return;
workspaceManager.append_new_workspace(false, global.get_current_time()); global.screen.append_new_workspace(false, global.get_current_time());
let windows = global.get_window_actors().map(a => a.meta_window); let windows = global.get_window_actors().map(a => a.meta_window);
@@ -1083,9 +1069,9 @@ var WindowManager = new Lang.Class({
// If the new workspace was inserted before the active workspace, // If the new workspace was inserted before the active workspace,
// activate the workspace to which its windows went // activate the workspace to which its windows went
let activeIndex = workspaceManager.get_active_workspace_index(); let activeIndex = global.screen.get_active_workspace_index();
if (activeIndex >= pos) { if (activeIndex >= pos) {
let newWs = workspaceManager.get_workspace_by_index(activeIndex + 1); let newWs = global.screen.get_workspace_by_index(activeIndex + 1);
this._blockAnimations = true; this._blockAnimations = true;
newWs.activate(global.get_current_time()); newWs.activate(global.get_current_time());
this._blockAnimations = false; this._blockAnimations = false;
@@ -1187,10 +1173,6 @@ var WindowManager = new Lang.Class({
yScale = geom.height / actor.height; yScale = geom.height / actor.height;
} else { } else {
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()]; let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
if (!monitor) {
this._minimizeWindowDone();
return;
}
xDest = monitor.x; xDest = monitor.x;
yDest = monitor.y; yDest = monitor.y;
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
@@ -1266,11 +1248,6 @@ var WindowManager = new Lang.Class({
geom.height / actor.height); geom.height / actor.height);
} else { } else {
let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()]; let monitor = Main.layoutManager.monitors[actor.meta_window.get_monitor()];
if (!monitor) {
actor.show();
this._unminimizeWindowDone();
return;
}
actor.set_position(monitor.x, monitor.y); actor.set_position(monitor.x, monitor.y);
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
actor.x += monitor.width; actor.x += monitor.width;
@@ -1843,7 +1820,7 @@ var WindowManager = new Lang.Class({
this._windowMenuManager.showWindowMenuForWindow(window, menu, rect); this._windowMenuManager.showWindowMenuForWindow(window, menu, rect);
}, },
_startSwitcher(display, window, binding) { _startSwitcher(display, screen, window, binding) {
let constructor = null; let constructor = null;
switch (binding.get_name()) { switch (binding.get_name()) {
case 'switch-applications': case 'switch-applications':
@@ -1882,15 +1859,15 @@ var WindowManager = new Lang.Class({
tabPopup.destroy(); tabPopup.destroy();
}, },
_startA11ySwitcher(display, window, binding) { _startA11ySwitcher(display, screen, window, binding) {
Main.ctrlAltTabManager.popup(binding.is_reversed(), binding.get_name(), binding.get_mask()); Main.ctrlAltTabManager.popup(binding.is_reversed(), binding.get_name(), binding.get_mask());
}, },
_toggleAppMenu(display, window, event, binding) { _toggleAppMenu(display, screen, window, event, binding) {
Main.panel.toggleAppMenu(); Main.panel.toggleAppMenu();
}, },
_toggleCalendar(display, window, event, binding) { _toggleCalendar(display, screen, window, event, binding) {
Main.panel.toggleCalendar(); Main.panel.toggleCalendar();
}, },
@@ -1903,13 +1880,11 @@ var WindowManager = new Lang.Class({
OrigTweener.resumeAllTweens(); OrigTweener.resumeAllTweens();
}, },
_showWorkspaceSwitcher(display, window, binding) { _showWorkspaceSwitcher(display, screen, window, binding) {
let workspaceManager = display.get_workspace_manager();
if (!Main.sessionMode.hasWorkspaces) if (!Main.sessionMode.hasWorkspaces)
return; return;
if (workspaceManager.n_workspaces == 1) if (screen.n_workspaces == 1)
return; return;
let [action,,,target] = binding.get_name().split('-'); let [action,,,target] = binding.get_name().split('-');
@@ -1928,22 +1903,22 @@ var WindowManager = new Lang.Class({
if (target == 'last') { if (target == 'last') {
direction = Meta.MotionDirection.DOWN; direction = Meta.MotionDirection.DOWN;
newWs = workspaceManager.get_workspace_by_index(workspaceManager.n_workspaces - 1); newWs = screen.get_workspace_by_index(screen.n_workspaces - 1);
} else if (isNaN(target)) { } else if (isNaN(target)) {
// Prepend a new workspace dynamically // Prepend a new workspace dynamically
if (workspaceManager.get_active_workspace_index() == 0 && if (screen.get_active_workspace_index() == 0 &&
action == 'move' && target == 'up' && this._isWorkspacePrepended == false) { action == 'move' && target == 'up' && this._isWorkspacePrepended == false) {
this.insertWorkspace(0); this.insertWorkspace(0);
this._isWorkspacePrepended = true; this._isWorkspacePrepended = true;
} }
direction = Meta.MotionDirection[target.toUpperCase()]; direction = Meta.MotionDirection[target.toUpperCase()];
newWs = workspaceManager.get_active_workspace().get_neighbor(direction); newWs = screen.get_active_workspace().get_neighbor(direction);
} else if (target > 0) { } else if (target > 0) {
target--; target--;
newWs = workspaceManager.get_workspace_by_index(target); newWs = screen.get_workspace_by_index(target);
if (workspaceManager.get_active_workspace().index() > target) if (screen.get_active_workspace().index() > target)
direction = Meta.MotionDirection.UP; direction = Meta.MotionDirection.UP;
else else
direction = Meta.MotionDirection.DOWN; direction = Meta.MotionDirection.DOWN;
@@ -1976,8 +1951,7 @@ var WindowManager = new Lang.Class({
if (!Main.sessionMode.hasWorkspaces) if (!Main.sessionMode.hasWorkspaces)
return; return;
let workspaceManager = global.workspace_manager; let activeWorkspace = global.screen.get_active_workspace();
let activeWorkspace = workspaceManager.get_active_workspace();
if (activeWorkspace != workspace) if (activeWorkspace != workspace)
workspace.activate(global.get_current_time()); workspace.activate(global.get_current_time());
@@ -1987,8 +1961,7 @@ var WindowManager = new Lang.Class({
if (!Main.sessionMode.hasWorkspaces) if (!Main.sessionMode.hasWorkspaces)
return; return;
let workspaceManager = global.workspace_manager; let activeWorkspace = global.screen.get_active_workspace();
let activeWorkspace = workspaceManager.get_active_workspace();
if (activeWorkspace != workspace) { if (activeWorkspace != workspace) {
// This won't have any effect for "always sticky" windows // This won't have any effect for "always sticky" windows

View File

@@ -126,15 +126,16 @@ var WindowMenu = new Lang.Class({
} }
} }
let display = global.display; let screen = global.screen;
let nMonitors = display.get_n_monitors(); let nMonitors = screen.get_n_monitors();
let monitorIndex = window.get_monitor(); if (nMonitors > 1) {
if (nMonitors > 1 && monitorIndex >= 0) {
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
let monitorIndex = window.get_monitor();
let dir = Meta.ScreenDirection.UP; let dir = Meta.ScreenDirection.UP;
let upMonitorIndex = let upMonitorIndex =
display.get_monitor_neighbor_index(monitorIndex, dir); screen.get_monitor_neighbor_index(monitorIndex, dir);
if (upMonitorIndex != -1) { if (upMonitorIndex != -1) {
this.addAction(_("Move to Monitor Up"), () => { this.addAction(_("Move to Monitor Up"), () => {
window.move_to_monitor(upMonitorIndex); window.move_to_monitor(upMonitorIndex);
@@ -143,7 +144,7 @@ var WindowMenu = new Lang.Class({
dir = Meta.ScreenDirection.DOWN; dir = Meta.ScreenDirection.DOWN;
let downMonitorIndex = let downMonitorIndex =
display.get_monitor_neighbor_index(monitorIndex, dir); screen.get_monitor_neighbor_index(monitorIndex, dir);
if (downMonitorIndex != -1) { if (downMonitorIndex != -1) {
this.addAction(_("Move to Monitor Down"), () => { this.addAction(_("Move to Monitor Down"), () => {
window.move_to_monitor(downMonitorIndex); window.move_to_monitor(downMonitorIndex);
@@ -152,7 +153,7 @@ var WindowMenu = new Lang.Class({
dir = Meta.ScreenDirection.LEFT; dir = Meta.ScreenDirection.LEFT;
let leftMonitorIndex = let leftMonitorIndex =
display.get_monitor_neighbor_index(monitorIndex, dir); screen.get_monitor_neighbor_index(monitorIndex, dir);
if (leftMonitorIndex != -1) { if (leftMonitorIndex != -1) {
this.addAction(_("Move to Monitor Left"), () => { this.addAction(_("Move to Monitor Left"), () => {
window.move_to_monitor(leftMonitorIndex); window.move_to_monitor(leftMonitorIndex);
@@ -161,7 +162,7 @@ var WindowMenu = new Lang.Class({
dir = Meta.ScreenDirection.RIGHT; dir = Meta.ScreenDirection.RIGHT;
let rightMonitorIndex = let rightMonitorIndex =
display.get_monitor_neighbor_index(monitorIndex, dir); screen.get_monitor_neighbor_index(monitorIndex, dir);
if (rightMonitorIndex != -1) { if (rightMonitorIndex != -1) {
this.addAction(_("Move to Monitor Right"), () => { this.addAction(_("Move to Monitor Right"), () => {
window.move_to_monitor(rightMonitorIndex); window.move_to_monitor(rightMonitorIndex);

View File

@@ -447,13 +447,12 @@ var WindowOverlay = new Lang.Class({
this.border = new St.Bin({ style_class: 'window-clone-border' }); this.border = new St.Bin({ style_class: 'window-clone-border' });
let title = new St.Label({ style_class: 'window-caption', let title = new St.Label({ style_class: 'window-caption',
text: this._getCaption() }); text: metaWindow.title });
title.clutter_text.ellipsize = Pango.EllipsizeMode.END; title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
windowClone.actor.label_actor = title; windowClone.actor.label_actor = title;
this._updateCaptionId = metaWindow.connect('notify::title', w => { this._updateCaptionId = metaWindow.connect('notify::title', w => {
this.title.text = w.title; this.title.text = w.title;
this.title.text = this._getCaption();
this.relayout(false); this.relayout(false);
}); });
@@ -566,16 +565,6 @@ 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) { _animateOverlayActor(actor, x, y, width, height) {
let params = { x: x, let params = { x: x,
y: y, y: y,
@@ -1156,10 +1145,10 @@ var Workspace = new Lang.Class({
this._windowRemovedId = this.metaWorkspace.connect('window-removed', this._windowRemovedId = this.metaWorkspace.connect('window-removed',
this._windowRemoved.bind(this)); this._windowRemoved.bind(this));
} }
this._windowEnteredMonitorId = global.display.connect('window-entered-monitor', this._windowEnteredMonitorId = global.screen.connect('window-entered-monitor',
this._windowEnteredMonitor.bind(this)); this._windowEnteredMonitor.bind(this));
this._windowLeftMonitorId = global.display.connect('window-left-monitor', this._windowLeftMonitorId = global.screen.connect('window-left-monitor',
this._windowLeftMonitor.bind(this)); this._windowLeftMonitor.bind(this));
this._repositionWindowsId = 0; this._repositionWindowsId = 0;
this.leavingOverview = false; this.leavingOverview = false;
@@ -1305,8 +1294,7 @@ var Workspace = new Lang.Class({
let area = padArea(this._actualGeometry, padding); let area = padArea(this._actualGeometry, padding);
let slots = strategy.computeWindowSlots(layout, area); let slots = strategy.computeWindowSlots(layout, area);
let workspaceManager = global.workspace_manager; let currentWorkspace = global.screen.get_active_workspace();
let currentWorkspace = workspaceManager.get_active_workspace();
let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace; let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace;
for (let i = 0; i < slots.length; i++) { for (let i = 0; i < slots.length; i++) {
@@ -1561,13 +1549,13 @@ var Workspace = new Lang.Class({
this._doRemoveWindow(metaWin); this._doRemoveWindow(metaWin);
}, },
_windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) { _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) {
if (monitorIndex == this.monitorIndex) { if (monitorIndex == this.monitorIndex) {
this._doAddWindow(metaWin); this._doAddWindow(metaWin);
} }
}, },
_windowLeftMonitor(metaDisplay, monitorIndex, metaWin) { _windowLeftMonitor(metaScreen, monitorIndex, metaWin) {
if (monitorIndex == this.monitorIndex) { if (monitorIndex == this.monitorIndex) {
this._doRemoveWindow(metaWin); this._doRemoveWindow(metaWin);
} }
@@ -1592,9 +1580,7 @@ var Workspace = new Lang.Class({
if (this._windows.length == 0) if (this._windows.length == 0)
return; return;
let workspaceManager = global.workspace_manager; if (this.metaWorkspace != null && this.metaWorkspace != global.screen.get_active_workspace())
let activeWorkspace = workspaceManager.get_active_workspace();
if (this.metaWorkspace != null && this.metaWorkspace != activeWorkspace)
return; return;
// Special case maximized windows, since it doesn't make sense // Special case maximized windows, since it doesn't make sense
@@ -1650,9 +1636,7 @@ var Workspace = new Lang.Class({
this._repositionWindowsId = 0; this._repositionWindowsId = 0;
} }
let workspaceManager = global.workspace_manager; if (this.metaWorkspace != null && this.metaWorkspace != global.screen.get_active_workspace())
let activeWorkspace = workspaceManager.get_active_workspace();
if (this.metaWorkspace != null && this.metaWorkspace != activeWorkspace)
return; return;
// Special case maximized windows, since it doesn't make sense // Special case maximized windows, since it doesn't make sense
@@ -1722,8 +1706,7 @@ var Workspace = new Lang.Class({
}, },
zoomFromOverview() { zoomFromOverview() {
let workspaceManager = global.workspace_manager; let currentWorkspace = global.screen.get_active_workspace();
let currentWorkspace = workspaceManager.get_active_workspace();
this.leavingOverview = true; this.leavingOverview = true;
@@ -1791,8 +1774,8 @@ var Workspace = new Lang.Class({
this.metaWorkspace.disconnect(this._windowAddedId); this.metaWorkspace.disconnect(this._windowAddedId);
this.metaWorkspace.disconnect(this._windowRemovedId); this.metaWorkspace.disconnect(this._windowRemovedId);
} }
global.display.disconnect(this._windowEnteredMonitorId); global.screen.disconnect(this._windowEnteredMonitorId);
global.display.disconnect(this._windowLeftMonitorId); global.screen.disconnect(this._windowLeftMonitorId);
if (this._repositionWindowsId > 0) { if (this._repositionWindowsId > 0) {
Mainloop.source_remove(this._repositionWindowsId); Mainloop.source_remove(this._repositionWindowsId);
@@ -2027,8 +2010,7 @@ var Workspace = new Lang.Class({
if (metaWindow.get_monitor() != this.monitorIndex) if (metaWindow.get_monitor() != this.monitorIndex)
metaWindow.move_to_monitor(this.monitorIndex); metaWindow.move_to_monitor(this.monitorIndex);
let workspaceManager = global.workspace_manager; let index = this.metaWorkspace ? this.metaWorkspace.index() : global.screen.get_active_workspace_index();
let index = this.metaWorkspace ? this.metaWorkspace.index() : workspaceManager.get_active_workspace_index();
metaWindow.change_workspace_by_index(index, false); metaWindow.change_workspace_by_index(index, false);
return true; return true;
} else if (source.shellWorkspaceLaunch) { } else if (source.shellWorkspaceLaunch) {

View File

@@ -47,12 +47,9 @@ var WorkspaceSwitcherPopup = new Lang.Class({
this.actor.hide(); this.actor.hide();
let workspaceManager = global.workspace_manager; this._globalSignals = [];
this._workspaceManagerSignals = []; this._globalSignals.push(global.screen.connect('workspace-added', this._redisplay.bind(this)));
this._workspaceManagerSignals.push(workspaceManager.connect('workspace-added', this._globalSignals.push(global.screen.connect('workspace-removed', this._redisplay.bind(this)));
this._redisplay.bind(this)));
this._workspaceManagerSignals.push(workspaceManager.connect('workspace-removed',
this._redisplay.bind(this)));
}, },
_getPreferredHeight(actor, forWidth, alloc) { _getPreferredHeight(actor, forWidth, alloc) {
@@ -71,12 +68,11 @@ var WorkspaceSwitcherPopup = new Lang.Class({
height += childNaturalHeight * workArea.width / workArea.height; height += childNaturalHeight * workArea.width / workArea.height;
} }
let workspaceManager = global.workspace_manager; let spacing = this._itemSpacing * (global.screen.n_workspaces - 1);
let spacing = this._itemSpacing * (workspaceManager.n_workspaces - 1);
height += spacing; height += spacing;
height = Math.min(height, availHeight); height = Math.min(height, availHeight);
this._childHeight = (height - spacing) / workspaceManager.n_workspaces; this._childHeight = (height - spacing) / global.screen.n_workspaces;
alloc.min_size = height; alloc.min_size = height;
alloc.natural_size = height; alloc.natural_size = height;
@@ -108,11 +104,9 @@ var WorkspaceSwitcherPopup = new Lang.Class({
}, },
_redisplay() { _redisplay() {
let workspaceManager = global.workspace_manager;
this._list.destroy_all_children(); this._list.destroy_all_children();
for (let i = 0; i < workspaceManager.n_workspaces; i++) { for (let i = 0; i < global.screen.n_workspaces; i++) {
let indicator = null; let indicator = null;
if (i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.UP) if (i == this._activeWorkspaceIndex && this._direction == Meta.MotionDirection.UP)
@@ -170,9 +164,8 @@ var WorkspaceSwitcherPopup = new Lang.Class({
Mainloop.source_remove(this._timeoutId); Mainloop.source_remove(this._timeoutId);
this._timeoutId = 0; this._timeoutId = 0;
let workspaceManager = global.workspace_manager; for (let i = 0; i < this._globalSignals.length; i++)
for (let i = 0; i < this._workspaceManagerSignals.length; i++) global.screen.disconnect(this._globalSignals[i]);
workspaceManager.disconnect(this._workspaceManagerSignals[i]);
this.actor.destroy(); this.actor.destroy();

View File

@@ -304,9 +304,9 @@ var WorkspaceThumbnail = new Lang.Class({
this._windowAdded.bind(this)); this._windowAdded.bind(this));
this._windowRemovedId = this.metaWorkspace.connect('window-removed', this._windowRemovedId = this.metaWorkspace.connect('window-removed',
this._windowRemoved.bind(this)); this._windowRemoved.bind(this));
this._windowEnteredMonitorId = global.display.connect('window-entered-monitor', this._windowEnteredMonitorId = global.screen.connect('window-entered-monitor',
this._windowEnteredMonitor.bind(this)); this._windowEnteredMonitor.bind(this));
this._windowLeftMonitorId = global.display.connect('window-left-monitor', this._windowLeftMonitorId = global.screen.connect('window-left-monitor',
this._windowLeftMonitor.bind(this)); this._windowLeftMonitor.bind(this));
this.state = ThumbnailState.NORMAL; this.state = ThumbnailState.NORMAL;
@@ -446,13 +446,13 @@ var WorkspaceThumbnail = new Lang.Class({
this._doRemoveWindow(metaWin); this._doRemoveWindow(metaWin);
}, },
_windowEnteredMonitor(metaDisplay, monitorIndex, metaWin) { _windowEnteredMonitor(metaScreen, monitorIndex, metaWin) {
if (monitorIndex == this.monitorIndex) { if (monitorIndex == this.monitorIndex) {
this._doAddWindow(metaWin); this._doAddWindow(metaWin);
} }
}, },
_windowLeftMonitor(metaDisplay, monitorIndex, metaWin) { _windowLeftMonitor(metaScreen, monitorIndex, metaWin) {
if (monitorIndex == this.monitorIndex) { if (monitorIndex == this.monitorIndex) {
this._doRemoveWindow(metaWin); this._doRemoveWindow(metaWin);
} }
@@ -478,8 +478,8 @@ var WorkspaceThumbnail = new Lang.Class({
this.metaWorkspace.disconnect(this._windowAddedId); this.metaWorkspace.disconnect(this._windowAddedId);
this.metaWorkspace.disconnect(this._windowRemovedId); this.metaWorkspace.disconnect(this._windowRemovedId);
global.display.disconnect(this._windowEnteredMonitorId); global.screen.disconnect(this._windowEnteredMonitorId);
global.display.disconnect(this._windowLeftMonitorId); global.screen.disconnect(this._windowLeftMonitorId);
for (let i = 0; i < this._allWindows.length; i++) for (let i = 0; i < this._allWindows.length; i++)
this._allWindows[i].disconnect(this._minimizedChangedIds[i]); this._allWindows[i].disconnect(this._minimizedChangedIds[i]);
@@ -556,9 +556,7 @@ var WorkspaceThumbnail = new Lang.Class({
return; return;
// a click on the already current workspace should go back to the main view // a click on the already current workspace should go back to the main view
let workspaceManager = global.workspace_manager; if (this.metaWorkspace == global.screen.get_active_workspace())
let activeWorkspace = workspaceManager.get_active_workspace();
if (this.metaWorkspace == activeWorkspace)
Main.overview.hide(); Main.overview.hide();
else else
this.metaWorkspace.activate(time); this.metaWorkspace.activate(time);
@@ -680,19 +678,12 @@ var ThumbnailsBox = new Lang.Class({
this._updateSwitcherVisibility.bind(this)); this._updateSwitcherVisibility.bind(this));
Main.layoutManager.connect('monitors-changed', this._rebuildThumbnails.bind(this)); Main.layoutManager.connect('monitors-changed', this._rebuildThumbnails.bind(this));
this._switchWorkspaceNotifyId = 0;
this._nWorkspacesNotifyId = 0;
this._syncStackingId = 0;
this._workareasChangedId = 0;
}, },
_updateSwitcherVisibility() { _updateSwitcherVisibility() {
let workspaceManager = global.workspace_manager;
this.actor.visible = this.actor.visible =
this._settings.get_boolean('dynamic-workspaces') || this._settings.get_boolean('dynamic-workspaces') ||
workspaceManager.n_workspaces > 1; global.screen.n_workspaces > 1;
}, },
_activateThumbnailAtPoint(stageX, stageY, time) { _activateThumbnailAtPoint(stageX, stageY, time) {
@@ -850,8 +841,7 @@ var ThumbnailsBox = new Lang.Class({
// to open its first window within some time, as tracked by Shell.WindowTracker. // to open its first window within some time, as tracked by Shell.WindowTracker.
// Here, we only add a very brief timeout to avoid the _immediate_ removal of the // Here, we only add a very brief timeout to avoid the _immediate_ removal of the
// workspace while we wait for the startup sequence to load. // workspace while we wait for the startup sequence to load.
let workspaceManager = global.workspace_manager; Main.wm.keepWorkspaceAlive(global.screen.get_workspace_by_index(newWorkspaceIndex),
Main.wm.keepWorkspaceAlive(workspaceManager.get_workspace_by_index(newWorkspaceIndex),
WORKSPACE_KEEP_ALIVE_TIME); WORKSPACE_KEEP_ALIVE_TIME);
} }
@@ -870,21 +860,18 @@ var ThumbnailsBox = new Lang.Class({
}, },
_createThumbnails() { _createThumbnails() {
let workspaceManager = global.workspace_manager;
this._switchWorkspaceNotifyId = this._switchWorkspaceNotifyId =
global.window_manager.connect('switch-workspace', global.window_manager.connect('switch-workspace',
this._activeWorkspaceChanged.bind(this)); this._activeWorkspaceChanged.bind(this));
this._nWorkspacesNotifyId = this._nWorkspacesNotifyId =
workspaceManager.connect('notify::n-workspaces', global.screen.connect('notify::n-workspaces',
this._workspacesChanged.bind(this)); this._workspacesChanged.bind(this));
this._syncStackingId = this._syncStackingId =
Main.overview.connect('windows-restacked', Main.overview.connect('windows-restacked',
this._syncStacking.bind(this)); this._syncStacking.bind(this));
this._workareasChangedId = this._workareasChangedId =
global.display.connect('workareas-changed', global.screen.connect('workareas-changed', this._rebuildThumbnails.bind(this));
this._rebuildThumbnails.bind(this));
this._targetScale = 0; this._targetScale = 0;
this._scale = 0; this._scale = 0;
@@ -895,22 +882,18 @@ var ThumbnailsBox = new Lang.Class({
for (let key in ThumbnailState) for (let key in ThumbnailState)
this._stateCounts[ThumbnailState[key]] = 0; this._stateCounts[ThumbnailState[key]] = 0;
this.addThumbnails(0, workspaceManager.n_workspaces); this.addThumbnails(0, global.screen.n_workspaces);
this._updateSwitcherVisibility(); this._updateSwitcherVisibility();
}, },
_destroyThumbnails() { _destroyThumbnails() {
if (this._thumbnails.length == 0)
return;
if (this._switchWorkspaceNotifyId > 0) { if (this._switchWorkspaceNotifyId > 0) {
global.window_manager.disconnect(this._switchWorkspaceNotifyId); global.window_manager.disconnect(this._switchWorkspaceNotifyId);
this._switchWorkspaceNotifyId = 0; this._switchWorkspaceNotifyId = 0;
} }
if (this._nWorkspacesNotifyId > 0) { if (this._nWorkspacesNotifyId > 0) {
let workspaceManager = global.workspace_manager; global.screen.disconnect(this._nWorkspacesNotifyId);
workspaceManager.disconnect(this._nWorkspacesNotifyId);
this._nWorkspacesNotifyId = 0; this._nWorkspacesNotifyId = 0;
} }
@@ -920,7 +903,7 @@ var ThumbnailsBox = new Lang.Class({
} }
if (this._workareasChangedId > 0) { if (this._workareasChangedId > 0) {
global.display.disconnect(this._workareasChangedId); global.screen.disconnect(this._workareasChangedId);
this._workareasChangedId = 0; this._workareasChangedId = 0;
} }
@@ -940,10 +923,9 @@ var ThumbnailsBox = new Lang.Class({
_workspacesChanged() { _workspacesChanged() {
let validThumbnails = let validThumbnails =
this._thumbnails.filter(t => t.state <= ThumbnailState.NORMAL); this._thumbnails.filter(t => t.state <= ThumbnailState.NORMAL);
let workspaceManager = global.workspace_manager;
let oldNumWorkspaces = validThumbnails.length; let oldNumWorkspaces = validThumbnails.length;
let newNumWorkspaces = workspaceManager.n_workspaces; let newNumWorkspaces = global.screen.n_workspaces;
let active = workspaceManager.get_active_workspace_index(); let active = global.screen.get_active_workspace_index();
if (newNumWorkspaces > oldNumWorkspaces) { if (newNumWorkspaces > oldNumWorkspaces) {
this.addThumbnails(oldNumWorkspaces, newNumWorkspaces - oldNumWorkspaces); this.addThumbnails(oldNumWorkspaces, newNumWorkspaces - oldNumWorkspaces);
@@ -951,7 +933,7 @@ var ThumbnailsBox = new Lang.Class({
let removedIndex; let removedIndex;
let removedNum = oldNumWorkspaces - newNumWorkspaces; let removedNum = oldNumWorkspaces - newNumWorkspaces;
for (let w = 0; w < oldNumWorkspaces; w++) { for (let w = 0; w < oldNumWorkspaces; w++) {
let metaWorkspace = workspaceManager.get_workspace_by_index(w); let metaWorkspace = global.screen.get_workspace_by_index(w);
if (this._thumbnails[w].metaWorkspace != metaWorkspace) { if (this._thumbnails[w].metaWorkspace != metaWorkspace) {
removedIndex = w; removedIndex = w;
break; break;
@@ -965,12 +947,10 @@ var ThumbnailsBox = new Lang.Class({
}, },
addThumbnails(start, count) { addThumbnails(start, count) {
let workspaceManager = global.workspace_manager;
if (!this._ensurePorthole()) if (!this._ensurePorthole())
return; return;
for (let k = start; k < start + count; k++) { for (let k = start; k < start + count; k++) {
let metaWorkspace = workspaceManager.get_workspace_by_index(k); let metaWorkspace = global.screen.get_workspace_by_index(k);
let thumbnail = new WorkspaceThumbnail(metaWorkspace); let thumbnail = new WorkspaceThumbnail(metaWorkspace);
thumbnail.setPorthole(this._porthole.x, this._porthole.y, thumbnail.setPorthole(this._porthole.x, this._porthole.y,
this._porthole.width, this._porthole.height); this._porthole.width, this._porthole.height);
@@ -1156,11 +1136,10 @@ var ThumbnailsBox = new Lang.Class({
return; return;
} }
let workspaceManager = global.workspace_manager;
let themeNode = this.actor.get_theme_node(); let themeNode = this.actor.get_theme_node();
let spacing = themeNode.get_length('spacing'); let spacing = themeNode.get_length('spacing');
let nWorkspaces = workspaceManager.n_workspaces; let nWorkspaces = global.screen.n_workspaces;
let totalSpacing = (nWorkspaces - 1) * spacing; let totalSpacing = (nWorkspaces - 1) * spacing;
alloc.min_size = totalSpacing; alloc.min_size = totalSpacing;
@@ -1174,11 +1153,10 @@ var ThumbnailsBox = new Lang.Class({
return; return;
} }
let workspaceManager = global.workspace_manager;
let themeNode = this.actor.get_theme_node(); let themeNode = this.actor.get_theme_node();
let spacing = this.actor.get_theme_node().get_length('spacing'); let spacing = this.actor.get_theme_node().get_length('spacing');
let nWorkspaces = workspaceManager.n_workspaces; let nWorkspaces = global.screen.n_workspaces;
let totalSpacing = (nWorkspaces - 1) * spacing; let totalSpacing = (nWorkspaces - 1) * spacing;
let avail = forHeight - totalSpacing; let avail = forHeight - totalSpacing;
@@ -1209,7 +1187,6 @@ var ThumbnailsBox = new Lang.Class({
if (this._thumbnails.length == 0) // not visible if (this._thumbnails.length == 0) // not visible
return; return;
let workspaceManager = global.workspace_manager;
let themeNode = this.actor.get_theme_node(); let themeNode = this.actor.get_theme_node();
let portholeWidth = this._porthole.width; let portholeWidth = this._porthole.width;
@@ -1217,7 +1194,7 @@ var ThumbnailsBox = new Lang.Class({
let spacing = themeNode.get_length('spacing'); let spacing = themeNode.get_length('spacing');
// Compute the scale we'll need once everything is updated // Compute the scale we'll need once everything is updated
let nWorkspaces = workspaceManager.n_workspaces; let nWorkspaces = global.screen.n_workspaces;
let totalSpacing = (nWorkspaces - 1) * spacing; let totalSpacing = (nWorkspaces - 1) * spacing;
let avail = (box.y2 - box.y1) - totalSpacing; let avail = (box.y2 - box.y1) - totalSpacing;
@@ -1251,8 +1228,7 @@ var ThumbnailsBox = new Lang.Class({
let indicatorY1 = this._indicatorY; let indicatorY1 = this._indicatorY;
let indicatorY2; let indicatorY2;
// when not animating, the workspace position overrides this._indicatorY // when not animating, the workspace position overrides this._indicatorY
let activeWorkspace = workspaceManager.get_active_workspace(); let indicatorWorkspace = !this._animatingIndicator ? global.screen.get_active_workspace() : null;
let indicatorWorkspace = !this._animatingIndicator ? activeWorkspace : null;
let indicatorThemeNode = this._indicator.get_theme_node(); let indicatorThemeNode = this._indicator.get_theme_node();
let indicatorTopFullBorder = indicatorThemeNode.get_padding(St.Side.TOP) + indicatorThemeNode.get_border_width(St.Side.TOP); let indicatorTopFullBorder = indicatorThemeNode.get_padding(St.Side.TOP) + indicatorThemeNode.get_border_width(St.Side.TOP);
@@ -1343,8 +1319,7 @@ var ThumbnailsBox = new Lang.Class({
_activeWorkspaceChanged(wm, from, to, direction) { _activeWorkspaceChanged(wm, from, to, direction) {
let thumbnail; let thumbnail;
let workspaceManager = global.workspace_manager; let activeWorkspace = global.screen.get_active_workspace();
let activeWorkspace = workspaceManager.get_active_workspace();
for (let i = 0; i < this._thumbnails.length; i++) { for (let i = 0; i < this._thumbnails.length; i++) {
if (this._thumbnails[i].metaWorkspace == activeWorkspace) { if (this._thumbnails[i].metaWorkspace == activeWorkspace) {
thumbnail = this._thumbnails[i]; thumbnail = this._thumbnails[i];

View File

@@ -91,29 +91,25 @@ var WorkspacesView = new Lang.Class({
Extends: WorkspacesViewBase, Extends: WorkspacesViewBase,
_init(monitorIndex) { _init(monitorIndex) {
let workspaceManager = global.workspace_manager;
this.parent(monitorIndex); this.parent(monitorIndex);
this._animating = false; // tweening this._animating = false; // tweening
this._scrolling = false; // swipe-scrolling this._scrolling = false; // swipe-scrolling
this._animatingScroll = false; // programatically updating the adjustment this._animatingScroll = false; // programatically updating the adjustment
let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); let activeWorkspaceIndex = global.screen.get_active_workspace_index();
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex, this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
lower: 0, lower: 0,
page_increment: 1, page_increment: 1,
page_size: 1, page_size: 1,
step_increment: 0, step_increment: 0,
upper: workspaceManager.n_workspaces }); upper: global.screen.n_workspaces });
this.scrollAdjustment.connect('notify::value', this.scrollAdjustment.connect('notify::value',
this._onScroll.bind(this)); this._onScroll.bind(this));
this._workspaces = []; this._workspaces = [];
this._updateWorkspaces(); this._updateWorkspaces();
this._updateWorkspacesId = this._updateWorkspacesId = global.screen.connect('notify::n-workspaces', this._updateWorkspaces.bind(this));
workspaceManager.connect('notify::n-workspaces',
this._updateWorkspaces.bind(this));
this._overviewShownId = this._overviewShownId =
Main.overview.connect('shown', () => { Main.overview.connect('shown', () => {
@@ -142,8 +138,7 @@ var WorkspacesView = new Lang.Class({
}, },
getActiveWorkspace() { getActiveWorkspace() {
let workspaceManager = global.workspace_manager; let active = global.screen.get_active_workspace_index();
let active = workspaceManager.get_active_workspace_index();
return this._workspaces[active]; return this._workspaces[active];
}, },
@@ -174,8 +169,7 @@ var WorkspacesView = new Lang.Class({
}, },
_scrollToActive() { _scrollToActive() {
let workspaceManager = global.workspace_manager; let active = global.screen.get_active_workspace_index();
let active = workspaceManager.get_active_workspace_index();
this._updateWorkspaceActors(true); this._updateWorkspaceActors(true);
this._updateScrollAdjustment(active); this._updateScrollAdjustment(active);
@@ -184,8 +178,7 @@ var WorkspacesView = new Lang.Class({
// Update workspace actors parameters // Update workspace actors parameters
// @showAnimation: iff %true, transition between states // @showAnimation: iff %true, transition between states
_updateWorkspaceActors(showAnimation) { _updateWorkspaceActors(showAnimation) {
let workspaceManager = global.workspace_manager; let active = global.screen.get_active_workspace_index();
let active = workspaceManager.get_active_workspace_index();
this._animating = showAnimation; this._animating = showAnimation;
@@ -221,8 +214,7 @@ var WorkspacesView = new Lang.Class({
}, },
_updateVisibility() { _updateVisibility() {
let workspaceManager = global.workspace_manager; let active = global.screen.get_active_workspace_index();
let active = workspaceManager.get_active_workspace_index();
for (let w = 0; w < this._workspaces.length; w++) { for (let w = 0; w < this._workspaces.length; w++) {
let workspace = this._workspaces[w]; let workspace = this._workspaces[w];
@@ -254,14 +246,13 @@ var WorkspacesView = new Lang.Class({
}, },
_updateWorkspaces() { _updateWorkspaces() {
let workspaceManager = global.workspace_manager; let newNumWorkspaces = global.screen.n_workspaces;
let newNumWorkspaces = workspaceManager.n_workspaces;
this.scrollAdjustment.upper = newNumWorkspaces; this.scrollAdjustment.upper = newNumWorkspaces;
let needsUpdate = false; let needsUpdate = false;
for (let j = 0; j < newNumWorkspaces; j++) { for (let j = 0; j < newNumWorkspaces; j++) {
let metaWorkspace = workspaceManager.get_workspace_by_index(j); let metaWorkspace = global.screen.get_workspace_by_index(j);
let workspace; let workspace;
if (j >= this._workspaces.length) { /* added */ if (j >= this._workspaces.length) { /* added */
@@ -299,8 +290,7 @@ var WorkspacesView = new Lang.Class({
this.scrollAdjustment.run_dispose(); this.scrollAdjustment.run_dispose();
Main.overview.disconnect(this._overviewShownId); Main.overview.disconnect(this._overviewShownId);
global.window_manager.disconnect(this._switchWorkspaceNotifyId); global.window_manager.disconnect(this._switchWorkspaceNotifyId);
let workspaceManager = global.workspace_manager; global.screen.disconnect(this._updateWorkspacesId);
workspaceManager.disconnect(this._updateWorkspacesId);
}, },
startSwipeScroll() { startSwipeScroll() {
@@ -321,8 +311,7 @@ var WorkspacesView = new Lang.Class({
if (this._animatingScroll) if (this._animatingScroll)
return; return;
let workspaceManager = global.workspace_manager; let active = global.screen.get_active_workspace_index();
let active = workspaceManager.get_active_workspace_index();
let current = Math.round(adj.value); let current = Math.round(adj.value);
if (active != current) { if (active != current) {
@@ -604,7 +593,7 @@ var WorkspacesDisplay = new Lang.Class({
_getMonitorIndexForEvent(event) { _getMonitorIndexForEvent(event) {
let [x, y] = event.get_coords(); let [x, y] = event.get_coords();
let rect = new Meta.Rectangle({ x: x, y: y, width: 1, height: 1 }); let rect = new Meta.Rectangle({ x: x, y: y, width: 1, height: 1 });
return global.display.get_monitor_index_for_rect(rect); return global.screen.get_monitor_index_for_rect(rect);
}, },
_getPrimaryView() { _getPrimaryView() {
@@ -690,8 +679,7 @@ var WorkspacesDisplay = new Lang.Class({
this._getMonitorIndexForEvent(event) != this._primaryIndex) this._getMonitorIndexForEvent(event) != this._primaryIndex)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
let workspaceManager = global.workspace_manager; let activeWs = global.screen.get_active_workspace();
let activeWs = workspaceManager.get_active_workspace();
let ws; let ws;
switch (event.get_scroll_direction()) { switch (event.get_scroll_direction()) {
case Clutter.ScrollDirection.UP: case Clutter.ScrollDirection.UP:
@@ -710,8 +698,7 @@ var WorkspacesDisplay = new Lang.Class({
_onKeyPressEvent(actor, event) { _onKeyPressEvent(actor, event) {
if (!this.actor.mapped) if (!this.actor.mapped)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
let workspaceManager = global.workspace_manager; let activeWs = global.screen.get_active_workspace();
let activeWs = workspaceManager.get_active_workspace();
let ws; let ws;
switch (event.get_key_symbol()) { switch (event.get_key_symbol()) {
case Clutter.KEY_Page_Up: case Clutter.KEY_Page_Up:

View File

@@ -1,12 +1,12 @@
project('gnome-shell', 'c', project('gnome-shell', 'c',
version: '3.29.3', version: '3.28.3',
meson_version: '>= 0.42.0', meson_version: '>= 0.42.0',
license: 'GPLv2+' license: 'GPLv2+'
) )
# We depend on a specific version of the libmutter API. The mutter variants of # We depend on a specific version of the libmutter API. The mutter variants of
# the Cogl and Clutter libraries also use this API version. # the Cogl and Clutter libraries also use this API version.
mutter_api_version = '3' mutter_api_version = '2'
clutter_pc = 'mutter-clutter-' + mutter_api_version clutter_pc = 'mutter-clutter-' + mutter_api_version
cogl_pc = 'mutter-cogl-' + mutter_api_version cogl_pc = 'mutter-cogl-' + mutter_api_version
@@ -23,7 +23,7 @@ gi_req = '>= 1.49.1'
gjs_req = '>= 1.47.0' gjs_req = '>= 1.47.0'
gtk_req = '>= 3.15.0' gtk_req = '>= 3.15.0'
json_glib_req = '>= 0.13.2' json_glib_req = '>= 0.13.2'
mutter_req = '>= 3.29.2' mutter_req = '>= 3.28.0'
polkit_req = '>= 0.100' polkit_req = '>= 0.100'
schemas_req = '>= 3.21.3' schemas_req = '>= 3.21.3'
startup_req = '>= 0.11' startup_req = '>= 0.11'
@@ -31,7 +31,7 @@ ibus_req = '>= 1.5.2'
bt_req = '>= 3.9.0' bt_req = '>= 3.9.0'
gst_req = '>= 0.11.92' gst_req = '>= 0.11.92'
nm_req = '>= 1.10.4' nm_req = '>= 0.9.8'
secret_req = '>= 0.18' secret_req = '>= 0.18'
gnome = import('gnome') gnome = import('gnome')

1500
po/af.po

File diff suppressed because it is too large Load Diff

View File

@@ -10,7 +10,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: HEAD\n" "Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-04-13 19:54+0000\n" "POT-Creation-Date: 2018-03-10 12:32+0000\n"
"PO-Revision-Date: 2018-03-10 21:24+0100\n" "PO-Revision-Date: 2018-03-10 21:24+0100\n"
"Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n" "Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n" "Language-Team: Catalan <tradgnome@softcatala.org>\n"
@@ -349,7 +349,7 @@ msgid "There was an error loading the preferences dialog for %s:"
msgstr "S'ha produït un error en carregar el diàleg de preferències de %s:" msgstr "S'ha produït un error en carregar el diàleg de preferències de %s:"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
msgid "Cancel" msgid "Cancel"
@@ -669,12 +669,12 @@ msgstr "Afegeix als preferits"
msgid "Show Details" msgid "Show Details"
msgstr "Mostra els detalls" msgstr "Mostra els detalls"
#: js/ui/appFavorites.js:140 #: js/ui/appFavorites.js:138
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "S'ha afegit %s als preferits." msgstr "S'ha afegit %s als preferits."
#: js/ui/appFavorites.js:174 #: js/ui/appFavorites.js:172
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "S'ha suprimit %s dels preferits." msgstr "S'ha suprimit %s dels preferits."
@@ -869,7 +869,7 @@ msgstr "S'ha desconnectat un dispositiu extern"
msgid "Open with %s" msgid "Open with %s"
msgstr "Obre amb %s" msgstr "Obre amb %s"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
msgid "Password:" msgid "Password:"
msgstr "Contrasenya:" msgstr "Contrasenya:"
@@ -957,15 +957,15 @@ msgstr "Cal introduir una contrasenya per connectar-vos a «%s»."
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestor de connexions de xarxa" msgstr "Gestor de connexions de xarxa"
#: js/ui/components/polkitAgent.js:48 #: js/ui/components/polkitAgent.js:43
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Cal autenticació" msgstr "Cal autenticació"
#: js/ui/components/polkitAgent.js:76 #: js/ui/components/polkitAgent.js:71
msgid "Administrator" msgid "Administrator"
msgstr "Administrador" msgstr "Administrador"
#: js/ui/components/polkitAgent.js:156 #: js/ui/components/polkitAgent.js:151
msgid "Authenticate" msgid "Authenticate"
msgstr "Autentica" msgstr "Autentica"
@@ -973,7 +973,7 @@ msgstr "Autentica"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "No ha funcionat. Torneu-ho a provar." msgstr "No ha funcionat. Torneu-ho a provar."
@@ -1021,7 +1021,7 @@ msgstr "Afegeix rellotges del món…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Rellotges del món" msgstr "Rellotges del món"
#: js/ui/dateMenu.js:227 #: js/ui/dateMenu.js:225
msgid "Weather" msgid "Weather"
msgstr "El temps" msgstr "El temps"
@@ -1029,7 +1029,7 @@ msgstr "El temps"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:291 #: js/ui/dateMenu.js:289
#, javascript-format #, javascript-format
msgid "%s all day." msgid "%s all day."
msgstr "%s tot el dia." msgstr "%s tot el dia."
@@ -1038,7 +1038,7 @@ msgstr "%s tot el dia."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:297 #: js/ui/dateMenu.js:295
#, javascript-format #, javascript-format
msgid "%s, then %s later." msgid "%s, then %s later."
msgstr "%s, llavors %s més tard." msgstr "%s, llavors %s més tard."
@@ -1047,30 +1047,30 @@ msgstr "%s, llavors %s més tard."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:303 #: js/ui/dateMenu.js:301
#, javascript-format #, javascript-format
msgid "%s, then %s, followed by %s later." msgid "%s, then %s, followed by %s later."
msgstr "%s, llavors %s, seguit per %s més tard." msgstr "%s, llavors %s, seguit per %s més tard."
#: js/ui/dateMenu.js:314 #: js/ui/dateMenu.js:312
msgid "Select a location…" msgid "Select a location…"
msgstr "Trieu una ubicació…" msgstr "Trieu una ubicació…"
#: js/ui/dateMenu.js:317 #: js/ui/dateMenu.js:315
msgid "Loading…" msgid "Loading…"
msgstr "S'està carregant…" msgstr "S'està carregant…"
#. Translators: %s is a temperature with unit, e.g. "23℃" #. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:321
#, javascript-format #, javascript-format
msgid "Feels like %s." msgid "Feels like %s."
msgstr "Sensació tèrmica de %s." msgstr "Sensació tèrmica de %s."
#: js/ui/dateMenu.js:326 #: js/ui/dateMenu.js:324
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Vés en línia per a informació sobre el temps" msgstr "Vés en línia per a informació sobre el temps"
#: js/ui/dateMenu.js:328 #: js/ui/dateMenu.js:326
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "La informació sobre el temps no està disponible" msgstr "La informació sobre el temps no està disponible"
@@ -1990,17 +1990,16 @@ msgid ""
"New device has been detected while you were away. Please disconnect and " "New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it." "reconnect the device to start using it."
msgstr "" msgstr ""
"El nou dispositiu s'ha detectat mentre estàveu absents. Desconnecteu i " "El nou dispositiu s'ha detectat mentre estàveu absents. Desconnecteu i torneu a connectar el dispositiu per a començar a utilitzar-lo."
"torneu a connectar el dispositiu per a començar a utilitzar-lo."
#: js/ui/status/thunderbolt.js:356 #: js/ui/status/thunderbolt.js:356
msgid "Thunderbolt authorization error" msgid "Thunderbolt authorization error"
msgstr "S'ha produït un error d'autorització a Thunderbolt" msgstr "S'ha produït un error d'autorització a Thunderbolt"
#: js/ui/status/thunderbolt.js:357 #: js/ui/status/thunderbolt.js:357
#, javascript-format #, javascript-format
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the thunderbolt device: %s"
msgstr "No s'ha pogut autoritzar el dispositiu Thunderbolt: %s" msgstr "No s'ha pogut autoritzar el dispositiu thunderbolt: %s"
#: js/ui/status/volume.js:128 #: js/ui/status/volume.js:128
msgid "Volume changed" msgid "Volume changed"

View File

@@ -11,8 +11,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-04-13 19:54+0000\n" "POT-Creation-Date: 2018-02-26 12:57+0000\n"
"PO-Revision-Date: 2018-04-24 17:32+0200\n" "PO-Revision-Date: 2018-02-26 17:57+0100\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n" "Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: čeština <gnome-cs-list@gnome.org>\n" "Language-Team: čeština <gnome-cs-list@gnome.org>\n"
"Language: cs\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:" "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/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
msgid "Cancel" msgid "Cancel"
@@ -667,12 +667,12 @@ msgstr "Přidat mezi oblíbené"
msgid "Show Details" msgid "Show Details"
msgstr "Zobrazit podrobnosti" msgstr "Zobrazit podrobnosti"
#: js/ui/appFavorites.js:140 #: js/ui/appFavorites.js:138
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s byl přidán mezi oblíbené." msgstr "%s byl přidán mezi oblíbené."
#: js/ui/appFavorites.js:174 #: js/ui/appFavorites.js:172
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s byl odstraněn z oblíbených." msgstr "%s byl odstraněn z oblíbených."
@@ -867,7 +867,7 @@ msgstr "Externí svazek odpojen"
msgid "Open with %s" msgid "Open with %s"
msgstr "Otevřít pomocí %s" msgstr "Otevřít pomocí %s"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
msgid "Password:" msgid "Password:"
msgstr "Heslo:" msgstr "Heslo:"
@@ -955,15 +955,15 @@ msgstr "Pro připojení k „%s“ je vyžadováno heslo."
msgid "Network Manager" msgid "Network Manager"
msgstr "Network Manager" msgstr "Network Manager"
#: js/ui/components/polkitAgent.js:48 #: js/ui/components/polkitAgent.js:43
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Je vyžadováno ověření" msgstr "Je vyžadováno ověření"
#: js/ui/components/polkitAgent.js:76 #: js/ui/components/polkitAgent.js:71
msgid "Administrator" msgid "Administrator"
msgstr "Správce" msgstr "Správce"
#: js/ui/components/polkitAgent.js:156 #: js/ui/components/polkitAgent.js:151
msgid "Authenticate" msgid "Authenticate"
msgstr "Ověřit" msgstr "Ověřit"
@@ -971,7 +971,7 @@ msgstr "Ověřit"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Ověření bohužel nebylo úspěšné. Zkuste to prosím znovu." 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" msgid "World Clocks"
msgstr "Světové hodiny" msgstr "Světové hodiny"
#: js/ui/dateMenu.js:227 #: js/ui/dateMenu.js:225
msgid "Weather" msgid "Weather"
msgstr "Počasí" msgstr "Počasí"
@@ -1029,7 +1029,7 @@ msgstr "Počasí"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:291 #: js/ui/dateMenu.js:289
#, javascript-format #, javascript-format
msgid "%s all day." msgid "%s all day."
msgstr "%s celý den." msgstr "%s celý den."
@@ -1038,7 +1038,7 @@ msgstr "%s celý den."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:297 #: js/ui/dateMenu.js:295
#, javascript-format #, javascript-format
msgid "%s, then %s later." msgid "%s, then %s later."
msgstr "%s, později %s." msgstr "%s, později %s."
@@ -1047,30 +1047,30 @@ msgstr "%s, později %s."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:303 #: js/ui/dateMenu.js:301
#, javascript-format #, javascript-format
msgid "%s, then %s, followed by %s later." msgid "%s, then %s, followed by %s later."
msgstr "%s, pak %s a později %s." msgstr "%s, pak %s a později %s."
#: js/ui/dateMenu.js:314 #: js/ui/dateMenu.js:312
msgid "Select a location…" msgid "Select a location…"
msgstr "Vybrat místo…" msgstr "Vybrat místo…"
#: js/ui/dateMenu.js:317 #: js/ui/dateMenu.js:315
msgid "Loading…" msgid "Loading…"
msgstr "Načítá se…" msgstr "Načítá se…"
#. Translators: %s is a temperature with unit, e.g. "23℃" #. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:321
#, javascript-format #, javascript-format
msgid "Feels like %s." msgid "Feels like %s."
msgstr "Pocitově jako %s." msgstr "Pocitově jako %s."
#: js/ui/dateMenu.js:326 #: js/ui/dateMenu.js:324
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Připojit se kvůli informacím o počasí" msgstr "Připojit se kvůli informacím o počasí"
#: js/ui/dateMenu.js:328 #: js/ui/dateMenu.js:326
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Informace o počasí nejsou nyní dostupné" msgstr "Informace o počasí nejsou nyní dostupné"
@@ -1986,16 +1986,16 @@ msgstr "Uspat do paměti"
msgid "Power Off" msgid "Power Off"
msgstr "Vypnout" msgstr "Vypnout"
#: js/ui/status/thunderbolt.js:294 #: js/ui/status/thunderbolt.js:272
msgid "Thunderbolt" msgid "Thunderbolt"
msgstr "Thunderbolt" msgstr "Thunderbolt"
#. we are done #. we are done
#: js/ui/status/thunderbolt.js:350 #: js/ui/status/thunderbolt.js:328
msgid "Unknown Thunderbolt device" msgid "Unknown Thunderbolt device"
msgstr "Neznámé zařízení Thunderbolt" msgstr "Neznámé zařízení Thunderbolt"
#: js/ui/status/thunderbolt.js:351 #: js/ui/status/thunderbolt.js:329
msgid "" msgid ""
"New device has been detected while you were away. Please disconnect and " "New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it." "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 " "Zatímco jste byli pryč, bylo nalezeno nové zařízení. Odpojte jej prosím a "
"znovu připojte, abyste jej mohli používat." "znovu připojte, abyste jej mohli používat."
#: js/ui/status/thunderbolt.js:356 #: js/ui/status/thunderbolt.js:334
msgid "Thunderbolt authorization error" msgid "Thunderbolt authorization error"
msgstr "Chyba ověření Thunderbolt" msgstr "Chyba ověření Thunderbolt"
#: js/ui/status/thunderbolt.js:357 #: js/ui/status/thunderbolt.js:335
#, javascript-format #, 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" msgstr "Nezdařilo se provést ověření zařízení Thunderbolt: %s"
#: js/ui/status/volume.js:128 #: js/ui/status/volume.js:128
@@ -2233,3 +2233,15 @@ msgstr[2] "%u vstupů"
#: subprojects/gvc/gvc-mixer-control.c:2738 #: subprojects/gvc/gvc-mixer-control.c:2738
msgid "System Sounds" msgid "System Sounds"
msgstr "Systémové zvuky" 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"

View File

@@ -9,8 +9,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell.master\n" "Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-04-13 19:54+0000\n" "POT-Creation-Date: 2018-02-22 09:24+0000\n"
"PO-Revision-Date: 2018-04-25 12:54+0200\n" "PO-Revision-Date: 2018-02-23 08:26+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: es <gnome-es-list@gnome.org>\n" "Language-Team: es <gnome-es-list@gnome.org>\n"
"Language: es\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:" msgstr "Hubo un error al lanzar el diálogo de preferencias para %s:"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
msgid "Cancel" msgid "Cancel"
@@ -665,12 +665,12 @@ msgstr "Añadir a los favoritos"
msgid "Show Details" msgid "Show Details"
msgstr "Mostrar detalles" msgstr "Mostrar detalles"
#: js/ui/appFavorites.js:140 #: js/ui/appFavorites.js:138
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "Se ha añadido %s a sus favoritos." msgstr "Se ha añadido %s a sus favoritos."
#: js/ui/appFavorites.js:174 #: js/ui/appFavorites.js:172
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "Se ha quitado %s de sus favoritos." msgstr "Se ha quitado %s de sus favoritos."
@@ -865,7 +865,7 @@ msgstr "Dispositivo externo desconectado"
msgid "Open with %s" msgid "Open with %s"
msgstr "Abrir con %s" msgstr "Abrir con %s"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
msgid "Password:" msgid "Password:"
msgstr "Contraseña:" msgstr "Contraseña:"
@@ -953,15 +953,15 @@ msgstr "Se requiere una contraseña para conectarse a «%s»."
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestor de la red" msgstr "Gestor de la red"
#: js/ui/components/polkitAgent.js:48 #: js/ui/components/polkitAgent.js:43
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Se necesita autenticación" msgstr "Se necesita autenticación"
#: js/ui/components/polkitAgent.js:76 #: js/ui/components/polkitAgent.js:71
msgid "Administrator" msgid "Administrator"
msgstr "Administrador" msgstr "Administrador"
#: js/ui/components/polkitAgent.js:156 #: js/ui/components/polkitAgent.js:151
msgid "Authenticate" msgid "Authenticate"
msgstr "Autenticar" msgstr "Autenticar"
@@ -969,7 +969,7 @@ msgstr "Autenticar"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Eso no ha funcionado. Inténtelo de nuevo." msgstr "Eso no ha funcionado. Inténtelo de nuevo."
@@ -1017,7 +1017,7 @@ msgstr "Añadir relojes del mundo…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Relojes del mundo" msgstr "Relojes del mundo"
#: js/ui/dateMenu.js:227 #: js/ui/dateMenu.js:225
msgid "Weather" msgid "Weather"
msgstr "Meteorología" msgstr "Meteorología"
@@ -1025,7 +1025,7 @@ msgstr "Meteorología"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:291 #: js/ui/dateMenu.js:289
#, javascript-format #, javascript-format
msgid "%s all day." msgid "%s all day."
msgstr "%s todo el día." 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 #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:297 #: js/ui/dateMenu.js:295
#, javascript-format #, javascript-format
msgid "%s, then %s later." msgid "%s, then %s later."
msgstr "%s, luego %s." msgstr "%s, luego %s."
@@ -1043,30 +1043,30 @@ msgstr "%s, luego %s."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:303 #: js/ui/dateMenu.js:301
#, javascript-format #, javascript-format
msgid "%s, then %s, followed by %s later." msgid "%s, then %s, followed by %s later."
msgstr "%s, luego %s seguido de %s." msgstr "%s, luego %s seguido de %s."
#: js/ui/dateMenu.js:314 #: js/ui/dateMenu.js:312
msgid "Select a location…" msgid "Select a location…"
msgstr "Seleccionar ubicación…" msgstr "Seleccionar ubicación…"
#: js/ui/dateMenu.js:317 #: js/ui/dateMenu.js:315
msgid "Loading…" msgid "Loading…"
msgstr "Cargando…" msgstr "Cargando…"
#. Translators: %s is a temperature with unit, e.g. "23℃" #. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:321
#, javascript-format #, javascript-format
msgid "Feels like %s." msgid "Feels like %s."
msgstr "Sensación térmica de %s." msgstr "Sensación térmica de %s."
#: js/ui/dateMenu.js:326 #: js/ui/dateMenu.js:324
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Conectarse para obtener la información meteorológica" msgstr "Conectarse para obtener la información meteorológica"
#: js/ui/dateMenu.js:328 #: js/ui/dateMenu.js:326
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "La información meteorológica no está disponible actualmente." msgstr "La información meteorológica no está disponible actualmente."
@@ -1968,16 +1968,16 @@ msgstr "Suspender"
msgid "Power Off" msgid "Power Off"
msgstr "Apagar" msgstr "Apagar"
#: js/ui/status/thunderbolt.js:294 #: js/ui/status/thunderbolt.js:272
msgid "Thunderbolt" msgid "Thunderbolt"
msgstr "Thunderbolt" msgstr "Thunderbolt"
#. we are done #. we are done
#: js/ui/status/thunderbolt.js:350 #: js/ui/status/thunderbolt.js:328
msgid "Unknown Thunderbolt device" msgid "Unknown Thunderbolt device"
msgstr "Dispositivo Thunderbolt desconocido" msgstr "Dispositivo Thunderbolt desconocido"
#: js/ui/status/thunderbolt.js:351 #: js/ui/status/thunderbolt.js:329
msgid "" msgid ""
"New device has been detected while you were away. Please disconnect and " "New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it." "reconnect the device to start using it."
@@ -1985,14 +1985,13 @@ msgstr ""
"Se ha detectado un dispositivo nuevo mientras estaba fuera. Desconéctelo y " "Se ha detectado un dispositivo nuevo mientras estaba fuera. Desconéctelo y "
"vuélvalo a conectar para empezar a usarlo." "vuélvalo a conectar para empezar a usarlo."
#: js/ui/status/thunderbolt.js:356 #: js/ui/status/thunderbolt.js:334
msgid "Thunderbolt authorization error" msgid "Thunderbolt authorization error"
msgstr "Error de autorización de Thunderbolt" msgstr "Error de autorización de Thunderbolt"
#: js/ui/status/thunderbolt.js:357 #: js/ui/status/thunderbolt.js:335
#, javascript-format #, 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" msgstr "No se pudo autorizar el dispositivo Thunderbolt: %s"
#: js/ui/status/volume.js:128 #: js/ui/status/volume.js:128

368
po/fur.po

File diff suppressed because it is too large Load Diff

418
po/gl.po

File diff suppressed because it is too large Load Diff

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-04-13 19:54+0000\n" "POT-Creation-Date: 2018-02-26 17:00+0000\n"
"PO-Revision-Date: 2018-04-16 14:30+0200\n" "PO-Revision-Date: 2018-03-07 22:46+0100\n"
"Last-Translator: gogo <trebelnik2@gmail.com>\n" "Last-Translator: gogo <trebelnik2@gmail.com>\n"
"Language-Team: Croatian <hr@li.org>\n" "Language-Team: Croatian <hr@li.org>\n"
"Language: hr\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:" msgstr "Dogodila se greška učitavanja dijaloga osobitosti za %s:"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
msgid "Cancel" msgid "Cancel"
@@ -663,12 +663,12 @@ msgstr "Dodaj u omiljene"
msgid "Show Details" msgid "Show Details"
msgstr "Prikaži pojedinosti" msgstr "Prikaži pojedinosti"
#: js/ui/appFavorites.js:140 #: js/ui/appFavorites.js:138
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s je dodan u omiljene." msgstr "%s je dodan u omiljene."
#: js/ui/appFavorites.js:174 #: js/ui/appFavorites.js:172
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s je uklonjen iz omiljenih." msgstr "%s je uklonjen iz omiljenih."
@@ -863,7 +863,7 @@ msgstr "Vanjski uređaj odspojen"
msgid "Open with %s" msgid "Open with %s"
msgstr "Otvori s(a) %s" msgstr "Otvori s(a) %s"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
msgid "Password:" msgid "Password:"
msgstr "Lozinka:" msgstr "Lozinka:"
@@ -950,15 +950,15 @@ msgstr "Potrebna je lozinka za povezivanje s “%s”."
msgid "Network Manager" msgid "Network Manager"
msgstr "Mrežni upravitelj" msgstr "Mrežni upravitelj"
#: js/ui/components/polkitAgent.js:48 #: js/ui/components/polkitAgent.js:43
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Potrebna je ovjera" msgstr "Potrebna je ovjera"
#: js/ui/components/polkitAgent.js:76 #: js/ui/components/polkitAgent.js:71
msgid "Administrator" msgid "Administrator"
msgstr "Administrator" msgstr "Administrator"
#: js/ui/components/polkitAgent.js:156 #: js/ui/components/polkitAgent.js:151
msgid "Authenticate" msgid "Authenticate"
msgstr "Ovjeri" msgstr "Ovjeri"
@@ -966,7 +966,7 @@ msgstr "Ovjeri"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Nažalost, to ne radi. Pokušajte ponovno." msgstr "Nažalost, to ne radi. Pokušajte ponovno."
@@ -1014,7 +1014,7 @@ msgstr "Dodaj satove iz svijeta…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Svjetski satovi" msgstr "Svjetski satovi"
#: js/ui/dateMenu.js:227 #: js/ui/dateMenu.js:225
msgid "Weather" msgid "Weather"
msgstr "Vrijeme" msgstr "Vrijeme"
@@ -1022,7 +1022,7 @@ msgstr "Vrijeme"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:291 #: js/ui/dateMenu.js:289
#, javascript-format #, javascript-format
msgid "%s all day." msgid "%s all day."
msgstr "%s cijeli dan." msgstr "%s cijeli dan."
@@ -1031,7 +1031,7 @@ msgstr "%s cijeli dan."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:297 #: js/ui/dateMenu.js:295
#, javascript-format #, javascript-format
msgid "%s, then %s later." msgid "%s, then %s later."
msgstr "%s, zatim %s kasnije." msgstr "%s, zatim %s kasnije."
@@ -1040,30 +1040,30 @@ msgstr "%s, zatim %s kasnije."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:303 #: js/ui/dateMenu.js:301
#, javascript-format #, javascript-format
msgid "%s, then %s, followed by %s later." msgid "%s, then %s, followed by %s later."
msgstr "%s, zatim %s, praćena s %s kasnije." msgstr "%s, zatim %s, praćena s %s kasnije."
#: js/ui/dateMenu.js:314 #: js/ui/dateMenu.js:312
msgid "Select a location…" msgid "Select a location…"
msgstr "Odaberi lokaciju…" msgstr "Odaberi lokaciju…"
#: js/ui/dateMenu.js:317 #: js/ui/dateMenu.js:315
msgid "Loading…" msgid "Loading…"
msgstr "Pretraživanje…" msgstr "Pretraživanje…"
#. Translators: %s is a temperature with unit, e.g. "23℃" #. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:321
#, javascript-format #, javascript-format
msgid "Feels like %s." msgid "Feels like %s."
msgstr "Kao da je %s." msgstr "Kao da je %s."
#: js/ui/dateMenu.js:326 #: js/ui/dateMenu.js:324
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Posjetite za opširnije vremenske informacije" msgstr "Posjetite za opširnije vremenske informacije"
#: js/ui/dateMenu.js:328 #: js/ui/dateMenu.js:326
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Vremenske informacije su trenutno nedostupne" msgstr "Vremenske informacije su trenutno nedostupne"
@@ -1977,16 +1977,16 @@ msgstr "Suspendiraj"
msgid "Power Off" msgid "Power Off"
msgstr "Isključivanje" msgstr "Isključivanje"
#: js/ui/status/thunderbolt.js:294 #: js/ui/status/thunderbolt.js:272
msgid "Thunderbolt" msgid "Thunderbolt"
msgstr "Thunderbolt" msgstr "Thunderbolt"
#. we are done #. we are done
#: js/ui/status/thunderbolt.js:350 #: js/ui/status/thunderbolt.js:328
msgid "Unknown Thunderbolt device" msgid "Unknown Thunderbolt device"
msgstr "Nepoznati Thunderbolt uređaj" msgstr "Nepoznati Thunderbolt uređaj"
#: js/ui/status/thunderbolt.js:351 #: js/ui/status/thunderbolt.js:329
msgid "" msgid ""
"New device has been detected while you were away. Please disconnect and " "New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it." "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 " "Otkriven je novi uređaj dok ste bili odsutni. Odspojite i ponovno spojite "
"uređaj kako bi ga mogli koristiti." "uređaj kako bi ga mogli koristiti."
#: js/ui/status/thunderbolt.js:356 #: js/ui/status/thunderbolt.js:334
msgid "Thunderbolt authorization error" msgid "Thunderbolt authorization error"
msgstr "Greška Thunderbolt odobravanja" msgstr "Greška Thunderbolt ovjere"
#: js/ui/status/thunderbolt.js:357 #: js/ui/status/thunderbolt.js:335
#, javascript-format #, javascript-format
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the thunderbolt device: %s"
msgstr "Nemoguće odobravanje Thunderbolt uređaja: %s" msgstr "Nemoguća ovjera Thunderbolt uređaja: %s"
#: js/ui/status/volume.js:128 #: js/ui/status/volume.js:128
msgid "Volume changed" msgid "Volume changed"

368
po/id.po

File diff suppressed because it is too large Load Diff

1595
po/oc.po

File diff suppressed because it is too large Load Diff

453
po/ro.po

File diff suppressed because it is too large Load Diff

View File

@@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-04-17 15:11+0000\n" "POT-Creation-Date: 2018-03-18 10:36+0000\n"
"PO-Revision-Date: 2018-04-17 18:32+0200\n" "PO-Revision-Date: 2018-03-19 21:42+0100\n"
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n" "Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n" "Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
"Language: sl\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" msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr "" msgstr ""
"Omogoči dostop do orodij razvijalcev in preizkuševalcev programske opreme " "Omogoči dostop do orodij razvijalcev in preizkuševalcev programske opreme "
"prek vnosnega polja Alt-F2." "preko Alt-F2 vnosnega polja."
#: data/org.gnome.shell.gschema.xml.in:9 #: data/org.gnome.shell.gschema.xml.in:9
msgid "" msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 " "Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog." "dialog."
msgstr "" msgstr ""
"Dovoli dostop do razhroščevanja in drugih orodij nadzora prek vnosnega polja " "Dovoli dostop do razhroščevanja in drugih orodij nadzora preko Alt-F2 "
"Alt-F2." "vnosnega polja."
#: data/org.gnome.shell.gschema.xml.in:16 #: data/org.gnome.shell.gschema.xml.in:16
msgid "UUIDs of extensions to enable" msgid "UUIDs of extensions to enable"
msgstr "Določila razširitev UUID, ki bodo omogočene" msgstr "Določila UUID razširitev, ki bodo omogočene"
#: data/org.gnome.shell.gschema.xml.in:17 #: data/org.gnome.shell.gschema.xml.in:17
msgid "" msgid ""
@@ -87,9 +87,10 @@ msgid ""
"list. You can also manipulate this list with the EnableExtension and " "list. You can also manipulate this list with the EnableExtension and "
"DisableExtension D-Bus methods on org.gnome.Shell." "DisableExtension D-Bus methods on org.gnome.Shell."
msgstr "" msgstr ""
"Razširitve lupine GNOME imajo nastavljeno določilo UUID; ključ določa seznam " "Razširitve lupine GNOME imajo določila UUID; ključ določa seznam razširitev, "
"razširitev, ki naj bodo naložene ob zagonu. Upravljanje seznama je mogoče " "ki bodo naložene. Razširitev, ki se naj naloži, mora biti zavedena na tem "
"tudi prek vodila D-BUs na org.gnome.Shell." "seznamu. Upravljanje seznama je mogoče tudi preko vodila D-BUs na org.gnome."
"Shell."
#: data/org.gnome.shell.gschema.xml.in:26 #: data/org.gnome.shell.gschema.xml.in:26
msgid "Disable user extensions" msgid "Disable user extensions"
@@ -114,8 +115,8 @@ msgid ""
"load all extensions regardless of the versions they claim to support." "load all extensions regardless of the versions they claim to support."
msgstr "" msgstr ""
"Lupina GNOME naloži le razširitve, ki so skladne z nameščeno različico. " "Lupina GNOME naloži le razširitve, ki so skladne z nameščeno različico. "
"Izbrana možnost onemogoči preverjanje, zato so lahko naložene tudi " "Izbrana možnost onemogoči preverjanje skladnosti, zato so lahko naložene "
"razširitve, katerih skladnost ni potrjena." "tudi razširitve, katerih skladnost ni potrjena."
#: data/org.gnome.shell.gschema.xml.in:43 #: data/org.gnome.shell.gschema.xml.in:43
msgid "List of desktop file IDs for favorite applications" msgid "List of desktop file IDs for favorite applications"
@@ -126,7 +127,7 @@ msgid ""
"The applications corresponding to these identifiers will be displayed in the " "The applications corresponding to these identifiers will be displayed in the "
"favorites area." "favorites area."
msgstr "" msgstr ""
"Programi, ki ustrezajo določilom, bodo prikazani v polju priljubljenih " "Programi določeni s temi določili bodo prikazani v območju priljubljenih "
"programov" "programov"
#: data/org.gnome.shell.gschema.xml.in:51 #: data/org.gnome.shell.gschema.xml.in:51
@@ -144,18 +145,18 @@ msgstr "Zgodovina pogovornega okna ukazov (Alt-F2)"
#. Translators: looking glass is a debugger and inspector tool, see https://wiki.gnome.org/Projects/GnomeShell/LookingGlass #. 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 #: data/org.gnome.shell.gschema.xml.in:63
msgid "History for the looking glass dialog" msgid "History for the looking glass dialog"
msgstr "Zgodovina za pogovorno okno povečevala" msgstr "Zgodovina za pogovorno okno povečevalnega stekla"
#: data/org.gnome.shell.gschema.xml.in:67 #: data/org.gnome.shell.gschema.xml.in:67
msgid "Always show the “Log out” menu item in the user menu." msgid "Always show the “Log out” menu item in the user menu."
msgstr "Vedno pokaži možnost »Odjave« v uporabniškem meniju." msgstr "Vedno pokaži možnost »Odjava« v uporabniškem meniju."
#: data/org.gnome.shell.gschema.xml.in:68 #: data/org.gnome.shell.gschema.xml.in:68
msgid "" msgid ""
"This key overrides the automatic hiding of the “Log out” menu item in single-" "This key overrides the automatic hiding of the “Log out” menu item in single-"
"user, single-session situations." "user, single-session situations."
msgstr "" msgstr ""
"Izbira prepiše možnost samodejnega skrivanja gumba za »Odjavo« na sistemskem " "Izbira prepiše možnost samodejnega skrivanja predmeta »Odjava« na sistemskem "
"meniju pri eno-uporabniškem in eno-sejnem zagonu." "meniju pri eno-uporabniškem in eno-sejnem zagonu."
#: data/org.gnome.shell.gschema.xml.in:75 #: data/org.gnome.shell.gschema.xml.in:75
@@ -173,8 +174,8 @@ msgid ""
"state of the checkbox." "state of the checkbox."
msgstr "" msgstr ""
"Za priklop oddaljenega datotečnega sistema ali šifrirane naprave bo po " "Za priklop oddaljenega datotečnega sistema ali šifrirane naprave bo po "
"izbiri podana zahteva za vnos gesla. Na pogovornem oknu bo prikazana tudi " "izbiri možnosti zahtevano geslo. Na pogovornem oknu bo prikazana možnost "
"možnost »Shrani geslo«. Ta možnost določa privzeto stanje izbirnega polja." "»Shrani geslo«. Ta možnost določa privzeto stanje izbirnega polja."
#: data/org.gnome.shell.gschema.xml.in:85 #: data/org.gnome.shell.gschema.xml.in:85
msgid "" msgid ""
@@ -332,7 +333,7 @@ msgid "There was an error loading the preferences dialog for %s:"
msgstr "Prišlo je do napake med nalaganjem pogovornega okna z možnostmi za %s:" 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/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
msgid "Cancel" msgid "Cancel"
@@ -663,12 +664,12 @@ msgstr "Dodaj med priljubljene"
msgid "Show Details" msgid "Show Details"
msgstr "Pokaži besedilo" msgstr "Pokaži besedilo"
#: js/ui/appFavorites.js:140 #: js/ui/appFavorites.js:138
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "Program »%s« je dodan med priljubljeno." msgstr "Program »%s« je dodan med priljubljeno."
#: js/ui/appFavorites.js:174 #: js/ui/appFavorites.js:172
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "Program »%s« je odstranjen iz priljubljenih." msgstr "Program »%s« je odstranjen iz priljubljenih."
@@ -839,7 +840,7 @@ msgid ""
"You may choose to wait a short while for it to continue or force the " "You may choose to wait a short while for it to continue or force the "
"application to quit entirely." "application to quit entirely."
msgstr "" msgstr ""
"Lahko počakate, če se program morda začne spet odzivati, lahko pa vsilite " "Lahko še malo počakate, če začne morda program spet delovati, ali pa vsilite "
"končanje delovanja." "končanje delovanja."
#: js/ui/closeDialog.js:61 #: js/ui/closeDialog.js:61
@@ -863,13 +864,13 @@ msgstr "Zunanji pogon je odklopljen"
msgid "Open with %s" msgid "Open with %s"
msgstr "Odpri s programom %s" msgstr "Odpri s programom %s"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
msgid "Password:" msgid "Password:"
msgstr "Geslo:" msgstr "Geslo:"
#: js/ui/components/keyring.js:140 #: js/ui/components/keyring.js:140
msgid "Type again:" msgid "Type again:"
msgstr "Ponovni vpis:" msgstr "Vpišite znova:"
#: js/ui/components/networkAgent.js:112 js/ui/status/network.js:245 #: js/ui/components/networkAgent.js:112 js/ui/status/network.js:245
#: js/ui/status/network.js:336 js/ui/status/network.js:922 #: js/ui/status/network.js:336 js/ui/status/network.js:922
@@ -886,19 +887,19 @@ msgstr "Geslo:"
#. static WEP #. static WEP
#: js/ui/components/networkAgent.js:210 #: js/ui/components/networkAgent.js:210
msgid "Key: " msgid "Key: "
msgstr "Ključ: " msgstr "Ključ:"
#: js/ui/components/networkAgent.js:249 #: js/ui/components/networkAgent.js:249
msgid "Identity: " msgid "Identity: "
msgstr "_Istovetnost: " msgstr "_Istovetnost:"
#: js/ui/components/networkAgent.js:251 #: js/ui/components/networkAgent.js:251
msgid "Private key password: " msgid "Private key password: "
msgstr "Geslo zasebnega ključa: " msgstr "Geslo zasebnega ključa:"
#: js/ui/components/networkAgent.js:263 #: js/ui/components/networkAgent.js:263
msgid "Service: " msgid "Service: "
msgstr "Storitev: " msgstr "Storitev:"
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659 #: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
@@ -919,7 +920,7 @@ msgstr "Žična overitev 802.1X"
#: js/ui/components/networkAgent.js:299 #: js/ui/components/networkAgent.js:299
msgid "Network name: " msgid "Network name: "
msgstr "Naziv omrežja: " msgstr "Naziv omrežja:"
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667 #: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667
msgid "DSL authentication" msgid "DSL authentication"
@@ -951,15 +952,15 @@ msgstr "Za povezavo z omrežjem »%s« je zahtevano geslo."
msgid "Network Manager" msgid "Network Manager"
msgstr "Upravljalnik omrežij" msgstr "Upravljalnik omrežij"
#: js/ui/components/polkitAgent.js:48 #: js/ui/components/polkitAgent.js:43
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Zahtevana je overitev" msgstr "Zahtevana je overitev"
#: js/ui/components/polkitAgent.js:76 #: js/ui/components/polkitAgent.js:71
msgid "Administrator" msgid "Administrator"
msgstr "Skrbnik" msgstr "Skrbnik"
#: js/ui/components/polkitAgent.js:156 #: js/ui/components/polkitAgent.js:151
msgid "Authenticate" msgid "Authenticate"
msgstr "Overi" msgstr "Overi"
@@ -967,7 +968,7 @@ msgstr "Overi"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Overitev je spodletela.. Poskusite znova." msgstr "Overitev je spodletela.. Poskusite znova."
@@ -1015,7 +1016,7 @@ msgstr "Dodaj svetovni čas ..."
msgid "World Clocks" msgid "World Clocks"
msgstr "Svetovni časi" msgstr "Svetovni časi"
#: js/ui/dateMenu.js:227 #: js/ui/dateMenu.js:225
msgid "Weather" msgid "Weather"
msgstr "Vreme" msgstr "Vreme"
@@ -1023,7 +1024,7 @@ msgstr "Vreme"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:291 #: js/ui/dateMenu.js:289
#, javascript-format #, javascript-format
msgid "%s all day." msgid "%s all day."
msgstr "%s ves dan." msgstr "%s ves dan."
@@ -1032,7 +1033,7 @@ msgstr "%s ves dan."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:297 #: js/ui/dateMenu.js:295
#, javascript-format #, javascript-format
msgid "%s, then %s later." msgid "%s, then %s later."
msgstr "%s, sledi %s." msgstr "%s, sledi %s."
@@ -1041,30 +1042,30 @@ msgstr "%s, sledi %s."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:303 #: js/ui/dateMenu.js:301
#, javascript-format #, javascript-format
msgid "%s, then %s, followed by %s later." msgid "%s, then %s, followed by %s later."
msgstr "%s, sledi %s, kasneje tudi %s." msgstr "%s, sledi %s, kasneje tudi %s."
#: js/ui/dateMenu.js:314 #: js/ui/dateMenu.js:312
msgid "Select a location…" msgid "Select a location…"
msgstr "Izbor mesta ..." msgstr "Izbor mesta ..."
#: js/ui/dateMenu.js:317 #: js/ui/dateMenu.js:315
msgid "Loading…" msgid "Loading…"
msgstr "Poteka nalaganje ..." msgstr "Poteka nalaganje ..."
#. Translators: %s is a temperature with unit, e.g. "23℃" #. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:321
#, javascript-format #, javascript-format
msgid "Feels like %s." msgid "Feels like %s."
msgstr "Občuti se kot %s." msgstr "Občuti se kot %s."
#: js/ui/dateMenu.js:326 #: js/ui/dateMenu.js:324
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Preglej splet za podrobnosti o vremenu." msgstr "Preglej splet za podrobnosti o vremenu."
#: js/ui/dateMenu.js:328 #: js/ui/dateMenu.js:326
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Podatki o vremenu trenutno niso na voljo." msgstr "Podatki o vremenu trenutno niso na voljo."
@@ -2013,8 +2014,8 @@ msgstr "Napaka overitve naprave Thunderbolt"
#: js/ui/status/thunderbolt.js:357 #: js/ui/status/thunderbolt.js:357
#, javascript-format #, javascript-format
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the thunderbolt device: %s"
msgstr "Naprave Thunderbolt ni mogoče overiti: %s" msgstr "Naprave thunderbolt ni mogoče overiti: %s"
#: js/ui/status/volume.js:128 #: js/ui/status/volume.js:128
msgid "Volume changed" msgid "Volume changed"

View File

@@ -11,8 +11,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-04-13 19:54+0000\n" "POT-Creation-Date: 2018-02-21 14:13+0000\n"
"PO-Revision-Date: 2018-05-20 19:24+0200\n" "PO-Revision-Date: 2018-02-22 15:56+0100\n"
"Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n" "Last-Translator: Anders Jonsson <anders.jonsson@norsjovallen.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n" "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
"Language: sv\n" "Language: sv\n"
@@ -20,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.0.7\n" "X-Generator: Poedit 2.0.6\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
msgid "System" 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:" 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/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
msgid "Cancel" msgid "Cancel"
@@ -652,12 +652,12 @@ msgstr "Lägg till som favorit"
msgid "Show Details" msgid "Show Details"
msgstr "Visa detaljer" msgstr "Visa detaljer"
#: js/ui/appFavorites.js:140 #: js/ui/appFavorites.js:138
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s har lagts till i dina favoriter." msgstr "%s har lagts till i dina favoriter."
#: js/ui/appFavorites.js:174 #: js/ui/appFavorites.js:172
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s har tagits bort från dina favoriter." msgstr "%s har tagits bort från dina favoriter."
@@ -852,7 +852,7 @@ msgstr "Extern disk frånkopplad"
msgid "Open with %s" msgid "Open with %s"
msgstr "Öppna med %s" msgstr "Öppna med %s"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
msgid "Password:" msgid "Password:"
msgstr "Lösenord:" msgstr "Lösenord:"
@@ -940,15 +940,15 @@ msgstr "Ett lösenord krävs för att ansluta till ”%s”."
msgid "Network Manager" msgid "Network Manager"
msgstr "Nätverkshanterare" msgstr "Nätverkshanterare"
#: js/ui/components/polkitAgent.js:48 #: js/ui/components/polkitAgent.js:43
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Autentisering krävs" msgstr "Autentisering krävs"
#: js/ui/components/polkitAgent.js:76 #: js/ui/components/polkitAgent.js:71
msgid "Administrator" msgid "Administrator"
msgstr "Administratör" msgstr "Administratör"
#: js/ui/components/polkitAgent.js:156 #: js/ui/components/polkitAgent.js:151
msgid "Authenticate" msgid "Authenticate"
msgstr "Autentisera" msgstr "Autentisera"
@@ -956,7 +956,7 @@ msgstr "Autentisera"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "Tyvärr, det fungerade inte. Försök igen." msgstr "Tyvärr, det fungerade inte. Försök igen."
@@ -1004,7 +1004,7 @@ msgstr "Lägg till världsklockor…"
msgid "World Clocks" msgid "World Clocks"
msgstr "Världsklockor" msgstr "Världsklockor"
#: js/ui/dateMenu.js:227 #: js/ui/dateMenu.js:225
msgid "Weather" msgid "Weather"
msgstr "Väder" msgstr "Väder"
@@ -1012,7 +1012,7 @@ msgstr "Väder"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:291 #: js/ui/dateMenu.js:289
#, javascript-format #, javascript-format
msgid "%s all day." msgid "%s all day."
msgstr "%s hela dagen." msgstr "%s hela dagen."
@@ -1021,7 +1021,7 @@ msgstr "%s hela dagen."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:297 #: js/ui/dateMenu.js:295
#, javascript-format #, javascript-format
msgid "%s, then %s later." msgid "%s, then %s later."
msgstr "%s, sedan %s senare." msgstr "%s, sedan %s senare."
@@ -1030,30 +1030,30 @@ msgstr "%s, sedan %s senare."
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:303 #: js/ui/dateMenu.js:301
#, javascript-format #, javascript-format
msgid "%s, then %s, followed by %s later." msgid "%s, then %s, followed by %s later."
msgstr "%s, sedan %s, följt av %s senare." msgstr "%s, sedan %s, följt av %s senare."
#: js/ui/dateMenu.js:314 #: js/ui/dateMenu.js:312
msgid "Select a location…" msgid "Select a location…"
msgstr "Välj en plats…" msgstr "Välj en plats…"
#: js/ui/dateMenu.js:317 #: js/ui/dateMenu.js:315
msgid "Loading…" msgid "Loading…"
msgstr "Läser in…" msgstr "Läser in…"
#. Translators: %s is a temperature with unit, e.g. "23℃" #. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:321
#, javascript-format #, javascript-format
msgid "Feels like %s." msgid "Feels like %s."
msgstr "Känns som %s." msgstr "Känns som %s."
#: js/ui/dateMenu.js:326 #: js/ui/dateMenu.js:324
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "Anslut till nätet för väderinformation" msgstr "Anslut till nätet för väderinformation"
#: js/ui/dateMenu.js:328 #: js/ui/dateMenu.js:326
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "Väderinformation är för närvarande inte tillgänglig" msgstr "Väderinformation är för närvarande inte tillgänglig"
@@ -1953,16 +1953,16 @@ msgstr "Vänteläge"
msgid "Power Off" msgid "Power Off"
msgstr "Stäng av" msgstr "Stäng av"
#: js/ui/status/thunderbolt.js:294 #: js/ui/status/thunderbolt.js:272
msgid "Thunderbolt" msgid "Thunderbolt"
msgstr "Thunderbolt" msgstr "Thunderbolt"
#. we are done #. we are done
#: js/ui/status/thunderbolt.js:350 #: js/ui/status/thunderbolt.js:328
msgid "Unknown Thunderbolt device" msgid "Unknown Thunderbolt device"
msgstr "Okänd Thunderbolt-enhet" msgstr "Okänd Thunderbolt-enhet"
#: js/ui/status/thunderbolt.js:351 #: js/ui/status/thunderbolt.js:329
msgid "" msgid ""
"New device has been detected while you were away. Please disconnect and " "New device has been detected while you were away. Please disconnect and "
"reconnect the device to start using it." "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 " "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." "igen för att börja använda den."
#: js/ui/status/thunderbolt.js:356 #: js/ui/status/thunderbolt.js:334
msgid "Thunderbolt authorization error" msgid "Thunderbolt authorization error"
msgstr "Thunderbolt-auktoriseringsfel" msgstr "Thunderbolt-auktoriseringsfel"
#: js/ui/status/thunderbolt.js:357 #: js/ui/status/thunderbolt.js:335
#, javascript-format #, 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" msgstr "Kunde inte auktorisera Thunderbolt-enheten: %s"
#: js/ui/status/volume.js:128 #: js/ui/status/volume.js:128

View File

@@ -23,16 +23,16 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-04-13 19:54+0000\n" "POT-Creation-Date: 2018-03-05 21:11+0000\n"
"PO-Revision-Date: 2018-05-10 12:11-0500\n" "PO-Revision-Date: 2018-02-15 01:42+0800\n"
"Last-Translator: Mingcong Bai <jeffbai@aosc.xyz>\n" "Last-Translator: Dingzhong Chen <wsxy162@gmail.com>\n"
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n" "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
"Language: zh_CN\n" "Language: zh_CN\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 2.0.6\n" "X-Generator: Gtranslator 2.91.7\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
msgid "System" msgid "System"
@@ -320,7 +320,7 @@ msgid "There was an error loading the preferences dialog for %s:"
msgstr "载入 %s 的首选项对话框时出错:" msgstr "载入 %s 的首选项对话框时出错:"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
msgid "Cancel" msgid "Cancel"
@@ -631,12 +631,12 @@ msgstr "添加到收藏夹"
msgid "Show Details" msgid "Show Details"
msgstr "显示细节" msgstr "显示细节"
#: js/ui/appFavorites.js:140 #: js/ui/appFavorites.js:138
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s 已经添加到了您的收藏夹。" msgstr "%s 已经添加到了您的收藏夹。"
#: js/ui/appFavorites.js:174 #: js/ui/appFavorites.js:172
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s 已经从您的收藏夹移除。" msgstr "%s 已经从您的收藏夹移除。"
@@ -829,7 +829,7 @@ msgstr "外部驱动器已断开"
msgid "Open with %s" msgid "Open with %s"
msgstr "使用 %s 打开" msgstr "使用 %s 打开"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:295 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
msgid "Password:" msgid "Password:"
msgstr "密码:" msgstr "密码:"
@@ -915,15 +915,15 @@ msgstr "连接到“%s”需要密码。"
msgid "Network Manager" msgid "Network Manager"
msgstr "网络管理器" msgstr "网络管理器"
#: js/ui/components/polkitAgent.js:48 #: js/ui/components/polkitAgent.js:43
msgid "Authentication Required" msgid "Authentication Required"
msgstr "需要认证" msgstr "需要认证"
#: js/ui/components/polkitAgent.js:76 #: js/ui/components/polkitAgent.js:71
msgid "Administrator" msgid "Administrator"
msgstr "管理员" msgstr "管理员"
#: js/ui/components/polkitAgent.js:156 #: js/ui/components/polkitAgent.js:151
msgid "Authenticate" msgid "Authenticate"
msgstr "认证" msgstr "认证"
@@ -932,7 +932,7 @@ msgstr "认证"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:281 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "抱歉,认证失败。请重试。" msgstr "抱歉,认证失败。请重试。"
@@ -980,7 +980,7 @@ msgstr "添加世界时钟…"
msgid "World Clocks" msgid "World Clocks"
msgstr "世界时钟" msgstr "世界时钟"
#: js/ui/dateMenu.js:227 #: js/ui/dateMenu.js:225
msgid "Weather" msgid "Weather"
msgstr "天气" msgstr "天气"
@@ -988,7 +988,7 @@ msgstr "天气"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:291 #: js/ui/dateMenu.js:289
#, javascript-format #, javascript-format
msgid "%s all day." msgid "%s all day."
msgstr "全天%s。" msgstr "全天%s。"
@@ -997,7 +997,7 @@ msgstr "全天%s。"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:297 #: js/ui/dateMenu.js:295
#, javascript-format #, javascript-format
msgid "%s, then %s later." msgid "%s, then %s later."
msgstr "%s转%s。" msgstr "%s转%s。"
@@ -1006,30 +1006,30 @@ msgstr "%s转%s。"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:303 #: js/ui/dateMenu.js:301
#, javascript-format #, javascript-format
msgid "%s, then %s, followed by %s later." msgid "%s, then %s, followed by %s later."
msgstr "%s转%s随后转%s。" msgstr "%s转%s随后转%s。"
#: js/ui/dateMenu.js:314 #: js/ui/dateMenu.js:312
msgid "Select a location…" msgid "Select a location…"
msgstr "选择地点…" msgstr "选择地点…"
#: js/ui/dateMenu.js:317 #: js/ui/dateMenu.js:315
msgid "Loading…" msgid "Loading…"
msgstr "正在载入…" msgstr "正在载入…"
#. Translators: %s is a temperature with unit, e.g. "23℃" #. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:321
#, javascript-format #, javascript-format
msgid "Feels like %s." msgid "Feels like %s."
msgstr "体感温度 %s。" msgstr "体感温度 %s。"
#: js/ui/dateMenu.js:326 #: js/ui/dateMenu.js:324
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "通过互联网查看天气信息" msgstr "通过互联网查看天气信息"
#: js/ui/dateMenu.js:328 #: js/ui/dateMenu.js:326
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "天气信息目前不可用" msgstr "天气信息目前不可用"
@@ -1930,7 +1930,7 @@ msgstr "Thunderbolt 授权错误"
#: js/ui/status/thunderbolt.js:357 #: js/ui/status/thunderbolt.js:357
#, javascript-format #, javascript-format
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the thunderbolt device: %s"
msgstr "无法授权 Thunderbolt 设备:%s" msgstr "无法授权 Thunderbolt 设备:%s"
#: js/ui/status/volume.js:128 #: js/ui/status/volume.js:128

View File

@@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell 3.3.90\n" "Project-Id-Version: gnome-shell 3.3.90\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-shell/issues\n"
"POT-Creation-Date: 2018-06-08 17:30+0000\n" "POT-Creation-Date: 2018-03-05 21:11+0000\n"
"PO-Revision-Date: 2018-06-09 11:17+0800\n" "PO-Revision-Date: 2018-03-10 20:30+0800\n"
"Last-Translator: Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>\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-Team: Chinese (Taiwan) <zh-l10n@lists.linux.org.tw>\n"
"Language: zh_TW\n" "Language: zh_TW\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 2.0.8\n" "X-Generator: Poedit 2.0.6\n"
#: data/50-gnome-shell-system.xml:6 #: data/50-gnome-shell-system.xml:6
msgid "System" msgid "System"
@@ -308,7 +308,7 @@ msgid "There was an error loading the preferences dialog for %s:"
msgstr "載入 %s 的偏好設定對話盒時發生錯誤:" msgstr "載入 %s 的偏好設定對話盒時發生錯誤:"
#: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71 #: js/gdm/authPrompt.js:147 js/ui/audioDeviceSelection.js:71
#: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:153 #: js/ui/components/networkAgent.js:117 js/ui/components/polkitAgent.js:148
#: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197 #: js/ui/endSessionDialog.js:482 js/ui/extensionDownloader.js:197
#: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919 #: js/ui/shellMountOperation.js:343 js/ui/status/network.js:919
msgid "Cancel" msgid "Cancel"
@@ -328,20 +328,20 @@ msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "登入" msgstr "登入"
#: js/gdm/loginDialog.js:319 #: js/gdm/loginDialog.js:315
msgid "Choose Session" msgid "Choose Session"
msgstr "選擇工作階段" msgstr "選擇工作階段"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: js/gdm/loginDialog.js:462 #: js/gdm/loginDialog.js:458
msgid "Not listed?" msgid "Not listed?"
msgstr "沒有列出來?" msgstr "沒有列出來?"
#. Translators: this message is shown below the username entry field #. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm #. to clue the user in on how to login to the local network realm
#: js/gdm/loginDialog.js:891 #: js/gdm/loginDialog.js:887
#, javascript-format #, javascript-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(例如: user 或 %s)" msgstr "(例如: user 或 %s)"
@@ -349,12 +349,12 @@ msgstr "(例如: user 或 %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: js/gdm/loginDialog.js:896 js/ui/components/networkAgent.js:243 #: js/gdm/loginDialog.js:892 js/ui/components/networkAgent.js:243
#: js/ui/components/networkAgent.js:261 #: js/ui/components/networkAgent.js:261
msgid "Username: " msgid "Username: "
msgstr "使用者名稱:" msgstr "使用者名稱:"
#: js/gdm/loginDialog.js:1234 #: js/gdm/loginDialog.js:1228
msgid "Login Window" msgid "Login Window"
msgstr "登入視窗" msgstr "登入視窗"
@@ -601,32 +601,32 @@ msgstr "常用"
msgid "All" msgid "All"
msgstr "全部" msgstr "全部"
#: js/ui/appDisplay.js:1889 #: js/ui/appDisplay.js:1886
msgid "New Window" msgid "New Window"
msgstr "新視窗" msgstr "新視窗"
#: js/ui/appDisplay.js:1903 #: js/ui/appDisplay.js:1900
msgid "Launch using Dedicated Graphics Card" msgid "Launch using Dedicated Graphics Card"
msgstr "使用獨立顯卡啟動" msgstr "使用獨立顯卡啟動"
#: js/ui/appDisplay.js:1930 js/ui/dash.js:285 #: js/ui/appDisplay.js:1927 js/ui/dash.js:285
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "自喜好中移除" msgstr "自喜好中移除"
#: js/ui/appDisplay.js:1936 #: js/ui/appDisplay.js:1933
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "加入喜好" msgstr "加入喜好"
#: js/ui/appDisplay.js:1946 #: js/ui/appDisplay.js:1943
msgid "Show Details" msgid "Show Details"
msgstr "顯示詳細資訊" msgstr "顯示詳細資訊"
#: js/ui/appFavorites.js:140 #: js/ui/appFavorites.js:138
#, javascript-format #, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s 已加入您的喜好中。" msgstr "%s 已加入您的喜好中。"
#: js/ui/appFavorites.js:174 #: js/ui/appFavorites.js:172
#, javascript-format #, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s 已經從您的喜好中移除。" msgstr "%s 已經從您的喜好中移除。"
@@ -787,22 +787,22 @@ msgid "Clear All"
msgstr "全部清除" msgstr "全部清除"
#. Translators: %s is an application name #. Translators: %s is an application name
#: js/ui/closeDialog.js:47 #: js/ui/closeDialog.js:44
#, javascript-format #, javascript-format
msgid "“%s” is not responding." msgid "“%s” is not responding."
msgstr "「%s」沒有回應。" msgstr "「%s」沒有回應。"
#: js/ui/closeDialog.js:48 #: js/ui/closeDialog.js:45
msgid "" msgid ""
"You may choose to wait a short while for it to continue or force the " "You may choose to wait a short while for it to continue or force the "
"application to quit entirely." "application to quit entirely."
msgstr "您可以選擇再等一下讓它繼續,或是強制讓應用程式立刻退出。" msgstr "您可以選擇再等一下讓它繼續,或是強制讓應用程式立刻退出。"
#: js/ui/closeDialog.js:64 #: js/ui/closeDialog.js:61
msgid "Force Quit" msgid "Force Quit"
msgstr "強制退出" msgstr "強制退出"
#: js/ui/closeDialog.js:67 #: js/ui/closeDialog.js:64
msgid "Wait" msgid "Wait"
msgstr "等待" msgstr "等待"
@@ -819,7 +819,7 @@ msgstr "外部裝置已拔除"
msgid "Open with %s" msgid "Open with %s"
msgstr "用 %s 開啟" msgstr "用 %s 開啟"
#: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:297 #: js/ui/components/keyring.js:107 js/ui/components/polkitAgent.js:284
msgid "Password:" msgid "Password:"
msgstr "密碼: " msgstr "密碼: "
@@ -856,18 +856,18 @@ msgstr "私密金鑰密碼:"
msgid "Service: " msgid "Service: "
msgstr "服務:" msgstr "服務:"
#: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:664 #: js/ui/components/networkAgent.js:292 js/ui/components/networkAgent.js:659
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
msgstr "無線網路所需要的核對" msgstr "無線網路所需要的核對"
#: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:665 #: js/ui/components/networkAgent.js:293 js/ui/components/networkAgent.js:660
#, javascript-format #, javascript-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
"“%s”." "“%s”."
msgstr "需要密碼或是加密金鑰來存取無線網路「%s」。" msgstr "需要密碼或是加密金鑰來存取無線網路「%s」。"
#: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:668 #: js/ui/components/networkAgent.js:297 js/ui/components/networkAgent.js:663
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "有線網路 802.1X 核對" msgstr "有線網路 802.1X 核對"
@@ -875,15 +875,15 @@ msgstr "有線網路 802.1X 核對"
msgid "Network name: " msgid "Network name: "
msgstr "網路名稱:" msgstr "網路名稱:"
#: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:672 #: js/ui/components/networkAgent.js:304 js/ui/components/networkAgent.js:667
msgid "DSL authentication" msgid "DSL authentication"
msgstr "DSL 核對" msgstr "DSL 核對"
#: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:678 #: js/ui/components/networkAgent.js:311 js/ui/components/networkAgent.js:673
msgid "PIN code required" msgid "PIN code required"
msgstr "需要 PIN 碼" msgstr "需要 PIN 碼"
#: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:679 #: js/ui/components/networkAgent.js:312 js/ui/components/networkAgent.js:674
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "這個行動寬頻裝置需要 PIN 碼" msgstr "這個行動寬頻裝置需要 PIN 碼"
@@ -891,29 +891,29 @@ msgstr "這個行動寬頻裝置需要 PIN 碼"
msgid "PIN: " msgid "PIN: "
msgstr "PIN " msgstr "PIN "
#: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:685 #: js/ui/components/networkAgent.js:320 js/ui/components/networkAgent.js:680
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "行動寬頻網路密碼" msgstr "行動寬頻網路密碼"
#: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:669 #: js/ui/components/networkAgent.js:321 js/ui/components/networkAgent.js:664
#: js/ui/components/networkAgent.js:673 js/ui/components/networkAgent.js:686 #: js/ui/components/networkAgent.js:668 js/ui/components/networkAgent.js:681
#, javascript-format #, javascript-format
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "連線至「%s」需要密碼。" msgstr "連線至「%s」需要密碼。"
#: js/ui/components/networkAgent.js:653 js/ui/status/network.js:1704 #: js/ui/components/networkAgent.js:648 js/ui/status/network.js:1691
msgid "Network Manager" msgid "Network Manager"
msgstr "網路管理員" msgstr "網路管理員"
#: js/ui/components/polkitAgent.js:48 #: js/ui/components/polkitAgent.js:43
msgid "Authentication Required" msgid "Authentication Required"
msgstr "要求核對" msgstr "要求核對"
#: js/ui/components/polkitAgent.js:76 #: js/ui/components/polkitAgent.js:71
msgid "Administrator" msgid "Administrator"
msgstr "管理員" msgstr "管理員"
#: js/ui/components/polkitAgent.js:156 #: js/ui/components/polkitAgent.js:151
msgid "Authenticate" msgid "Authenticate"
msgstr "核對" msgstr "核對"
@@ -921,7 +921,7 @@ msgstr "核對"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: js/ui/components/polkitAgent.js:283 js/ui/shellMountOperation.js:327 #: js/ui/components/polkitAgent.js:270 js/ui/shellMountOperation.js:327
msgid "Sorry, that didnt work. Please try again." msgid "Sorry, that didnt work. Please try again."
msgstr "抱歉,那沒有作用。請再試一次。" msgstr "抱歉,那沒有作用。請再試一次。"
@@ -969,7 +969,7 @@ msgstr "加入世界時鐘…"
msgid "World Clocks" msgid "World Clocks"
msgstr "世界時鐘" msgstr "世界時鐘"
#: js/ui/dateMenu.js:227 #: js/ui/dateMenu.js:225
msgid "Weather" msgid "Weather"
msgstr "天氣" msgstr "天氣"
@@ -977,7 +977,7 @@ msgstr "天氣"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:291 #: js/ui/dateMenu.js:289
#, javascript-format #, javascript-format
msgid "%s all day." msgid "%s all day."
msgstr "全天%s。" msgstr "全天%s。"
@@ -986,7 +986,7 @@ msgstr "全天%s。"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:297 #: js/ui/dateMenu.js:295
#, javascript-format #, javascript-format
msgid "%s, then %s later." msgid "%s, then %s later."
msgstr "%s較晚%s。" msgstr "%s較晚%s。"
@@ -995,30 +995,30 @@ msgstr "%s較晚%s。"
#. libgweather for the possible condition strings. If at all #. libgweather for the possible condition strings. If at all
#. possible, the sentence should match the grammatical case etc. of #. possible, the sentence should match the grammatical case etc. of
#. the inserted conditions. #. the inserted conditions.
#: js/ui/dateMenu.js:303 #: js/ui/dateMenu.js:301
#, javascript-format #, javascript-format
msgid "%s, then %s, followed by %s later." msgid "%s, then %s, followed by %s later."
msgstr "%s然後%s接著較晚%s。" msgstr "%s然後%s接著較晚%s。"
#: js/ui/dateMenu.js:314 #: js/ui/dateMenu.js:312
msgid "Select a location…" msgid "Select a location…"
msgstr "選擇位置…" msgstr "選擇位置…"
#: js/ui/dateMenu.js:317 #: js/ui/dateMenu.js:315
msgid "Loading…" msgid "Loading…"
msgstr "載入中…" msgstr "載入中…"
#. Translators: %s is a temperature with unit, e.g. "23℃" #. Translators: %s is a temperature with unit, e.g. "23℃"
#: js/ui/dateMenu.js:323 #: js/ui/dateMenu.js:321
#, javascript-format #, javascript-format
msgid "Feels like %s." msgid "Feels like %s."
msgstr "體感溫度 %s。" msgstr "體感溫度 %s。"
#: js/ui/dateMenu.js:326 #: js/ui/dateMenu.js:324
msgid "Go online for weather information" msgid "Go online for weather information"
msgstr "上線以取得天氣資訊" msgstr "上線以取得天氣資訊"
#: js/ui/dateMenu.js:328 #: js/ui/dateMenu.js:326
msgid "Weather information is currently unavailable" msgid "Weather information is currently unavailable"
msgstr "天氣資訊目前不可使用" msgstr "天氣資訊目前不可使用"
@@ -1239,13 +1239,13 @@ msgid "Leave On"
msgstr "離開" msgstr "離開"
#: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143 #: js/ui/kbdA11yDialog.js:59 js/ui/status/bluetooth.js:143
#: js/ui/status/network.js:1294 #: js/ui/status/network.js:1281
msgid "Turn On" msgid "Turn On"
msgstr "開啟" msgstr "開啟"
#: js/ui/kbdA11yDialog.js:67 js/ui/status/bluetooth.js:143 #: 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:154 js/ui/status/network.js:337
#: js/ui/status/network.js:1294 js/ui/status/network.js:1409 #: js/ui/status/network.js:1281 js/ui/status/network.js:1396
#: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90 #: js/ui/status/nightLight.js:47 js/ui/status/rfkill.js:90
#: js/ui/status/rfkill.js:117 #: js/ui/status/rfkill.js:117
msgid "Turn Off" msgid "Turn Off"
@@ -1307,7 +1307,7 @@ msgstr "檢示來源"
msgid "Web Page" msgid "Web Page"
msgstr "網頁" msgstr "網頁"
#: js/ui/messageTray.js:1495 #: js/ui/messageTray.js:1493
msgid "System Information" msgid "System Information"
msgstr "系統資訊" msgstr "系統資訊"
@@ -1622,7 +1622,7 @@ msgid "<unknown>"
msgstr "<不明>" msgstr "<不明>"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:441 js/ui/status/network.js:1323 #: js/ui/status/network.js:441 js/ui/status/network.js:1310
#, javascript-format #, javascript-format
msgid "%s Off" msgid "%s Off"
msgstr "%s 關閉" msgstr "%s 關閉"
@@ -1648,7 +1648,7 @@ msgid "%s Disconnecting"
msgstr "%s 正在斷線" msgstr "%s 正在斷線"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:459 js/ui/status/network.js:1315 #: js/ui/status/network.js:459 js/ui/status/network.js:1302
#, javascript-format #, javascript-format
msgid "%s Connecting" msgid "%s Connecting"
msgstr "正連線到 %s" msgstr "正連線到 %s"
@@ -1688,7 +1688,7 @@ msgid "Mobile Broadband Settings"
msgstr "行動寬頻設定值" msgstr "行動寬頻設定值"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:578 js/ui/status/network.js:1320 #: js/ui/status/network.js:578 js/ui/status/network.js:1307
#, javascript-format #, javascript-format
msgid "%s Hardware Disabled" msgid "%s Hardware Disabled"
msgstr "%s 硬體已停用" msgstr "%s 硬體已停用"
@@ -1744,78 +1744,78 @@ msgstr "沒有網路"
msgid "Use hardware switch to turn off" msgid "Use hardware switch to turn off"
msgstr "使用硬體開關來關閉" msgstr "使用硬體開關來關閉"
#: js/ui/status/network.js:1186 #: js/ui/status/network.js:1173
msgid "Select Network" msgid "Select Network"
msgstr "選擇網路" msgstr "選擇網路"
#: js/ui/status/network.js:1192 #: js/ui/status/network.js:1179
msgid "Wi-Fi Settings" msgid "Wi-Fi Settings"
msgstr "Wi-Fi 設定值" msgstr "Wi-Fi 設定值"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1311 #: js/ui/status/network.js:1298
#, javascript-format #, javascript-format
msgid "%s Hotspot Active" msgid "%s Hotspot Active"
msgstr "%s 熱點有效" msgstr "%s 熱點有效"
#. Translators: %s is a network identifier #. Translators: %s is a network identifier
#: js/ui/status/network.js:1326 #: js/ui/status/network.js:1313
#, javascript-format #, javascript-format
msgid "%s Not Connected" msgid "%s Not Connected"
msgstr "%s 未連線" msgstr "%s 未連線"
#: js/ui/status/network.js:1426 #: js/ui/status/network.js:1413
msgid "connecting…" msgid "connecting…"
msgstr "連線中…" msgstr "連線中…"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: js/ui/status/network.js:1429 #: js/ui/status/network.js:1416
msgid "authentication required" msgid "authentication required"
msgstr "要求核對" msgstr "要求核對"
#: js/ui/status/network.js:1431 #: js/ui/status/network.js:1418
msgid "connection failed" msgid "connection failed"
msgstr "連線失敗" msgstr "連線失敗"
#: js/ui/status/network.js:1485 #: js/ui/status/network.js:1472
msgid "VPN Settings" msgid "VPN Settings"
msgstr "VPN 設定值" msgstr "VPN 設定值"
#: js/ui/status/network.js:1498 #: js/ui/status/network.js:1485
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: js/ui/status/network.js:1508 #: js/ui/status/network.js:1495
msgid "VPN Off" msgid "VPN Off"
msgstr "VPN 關閉" msgstr "VPN 關閉"
#: js/ui/status/network.js:1572 js/ui/status/rfkill.js:93 #: js/ui/status/network.js:1559 js/ui/status/rfkill.js:93
msgid "Network Settings" msgid "Network Settings"
msgstr "網路設定值" msgstr "網路設定值"
#: js/ui/status/network.js:1601 #: js/ui/status/network.js:1588
#, javascript-format #, javascript-format
msgid "%s Wired Connection" msgid "%s Wired Connection"
msgid_plural "%s Wired Connections" msgid_plural "%s Wired Connections"
msgstr[0] "%s 個有線網路連線" msgstr[0] "%s 個有線網路連線"
#: js/ui/status/network.js:1605 #: js/ui/status/network.js:1592
#, javascript-format #, javascript-format
msgid "%s Wi-Fi Connection" msgid "%s Wi-Fi Connection"
msgid_plural "%s Wi-Fi Connections" msgid_plural "%s Wi-Fi Connections"
msgstr[0] "%s 個 Wi-Fi 連線" msgstr[0] "%s 個 Wi-Fi 連線"
#: js/ui/status/network.js:1609 #: js/ui/status/network.js:1596
#, javascript-format #, javascript-format
msgid "%s Modem Connection" msgid "%s Modem Connection"
msgid_plural "%s Modem Connections" msgid_plural "%s Modem Connections"
msgstr[0] "%s 個數據機連線" msgstr[0] "%s 個數據機連線"
#: js/ui/status/network.js:1741 #: js/ui/status/network.js:1728
msgid "Connection failed" msgid "Connection failed"
msgstr "連線失敗" msgstr "連線失敗"
#: js/ui/status/network.js:1742 #: js/ui/status/network.js:1729
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "啟動網路連線失敗" msgstr "啟動網路連線失敗"
@@ -1918,7 +1918,7 @@ msgstr "Thunderbolt 授權錯誤"
#: js/ui/status/thunderbolt.js:357 #: js/ui/status/thunderbolt.js:357
#, javascript-format #, javascript-format
msgid "Could not authorize the Thunderbolt device: %s" msgid "Could not authorize the thunderbolt device: %s"
msgstr "無法授權該 Thunderbolt 裝置:%s" msgstr "無法授權該 Thunderbolt 裝置:%s"
#: js/ui/status/volume.js:128 #: js/ui/status/volume.js:128

View File

@@ -590,11 +590,6 @@ app_load_events (App *app)
g_list_free (app->live_views); g_list_free (app->live_views);
app->live_views = NULL; 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 */ /* timezone could have changed */
app_update_timezone (app); app_update_timezone (app);

View File

@@ -347,10 +347,10 @@ if options.perf == None:
options.perf = 'core' options.perf = 'core'
if options.extra_filter is None: if options.extra_filter is None:
options.extra_filter = [] if options.hwtest:
options.extra_filter = ['Gedit']
if options.perf == 'hwtest': else:
options.extra_filter.append('Gedit') options.extra_filter = []
if args: if args:
parser.print_usage() parser.print_usage()

View File

@@ -167,19 +167,22 @@ gnome_shell_plugin_init (GnomeShellPlugin *shell_plugin)
static gboolean static gboolean
gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin) gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin)
{ {
MetaPlugin *plugin = META_PLUGIN (shell_plugin);
CoglDisplay *cogl_display = CoglDisplay *cogl_display =
cogl_context_get_display (shell_plugin->cogl_context); cogl_context_get_display (shell_plugin->cogl_context);
CoglRenderer *renderer = cogl_display_get_renderer (cogl_display); CoglRenderer *renderer = cogl_display_get_renderer (cogl_display);
const char * (* query_extensions_string) (Display *dpy, int screen); const char * (* query_extensions_string) (Display *dpy, int screen);
Bool (* query_extension) (Display *dpy, int *error, int *event); Bool (* query_extension) (Display *dpy, int *error, int *event);
MetaScreen *screen;
Display *xdisplay; Display *xdisplay;
int screen_number;
const char *glx_extensions; const char *glx_extensions;
/* We will only get swap events if Cogl is using GLX */ /* We will only get swap events if Cogl is using GLX */
if (cogl_renderer_get_winsys_id (renderer) != COGL_WINSYS_ID_GLX) if (cogl_renderer_get_winsys_id (renderer) != COGL_WINSYS_ID_GLX)
return FALSE; return FALSE;
screen = meta_plugin_get_screen (plugin);
xdisplay = clutter_x11_get_default_display (); xdisplay = clutter_x11_get_default_display ();
query_extensions_string = query_extensions_string =
@@ -191,8 +194,9 @@ gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin)
&shell_plugin->glx_error_base, &shell_plugin->glx_error_base,
&shell_plugin->glx_event_base); &shell_plugin->glx_event_base);
screen_number = XDefaultScreen (xdisplay); glx_extensions =
glx_extensions = query_extensions_string (xdisplay, screen_number); query_extensions_string (xdisplay,
meta_screen_get_screen_number (screen));
return strstr (glx_extensions, "GLX_INTEL_swap_event") != NULL; return strstr (glx_extensions, "GLX_INTEL_swap_event") != NULL;
} }

View File

@@ -7,8 +7,6 @@
#include <glib/gi18n-lib.h> #include <glib/gi18n-lib.h>
#include <meta/display.h> #include <meta/display.h>
#include <meta/meta-workspace-manager.h>
#include <meta/meta-x11-display.h>
#include "shell-app-private.h" #include "shell-app-private.h"
#include "shell-enum-types.h" #include "shell-enum-types.h"
@@ -360,17 +358,6 @@ find_most_recent_transient_on_same_workspace (MetaDisplay *display,
return result; return result;
} }
static MetaWorkspace *
get_active_workspace (void)
{
ShellGlobal *global = shell_global_get ();
MetaDisplay *display = shell_global_get_display (global);
MetaWorkspaceManager *workspace_manager =
meta_display_get_workspace_manager (display);
return meta_workspace_manager_get_active_workspace (workspace_manager);
}
/** /**
* shell_app_activate_window: * shell_app_activate_window:
* @app: a #ShellApp * @app: a #ShellApp
@@ -404,8 +391,9 @@ shell_app_activate_window (ShellApp *app,
{ {
GSList *windows_reversed, *iter; GSList *windows_reversed, *iter;
ShellGlobal *global = shell_global_get (); ShellGlobal *global = shell_global_get ();
MetaDisplay *display = shell_global_get_display (global); MetaScreen *screen = shell_global_get_screen (global);
MetaWorkspace *active = get_active_workspace (); MetaDisplay *display = meta_screen_get_display (screen);
MetaWorkspace *active = meta_screen_get_active_workspace (screen);
MetaWorkspace *workspace = meta_window_get_workspace (window); MetaWorkspace *workspace = meta_window_get_workspace (window);
guint32 last_user_timestamp = meta_display_get_last_user_time (display); guint32 last_user_timestamp = meta_display_get_last_user_time (display);
MetaWindow *most_recent_transient; MetaWindow *most_recent_transient;
@@ -698,7 +686,7 @@ shell_app_get_windows (ShellApp *app)
{ {
CompareWindowsData data; CompareWindowsData data;
data.app = app; data.app = app;
data.active_workspace = get_active_workspace (); data.active_workspace = meta_screen_get_active_workspace (shell_global_get_screen (shell_global_get ()));
app->running_state->windows = g_slist_sort_with_data (app->running_state->windows, shell_app_compare_windows, &data); app->running_state->windows = g_slist_sort_with_data (app->running_state->windows, shell_app_compare_windows, &data);
app->running_state->window_sort_stale = FALSE; app->running_state->window_sort_stale = FALSE;
} }
@@ -934,11 +922,11 @@ shell_app_on_skip_taskbar_changed (MetaWindow *window,
} }
static void static void
shell_app_on_ws_switch (MetaWorkspaceManager *workspace_manager, shell_app_on_ws_switch (MetaScreen *screen,
int from, int from,
int to, int to,
MetaMotionDirection direction, MetaMotionDirection direction,
gpointer data) gpointer data)
{ {
ShellApp *app = SHELL_APP (data); ShellApp *app = SHELL_APP (data);
@@ -1127,12 +1115,12 @@ _shell_app_handle_startup_sequence (ShellApp *app,
*/ */
if (starting && shell_app_get_state (app) == SHELL_APP_STATE_STOPPED) if (starting && shell_app_get_state (app) == SHELL_APP_STATE_STOPPED)
{ {
MetaDisplay *display = shell_global_get_display (shell_global_get ()); MetaScreen *screen = shell_global_get_screen (shell_global_get ());
MetaX11Display *x11_display = meta_display_get_x11_display (display); MetaDisplay *display = meta_screen_get_display (screen);
shell_app_state_transition (app, SHELL_APP_STATE_STARTING); shell_app_state_transition (app, SHELL_APP_STATE_STARTING);
meta_x11_display_focus_the_no_focus_window (x11_display, meta_display_focus_the_no_focus_window (display, screen,
sn_startup_sequence_get_timestamp (sequence)); sn_startup_sequence_get_timestamp (sequence));
app->started_on_workspace = sn_startup_sequence_get_workspace (sequence); app->started_on_workspace = sn_startup_sequence_get_workspace (sequence);
} }
@@ -1302,17 +1290,15 @@ shell_app_get_app_info (ShellApp *app)
static void static void
create_running_state (ShellApp *app) create_running_state (ShellApp *app)
{ {
MetaDisplay *display = shell_global_get_display (shell_global_get ()); MetaScreen *screen;
MetaWorkspaceManager *workspace_manager =
meta_display_get_workspace_manager (display);
g_assert (app->running_state == NULL); g_assert (app->running_state == NULL);
screen = shell_global_get_screen (shell_global_get ());
app->running_state = g_slice_new0 (ShellAppRunningState); app->running_state = g_slice_new0 (ShellAppRunningState);
app->running_state->refcount = 1; app->running_state->refcount = 1;
app->running_state->workspace_switch_id = app->running_state->workspace_switch_id =
g_signal_connect (workspace_manager, "workspace-switched", g_signal_connect (screen, "workspace-switched", G_CALLBACK(shell_app_on_ws_switch), app);
G_CALLBACK (shell_app_on_ws_switch), app);
app->running_state->session = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL); app->running_state->session = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
g_assert (app->running_state->session != NULL); g_assert (app->running_state->session != NULL);
@@ -1363,9 +1349,7 @@ shell_app_update_app_menu (ShellApp *app,
static void static void
unref_running_state (ShellAppRunningState *state) unref_running_state (ShellAppRunningState *state)
{ {
MetaDisplay *display = shell_global_get_display (shell_global_get ()); MetaScreen *screen;
MetaWorkspaceManager *workspace_manager =
meta_display_get_workspace_manager (display);
g_assert (state->refcount > 0); g_assert (state->refcount > 0);
@@ -1373,7 +1357,8 @@ unref_running_state (ShellAppRunningState *state)
if (state->refcount > 0) if (state->refcount > 0)
return; return;
g_signal_handler_disconnect (workspace_manager, state->workspace_switch_id); screen = shell_global_get_screen (shell_global_get ());
g_signal_handler_disconnect (screen, state->workspace_switch_id);
g_clear_object (&state->application_proxy); g_clear_object (&state->application_proxy);

View File

@@ -28,8 +28,6 @@
#include <meta/meta-shaped-texture.h> #include <meta/meta-shaped-texture.h>
#include <meta/meta-cursor-tracker.h> #include <meta/meta-cursor-tracker.h>
#include <meta/meta-settings.h> #include <meta/meta-settings.h>
#include <meta/meta-workspace-manager.h>
#include <meta/meta-x11-display.h>
#ifdef HAVE_SYSTEMD #ifdef HAVE_SYSTEMD
#include <systemd/sd-journal.h> #include <systemd/sd-journal.h>
@@ -62,10 +60,9 @@ struct _ShellGlobal {
Window stage_xwindow; Window stage_xwindow;
MetaDisplay *meta_display; MetaDisplay *meta_display;
MetaWorkspaceManager *workspace_manager;
GdkDisplay *gdk_display; GdkDisplay *gdk_display;
MetaX11Display *x11_display;
Display *xdisplay; Display *xdisplay;
MetaScreen *meta_screen;
char *session_mode; char *session_mode;
@@ -99,8 +96,8 @@ enum {
PROP_0, PROP_0,
PROP_SESSION_MODE, PROP_SESSION_MODE,
PROP_SCREEN,
PROP_DISPLAY, PROP_DISPLAY,
PROP_WORKSPACE_MANAGER,
PROP_SCREEN_WIDTH, PROP_SCREEN_WIDTH,
PROP_SCREEN_HEIGHT, PROP_SCREEN_HEIGHT,
PROP_STAGE, PROP_STAGE,
@@ -166,17 +163,17 @@ shell_global_get_property(GObject *object,
case PROP_SESSION_MODE: case PROP_SESSION_MODE:
g_value_set_string (value, shell_global_get_session_mode (global)); g_value_set_string (value, shell_global_get_session_mode (global));
break; break;
case PROP_SCREEN:
g_value_set_object (value, global->meta_screen);
break;
case PROP_DISPLAY: case PROP_DISPLAY:
g_value_set_object (value, global->meta_display); g_value_set_object (value, global->meta_display);
break; break;
case PROP_WORKSPACE_MANAGER:
g_value_set_object (value, global->workspace_manager);
break;
case PROP_SCREEN_WIDTH: case PROP_SCREEN_WIDTH:
{ {
int width, height; int width, height;
meta_display_get_size (global->meta_display, &width, &height); meta_screen_get_size (global->meta_screen, &width, &height);
g_value_set_int (value, width); g_value_set_int (value, width);
} }
break; break;
@@ -184,7 +181,7 @@ shell_global_get_property(GObject *object,
{ {
int width, height; int width, height;
meta_display_get_size (global->meta_display, &width, &height); meta_screen_get_size (global->meta_screen, &width, &height);
g_value_set_int (value, height); g_value_set_int (value, height);
} }
break; break;
@@ -192,10 +189,10 @@ shell_global_get_property(GObject *object,
g_value_set_object (value, global->stage); g_value_set_object (value, global->stage);
break; break;
case PROP_WINDOW_GROUP: case PROP_WINDOW_GROUP:
g_value_set_object (value, meta_get_window_group_for_display (global->meta_display)); g_value_set_object (value, meta_get_window_group_for_screen (global->meta_screen));
break; break;
case PROP_TOP_WINDOW_GROUP: case PROP_TOP_WINDOW_GROUP:
g_value_set_object (value, meta_get_top_window_group_for_display (global->meta_display)); g_value_set_object (value, meta_get_top_window_group_for_screen (global->meta_screen));
break; break;
case PROP_WINDOW_MANAGER: case PROP_WINDOW_MANAGER:
g_value_set_object (value, global->wm); g_value_set_object (value, global->wm);
@@ -373,6 +370,13 @@ shell_global_class_init (ShellGlobalClass *klass)
"The session mode to use", "The session mode to use",
"user", "user",
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (gobject_class,
PROP_SCREEN,
g_param_spec_object ("screen",
"Screen",
"Metacity screen object for the shell",
META_TYPE_SCREEN,
G_PARAM_READABLE));
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_SCREEN_WIDTH, PROP_SCREEN_WIDTH,
@@ -397,14 +401,6 @@ shell_global_class_init (ShellGlobalClass *klass)
META_TYPE_DISPLAY, META_TYPE_DISPLAY,
G_PARAM_READABLE)); G_PARAM_READABLE));
g_object_class_install_property (gobject_class,
PROP_WORKSPACE_MANAGER,
g_param_spec_object ("workspace-manager",
"Workspace manager",
"Workspace manager",
META_TYPE_WORKSPACE_MANAGER,
G_PARAM_READABLE));
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_STAGE, PROP_STAGE,
g_param_spec_object ("stage", g_param_spec_object ("stage",
@@ -568,7 +564,7 @@ focus_window_changed (MetaDisplay *display,
/* If the stage window became unfocused, drop the key focus /* If the stage window became unfocused, drop the key focus
* on Clutter's side. */ * on Clutter's side. */
if (!meta_stage_is_focused (global->meta_display)) if (!meta_stage_is_focused (global->meta_screen))
clutter_stage_set_key_focus (global->stage, NULL); clutter_stage_set_key_focus (global->stage, NULL);
} }
@@ -598,14 +594,14 @@ sync_stage_window_focus (ShellGlobal *global)
actor = get_key_focused_actor (global); actor = get_key_focused_actor (global);
/* An actor got key focus and the stage needs to be focused. */ /* An actor got key focus and the stage needs to be focused. */
if (actor != NULL && !meta_stage_is_focused (global->meta_display)) if (actor != NULL && !meta_stage_is_focused (global->meta_screen))
meta_focus_stage_window (global->meta_display, meta_focus_stage_window (global->meta_screen,
get_current_time_maybe_roundtrip (global)); get_current_time_maybe_roundtrip (global));
/* An actor dropped key focus. Focus the default window. */ /* An actor dropped key focus. Focus the default window. */
else if (actor == NULL && meta_stage_is_focused (global->meta_display)) else if (actor == NULL && meta_stage_is_focused (global->meta_screen))
meta_display_focus_default_window (global->meta_display, meta_screen_focus_default_window (global->meta_screen,
get_current_time_maybe_roundtrip (global)); get_current_time_maybe_roundtrip (global));
} }
static void static void
@@ -620,12 +616,12 @@ focus_actor_changed (ClutterStage *stage,
static void static void
sync_input_region (ShellGlobal *global) sync_input_region (ShellGlobal *global)
{ {
MetaDisplay *display = global->meta_display; MetaScreen *screen = global->meta_screen;
if (global->has_modal) if (global->has_modal)
meta_set_stage_input_region (display, None); meta_set_stage_input_region (screen, None);
else else
meta_set_stage_input_region (display, global->input_region); meta_set_stage_input_region (screen, global->input_region);
} }
/** /**
@@ -679,6 +675,17 @@ shell_global_get_stage (ShellGlobal *global)
return global->stage; return global->stage;
} }
/**
* shell_global_get_screen:
*
* Return value: (transfer none): The default #MetaScreen
*/
MetaScreen *
shell_global_get_screen (ShellGlobal *global)
{
return global->meta_screen;
}
/** /**
* shell_global_get_display: * shell_global_get_display:
* *
@@ -705,7 +712,7 @@ shell_global_get_window_actors (ShellGlobal *global)
g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL); g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL);
for (l = meta_get_window_actors (global->meta_display); l; l = l->next) for (l = meta_get_window_actors (global->meta_screen); l; l = l->next)
if (!meta_window_actor_is_destroyed (l->data)) if (!meta_window_actor_is_destroyed (l->data))
filtered = g_list_prepend (filtered, l->data); filtered = g_list_prepend (filtered, l->data);
@@ -831,15 +838,13 @@ entry_cursor_func (StEntry *entry,
{ {
ShellGlobal *global = user_data; ShellGlobal *global = user_data;
meta_display_set_cursor (global->meta_display, meta_screen_set_cursor (global->meta_screen, use_ibeam ? META_CURSOR_IBEAM : META_CURSOR_DEFAULT);
use_ibeam ? META_CURSOR_IBEAM : META_CURSOR_DEFAULT);
} }
void void
_shell_global_set_plugin (ShellGlobal *global, _shell_global_set_plugin (ShellGlobal *global,
MetaPlugin *plugin) MetaPlugin *plugin)
{ {
MetaDisplay *display;
MetaBackend *backend; MetaBackend *backend;
MetaSettings *settings; MetaSettings *settings;
@@ -849,15 +854,13 @@ _shell_global_set_plugin (ShellGlobal *global,
global->plugin = plugin; global->plugin = plugin;
global->wm = shell_wm_new (plugin); global->wm = shell_wm_new (plugin);
display = meta_plugin_get_display (plugin); global->meta_screen = meta_plugin_get_screen (plugin);
global->meta_display = display; global->meta_display = meta_screen_get_display (global->meta_screen);
global->workspace_manager = meta_display_get_workspace_manager (display); global->xdisplay = meta_display_get_xdisplay (global->meta_display);
global->x11_display = meta_display_get_x11_display (display);
global->xdisplay = meta_x11_display_get_xdisplay (global->x11_display);
global->gdk_display = gdk_x11_lookup_xdisplay (global->xdisplay); global->gdk_display = gdk_x11_lookup_xdisplay (global->xdisplay);
global->stage = CLUTTER_STAGE (meta_get_stage_for_display (display)); global->stage = CLUTTER_STAGE (meta_get_stage_for_screen (global->meta_screen));
if (meta_is_wayland_compositor ()) if (meta_is_wayland_compositor ())
{ {
@@ -969,13 +972,13 @@ shell_global_end_modal (ShellGlobal *global,
/* If the stage window is unfocused, ensure that there's no /* If the stage window is unfocused, ensure that there's no
* actor focused on Clutter's side. */ * actor focused on Clutter's side. */
if (!meta_stage_is_focused (global->meta_display)) if (!meta_stage_is_focused (global->meta_screen))
clutter_stage_set_key_focus (global->stage, NULL); clutter_stage_set_key_focus (global->stage, NULL);
/* An actor dropped key focus. Focus the default window. */ /* An actor dropped key focus. Focus the default window. */
else if (get_key_focused_actor (global) && meta_stage_is_focused (global->meta_display)) else if (get_key_focused_actor (global) && meta_stage_is_focused (global->meta_screen))
meta_display_focus_default_window (global->meta_display, meta_screen_focus_default_window (global->meta_screen,
get_current_time_maybe_roundtrip (global)); get_current_time_maybe_roundtrip (global));
sync_input_region (global); sync_input_region (global);
} }
@@ -1156,8 +1159,9 @@ shell_global_reexec_self (ShellGlobal *global)
*/ */
pre_exec_close_fds (); pre_exec_close_fds ();
meta_display_close (shell_global_get_display (global), meta_display_unmanage_screen (shell_global_get_display (global),
shell_global_get_current_time (global)); shell_global_get_screen (global),
shell_global_get_current_time (global));
execvp (arr->pdata[0], (char**)arr->pdata); execvp (arr->pdata[0], (char**)arr->pdata);
g_warning ("failed to reexec: %s", g_strerror (errno)); g_warning ("failed to reexec: %s", g_strerror (errno));
@@ -1242,7 +1246,7 @@ shell_global_notify_error (ShellGlobal *global,
*/ */
void shell_global_init_xdnd (ShellGlobal *global) void shell_global_init_xdnd (ShellGlobal *global)
{ {
Window output_window = meta_get_overlay_window (global->meta_display); Window output_window = meta_get_overlay_window (global->meta_screen);
long xdnd_version = 5; long xdnd_version = 5;
XChangeProperty (global->xdisplay, global->stage_xwindow, XChangeProperty (global->xdisplay, global->stage_xwindow,
@@ -1280,7 +1284,7 @@ shell_global_get_pointer (ShellGlobal *global,
ClutterModifierType raw_mods; ClutterModifierType raw_mods;
MetaCursorTracker *tracker; MetaCursorTracker *tracker;
tracker = meta_cursor_tracker_get_for_display (global->meta_display); tracker = meta_cursor_tracker_get_for_screen (global->meta_screen);
meta_cursor_tracker_get_pointer (tracker, x, y, &raw_mods); meta_cursor_tracker_get_pointer (tracker, x, y, &raw_mods);
*mods = raw_mods & CLUTTER_MODIFIER_MASK; *mods = raw_mods & CLUTTER_MODIFIER_MASK;
@@ -1428,12 +1432,7 @@ shell_global_create_app_launch_context (ShellGlobal *global,
gdk_app_launch_context_set_timestamp (context, timestamp); gdk_app_launch_context_set_timestamp (context, timestamp);
if (workspace < 0) if (workspace < 0)
{ workspace = meta_screen_get_active_workspace_index (global->meta_screen);
MetaWorkspaceManager *workspace_manager = global->workspace_manager;
workspace =
meta_workspace_manager_get_active_workspace_index (workspace_manager);
}
gdk_app_launch_context_set_desktop (context, workspace); gdk_app_launch_context_set_desktop (context, workspace);
return (GAppLaunchContext *)context; return (GAppLaunchContext *)context;

View File

@@ -16,6 +16,7 @@ G_DECLARE_FINAL_TYPE (ShellGlobal, shell_global, SHELL, GLOBAL, GObject)
ShellGlobal *shell_global_get (void); ShellGlobal *shell_global_get (void);
ClutterStage *shell_global_get_stage (ShellGlobal *global); ClutterStage *shell_global_get_stage (ShellGlobal *global);
MetaScreen *shell_global_get_screen (ShellGlobal *global);
MetaDisplay *shell_global_get_display (ShellGlobal *global); MetaDisplay *shell_global_get_display (ShellGlobal *global);
GList *shell_global_get_window_actors (ShellGlobal *global); GList *shell_global_get_window_actors (ShellGlobal *global);
GSettings *shell_global_get_settings (ShellGlobal *global); GSettings *shell_global_get_settings (ShellGlobal *global);

View File

@@ -15,8 +15,8 @@
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <cogl/cogl.h> #include <cogl/cogl.h>
#include <meta/screen.h>
#include <meta/meta-cursor-tracker.h> #include <meta/meta-cursor-tracker.h>
#include <meta/display.h>
#include <meta/compositor-mutter.h> #include <meta/compositor-mutter.h>
#include "shell-global.h" #include "shell-global.h"
@@ -112,7 +112,7 @@ static void recorder_remove_redraw_timeout (ShellRecorder *recorder);
enum { enum {
PROP_0, PROP_0,
PROP_DISPLAY, PROP_SCREEN,
PROP_STAGE, PROP_STAGE,
PROP_FRAMERATE, PROP_FRAMERATE,
PROP_PIPELINE, PROP_PIPELINE,
@@ -670,12 +670,12 @@ recorder_set_stage (ShellRecorder *recorder,
} }
static void static void
recorder_set_display (ShellRecorder *recorder, recorder_set_screen (ShellRecorder *recorder,
MetaDisplay *display) MetaScreen *screen)
{ {
MetaCursorTracker *tracker; MetaCursorTracker *tracker;
tracker = meta_cursor_tracker_get_for_display (display); tracker = meta_cursor_tracker_get_for_screen (screen);
if (tracker == recorder->cursor_tracker) if (tracker == recorder->cursor_tracker)
return; return;
@@ -760,8 +760,8 @@ shell_recorder_set_property (GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_DISPLAY: case PROP_SCREEN:
recorder_set_display (recorder, g_value_get_object (value)); recorder_set_screen (recorder, g_value_get_object (value));
break; break;
case PROP_STAGE: case PROP_STAGE:
recorder_set_stage (recorder, g_value_get_object (value)); recorder_set_stage (recorder, g_value_get_object (value));
@@ -825,11 +825,11 @@ shell_recorder_class_init (ShellRecorderClass *klass)
gobject_class->set_property = shell_recorder_set_property; gobject_class->set_property = shell_recorder_set_property;
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_DISPLAY, PROP_SCREEN,
g_param_spec_object ("display", g_param_spec_object ("screen",
"Display", "Screen",
"Display to record", "Screen to record",
META_TYPE_DISPLAY, META_TYPE_SCREEN,
G_PARAM_WRITABLE)); G_PARAM_WRITABLE));
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
@@ -1551,7 +1551,7 @@ shell_recorder_record (ShellRecorder *recorder,
recorder_add_update_pointer_timeout (recorder); recorder_add_update_pointer_timeout (recorder);
/* Disable unredirection while we are recoring */ /* Disable unredirection while we are recoring */
meta_disable_unredirect_for_display (shell_global_get_display (shell_global_get ())); meta_disable_unredirect_for_screen (shell_global_get_screen (shell_global_get ()));
/* Set up repaint hook */ /* Set up repaint hook */
recorder->repaint_hook_id = clutter_threads_add_repaint_func(recorder_repaint_hook, recorder->stage, NULL); recorder->repaint_hook_id = clutter_threads_add_repaint_func(recorder_repaint_hook, recorder->stage, NULL);
@@ -1602,7 +1602,7 @@ shell_recorder_close (ShellRecorder *recorder)
recorder->state = RECORDER_STATE_CLOSED; recorder->state = RECORDER_STATE_CLOSED;
/* Reenable after the recording */ /* Reenable after the recording */
meta_enable_unredirect_for_display (shell_global_get_display (shell_global_get ())); meta_enable_unredirect_for_screen (shell_global_get_screen (shell_global_get ()));
/* Release the refcount we took when we started recording */ /* Release the refcount we took when we started recording */
g_object_unref (recorder); g_object_unref (recorder);

View File

@@ -31,8 +31,6 @@ struct _ShellScreenshotPrivate
char *filename; char *filename;
char *filename_used; char *filename_used;
GDateTime *datetime;
cairo_surface_t *image; cairo_surface_t *image;
cairo_rectangle_int_t screenshot_area; cairo_rectangle_int_t screenshot_area;
@@ -74,9 +72,8 @@ on_screenshot_written (GObject *source,
g_clear_pointer (&priv->image, cairo_surface_destroy); g_clear_pointer (&priv->image, cairo_surface_destroy);
g_clear_pointer (&priv->filename, g_free); g_clear_pointer (&priv->filename, g_free);
g_clear_pointer (&priv->filename_used, g_free); g_clear_pointer (&priv->filename_used, g_free);
g_clear_pointer (&priv->datetime, g_date_time_unref);
meta_enable_unredirect_for_display (shell_global_get_display (priv->global)); meta_enable_unredirect_for_screen (shell_global_get_screen (priv->global));
} }
/* called in an I/O thread */ /* called in an I/O thread */
@@ -178,7 +175,6 @@ write_screenshot_thread (GTask *result,
GOutputStream *stream; GOutputStream *stream;
ShellScreenshot *screenshot = SHELL_SCREENSHOT (object); ShellScreenshot *screenshot = SHELL_SCREENSHOT (object);
ShellScreenshotPrivate *priv; ShellScreenshotPrivate *priv;
char *creation_time;
g_assert (screenshot != NULL); g_assert (screenshot != NULL);
@@ -197,18 +193,14 @@ write_screenshot_thread (GTask *result,
0, 0, 0, 0,
cairo_image_surface_get_width (priv->image), cairo_image_surface_get_width (priv->image),
cairo_image_surface_get_height (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, if (gdk_pixbuf_save_to_stream (pixbuf, stream, "png", NULL, NULL,
"tEXt::Software", "gnome-screenshot", "tEXt::Software", "gnome-screenshot", NULL))
"tEXt::Creation Time", creation_time,
NULL))
status = CAIRO_STATUS_SUCCESS; status = CAIRO_STATUS_SUCCESS;
else else
status = CAIRO_STATUS_WRITE_ERROR; status = CAIRO_STATUS_WRITE_ERROR;
g_object_unref (pixbuf); g_object_unref (pixbuf);
g_free (creation_time);
} }
@@ -249,7 +241,6 @@ do_grab_screenshot (ShellScreenshot *screenshot,
n_captures, n_captures,
x, y, x, y,
width, height); width, height);
priv->datetime = g_date_time_new_now_local ();
for (i = 0; i < n_captures; i++) for (i = 0; i < n_captures; i++)
cairo_surface_destroy (captures[i].image); cairo_surface_destroy (captures[i].image);
@@ -315,19 +306,19 @@ static void
grab_screenshot (ClutterActor *stage, grab_screenshot (ClutterActor *stage,
ShellScreenshot *screenshot) ShellScreenshot *screenshot)
{ {
MetaDisplay *display; MetaScreen *screen;
MetaCursorTracker *tracker; MetaCursorTracker *tracker;
int width, height; int width, height;
GTask *result; GTask *result;
GSettings *settings; GSettings *settings;
ShellScreenshotPrivate *priv = screenshot->priv; ShellScreenshotPrivate *priv = screenshot->priv;
display = shell_global_get_display (priv->global); screen = shell_global_get_screen (priv->global);
meta_display_get_size (display, &width, &height); meta_screen_get_size (screen, &width, &height);
do_grab_screenshot (screenshot, CLUTTER_STAGE (stage), 0, 0, width, height); do_grab_screenshot (screenshot, CLUTTER_STAGE (stage), 0, 0, width, height);
if (meta_display_get_n_monitors (display) > 1) if (meta_screen_get_n_monitors (screen) > 1)
{ {
cairo_region_t *screen_region = cairo_region_create (); cairo_region_t *screen_region = cairo_region_create ();
cairo_region_t *stage_region; cairo_region_t *stage_region;
@@ -336,11 +327,10 @@ grab_screenshot (ClutterActor *stage,
int i; int i;
cairo_t *cr; cairo_t *cr;
for (i = meta_display_get_n_monitors (display) - 1; i >= 0; i--) for (i = meta_screen_get_n_monitors (screen) - 1; i >= 0; i--)
{ {
meta_display_get_monitor_geometry (display, i, &monitor_rect); meta_screen_get_monitor_geometry (screen, i, &monitor_rect);
cairo_region_union_rectangle (screen_region, cairo_region_union_rectangle (screen_region, (const cairo_rectangle_int_t *) &monitor_rect);
(const cairo_rectangle_int_t *) &monitor_rect);
} }
stage_rect.x = 0; stage_rect.x = 0;
@@ -375,7 +365,7 @@ grab_screenshot (ClutterActor *stage,
if (priv->include_cursor && if (priv->include_cursor &&
!g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY)) !g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY))
{ {
tracker = meta_cursor_tracker_get_for_display (display); tracker = meta_cursor_tracker_get_for_screen (screen);
_draw_cursor_image (tracker, priv->image, priv->screenshot_area); _draw_cursor_image (tracker, priv->image, priv->screenshot_area);
} }
g_object_unref (settings); g_object_unref (settings);
@@ -414,8 +404,9 @@ grab_window_screenshot (ClutterActor *stage,
ShellScreenshotPrivate *priv = screenshot->priv; ShellScreenshotPrivate *priv = screenshot->priv;
GTask *result; GTask *result;
GSettings *settings; GSettings *settings;
MetaDisplay *display = shell_global_get_display (priv->global); MetaScreen *screen = shell_global_get_screen (priv->global);
MetaCursorTracker *tracker; MetaCursorTracker *tracker;
MetaDisplay *display = meta_screen_get_display (screen);
MetaWindow *window = meta_display_get_focus_window (display); MetaWindow *window = meta_display_get_focus_window (display);
ClutterActor *window_actor; ClutterActor *window_actor;
gfloat actor_x, actor_y; gfloat actor_x, actor_y;
@@ -441,12 +432,11 @@ grab_window_screenshot (ClutterActor *stage,
stex = META_SHAPED_TEXTURE (meta_window_actor_get_texture (META_WINDOW_ACTOR (window_actor))); stex = META_SHAPED_TEXTURE (meta_window_actor_get_texture (META_WINDOW_ACTOR (window_actor)));
priv->image = meta_shaped_texture_get_image (stex, &clip); priv->image = meta_shaped_texture_get_image (stex, &clip);
priv->datetime = g_date_time_new_now_local ();
settings = g_settings_new (A11Y_APPS_SCHEMA); settings = g_settings_new (A11Y_APPS_SCHEMA);
if (priv->include_cursor && !g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY)) if (priv->include_cursor && !g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY))
{ {
tracker = meta_cursor_tracker_get_for_display (display); tracker = meta_cursor_tracker_get_for_screen (screen);
_draw_cursor_image (tracker, priv->image, priv->screenshot_area); _draw_cursor_image (tracker, priv->image, priv->screenshot_area);
} }
g_object_unref (settings); g_object_unref (settings);
@@ -490,7 +480,7 @@ shell_screenshot_screenshot (ShellScreenshot *screenshot,
stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global)); stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));
meta_disable_unredirect_for_display (shell_global_get_display (priv->global)); meta_disable_unredirect_for_screen (shell_global_get_screen (priv->global));
g_signal_connect_after (stage, "paint", G_CALLBACK (grab_screenshot), (gpointer)screenshot); g_signal_connect_after (stage, "paint", G_CALLBACK (grab_screenshot), (gpointer)screenshot);
@@ -539,7 +529,7 @@ shell_screenshot_screenshot_area (ShellScreenshot *screenshot,
stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global)); stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));
meta_disable_unredirect_for_display (shell_global_get_display (shell_global_get ())); meta_disable_unredirect_for_screen (shell_global_get_screen (shell_global_get ()));
g_signal_connect_after (stage, "paint", G_CALLBACK (grab_area_screenshot), (gpointer)screenshot); g_signal_connect_after (stage, "paint", G_CALLBACK (grab_area_screenshot), (gpointer)screenshot);
@@ -567,8 +557,9 @@ shell_screenshot_screenshot_window (ShellScreenshot *screenshot,
ShellScreenshotCallback callback) ShellScreenshotCallback callback)
{ {
ShellScreenshotPrivate *priv = screenshot->priv; ShellScreenshotPrivate *priv = screenshot->priv;
MetaDisplay *display = shell_global_get_display (priv->global); MetaScreen *screen = shell_global_get_screen (priv->global);
ClutterActor *stage; ClutterActor *stage;
MetaDisplay *display = meta_screen_get_display (screen);
MetaWindow *window = meta_display_get_focus_window (display); MetaWindow *window = meta_display_get_focus_window (display);
if (priv->filename != NULL || !window) { if (priv->filename != NULL || !window) {
@@ -584,7 +575,7 @@ shell_screenshot_screenshot_window (ShellScreenshot *screenshot,
stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global)); stage = CLUTTER_ACTOR (shell_global_get_stage (priv->global));
meta_disable_unredirect_for_display (shell_global_get_display (shell_global_get ())); meta_disable_unredirect_for_screen (shell_global_get_screen (shell_global_get ()));
g_signal_connect_after (stage, "paint", G_CALLBACK (grab_window_screenshot), (gpointer)screenshot); g_signal_connect_after (stage, "paint", G_CALLBACK (grab_window_screenshot), (gpointer)screenshot);

View File

@@ -210,13 +210,16 @@ shell_tray_manager_style_changed (StWidget *theme_widget,
void void
shell_tray_manager_manage_screen (ShellTrayManager *manager, shell_tray_manager_manage_screen (ShellTrayManager *manager,
MetaScreen *screen,
StWidget *theme_widget) StWidget *theme_widget)
{ {
GdkDisplay *display; GdkDisplay *display;
GdkScreen *gdk_screen; GdkScreen *gdk_screen;
int screen_number;
display = gdk_display_get_default (); display = gdk_display_get_default ();
gdk_screen = gdk_display_get_default_screen (display); screen_number = meta_screen_get_screen_number (screen);
gdk_screen = gdk_display_get_screen (display, screen_number);
na_tray_manager_manage_screen (manager->priv->na_manager, gdk_screen); na_tray_manager_manage_screen (manager->priv->na_manager, gdk_screen);

View File

@@ -14,6 +14,7 @@ G_DECLARE_FINAL_TYPE (ShellTrayManager, shell_tray_manager,
ShellTrayManager *shell_tray_manager_new (void); ShellTrayManager *shell_tray_manager_new (void);
void shell_tray_manager_manage_screen (ShellTrayManager *manager, void shell_tray_manager_manage_screen (ShellTrayManager *manager,
MetaScreen *screen,
StWidget *theme_widget); StWidget *theme_widget);
G_END_DECLS G_END_DECLS

View File

@@ -399,9 +399,6 @@ get_gl_vendor (void)
gboolean gboolean
shell_util_need_background_refresh (void) shell_util_need_background_refresh (void)
{ {
if (!clutter_check_windowing_backend (CLUTTER_WINDOWING_X11))
return FALSE;
if (g_strcmp0 (get_gl_vendor (), "NVIDIA Corporation") == 0) if (g_strcmp0 (get_gl_vendor (), "NVIDIA Corporation") == 0)
return TRUE; return TRUE;

View File

@@ -13,7 +13,6 @@
#include <meta/group.h> #include <meta/group.h>
#include <meta/util.h> #include <meta/util.h>
#include <meta/window.h> #include <meta/window.h>
#include <meta/meta-workspace-manager.h>
#define SN_API_NOT_YET_FROZEN 1 #define SN_API_NOT_YET_FROZEN 1
#include <libsn/sn.h> #include <libsn/sn.h>
@@ -588,16 +587,13 @@ shell_window_tracker_on_window_removed (MetaWorkspace *workspace,
static void static void
load_initial_windows (ShellWindowTracker *tracker) load_initial_windows (ShellWindowTracker *tracker)
{ {
MetaDisplay *display = shell_global_get_display (shell_global_get ()); GList *workspaces, *iter;
MetaWorkspaceManager *workspace_manager = MetaScreen *screen = shell_global_get_screen (shell_global_get ());
meta_display_get_workspace_manager (display); workspaces = meta_screen_get_workspaces (screen);
GList *workspaces;
GList *l;
workspaces = meta_workspace_manager_get_workspaces (workspace_manager); for (iter = workspaces; iter; iter = iter->next)
for (l = workspaces; l; l = l->next)
{ {
MetaWorkspace *workspace = l->data; MetaWorkspace *workspace = iter->data;
GList *windows = meta_workspace_list_windows (workspace); GList *windows = meta_workspace_list_windows (workspace);
GList *window_iter; GList *window_iter;
@@ -612,18 +608,18 @@ load_initial_windows (ShellWindowTracker *tracker)
} }
static void static void
shell_window_tracker_on_n_workspaces_changed (MetaWorkspaceManager *workspace_manager, shell_window_tracker_on_n_workspaces_changed (MetaScreen *screen,
GParamSpec *pspec, GParamSpec *pspec,
gpointer user_data) gpointer user_data)
{ {
ShellWindowTracker *self = SHELL_WINDOW_TRACKER (user_data); ShellWindowTracker *self = SHELL_WINDOW_TRACKER (user_data);
GList *workspaces; GList *workspaces, *iter;
GList *l;
workspaces = meta_workspace_manager_get_workspaces (workspace_manager); workspaces = meta_screen_get_workspaces (screen);
for (l = workspaces; l; l = l->next)
for (iter = workspaces; iter; iter = iter->next)
{ {
MetaWorkspace *workspace = l->data; MetaWorkspace *workspace = iter->data;
/* This pair of disconnect/connect is idempotent if we were /* This pair of disconnect/connect is idempotent if we were
* already connected, while ensuring we get connected for * already connected, while ensuring we get connected for
@@ -646,20 +642,20 @@ shell_window_tracker_on_n_workspaces_changed (MetaWorkspaceManager *workspace_ma
static void static void
init_window_tracking (ShellWindowTracker *self) init_window_tracking (ShellWindowTracker *self)
{ {
MetaDisplay *display = shell_global_get_display (shell_global_get ()); MetaDisplay *display;
MetaWorkspaceManager *workspace_manager = MetaScreen *screen = shell_global_get_screen (shell_global_get ());
meta_display_get_workspace_manager (display);
g_signal_connect (workspace_manager, "notify::n-workspaces", g_signal_connect (screen, "notify::n-workspaces",
G_CALLBACK (shell_window_tracker_on_n_workspaces_changed), self); G_CALLBACK (shell_window_tracker_on_n_workspaces_changed), self);
display = meta_screen_get_display (screen);
g_signal_connect (display, "notify::focus-window", g_signal_connect (display, "notify::focus-window",
G_CALLBACK (on_focus_window_changed), self); G_CALLBACK (on_focus_window_changed), self);
shell_window_tracker_on_n_workspaces_changed (workspace_manager, NULL, self); shell_window_tracker_on_n_workspaces_changed (screen, NULL, self);
} }
static void static void
on_startup_sequence_changed (MetaDisplay *display, on_startup_sequence_changed (MetaScreen *screen,
SnStartupSequence *sequence, SnStartupSequence *sequence,
ShellWindowTracker *self) ShellWindowTracker *self)
{ {
@@ -675,13 +671,14 @@ on_startup_sequence_changed (MetaDisplay *display,
static void static void
shell_window_tracker_init (ShellWindowTracker *self) shell_window_tracker_init (ShellWindowTracker *self)
{ {
MetaDisplay *display = shell_global_get_display (shell_global_get ()); MetaScreen *screen;
self->window_to_app = g_hash_table_new_full (g_direct_hash, g_direct_equal, self->window_to_app = g_hash_table_new_full (g_direct_hash, g_direct_equal,
NULL, (GDestroyNotify) g_object_unref); NULL, (GDestroyNotify) g_object_unref);
screen = shell_global_get_screen (shell_global_get ());
g_signal_connect (display, "startup-sequence-changed", g_signal_connect (G_OBJECT (screen), "startup-sequence-changed",
G_CALLBACK (on_startup_sequence_changed), self); G_CALLBACK (on_startup_sequence_changed), self);
load_initial_windows (self); load_initial_windows (self);
@@ -798,9 +795,8 @@ GSList *
shell_window_tracker_get_startup_sequences (ShellWindowTracker *self) shell_window_tracker_get_startup_sequences (ShellWindowTracker *self)
{ {
ShellGlobal *global = shell_global_get (); ShellGlobal *global = shell_global_get ();
MetaDisplay *display = shell_global_get_display (global); MetaScreen *screen = shell_global_get_screen (global);
return meta_screen_get_startup_sequences (screen);
return meta_display_get_startup_sequences (display);
} }
/* sn_startup_sequence_ref returns void, so make a /* sn_startup_sequence_ref returns void, so make a

View File

@@ -308,8 +308,9 @@ st_entry_style_changed (StWidget *self)
} }
theme_node = st_widget_get_theme_node (self); theme_node = st_widget_get_theme_node (self);
_st_set_text_from_style (CLUTTER_TEXT (priv->entry), theme_node); st_theme_node_get_foreground_color (theme_node, &color);
clutter_text_set_color (CLUTTER_TEXT (priv->entry), &color);
if (st_theme_node_lookup_length (theme_node, "caret-size", TRUE, &size)) if (st_theme_node_lookup_length (theme_node, "caret-size", TRUE, &size))
clutter_text_set_cursor_size (CLUTTER_TEXT (priv->entry), (int)(.5 + size)); clutter_text_set_cursor_size (CLUTTER_TEXT (priv->entry), (int)(.5 + size));

View File

@@ -56,15 +56,12 @@ struct _StIconPrivate
CoglPipeline *shadow_pipeline; CoglPipeline *shadow_pipeline;
StShadow *shadow_spec; StShadow *shadow_spec;
ClutterSize shadow_size;
}; };
G_DEFINE_TYPE_WITH_PRIVATE (StIcon, st_icon, ST_TYPE_WIDGET) G_DEFINE_TYPE_WITH_PRIVATE (StIcon, st_icon, ST_TYPE_WIDGET)
static void st_icon_update (StIcon *icon); static void st_icon_update (StIcon *icon);
static gboolean st_icon_update_icon_size (StIcon *icon); static gboolean st_icon_update_icon_size (StIcon *icon);
static void st_icon_update_shadow_pipeline (StIcon *icon);
static void st_icon_clear_shadow_pipeline (StIcon *icon);
#define DEFAULT_ICON_SIZE 48 #define DEFAULT_ICON_SIZE 48
@@ -161,20 +158,20 @@ st_icon_dispose (GObject *gobject)
static void static void
st_icon_paint (ClutterActor *actor) st_icon_paint (ClutterActor *actor)
{ {
StIcon *icon = ST_ICON (actor); StIconPrivate *priv = ST_ICON (actor)->priv;
StIconPrivate *priv = icon->priv;
st_widget_paint_background (ST_WIDGET (actor)); st_widget_paint_background (ST_WIDGET (actor));
if (priv->icon_texture) if (priv->icon_texture)
{ {
st_icon_update_shadow_pipeline (icon);
if (priv->shadow_pipeline) if (priv->shadow_pipeline)
{ {
ClutterActorBox allocation; ClutterActorBox allocation;
float width, height;
clutter_actor_get_allocation_box (priv->icon_texture, &allocation); clutter_actor_get_allocation_box (priv->icon_texture, &allocation);
clutter_actor_box_get_size (&allocation, &width, &height);
_st_paint_shadow_with_opacity (priv->shadow_spec, _st_paint_shadow_with_opacity (priv->shadow_spec,
priv->shadow_pipeline, priv->shadow_pipeline,
&allocation, &allocation,
@@ -192,7 +189,7 @@ st_icon_style_changed (StWidget *widget)
StThemeNode *theme_node = st_widget_get_theme_node (widget); StThemeNode *theme_node = st_widget_get_theme_node (widget);
StIconPrivate *priv = self->priv; StIconPrivate *priv = self->priv;
st_icon_clear_shadow_pipeline (self); g_clear_pointer (&priv->shadow_pipeline, cogl_object_unref);
g_clear_pointer (&priv->shadow_spec, st_shadow_unref); g_clear_pointer (&priv->shadow_spec, st_shadow_unref);
priv->shadow_spec = st_theme_node_get_shadow (theme_node, "icon-shadow"); priv->shadow_spec = st_theme_node_get_shadow (theme_node, "icon-shadow");
@@ -270,50 +267,22 @@ st_icon_init (StIcon *self)
self->priv->shadow_pipeline = NULL; self->priv->shadow_pipeline = NULL;
} }
static void
st_icon_clear_shadow_pipeline (StIcon *icon)
{
StIconPrivate *priv = icon->priv;
g_clear_pointer (&priv->shadow_pipeline, cogl_object_unref);
clutter_size_init (&priv->shadow_size, 0, 0);
}
static void static void
st_icon_update_shadow_pipeline (StIcon *icon) st_icon_update_shadow_pipeline (StIcon *icon)
{ {
StIconPrivate *priv = icon->priv; StIconPrivate *priv = icon->priv;
if (priv->icon_texture && priv->shadow_spec) g_clear_pointer (&priv->shadow_pipeline, cogl_object_unref);
{
ClutterActorBox box;
float width, height;
clutter_actor_get_allocation_box (CLUTTER_ACTOR (icon), &box); if (priv->shadow_spec)
clutter_actor_box_get_size (&box, &width, &height); priv->shadow_pipeline = _st_create_shadow_pipeline_from_actor (priv->shadow_spec, priv->icon_texture);
if (priv->shadow_pipeline == NULL ||
priv->shadow_size.width != width ||
priv->shadow_size.height != height)
{
st_icon_clear_shadow_pipeline (icon);
priv->shadow_pipeline =
_st_create_shadow_pipeline_from_actor (priv->shadow_spec,
priv->icon_texture);
if (priv->shadow_pipeline)
clutter_size_init (&priv->shadow_size, width, height);
}
}
} }
static void static void
on_pixbuf_changed (ClutterTexture *texture, on_pixbuf_changed (ClutterTexture *texture,
StIcon *icon) StIcon *icon)
{ {
st_icon_clear_shadow_pipeline (icon); st_icon_update_shadow_pipeline (icon);
clutter_actor_queue_redraw (CLUTTER_ACTOR (icon));
} }
static void static void
@@ -338,7 +307,7 @@ st_icon_finish_update (StIcon *icon)
/* Remove the temporary ref we added */ /* Remove the temporary ref we added */
g_object_unref (priv->icon_texture); g_object_unref (priv->icon_texture);
st_icon_clear_shadow_pipeline (icon); st_icon_update_shadow_pipeline (icon);
/* "pixbuf-change" is actually a misnomer for "texture-changed" */ /* "pixbuf-change" is actually a misnomer for "texture-changed" */
g_signal_connect_object (priv->icon_texture, "pixbuf-change", g_signal_connect_object (priv->icon_texture, "pixbuf-change",

View File

@@ -116,8 +116,6 @@ _st_set_text_from_style (ClutterText *text,
PangoAttrList *attribs = NULL; PangoAttrList *attribs = NULL;
const PangoFontDescription *font; const PangoFontDescription *font;
StTextAlign align; StTextAlign align;
gdouble spacing;
gchar *font_features;
st_theme_node_get_foreground_color (theme_node, &color); st_theme_node_get_foreground_color (theme_node, &color);
clutter_text_set_color (text, &color); clutter_text_set_color (text, &color);
@@ -125,11 +123,11 @@ _st_set_text_from_style (ClutterText *text,
font = st_theme_node_get_font (theme_node); font = st_theme_node_get_font (theme_node);
clutter_text_set_font_description (text, (PangoFontDescription *) font); clutter_text_set_font_description (text, (PangoFontDescription *) font);
attribs = pango_attr_list_new ();
decoration = st_theme_node_get_text_decoration (theme_node); decoration = st_theme_node_get_text_decoration (theme_node);
if (decoration) if (decoration)
{ {
attribs = pango_attr_list_new ();
if (decoration & ST_TEXT_DECORATION_UNDERLINE) if (decoration & ST_TEXT_DECORATION_UNDERLINE)
{ {
PangoAttribute *underline = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE); PangoAttribute *underline = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE);
@@ -145,20 +143,6 @@ _st_set_text_from_style (ClutterText *text,
*/ */
} }
spacing = st_theme_node_get_letter_spacing (theme_node);
if (spacing)
{
PangoAttribute *letter_spacing = pango_attr_letter_spacing_new ((int)(.5 + spacing) * PANGO_SCALE);
pango_attr_list_insert (attribs, letter_spacing);
}
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); clutter_text_set_attributes (text, attribs);
if (attribs) if (attribs)
@@ -432,8 +416,6 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec,
CoglPipeline *shadow_pipeline = NULL; CoglPipeline *shadow_pipeline = NULL;
float width, height; float width, height;
g_return_val_if_fail (clutter_actor_has_allocation (actor), NULL);
clutter_actor_get_size (actor, &width, &height); clutter_actor_get_size (actor, &width, &height);
if (width == 0 || height == 0) if (width == 0 || height == 0)

View File

@@ -105,6 +105,18 @@ st_texture_cache_class_init (StTextureCacheClass *klass)
G_TYPE_NONE, 1, G_TYPE_FILE); G_TYPE_NONE, 1, G_TYPE_FILE);
} }
/* Evicts all cached textures */
void
st_texture_cache_clear (StTextureCache *cache)
{
GHashTableIter iter;
gpointer key;
gpointer value;
g_hash_table_remove_all (cache->priv->keyed_cache);
g_signal_emit (cache, signals[ICON_THEME_CHANGED], 0);
}
/* Evicts all cached textures for named icons */ /* Evicts all cached textures for named icons */
static void static void
st_texture_cache_evict_icons (StTextureCache *cache) st_texture_cache_evict_icons (StTextureCache *cache)

View File

@@ -52,6 +52,7 @@ typedef enum {
} StTextureCachePolicy; } StTextureCachePolicy;
StTextureCache* st_texture_cache_get_default (void); StTextureCache* st_texture_cache_get_default (void);
void st_texture_cache_clear (StTextureCache *cache);
ClutterActor * ClutterActor *
st_texture_cache_load_sliced_image (StTextureCache *cache, st_texture_cache_load_sliced_image (StTextureCache *cache,

View File

@@ -2545,28 +2545,6 @@ st_theme_node_get_text_align(StThemeNode *node)
return ST_TEXT_ALIGN_LEFT; 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 static gboolean
font_family_from_terms (CRTerm *term, font_family_from_terms (CRTerm *term,
char **family) char **family)
@@ -3019,39 +2997,6 @@ st_theme_node_get_font (StThemeNode *node)
return node->font_desc; 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: * st_theme_node_get_border_image:
* @node: a #StThemeNode * @node: a #StThemeNode

View File

@@ -223,8 +223,6 @@ StTextDecoration st_theme_node_get_text_decoration (StThemeNode *node);
StTextAlign st_theme_node_get_text_align (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 /* Font rule processing is pretty complicated, so we just hardcode it
* under the standard font/font-family/font-size/etc names. This means * under the standard font/font-family/font-size/etc names. This means
* you can't have multiple separate styled fonts for a single item, * you can't have multiple separate styled fonts for a single item,
@@ -232,8 +230,6 @@ double st_theme_node_get_letter_spacing (StThemeNode *node);
*/ */
const PangoFontDescription *st_theme_node_get_font (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); StBorderImage *st_theme_node_get_border_image (StThemeNode *node);
StShadow *st_theme_node_get_box_shadow (StThemeNode *node); StShadow *st_theme_node_get_box_shadow (StThemeNode *node);
StShadow *st_theme_node_get_text_shadow (StThemeNode *node); StShadow *st_theme_node_get_text_shadow (StThemeNode *node);

View File

@@ -59,24 +59,6 @@ assert_font (StThemeNode *node,
g_free (value); 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 * static char *
text_decoration_to_string (StTextDecoration decoration) text_decoration_to_string (StTextDecoration decoration)
{ {
@@ -414,7 +396,7 @@ test_background (void)
/* text1 inherits the background image but not the color */ /* text1 inherits the background image but not the color */
assert_background_color (text1, "text1", 0x00000000); assert_background_color (text1, "text1", 0x00000000);
assert_background_image (text1, "text1", "st/some-background.png"); assert_background_image (text1, "text1", "st/some-background.png");
/* text2 inherits both, but then background: none overrides both */ /* text1 inherits inherits both, but then background: none overrides both */
assert_background_color (text2, "text2", 0x00000000); assert_background_color (text2, "text2", 0x00000000);
assert_background_image (text2, "text2", NULL); assert_background_image (text2, "text2", NULL);
/* background-image property */ /* background-image property */
@@ -431,22 +413,6 @@ test_font (void)
assert_font (text3, "text3", "serif Bold Oblique Small-Caps 24px"); 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 static void
test_pseudo_class (void) test_pseudo_class (void)
{ {
@@ -588,7 +554,6 @@ main (int argc, char **argv)
test_border (); test_border ();
test_background (); test_background ();
test_font (); test_font ();
test_font_features ();
test_pseudo_class (); test_pseudo_class ();
test_inline_style (); test_inline_style ();

View File

@@ -13,8 +13,6 @@ stage {
margin-left: 1in; margin-left: 1in;
background: #ff0000 url('some-background.png'); background: #ff0000 url('some-background.png');
font-feature-settings: "tnum";
} }
#text1 { #text1 {
@@ -37,7 +35,6 @@ ClutterTexture.special-text {
#group2 { #group2 {
font: italic 12px serif; font: italic 12px serif;
font-feature-settings: "tnum", "zero";
} }
#text3 { #text3 {
@@ -45,11 +42,6 @@ ClutterTexture.special-text {
font-weight: bold; font-weight: bold;
font-style: oblique; font-style: oblique;
font-size: 200%; font-size: 200%;
font-feature-settings: "pnum";
}
#text4 {
font-feature-settings: normal;
} }
ClutterTexture { ClutterTexture {
@@ -68,10 +60,6 @@ stage > #text2 {
color: #ff0000; color: #ff0000;
} }
#group2 > #text3 {
font-feature-settings: inherit;
}
#group2 { #group2 {
background-image: url('other-background.png'); background-image: url('other-background.png');
padding: 1px 2px 3px 4px; padding: 1px 2px 3px 4px;