Compare commits

..

79 Commits

Author SHA1 Message Date
Jasper St. Pierre
28f4030aa2 retrigger greeter 2014-03-07 19:36:31 -05:00
Jasper St. Pierre
67fe376564 gdm: Make the smartcard and service status fields private
We don't need to export these publicly any more.
2014-03-07 19:36:31 -05:00
Jasper St. Pierre
fb824131ae gdm: Integrate username asking into the ShellUserVerifier flow
Currently, prompting for the username on the login screen is done
"out-of-band". This leads to subtle bugs where we're trying to
integrate two different state machines, or interpret results from
one state machine as part of another.

It also complicates the logic, as the ability to know whether we
need or want a username is currently in the UI layer rather than
the logic layer.

Move this into the verifier proper.
2014-03-07 19:36:18 -05:00
Jasper St. Pierre
056375cbcf gdm: Merge clear() and cancel()
cancel() isn't used anymore.
2014-03-07 18:49:41 -05:00
Jasper St. Pierre
84431cbc65 gdm: Move reset-on-smartcard / reset-on-ovirt code to ShellUserVerifier
We still need to expose smartcardDetected to determine whether to
prompt for a username. This part is another hairy mess of signals
and layer violations that will need untangling, but we'll get there...
2014-03-07 18:47:37 -05:00
Jasper St. Pierre
92c283da4d gdm: Move the verificationStatus state machine to ShellUserVerifier
The idea here is that the ShellUserVerifier does all the logic of
identifying the user, and the AuthPrompt is simply the UI on top
of it.

Thus, it makes sense for more of the state machine to be driven by
the ShellUserVerifier.

This will become more apparent in the next commit.
2014-03-07 18:47:37 -05:00
Jasper St. Pierre
6e27ef8ff9 gdm: Emit the 'failed' status immediately, and not on reset
There's really no reason to do it this way: it works in both cases,
and it's a lot simpler to reason about.
2014-03-07 18:47:37 -05:00
Jasper St. Pierre
0c511c884b gdm: Remove the (partially) unused cancelled signal
When we emit the 'cancelled' signal if we were previously verifying,
we'll always emit a 'failed' signal. LoginDialog doesn't care about
cancelled, only UnlockDialog cares about both, but it does the same
thing for both, so there's no reason to have the extra signal.
2014-03-07 18:47:37 -05:00
Jasper St. Pierre
7afb503666 gdm: Rearrange code to make it slightly easier to read 2014-03-07 18:47:37 -05:00
Jasper St. Pierre
0b9d01a1c0 gdm: Merge some duplicate code
Do a reset at initialization time.

Technically, this isn't needed, since to start the process we'll need
to reset(); anyway after all the signals have connected, but this helps
the code be clean.
2014-03-07 18:47:37 -05:00
Jasper St. Pierre
b978d99820 gdm: Remove params from AuthPrompt.begin();
It's just one parameter now.
2014-03-07 18:47:36 -05:00
Jasper St. Pierre
6d8d094e0c gdm: Remove the hold from AuthPrompt / UserVerifier
After the removal before, it's now unused.
2014-03-07 18:47:36 -05:00
Jasper St. Pierre
97e0175f48 gdm: Don't bother passing a Hold through to the authPrompt
beginVerificationForUser is always the last task in the last, so it
doesn't matter when it's released.
2014-03-07 18:47:36 -05:00
Jasper St. Pierre
ebef4ff174 gdm: Clean up pending messages handling
Introduce a new doAfterPendingMessages helper to wait until
we have no more pending messages before doing an action.
2014-03-07 18:47:36 -05:00
Jasper St. Pierre
82b8b32355 gdm: Correct placement of verification-failed emission
If we fail to verify, and don't have any pending messages, we'll retry
or cancel, which will cause a state change to VERIFYING or NOT_VERIFYING,
and then change the state again to VERIFICATION_FAILED, messing up our
state machine.
2014-03-07 18:47:35 -05:00
Jasper St. Pierre
5b4337f716 gdm: Remove _cancelAndReset
Calling Cancel(); on the UserVerifier will make us get a reset
signal eventually, so simply wait for the natural flow.
2014-03-07 18:42:17 -05:00
Jasper St. Pierre
5eb377bd3b gdm: Replace preemptingService with checks in getForegroundService
This removes a piece of the chicken-wire state machine to determine
what the current foreground service should be.
2014-03-07 18:42:17 -05:00
Jasper St. Pierre
8173110842 gdm: Make a method private 2014-03-07 18:42:17 -05:00
Jasper St. Pierre
fee97da26b activate session 2014-03-07 18:42:07 -05:00
Jasper St. Pierre
0cc10e0c5d mutter-launch was killed upstream 2014-03-07 18:42:07 -05:00
Florian Müllner
0ba05b29b9 loginDialog: Defer loading user list until needed
Loading the user list can be expensive, for instance when there is
a large number of users and/or their avatars have to be fetched over
the network. In case the user list is disabled anyway, there is no
point in doing that work just to hide it, so stop doing that.

https://bugzilla.gnome.org/show_bug.cgi?id=725905
2014-03-08 00:29:11 +01:00
Florian Müllner
ef8123e3a2 loginDialog: Add missing return value
_loadUserList() may be used as idle handler, so we should explicitly
return a boolean.

https://bugzilla.gnome.org/show_bug.cgi?id=725905
2014-03-08 00:29:10 +01:00
Volker Sobek
257e1f3096 calendar: Grab key focus when user changes day
When the user changes the active day by mouse click or keyboard focus
plus key press on a day in the grid, always move the keyboard focus to
the newly activated day.

This basically restores functionality that was introduced in commit
31478e9fb4 but got lost again in the re-factoring in commit
cc4659f5c6.

https://bugzilla.gnome.org/show_bug.cgi?id=725606
2014-03-07 19:18:32 +01:00
Andika Triwidada
6441ae77d9 Updated Indonesian translation 2014-03-07 06:48:50 +00:00
Baurzhan Muftakhidinov
3f0938072f Updated Kazakh translation 2014-03-07 02:35:31 +00:00
Marek Černocký
2fe06a28aa Updated Czech translation 2014-03-06 18:18:06 +01:00
Giovanni Campagna
38750ba798 LookingGlass: add GObject and Gio to the ns available inline
Having to go through import.gi is awfully inconvenient when one
is using the looking glass as a quick gjs console, and we're
already importing all sorts of stuff there.

https://bugzilla.gnome.org/show_bug.cgi?id=725832
2014-03-06 16:57:41 +01:00
Fran Diéguez
b4c01f8905 Updated Galician translations 2014-03-06 12:27:41 +01:00
Fabio Tomat
104d70c88e Updated Friulian translation 2014-03-06 11:11:35 +01:00
Rafael Ferreira
133a350f2f Updated Brazilian Portuguese translation 2014-03-06 08:38:30 +00:00
Fabio Tomat
496ab55357 Updated Friulian translation 2014-03-06 04:59:38 +01:00
Fabio Tomat
a391758e31 Updated Friulian translation 2014-03-06 04:23:40 +01:00
Fabio Tomat
eaf8ad4949 Updated Friulian translation 2014-03-06 03:59:10 +01:00
Fabio Tomat
2f583bdcf3 Updated Friulian translation 2014-03-06 03:45:24 +01:00
Florian Müllner
db19012a41 Bump version to 3.11.91
Update NEWS.
2014-03-06 00:23:41 +01:00
Volker Sobek
62be46884e calendar: Don't forget to rebuild the calendar
Don't forget to rebuild the calendar when changing the setting
'org.gnome.shell.calendar show-weekdate'. This wasn't happening anymore
and changing the setting resulted in a calendar without the days
grid.

https://bugzilla.gnome.org/show_bug.cgi?id=725533
2014-03-05 20:14:56 +01:00
Yosef Or Boczko
3f2e6a48a9 Updated Hebrew translation 2014-03-05 18:58:56 +02:00
Daniel Mustieles
ff124e5f74 Updated Spanish translation 2014-03-05 16:58:35 +01:00
Vit Stanislav
c07421c195 Calendar: make current date label clickable
Once you start navigating between months, you can't return to the
current day.  However, the current day is always displayed above the
calendar grid.  Fix this by making the current date clickable; when
clicked, the calendar grid jumps back to that day.

https://bugzilla.gnome.org/show_bug.cgi?id=641366
2014-03-05 16:40:56 +01:00
Daniel Mustieles
de8348d3b9 Updated Spanish translation 2014-03-05 16:39:11 +01:00
Changwoo Ryu
184df8a853 Updated Korean translation 2014-03-05 19:55:27 +09:00
Kjartan Maraas
12768a147c Updated Norwegian bokmål translation 2014-03-05 06:47:35 +01:00
Piotr Drąg
94161cea37 Updated Polish translation 2014-03-04 18:18:35 +01:00
Yosef Or Boczko
52a4ef7cf7 Updated Hebrew translation 2014-03-04 18:30:55 +02:00
Giovanni Campagna
3432f71500 NetworkMenu: use Connected instead of profile name for wired and wwan
The profile name is most often not useful (because it's an
autogenerated string like "Wired Connection 1"), and even when it
is, it's already available in the submenu.

https://bugzilla.gnome.org/show_bug.cgi?id=725586
2014-03-04 16:08:02 +01:00
Fran Diéguez
8282aa6c24 Updated Galician translations 2014-03-03 17:34:02 +01:00
Dan Williams
59f9eaa1c9 NetworkAgent: fix initial secrets requests after 17726abb
While the named commit was correct for VPN connections, it didn't
work correctly for the initial secrets requests like when connecting
to a new access point.  In that case, secrets *should* be requested
when none are found, but only if interaction is enabled.  The
bits of 17726abb which removed checking secrets against the hints
*were* correct, but 17726abb removed too much.

Also, to ensure passwords don't get inadvertently cleared when
simply reading them from the keyring, don't save passwords
unless something might have changed.

https://bugzilla.gnome.org/show_bug.cgi?id=724779
2014-03-03 15:17:43 +01:00
Aurimas Černius
4433b735c4 Updated Lithuanian translation 2014-03-02 19:57:10 +02:00
Piotr Drąg
9cd30fa6b5 Updated Polish translation 2014-03-02 17:24:18 +01:00
Piotr Drąg
2c7bbfb500 Fix a typo 2014-03-02 17:21:34 +01:00
Ville-Pekka Vainio
51a1d23bf9 Finnish translation update by Jiri Grönroos 2014-03-01 20:15:45 +02:00
Khaled Hosny
c02e6e82bc Update Arabic translation 2014-02-28 23:09:15 +02:00
Adel Gadllah
e37a3fa7e6 perf: Restore shell after runs
Currently running the perf tool results into no wm running
afterwards making it hard for the user to get the results from a terminal
and generally does not make it easy for users to run it to gather numbers.

So restore the shell after the test has completed.

https://bugzilla.gnome.org/show_bug.cgi?id=724870
2014-02-28 21:40:31 +01:00
Adel Gadllah
e23c2ffecc plugin: Don't query for swap_events support directly
There is no need for the duplication, clutter already exports
this information.

https://bugzilla.gnome.org/show_bug.cgi?id=724870
2014-02-28 21:40:31 +01:00
Daniel Mustieles
744f11d045 Updated Spanish translation 2014-02-28 14:13:08 +01:00
Jasper St. Pierre
b7eb1f3e8b Don't use get_core_device
clutter_device_manager_get_core_device calls XIGetClientPointer, which
requires a round-trip to the server. Since we do this on StWidget
creation, this means a full round-trip for every created StWidget.
Replace this with get_device with the ID of the VCP/VCK, since mutter
doesn't support MPX, and we know this is what the device is.
2014-02-27 14:55:29 -05:00
Victor Ibragimov
3f28091e52 Tajik translation updated 2014-02-27 12:13:18 +05:00
Adel Gadllah
b4ee86955d messageTray: Make sure that the source actor is square
Commit b7e1539699 removed the size to support hidpi but that caused the
actor to no longer be square. Fix that by going back to setting a size
but apply the scale factor before doing so.
2014-02-26 18:15:38 +01:00
Zeeshan Ali (Khattak)
8b866efe92 location: Adapt to new Geoclue agent interface
To be able to correctly setup dbus policy, I had to change the expected
agent D-Bus API a bit: Now object path is fixed and not different for
each user.

https://bugzilla.gnome.org/show_bug.cgi?id=725082
2014-02-25 12:45:32 +00:00
Daniel Mustieles
fb61ab8df7 Updated Spanish translation 2014-02-24 17:28:11 +01:00
Fran Diéguez
990956ece7 Updated Galician translations 2014-02-24 15:22:12 +01:00
Yosef Or Boczko
414b592d53 Updated Hebrew translation 2014-02-24 15:25:37 +02:00
Jasper St. Pierre
751154d9da shell-util: Fix warning in shell_util_cursor_tracker_to_clutter
If the sprite is NULL, like if a Wayland app wanted to hide the cursor,
then we need to hide the ClutterTexture on our side, as ClutterTexture
has no easy way to tell it to paint nothing.
2014-02-23 10:54:32 -05:00
Jasper St. Pierre
29addc499c shell-global: Only set the scale factor if get_setting succeeded
If gdk_screen_get_setting fails, like if it's running without XSettings,
then the GValue will have a value of 0. A lot of code tries to divide by
the scale factor. This produces NaN, and combined with the fact that NaN
is "leaky", we very quickly end up spinning out of control.
2014-02-23 10:54:32 -05:00
Yosef Or Boczko
caa98de581 Updated Hebrew translation 2014-02-23 14:16:30 +02:00
eternalhui
1fd1ec4312 Updated Chinese (China) translation 2014-02-23 09:57:11 +00:00
Florian Müllner
f4607626e4 workspaceThumbnails: Really fix DND creating new workspaces
The same problem spotted in commit 89a2dc71fc is present in
some more places, fix those as well.

https://bugzilla.gnome.org/show_bug.cgi?id=724686
2014-02-23 00:29:29 +01:00
Jasper St. Pierre
b494c15e4b shell-js: Kill some compile warnings
jsapi.h has some bad warnings with gcc. gjs-module.h already includes
jsapi.h and uses a complicated set of GCC pragmas to mask them out, so
just kill our include.
2014-02-22 17:42:03 -05:00
Ihar Hrachyshka
3c0defa125 Updated Belarusian translation. 2014-02-22 11:27:32 +01:00
Marek Černocký
f2df4d95de Updated Czech translation 2014-02-22 08:51:14 +01:00
Baurzhan Muftakhidinov
fabcf20e06 Updated Kazakh translation 2014-02-21 17:25:04 +00:00
Daniel Mustieles
b9510b9ab7 Updated Spanish translation 2014-02-21 13:10:31 +01:00
Rafael Ferreira
52a2ebad04 Updated Brazilian Portuguese translation 2014-02-21 12:02:52 +00:00
Florian Müllner
89a2dc71fc workspaceThumbnails: Fix creating new workspace via DND
Commit 61a58ff3c9 replaced the (removed in commit 254afc50223a7)
MetaWindowActor.get_workspace() method by MetaWindow.get_workspace(),
but did not take into account that the return values differ - the
former returns the workspace index, the latter the workspace object.

https://bugzilla.gnome.org/show_bug.cgi?id=724686
2014-02-21 11:48:55 +01:00
Andika Triwidada
adb0de43d8 Updated Indonesian translation 2014-02-21 06:46:22 +00:00
Dimitris Spingos
e2a811a720 Updated Greek translation 2014-02-20 23:20:56 +02:00
Aurimas Černius
5bcafc5c17 Updated Lithuanian translation 2014-02-20 22:42:10 +02:00
Florian Müllner
2d24536caf shellDBus: Fix LaunchExtensionPreferences()
Commit 5dedc5d8ba removed "unused" functionality which was
still used by that method. Launch it via GAppInfo instead, which
still supports passing URIs.

https://bugzilla.gnome.org/show_bug.cgi?id=724813
2014-02-20 20:27:02 +01:00
Victor Ibragimov
b088c4086b Tajik translation updated 2014-02-20 17:00:40 +05:00
45 changed files with 7711 additions and 5975 deletions

19
NEWS
View File

@@ -1,3 +1,22 @@
3.11.91
=======
* Don't use network profile name in menu [Giovanni; #725586]
* calendar: Make date label clickable to return to current date [Vit; #641366]
* Misc. bug fixes [Florian, Zeeshan, Adel, Jasper, Dan, Volker; #724813,
#724686, #725082, #724870, #724779, #725533]
Contributors:
Zeeshan Ali (Khattak), Giovanni Campagna, Piotr Drąg, Adel Gadllah,
Florian Müllner, Volker Sobek, Vit Stanislav, Jasper St. Pierre, Dan Williams
Translations:
Victor Ibragimov [tg], Aurimas Černius [lt], Dimitris Spingos [el],
Andika Triwidada [id], Rafael Ferreira [pt_BR], Daniel Mustieles [es],
Baurzhan Muftakhidinov [kk], Marek Černocký [cs], Ihar Hrachyshka [be],
eternalhui [zh_CN], Yosef Or Boczko [he], Fran Diéguez [gl],
Khaled Hosny [ar], Ville-Pekka Vainio [fi], Piotr Drąg [pl],
Kjartan Maraas [nb], Changwoo Ryu [ko]
3.11.90
=======
* Stop showing two bluetooth entries [Giovanni; #709353]

View File

@@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.11.90],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.11.91],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])
@@ -76,7 +76,7 @@ AC_MSG_RESULT($enable_systemd)
CLUTTER_MIN_VERSION=1.15.90
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.39.0
MUTTER_MIN_VERSION=3.11.90
MUTTER_MIN_VERSION=3.11.91
GTK_MIN_VERSION=3.7.9
GIO_MIN_VERSION=2.37.0
LIBECAL_MIN_VERSION=3.5.3

View File

@@ -2,7 +2,7 @@
Type=Application
_Name=GNOME Shell (wayland compositor)
_Comment=Window management and application launching
Exec=@bindir@/mutter-launch -- gnome-shell-wayland --wayland
Exec=@bindir@/gnome-shell-wayland --wayland --display-server
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=gnome-shell
X-GNOME-Bugzilla-Component=general

View File

@@ -163,7 +163,7 @@
allowed to see. Valid options are 'off' (disable location tracking),
'country', 'city', 'neighborhood', 'street', and 'exact' (typically
requires GPS receiver). Please keep in mind that this only controls
what Geoclue will allow applications to see and they can find user's
what GeoClue will allow applications to see and they can find user's
location on their own using network resources (albeit with street-level
accuracy at best).
</_description>

View File

@@ -1304,12 +1304,18 @@ StScrollBar StButton#vhandle:active {
font-weight: bold;
text-align: center;
color: #eeeeec;
border-radius: 4px;
}
.datemenu-date-label:hover,
.datemenu-date-label:focus {
background-color: #999999;
}
.datemenu-date-label:active {
background-color: #aaaaaa;
}
.calendar-day-base {
font-size: 9pt;
text-align: center;

View File

@@ -24,24 +24,10 @@ const AuthPromptMode = {
UNLOCK_OR_LOG_IN: 1
};
const AuthPromptStatus = {
NOT_VERIFYING: 0,
VERIFYING: 1,
VERIFICATION_FAILED: 2,
VERIFICATION_SUCCEEDED: 3
};
const BeginRequestType = {
PROVIDE_USERNAME: 0,
DONT_PROVIDE_USERNAME: 1
};
const AuthPrompt = new Lang.Class({
Name: 'AuthPrompt',
_init: function(gdmClient, mode) {
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
this._gdmClient = gdmClient;
this._mode = mode;
@@ -53,14 +39,11 @@ const AuthPrompt = new Lang.Class({
this._userVerifier = new GdmUtil.ShellUserVerifier(this._gdmClient, { reauthenticationOnly: reauthenticationOnly });
this._userVerifier.connect('needs-username', Lang.bind(this, this._onNeedsUserName));
this._userVerifier.connect('ask-question', Lang.bind(this, this._onAskQuestion));
this._userVerifier.connect('show-message', Lang.bind(this, this._onShowMessage));
this._userVerifier.connect('verification-failed', Lang.bind(this, this._onVerificationFailed));
this._userVerifier.connect('verification-complete', Lang.bind(this, this._onVerificationComplete));
this._userVerifier.connect('reset', Lang.bind(this, this._onReset));
this._userVerifier.connect('smartcard-status-changed', Lang.bind(this, this._onSmartcardStatusChanged));
this._userVerifier.connect('ovirt-user-authenticated', Lang.bind(this, this._onOVirtUserAuthenticated));
this.smartcardDetected = this._userVerifier.smartcardDetected;
this.connect('next', Lang.bind(this, function() {
this.updateSensitivity(false);
@@ -133,6 +116,10 @@ const AuthPrompt = new Lang.Class({
this._defaultButtonWell.add_child(this._spinner.actor);
},
get verificationStatus() {
return this._userVerifier.verificationStatus;
},
_onDestroy: function() {
this._userVerifier.clear();
this._userVerifier.disconnectAll();
@@ -193,6 +180,14 @@ const AuthPrompt = new Lang.Class({
}));
},
_onNeedsUserName: function() {
this.emit('needs-username');
},
gotUserName: function(userName) {
this._userVerifier.gotUserName(userName);
},
_onAskQuestion: function(verifier, serviceName, question, passwordChar) {
if (this._preemptiveAnswer) {
if (this._queryingService)
@@ -221,30 +216,6 @@ const AuthPrompt = new Lang.Class({
this.emit('prompted');
},
_onOVirtUserAuthenticated: function() {
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
this.reset();
},
_onSmartcardStatusChanged: function() {
this.smartcardDetected = this._userVerifier.smartcardDetected;
// Most of the time we want to reset if the user inserts or removes
// a smartcard. Smartcard insertion "preempts" what the user was
// doing, and smartcard removal aborts the preemption.
// The exceptions are: 1) Don't reset on smartcard insertion if we're already verifying
// with a smartcard
// 2) Don't reset if we've already succeeded at verification and
// the user is getting logged in.
if (this._userVerifier.serviceIsDefault(GdmUtil.SMARTCARD_SERVICE_NAME) &&
this.verificationStatus == AuthPromptStatus.VERIFYING &&
this.smartcardDetected)
return;
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
this.reset();
},
_onShowMessage: function(userVerifier, message, type) {
this.setMessage(message, type);
this.emit('prompted');
@@ -256,15 +227,11 @@ const AuthPrompt = new Lang.Class({
this.updateSensitivity(true);
this.setActorInDefaultButtonWell(null);
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
},
_onVerificationComplete: function() {
this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
this.emit('failed');
},
_onReset: function() {
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
this.reset();
},
@@ -428,39 +395,13 @@ const AuthPrompt = new Lang.Class({
},
reset: function() {
let oldStatus = this.verificationStatus;
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
if (oldStatus == AuthPromptStatus.VERIFYING)
this._userVerifier.cancel();
this._queryingService = null;
this.clear();
this._message.opacity = 0;
this.setUser(null);
this.stopSpinning();
if (oldStatus == AuthPromptStatus.VERIFICATION_FAILED)
this.emit('failed');
let beginRequestType;
if (this._mode == AuthPromptMode.UNLOCK_ONLY) {
// The user is constant at the unlock screen, so it will immediately
// respond to the request with the username
beginRequestType = BeginRequestType.PROVIDE_USERNAME;
} else if (this._userVerifier.serviceIsForeground(GdmUtil.OVIRT_SERVICE_NAME) ||
(this.smartcardDetected &&
this._userVerifier.serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME))) {
// We don't need to know the username if the user preempted the login screen
// with a smartcard or with preauthenticated oVirt credentials
beginRequestType = BeginRequestType.DONT_PROVIDE_USERNAME;
} else {
// In all other cases, we should get the username up front.
beginRequestType = BeginRequestType.PROVIDE_USERNAME;
}
this.emit('reset', beginRequestType);
this.emit('reset');
},
addCharacter: function(unichar) {
@@ -471,18 +412,13 @@ const AuthPrompt = new Lang.Class({
this._entry.clutter_text.insert_unichar(unichar);
},
begin: function(params) {
params = Params.parse(params, { userName: null,
hold: null });
begin: function() {
this.updateSensitivity(false);
this._userVerifier.begin();
},
let hold = params.hold;
if (!hold)
hold = new Batch.Hold();
this._userVerifier.begin(params.userName, hold);
this.verificationStatus = AuthPromptStatus.VERIFYING;
needsUsername: function() {
this._userVerifier.begin(userName);
},
finish: function(onComplete) {
@@ -500,7 +436,6 @@ const AuthPrompt = new Lang.Class({
cancel: function() {
this.reset();
this.emit('cancelled');
}
});
Signals.addSignalMethods(AuthPrompt.prototype);

View File

@@ -421,6 +421,7 @@ const LoginDialog = new Lang.Class({
this._authPrompt = new AuthPrompt.AuthPrompt(gdmClient, AuthPrompt.AuthPromptMode.UNLOCK_OR_LOG_IN);
this._authPrompt.connect('prompted', Lang.bind(this, this._onPrompted));
this._authPrompt.connect('reset', Lang.bind(this, this._onReset));
this._authPrompt.connect('needs-username', Lang.bind(this, this._onNeedsUserName));
this._authPrompt.hide();
this.actor.add_child(this._authPrompt.actor);
@@ -469,6 +470,18 @@ const LoginDialog = new Lang.Class({
this._sessionMenuButton.actor.show();
this._authPrompt.addActorToDefaultButtonWell(this._sessionMenuButton.actor);
this._updateDisableUserList();
this._userListLoaded = false;
LoginManager.getLoginManager().getCurrentSessionProxy(Lang.bind(this, this._gotGreeterSessionProxy));
// If the user list is enabled, it should take key focus; make sure the
// screen shield is initialized first to prevent it from stealing the
// focus later
Main.layoutManager.connect('startup-complete', Lang.bind(this, this._reset));
},
_ensureUserListLoaded: function() {
if (!this._userManager.is_loaded)
this._userManagerLoadedId = this._userManager.connect('notify::is-loaded',
Lang.bind(this, function() {
@@ -480,18 +493,22 @@ const LoginDialog = new Lang.Class({
}));
else
GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, this._loadUserList));
},
},
_reset: function() {
this._authPrompt.reset();
this._authPrompt.begin();
},
_updateDisableUserList: function() {
let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
if (disableUserList == this._disableUserList)
return;
if (disableUserList != this._disableUserList) {
this._disableUserList = disableUserList;
this._disableUserList = disableUserList;
if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING)
this._authPrompt.reset();
}
if (this._authPrompt.verificationStatus == GdmUtil.VerificationStatus.ASKING_FOR_USERNAME)
this._reset();
},
_updateCancelButton: function() {
@@ -499,7 +516,7 @@ const LoginDialog = new Lang.Class({
// Hide the cancel button if the user list is disabled and we're asking for
// a username
if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING && this._disableUserList)
if (this._authPrompt.verificationStatus == GdmUtil.VerificationStatus.ASKING_FOR_USERNAME && this._disableUserList)
cancelVisible = false;
else
cancelVisible = true;
@@ -544,19 +561,18 @@ const LoginDialog = new Lang.Class({
this._showPrompt();
},
_onReset: function(authPrompt, beginRequest) {
_onReset: function() {
this._sessionMenuButton.updateSensitivity(true);
this._user = null;
if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) {
if (!this._disableUserList)
this._showUserList();
else
this._hideUserListAskForUsernameAndBeginVerification();
} else {
this._hideUserListAndBeginVerification();
}
this._reset();
},
_onNeedsUserName: function() {
if (!this._disableUserList)
this._showUserList();
else
this._hideUserListAskForUsernameAndBeginVerification();
},
_onDefaultSessionChanged: function(client, sessionId) {
@@ -564,8 +580,8 @@ const LoginDialog = new Lang.Class({
},
_shouldShowSessionMenuButton: function() {
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFYING &&
this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_FAILED)
if (this._authPrompt.verificationStatus != GdmUtil.VerificationStatus.VERIFYING &&
this._authPrompt.verificationStatus != GdmUtil.VerificationStatus.VERIFICATION_FAILED)
return false;
if (this._user && this._user.is_loaded && this._user.is_logged_in())
@@ -615,7 +631,7 @@ const LoginDialog = new Lang.Class({
this._user = this._userManager.get_user(answer);
this._authPrompt.clear();
this._authPrompt.startSpinning();
this._authPrompt.begin({ userName: answer });
this._authPrompt.gotUserName(answer);
this._updateCancelButton();
realmManager.disconnect(realmSignalId)
@@ -625,6 +641,32 @@ const LoginDialog = new Lang.Class({
this._showPrompt();
},
_sessionActivated: function() {
// We fade out the shell after logging in, and then re-set
// the greeter wen we're VT switched to again.
// XXX: re-trigger startup animation
if (this._authPrompt.verificationStatus == GdmUtil.VerificationStatus.VERIFICATION_SUCCEEDED) {
this._reset();
// XXX: do something better here
this.actor.opacity = 255;
let children = Main.layoutManager.uiGroup.get_children();
for (let i = 0; i < children.length; i++) {
if (children[i] != Main.layoutManager.screenShieldGroup)
children[i].opacity = 255;
}
}
},
_gotGreeterSessionProxy: function(proxy) {
proxy.connect('g-properties-changed', Lang.bind(this, function() {
if (proxy.Active)
this._sessionActivated();
}));
},
_startSession: function(serviceName) {
Tweener.addTween(this.actor,
{ opacity: 0,
@@ -795,12 +837,8 @@ const LoginDialog = new Lang.Class({
this._askForUsernameAndBeginVerification();
},
_hideUserListAndBeginVerification: function() {
this._hideUserList();
this._authPrompt.begin();
},
_showUserList: function() {
this._ensureUserListLoaded();
this._authPrompt.hide();
this._sessionMenuButton.close();
this._setUserListExpanded(true);
@@ -812,11 +850,7 @@ const LoginDialog = new Lang.Class({
this._authPrompt.setUser(item.user);
let userName = item.user.get_user_name();
let hold = new Batch.Hold();
this._authPrompt.begin({ userName: userName,
hold: hold });
return hold;
this._authPrompt.gotUserName(userName);
},
_onUserListActivated: function(activatedItem) {
@@ -831,9 +865,9 @@ const LoginDialog = new Lang.Class({
this._updateCancelButton();
let batch = new Batch.ConcurrentBatch(this, [new Batch.ConsecutiveBatch(this, tasks),
this._beginVerificationForItem(activatedItem)]);
let batch = new Batch.ConsecutiveBatch(this, tasks);
batch.run();
this._beginVerificationForItem(activatedItem);
},
_onDestroy: function() {
@@ -844,14 +878,17 @@ const LoginDialog = new Lang.Class({
},
_loadUserList: function() {
if (this._userListLoaded)
return GLib.SOURCE_REMOVE;
this._userListLoaded = true;
let users = this._userManager.list_users();
for (let i = 0; i < users.length; i++) {
this._userList.addUser(users[i]);
}
this._updateDisableUserList();
this._userManager.connect('user-added',
Lang.bind(this, function(userManager, user) {
this._userList.addUser(user);
@@ -861,6 +898,8 @@ const LoginDialog = new Lang.Class({
Lang.bind(this, function(userManager, user) {
this._userList.removeUser(user);
}));
return GLib.SOURCE_REMOVE;
},
open: function() {

View File

@@ -119,6 +119,14 @@ function cloneAndFadeOutActor(actor) {
return hold;
}
const VerificationStatus = {
NOT_VERIFYING: 0,
ASKING_FOR_USERNAME: 1,
VERIFYING: 2,
VERIFICATION_FAILED: 3,
VERIFICATION_SUCCEEDED: 4,
};
const ShellUserVerifier = new Lang.Class({
Name: 'ShellUserVerifier',
@@ -131,7 +139,6 @@ const ShellUserVerifier = new Lang.Class({
this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed',
Lang.bind(this, this._updateDefaultService));
this._updateDefaultService();
this._fprintManager = new Fprint.FprintManager();
this._smartcardManager = SmartcardManager.getSmartcardManager();
@@ -152,45 +159,69 @@ const ShellUserVerifier = new Lang.Class({
this.hasPendingMessages = false;
this.reauthenticating = false;
this._failCounter = 0;
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
this._oVirtCredentialsManager.connect('user-authenticated', Lang.bind(this, this._oVirtUserAuthenticated));
if (this._oVirtCredentialsManager.hasToken())
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
this._oVirtCredentialsManager.connect('user-authenticated',
Lang.bind(this, this._oVirtUserAuthenticated));
this._reset();
},
begin: function(userName, hold) {
this._cancellable = new Gio.Cancellable();
this._hold = hold;
_reset: function() {
// Clear previous attempts to authenticate
this.verificationStatus = VerificationStatus.NOT_VERIFYING;
this._userName = null;
this._failCounter = 0;
this._updateDefaultService();
this.emit('reset');
},
begin: function() {
if (this._mode == AuthPromptMode.UNLOCK_ONLY) {
// The user is constant at the unlock screen, so it will immediately
// respond to the request with the username
needsUsername = true;
} else if (this._serviceIsForeground(GdmUtil.OVIRT_SERVICE_NAME) ||
(this._smartcardDetected &&
this._serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME))) {
// We don't need to know the username if the user preempted the login screen
// with a smartcard or with preauthenticated oVirt credentials
needsUsername = false;
} else {
// In all other cases, we should get the username up front.
needsUsername = true;
}
if (needsUsername) {
this.verificationStatus = VerificationStatus.ASKING_FOR_USERNAME;
this.emit('needs-username');
} else {
this._beginAuthentication();
}
},
gotUserName: function(userName) {
this._userName = userName;
this._beginAuthentication();
},
_beginAuthentication: function() {
this.verificationStatus = VerificationStatus.VERIFYING;
this._cancellable = new Gio.Cancellable();
this.reauthenticating = false;
this._checkForFingerprintReader();
if (userName) {
if (this._userName) {
// If possible, reauthenticate an already running session,
// so any session specific credentials get updated appropriately
this._client.open_reauthentication_channel(userName, this._cancellable,
this._client.open_reauthentication_channel(this._userName, this._cancellable,
Lang.bind(this, this._reauthenticationChannelOpened));
} else {
this._client.get_user_verifier(this._cancellable, Lang.bind(this, this._userVerifierGot));
}
},
cancel: function() {
if (this._cancellable)
this._cancellable.cancel();
if (this._userVerifier) {
this._userVerifier.call_cancel_sync(null);
this.clear();
}
},
clear: function() {
if (this._cancellable) {
this._cancellable.cancel();
@@ -198,6 +229,7 @@ const ShellUserVerifier = new Lang.Class({
}
if (this._userVerifier) {
this._userVerifier.call_cancel_sync(null);
this._userVerifier.run_dispose();
this._userVerifier = null;
}
@@ -205,24 +237,29 @@ const ShellUserVerifier = new Lang.Class({
this._clearMessageQueue();
},
answerQuery: function(serviceName, answer) {
if (!this.hasPendingMessages) {
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
_doAfterPendingMessages: function(func) {
if (this.hasPendingMessages) {
let signalId = this.connect('no-more-messages', Lang.bind(this, function() {
this.disconnect(signalId);
func();
}));
} else {
let signalId = this.connect('no-more-messages',
Lang.bind(this, function() {
this.disconnect(signalId);
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
}));
func();
}
},
answerQuery: function(serviceName, answer) {
this._doAfterPendingMessages(Lang.bind(this, function() {
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
}));
},
_getIntervalForMessage: function(message) {
// We probably could be smarter here
return message.length * USER_READ_TIME;
},
finishMessageQueue: function() {
_finishMessageQueue: function() {
if (!this.hasPendingMessages)
return;
@@ -234,7 +271,7 @@ const ShellUserVerifier = new Lang.Class({
_queueMessageTimeout: function() {
if (this._messageQueue.length == 0) {
this.finishMessageQueue();
this._finishMessageQueue();
return;
}
@@ -263,7 +300,7 @@ const ShellUserVerifier = new Lang.Class({
},
_clearMessageQueue: function() {
this.finishMessageQueue();
this._finishMessageQueue();
if (this._messageQueueTimeoutId != 0) {
GLib.source_remove(this._messageQueueTimeoutId);
@@ -288,9 +325,9 @@ const ShellUserVerifier = new Lang.Class({
}));
},
_oVirtUserAuthenticated: function(token) {
this._preemptingService = OVIRT_SERVICE_NAME;
this.emit('ovirt-user-authenticated');
_oVirtUserAuthenticated: function() {
if (this.verificationStatus != GdmUtil.VerificationStatus.VERIFICATION_SUCCEEDED)
this._reset();
},
_checkForSmartcard: function() {
@@ -303,21 +340,29 @@ const ShellUserVerifier = new Lang.Class({
else
smartcardDetected = this._smartcardManager.hasInsertedTokens();
if (smartcardDetected != this.smartcardDetected) {
this.smartcardDetected = smartcardDetected;
if (this._smartcardDetected == smartcardDetected)
return;
if (this.smartcardDetected)
this._preemptingService = SMARTCARD_SERVICE_NAME;
else if (this._preemptingService == SMARTCARD_SERVICE_NAME)
this._preemptingService = null;
this._smartcardDetected = smartcardDetected;
this.emit('smartcard-status-changed');
}
// Most of the time we want to reset if the user inserts or removes
// a smartcard. Smartcard insertion "preempts" what the user was
// doing, and smartcard removal aborts the preemption.
// The exceptions are: 1) Don't reset on smartcard insertion if we're already verifying
// with a smartcard
// 2) Don't reset if we've already succeeded at verification and
// the user is getting logged in.
if (this._serviceIsDefault(SMARTCARD_SERVICE_NAME) &&
this.verificationStatus == VerificationStatus.VERIFYING &&
this._smartcardDetected)
return;
if (this.verificationStatus != VerificationStatus.VERIFICATION_SUCCEEDED)
this._reset();
},
_reportInitError: function(where, error) {
logError(error, where);
this._hold.release();
this._queueMessage(_("Authentication error"), MessageType.ERROR);
this._verificationFailed(false);
@@ -343,7 +388,6 @@ const ShellUserVerifier = new Lang.Class({
this.reauthenticating = true;
this._connectSignals();
this._beginVerification();
this._hold.release();
},
_userVerifierGot: function(client, result) {
@@ -358,7 +402,6 @@ const ShellUserVerifier = new Lang.Class({
this._connectSignals();
this._beginVerification();
this._hold.release();
},
_connectSignals: function() {
@@ -372,31 +415,32 @@ const ShellUserVerifier = new Lang.Class({
},
_getForegroundService: function() {
if (this._preemptingService)
return this._preemptingService;
if (this._oVirtCredentialsManager.hasToken())
return OVIRT_SERVICE_NAME;
if (this._smartcardDetected)
return SMARTCARD_SERVICE_NAME;
return this._defaultService;
},
serviceIsForeground: function(serviceName) {
_serviceIsForeground: function(serviceName) {
return serviceName == this._getForegroundService();
},
serviceIsDefault: function(serviceName) {
_serviceIsDefault: function(serviceName) {
return serviceName == this._defaultService;
},
_updateDefaultService: function() {
if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
this._defaultService = PASSWORD_SERVICE_NAME;
else if (this.smartcardDetected)
else if (this._smartcardDetected)
this._defaultService = SMARTCARD_SERVICE_NAME;
else if (this._haveFingerprintReader)
this._defaultService = FINGERPRINT_SERVICE_NAME;
},
_startService: function(serviceName) {
this._hold.acquire();
if (this._userName) {
this._userVerifier.call_begin_verification_for_user(serviceName,
this._userName,
@@ -410,8 +454,6 @@ const ShellUserVerifier = new Lang.Class({
this._reportInitError('Failed to start verification for user', e);
return;
}
this._hold.release();
}));
} else {
this._userVerifier.call_begin_verification(serviceName,
@@ -425,8 +467,6 @@ const ShellUserVerifier = new Lang.Class({
this._reportInitError('Failed to start verification', e);
return;
}
this._hold.release();
}));
}
},
@@ -434,12 +474,12 @@ const ShellUserVerifier = new Lang.Class({
_beginVerification: function() {
this._startService(this._getForegroundService());
if (this._userName && this._haveFingerprintReader && !this.serviceIsForeground(FINGERPRINT_SERVICE_NAME))
if (this._userName && this._haveFingerprintReader && !this._serviceIsForeground(FINGERPRINT_SERVICE_NAME))
this._startService(FINGERPRINT_SERVICE_NAME);
},
_onInfo: function(client, serviceName, info) {
if (this.serviceIsForeground(serviceName)) {
if (this._serviceIsForeground(serviceName)) {
this._queueMessage(info, MessageType.INFO);
} else if (serviceName == FINGERPRINT_SERVICE_NAME &&
this._haveFingerprintReader) {
@@ -454,21 +494,21 @@ const ShellUserVerifier = new Lang.Class({
},
_onProblem: function(client, serviceName, problem) {
if (!this.serviceIsForeground(serviceName))
if (!this._serviceIsForeground(serviceName))
return;
this._queueMessage(problem, MessageType.ERROR);
},
_onInfoQuery: function(client, serviceName, question) {
if (!this.serviceIsForeground(serviceName))
if (!this._serviceIsForeground(serviceName))
return;
this.emit('ask-question', serviceName, question, '');
},
_onSecretInfoQuery: function(client, serviceName, secretQuestion) {
if (!this.serviceIsForeground(serviceName))
if (!this._serviceIsForeground(serviceName))
return;
if (serviceName == OVIRT_SERVICE_NAME) {
@@ -481,24 +521,11 @@ const ShellUserVerifier = new Lang.Class({
},
_onReset: function() {
// Clear previous attempts to authenticate
this._failCounter = 0;
this._updateDefaultService();
this.emit('reset');
this._reset();
},
_onVerificationComplete: function() {
this.emit('verification-complete');
},
_cancelAndReset: function() {
this.cancel();
this._onReset();
},
_retry: function() {
this.begin(this._userName, new Batch.Hold());
this.verificationStatus = VerificationStatus.VERIFICATION_SUCCEEDED;
},
_verificationFailed: function(retry) {
@@ -511,38 +538,23 @@ const ShellUserVerifier = new Lang.Class({
let canRetry = retry && this._userName &&
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY);
if (canRetry) {
if (!this.hasPendingMessages) {
this._retry();
} else {
let signalId = this.connect('no-more-messages',
Lang.bind(this, function() {
this.disconnect(signalId);
this._retry();
}));
}
} else {
if (!this.hasPendingMessages) {
this._cancelAndReset();
} else {
let signalId = this.connect('no-more-messages',
Lang.bind(this, function() {
this.disconnect(signalId);
this._cancelAndReset();
}));
}
}
this.verificationStatus = VerificationStatus.VERIFICATION_FAILED;
this.emit('verification-failed');
this._doAfterPendingMessages(Lang.bind(this, function() {
if (canRetry)
this._beginAuthentication();
else
this.clear();
}));
},
_onConversationStopped: function(client, serviceName) {
// If the login failed with the preauthenticated oVirt credentials
// then discard the credentials and revert to default authentication
// mechanism.
if (this.serviceIsForeground(OVIRT_SERVICE_NAME)) {
if (this._serviceIsForeground(OVIRT_SERVICE_NAME)) {
this._oVirtCredentialsManager.resetToken();
this._preemptingService = null;
this._verificationFailed(false);
return;
}
@@ -550,7 +562,7 @@ const ShellUserVerifier = new Lang.Class({
// if the password service fails, then cancel everything.
// But if, e.g., fingerprint fails, still give
// password authentication a chance to succeed
if (this.serviceIsForeground(serviceName)) {
if (this._serviceIsForeground(serviceName)) {
this._verificationFailed(true);
}
},

View File

@@ -39,6 +39,7 @@ const SystemdLoginSessionIface = '<node> \
<interface name="org.freedesktop.login1.Session"> \
<signal name="Lock" /> \
<signal name="Unlock" /> \
<property name="Active" access="readonly" /> \
</interface> \
</node>';

View File

@@ -403,6 +403,8 @@ const Calendar = new Lang.Class({
// Start off with the current date
this._selectedDate = new Date();
this._shouldDateGrabFocus = false;
this.actor = new St.Table({ homogeneous: false,
style_class: 'calendar',
reactive: true });
@@ -548,6 +550,7 @@ const Calendar = new Lang.Class({
_onSettingsChange: function() {
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
this._buildHeader();
this._rebuildCalendar();
this._update();
},
@@ -607,7 +610,9 @@ const Calendar = new Lang.Class({
button._date = new Date(iter);
button.connect('clicked', Lang.bind(this, function() {
this._shouldDateGrabFocus = true;
this.setDate(button._date);
this._shouldDateGrabFocus = false;
}));
let hasEvents = this._eventSource.hasEvents(iter);
@@ -673,8 +678,11 @@ const Calendar = new Lang.Class({
this._rebuildCalendar();
this._buttons.forEach(Lang.bind(this, function(button) {
if (_sameDay(button._date, this._selectedDate))
if (_sameDay(button._date, this._selectedDate)) {
button.add_style_pseudo_class('active');
if (this._shouldDateGrabFocus)
button.grab_key_focus();
}
else
button.remove_style_pseudo_class('active');
}));

View File

@@ -63,9 +63,14 @@ const DateMenuButton = new Lang.Class({
hbox.add(vbox);
// Date
this._date = new St.Label({ style_class: 'datemenu-date-label',
can_focus: true });
vbox.add(this._date);
this._date = new St.Button({ style_class: 'datemenu-date-label',
can_focus: true,
});
this._date.connect('clicked',
Lang.bind(this, function() {
this._calendar.setDate(new Date(), false);
}));
vbox.add(this._date, { x_fill: false });
this._eventList = new Calendar.EventsList();
this._calendar = new Calendar.Calendar();
@@ -186,7 +191,7 @@ const DateMenuButton = new Lang.Class({
*/
let dateFormat = _("%A %B %e, %Y");
let displayDate = new Date();
this._date.set_text(displayDate.toLocaleFormat(dateFormat));
this._date.set_label(displayDate.toLocaleFormat(dateFormat));
},
_getCalendarApp: function() {

View File

@@ -27,6 +27,8 @@ const CHEVRON = '>>> ';
/* Imports...feel free to add here as needed */
var commandHeader = 'const Clutter = imports.gi.Clutter; ' +
'const GLib = imports.gi.GLib; ' +
'const GObject = imports.gi.GObject; ' +
'const Gio = imports.gi.Gio; ' +
'const Gtk = imports.gi.Gtk; ' +
'const Mainloop = imports.mainloop; ' +
'const Meta = imports.gi.Meta; ' +

View File

@@ -203,6 +203,10 @@ function _initializeUI() {
ExtensionDownloader.init();
ExtensionSystem.init();
layoutManager.connect('startup-prepared', function() {
Meta.activate_session();
});
if (sessionMode.isGreeter && screenShield) {
layoutManager.connect('startup-prepared', function() {
screenShield.showDialog();

View File

@@ -1162,8 +1162,10 @@ const SourceActor = new Lang.Class({
}));
this._actorDestroyed = false;
let scale_factor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._iconBin = new St.Bin({ x_fill: true,
y_fill: true });
height: size * scale_factor,
width: size * scale_factor });
this.actor.add_actor(this._iconBin);

View File

@@ -371,8 +371,10 @@ const GnomeShellExtensions = new Lang.Class({
LaunchExtensionPrefs: function(uuid) {
let appSys = Shell.AppSystem.get_default();
let app = appSys.lookup_app('gnome-shell-extension-prefs.desktop');
app.launch(global.display.get_current_time_roundtrip(),
['extension:///' + uuid], -1, null);
let info = app.get_app_info();
let timestamp = global.display.get_current_time_roundtrip();
info.launch_uris(['extension:///' + uuid],
global.create_app_launch_context(timestamp, -1));
},
ReloadExtension: function(uuid) {

View File

@@ -52,11 +52,8 @@ const Indicator = new Lang.Class({
this._item = new PopupMenu.PopupSubMenuMenuItem(_("Location"), true);
this._item.icon.icon_name = 'find-location-symbolic';
var credentials = new Gio.Credentials();
var uid = credentials.get_unix_user();
this._agent = Gio.DBusExportedObject.wrapJSObject(AgentIface, this);
this._agent.export(Gio.DBus.system,
'/org/freedesktop/GeoClue2/Agent/' + uid);
this._agent.export(Gio.DBus.system, '/org/freedesktop/GeoClue2/Agent');
this._item.status.text = _("On");
this._onOffAction = this._item.menu.addAction(_("Turn Off"), Lang.bind(this, this._onOnOffAction));

View File

@@ -236,16 +236,6 @@ const NMConnectionSection = new Lang.Class({
return this.getIndicatorIcon();
},
_getStatus: function() {
let values = this._connectionItems.values();
for (let item of values) {
if (item.isActive())
return item.getName();
}
return _("Off");
},
getConnectLabel: function() {
return _("Connect");
},
@@ -424,7 +414,7 @@ const NMConnectionDevice = new Lang.Class({
case NetworkManager.DeviceState.DISCONNECTED:
return _("Off");
case NetworkManager.DeviceState.ACTIVATED:
return this.parent();
return _("Connected");
case NetworkManager.DeviceState.UNMANAGED:
/* Translators: this is for network devices that are physically present but are not
under NetworkManager's control (and thus cannot be used in the menu) */
@@ -1455,6 +1445,16 @@ const NMVPNSection = new Lang.Class({
return _("VPN");
},
_getStatus: function() {
let values = this._connectionItems.values();
for (let item of values) {
if (item.isActive())
return item.getName();
}
return _("Off");
},
_getMenuIcon: function() {
return this.getIndicatorIcon() || 'network-vpn-symbolic';
},

View File

@@ -53,8 +53,8 @@ const UnlockDialog = new Lang.Class({
this._authPrompt = new AuthPrompt.AuthPrompt(new Gdm.Client(), AuthPrompt.AuthPromptMode.UNLOCK_ONLY);
this._authPrompt.connect('failed', Lang.bind(this, this._fail));
this._authPrompt.connect('cancelled', Lang.bind(this, this._fail));
this._authPrompt.connect('reset', Lang.bind(this, this._onReset));
this._authPrompt.connect('needs-username', Lang.bind(this, this._onNeedsUserName));
this._authPrompt.setPasswordChar('\u25cf');
this._authPrompt.nextButton.label = _("Unlock");
@@ -101,6 +101,10 @@ const UnlockDialog = new Lang.Class({
},
_onReset: function(authPrompt, beginRequest) {
this._authPrompt.begin();
},
_onNeedsUserName: function() {
let userName;
if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) {
this._authPrompt.setUser(this._user);
@@ -109,7 +113,7 @@ const UnlockDialog = new Lang.Class({
userName = null;
}
this._authPrompt.begin({ userName: userName });
this._authPrompt.gotUserName(userName);
},
_escape: function() {

View File

@@ -812,9 +812,9 @@ const ThumbnailsBox = new Lang.Class({
return false;
if (isWindow)
return window.get_workspace() >= newWorkspaceIndex && winActor != source;
return window.get_workspace().index() >= newWorkspaceIndex && winActor != source;
else
return window.get_workspace() >= newWorkspaceIndex;
return window.get_workspace().index() >= newWorkspaceIndex;
});
this._spliceIndex = newWorkspaceIndex;
@@ -822,7 +822,7 @@ const ThumbnailsBox = new Lang.Class({
// ... move them down one.
windows.forEach(function(winActor) {
let window = winActor.meta_window;
window.change_workspace_by_index(window.get_workspace() + 1, true);
window.change_workspace_by_index(window.get_workspace().index() + 1, true);
});
if (isWindow)

530
po/ar.po

File diff suppressed because it is too large Load Diff

884
po/be.po

File diff suppressed because it is too large Load Diff

529
po/cs.po

File diff suppressed because it is too large Load Diff

575
po/el.po

File diff suppressed because it is too large Load Diff

528
po/es.po

File diff suppressed because it is too large Load Diff

939
po/fi.po

File diff suppressed because it is too large Load Diff

2010
po/fur.po

File diff suppressed because it is too large Load Diff

786
po/gl.po

File diff suppressed because it is too large Load Diff

562
po/he.po

File diff suppressed because it is too large Load Diff

565
po/id.po

File diff suppressed because it is too large Load Diff

586
po/kk.po

File diff suppressed because it is too large Load Diff

1475
po/ko.po

File diff suppressed because it is too large Load Diff

569
po/lt.po

File diff suppressed because it is too large Load Diff

180
po/nb.po
View File

@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell 3.11.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-02-19 19:43+0100\n"
"PO-Revision-Date: 2014-02-19 19:45+0100\n"
"POT-Creation-Date: 2014-03-05 06:45+0100\n"
"PO-Revision-Date: 2014-03-05 06:47+0100\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
"Language: \n"
@@ -94,7 +94,7 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Disables the validation of extension version compatibility"
msgstr ""
msgstr "Slår av validering av versjonskompatibilitet for utvidelser"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid ""
@@ -206,14 +206,14 @@ msgstr "Type tastatur som skal brukes."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "The maximum accuracy level of location."
msgstr ""
msgstr "Maksimalt nøyaktighetsnivå for lokasjon."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid ""
"Configures the maximum level of location accuracy applications are allowed "
"to see. Valid options are 'off' (disable location tracking), 'country', "
"'city', 'neighborhood', 'street', and 'exact' (typically requires GPS "
"receiver). Please keep in mind that this only controls what Geoclue will "
"receiver). Please keep in mind that this only controls what GeoClue will "
"allow applications to see and they can find user's location on their own "
"using network resources (albeit with street-level accuracy at best)."
msgstr ""
@@ -265,7 +265,7 @@ msgstr "Arbeidsområder vises kun på hovedskjerm"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr ""
msgstr "Utsett fokusendringer i musmodus til peker slutter å bevege seg"
#: ../js/extensionPrefs/main.js:127
#, javascript-format
@@ -281,9 +281,9 @@ msgid "Select an extension to configure using the combobox above."
msgstr "Velg en utvidelse som skal konfigureres med komboboksen over."
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:357
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:883
#: ../js/ui/status/network.js:873
msgid "Cancel"
msgstr "Avbryt"
@@ -577,8 +577,8 @@ msgstr "Passord:"
msgid "Type again:"
msgstr "Skriv på nytt:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:250
#: ../js/ui/status/network.js:327 ../js/ui/status/network.js:886
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
#: ../js/ui/status/network.js:317 ../js/ui/status/network.js:876
msgid "Connect"
msgstr "Koble til"
@@ -976,76 +976,86 @@ msgstr "Innstillinger for dato og klokkeslett"
msgid "%A %B %e, %Y"
msgstr "%a %e %B, %Y"
#: ../js/ui/endSessionDialog.js:62
#: ../js/ui/endSessionDialog.js:66
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "Logg ut %s"
#: ../js/ui/endSessionDialog.js:63
#: ../js/ui/endSessionDialog.js:67
msgctxt "title"
msgid "Log Out"
msgstr "Logg ut"
#: ../js/ui/endSessionDialog.js:65
#: ../js/ui/endSessionDialog.js:69
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s vil bli logget ut automatisk om %d sekund."
msgstr[1] "%s vil bli logget ut automatisk om %d sekunder."
#: ../js/ui/endSessionDialog.js:70
#: ../js/ui/endSessionDialog.js:74
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "Du vil bli logget ut automatisk om %d sekund."
msgstr[1] "Du vil bli logget ut automatisk om %d sekunder."
#: ../js/ui/endSessionDialog.js:75
#: ../js/ui/endSessionDialog.js:80
msgctxt "button"
msgid "Log Out"
msgstr "Logg ut"
#: ../js/ui/endSessionDialog.js:81
#: ../js/ui/endSessionDialog.js:86
msgctxt "title"
msgid "Power Off"
msgstr "Slå av"
#: ../js/ui/endSessionDialog.js:83
#: ../js/ui/endSessionDialog.js:87
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "Installer oppdateringer og slå av"
#: ../js/ui/endSessionDialog.js:89
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "Systemet vil slås av automatisk om %d sekund."
msgstr[1] "Systemet vil slås av automatisk om %d sekunder."
#: ../js/ui/endSessionDialog.js:88 ../js/ui/endSessionDialog.js:104
#: ../js/ui/endSessionDialog.js:93
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "Installer utestående programvareoppdateringer"
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
msgctxt "button"
msgid "Restart"
msgstr "Start på nytt"
#: ../js/ui/endSessionDialog.js:90
#: ../js/ui/endSessionDialog.js:98
msgctxt "button"
msgid "Power Off"
msgstr "Slå av"
#: ../js/ui/endSessionDialog.js:97
#: ../js/ui/endSessionDialog.js:105
msgctxt "title"
msgid "Restart"
msgstr "Start på nytt"
#: ../js/ui/endSessionDialog.js:99
#: ../js/ui/endSessionDialog.js:107
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "Systemet vil starte på nytt automatisk om %d sekund."
msgstr[1] "Systemet vil starte på nytt automatisk om %d sekunder."
#: ../js/ui/endSessionDialog.js:112
#: ../js/ui/endSessionDialog.js:121
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "Start på nytt og installer oppdateringer"
#: ../js/ui/endSessionDialog.js:114
#: ../js/ui/endSessionDialog.js:123
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@@ -1057,27 +1067,41 @@ msgstr[1] ""
"Systemet vil starte på nytt og installere oppdateringer automatisk om %d "
"sekunder."
#: ../js/ui/endSessionDialog.js:119
#: ../js/ui/endSessionDialog.js:129
msgctxt "button"
msgid "Restart & Install"
msgid "Restart &amp; Install"
msgstr "Start på nytt og installer"
#: ../js/ui/endSessionDialog.js:275
#: ../js/ui/endSessionDialog.js:130
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "Installer og slå av"
#: ../js/ui/endSessionDialog.js:131
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Slå av etter at oppdateringer er installert"
#: ../js/ui/endSessionDialog.js:315
msgid "Running on battery power: please plug in before installing updates."
msgstr "Kjører på batteristrøm: vennligst koble til strøm før oppdateringer blir installert."
#: ../js/ui/endSessionDialog.js:332
msgid "Some applications are busy or have unsaved work."
msgstr "Noen programmer er opptatt eller har arbeid som ikke er lagret."
#: ../js/ui/endSessionDialog.js:282
#: ../js/ui/endSessionDialog.js:339
msgid "Other users are logged in."
msgstr "Andre brukere er logget inn."
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:486
#: ../js/ui/endSessionDialog.js:618
#, javascript-format
msgid "%s (remote)"
msgstr "%s (ekstern)"
#. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:489
#: ../js/ui/endSessionDialog.js:621
#, javascript-format
msgid "%s (console)"
msgstr "%s (konsoll)"
@@ -1121,7 +1145,7 @@ msgstr "Aktivert"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:717 ../js/ui/status/network.js:560
#: ../js/ui/lookingGlass.js:717 ../js/ui/status/network.js:550
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Deaktivert"
@@ -1146,39 +1170,39 @@ msgstr "Vis kildekode"
msgid "Web Page"
msgstr "Nettside"
#: ../js/ui/messageTray.js:1324
#: ../js/ui/messageTray.js:1326
msgid "Open"
msgstr "Åpne"
#: ../js/ui/messageTray.js:1331
#: ../js/ui/messageTray.js:1333
msgid "Remove"
msgstr "Fjern"
#: ../js/ui/messageTray.js:1628
#: ../js/ui/messageTray.js:1630
msgid "Notifications"
msgstr "Varslinger"
#: ../js/ui/messageTray.js:1635
#: ../js/ui/messageTray.js:1637
msgid "Clear Messages"
msgstr "Tøm meldinger"
#: ../js/ui/messageTray.js:1654
#: ../js/ui/messageTray.js:1656
msgid "Notification Settings"
msgstr "Innstillinger for varsling"
#: ../js/ui/messageTray.js:1707
#: ../js/ui/messageTray.js:1709
msgid "Tray Menu"
msgstr "Meny for varslingsområde"
#: ../js/ui/messageTray.js:1924
#: ../js/ui/messageTray.js:1926
msgid "No Messages"
msgstr "Ingen meldinger"
#: ../js/ui/messageTray.js:1962
#: ../js/ui/messageTray.js:1964
msgid "Message Tray"
msgstr "Meldingstrau"
#: ../js/ui/messageTray.js:2946
#: ../js/ui/messageTray.js:2948
msgid "System Information"
msgstr "Systeminformasjon"
@@ -1345,10 +1369,10 @@ msgstr "Stor tekst"
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:162 ../js/ui/status/network.js:151
#: ../js/ui/status/network.js:328 ../js/ui/status/network.js:1235
#: ../js/ui/status/network.js:1346 ../js/ui/status/rfkill.js:85
#: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:59
#: ../js/ui/status/location.js:159 ../js/ui/status/network.js:151
#: ../js/ui/status/network.js:318 ../js/ui/status/network.js:1225
#: ../js/ui/status/network.js:1336 ../js/ui/status/rfkill.js:85
#: ../js/ui/status/rfkill.js:105
msgid "Turn Off"
msgstr "Slå av"
@@ -1364,7 +1388,7 @@ msgid_plural "%d Connected Devices"
msgstr[0] "%d tilkoblet enhet"
msgstr[1] "%d tilkoblede enheter"
#: ../js/ui/status/bluetooth.js:102 ../js/ui/status/network.js:1263
#: ../js/ui/status/bluetooth.js:102 ../js/ui/status/network.js:1253
msgid "Not Connected"
msgstr "Ikke koblet til"
@@ -1380,17 +1404,17 @@ msgstr "Vis tastaturutforming"
msgid "Location"
msgstr "Lokasjon"
#: ../js/ui/status/location.js:61 ../js/ui/status/location.js:161
#: ../js/ui/status/location.js:58 ../js/ui/status/location.js:158
#: ../js/ui/status/rfkill.js:84
msgid "On"
msgstr "På"
#: ../js/ui/status/location.js:158 ../js/ui/status/network.js:246
#: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1261
#: ../js/ui/status/location.js:155 ../js/ui/status/network.js:415
#: ../js/ui/status/network.js:1251 ../js/ui/status/network.js:1455
msgid "Off"
msgstr "Av"
#: ../js/ui/status/location.js:159 ../js/ui/status/network.js:1235
#: ../js/ui/status/location.js:156 ../js/ui/status/network.js:1225
msgid "Turn On"
msgstr "Slå på"
@@ -1398,122 +1422,126 @@ msgstr "Slå på"
msgid "<unknown>"
msgstr "<ukjent>"
#: ../js/ui/status/network.js:417
msgid "Connected"
msgstr "Koblet til"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:431
#: ../js/ui/status/network.js:421
msgid "unmanaged"
msgstr "ikke håndtert"
#: ../js/ui/status/network.js:433
#: ../js/ui/status/network.js:423
msgid "disconnecting..."
msgstr "kobler fra …"
#: ../js/ui/status/network.js:439 ../js/ui/status/network.js:1363
#: ../js/ui/status/network.js:429 ../js/ui/status/network.js:1353
msgid "connecting..."
msgstr "kobler til …"
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:442 ../js/ui/status/network.js:1366
#: ../js/ui/status/network.js:432 ../js/ui/status/network.js:1356
msgid "authentication required"
msgstr "autentisering kreves"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */
#: ../js/ui/status/network.js:450
#: ../js/ui/status/network.js:440
msgid "firmware missing"
msgstr "fastvare mangler"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:454
#: ../js/ui/status/network.js:444
msgid "unavailable"
msgstr "ikke tilgjengelig"
#: ../js/ui/status/network.js:456 ../js/ui/status/network.js:1368
#: ../js/ui/status/network.js:446 ../js/ui/status/network.js:1358
msgid "connection failed"
msgstr "tilkobling feilet"
#: ../js/ui/status/network.js:472
#: ../js/ui/status/network.js:462
msgid "Wired Settings"
msgstr "Innstillinger for trådbundet nettverk"
#: ../js/ui/status/network.js:514 ../js/ui/status/network.js:592
#: ../js/ui/status/network.js:504 ../js/ui/status/network.js:582
msgid "Mobile Broadband Settings"
msgstr "Innstillinger for mobilt bredbånd"
#: ../js/ui/status/network.js:556 ../js/ui/status/network.js:1259
#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:1249
msgid "Hardware Disabled"
msgstr "Maskinvare slått av"
#: ../js/ui/status/network.js:600
#: ../js/ui/status/network.js:590
msgid "Use as Internet connection"
msgstr "Bruk som internettforbindelse"
#: ../js/ui/status/network.js:781
#: ../js/ui/status/network.js:771
msgid "Airplane Mode is On"
msgstr "Flymodus er slått på"
#: ../js/ui/status/network.js:782
#: ../js/ui/status/network.js:772
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Trådløst blir slått av når flymodus slås på."
#: ../js/ui/status/network.js:783
#: ../js/ui/status/network.js:773
msgid "Turn Off Airplane Mode"
msgstr "Slå av flymodus"
#: ../js/ui/status/network.js:792
#: ../js/ui/status/network.js:782
msgid "Wi-Fi is Off"
msgstr "Trådløs er av"
#: ../js/ui/status/network.js:793
#: ../js/ui/status/network.js:783
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Trådløs må slås på for å koble til et nettverk."
#: ../js/ui/status/network.js:794
#: ../js/ui/status/network.js:784
msgid "Turn On Wi-Fi"
msgstr "Slå på trådløs"
#: ../js/ui/status/network.js:819
#: ../js/ui/status/network.js:809
msgid "Wi-Fi Networks"
msgstr "Wi-Fi nettverk"
#: ../js/ui/status/network.js:821
#: ../js/ui/status/network.js:811
msgid "Select a network"
msgstr "Velg et nettverk"
#: ../js/ui/status/network.js:850
#: ../js/ui/status/network.js:840
msgid "No Networks"
msgstr "Ingen nettverk"
#: ../js/ui/status/network.js:871 ../js/ui/status/rfkill.js:103
#: ../js/ui/status/network.js:861 ../js/ui/status/rfkill.js:103
msgid "Use hardware switch to turn off"
msgstr "Bruk maskinvarebryter til å slå av"
#: ../js/ui/status/network.js:1141
#: ../js/ui/status/network.js:1131
msgid "Select Network"
msgstr "Velg nettverk"
#: ../js/ui/status/network.js:1147
#: ../js/ui/status/network.js:1137
msgid "Wi-Fi Settings"
msgstr "Innstillinger"
#: ../js/ui/status/network.js:1252
#: ../js/ui/status/network.js:1242
msgid "Hotspot Active"
msgstr "Trådløst aksesspunkt aktivt"
#: ../js/ui/status/network.js:1255
#: ../js/ui/status/network.js:1245
msgid "Connecting"
msgstr "Kobler til"
#: ../js/ui/status/network.js:1434 ../js/ui/status/rfkill.js:88
#: ../js/ui/status/network.js:1424 ../js/ui/status/rfkill.js:88
msgid "Network Settings"
msgstr "Innstillinger for nettverk"
#: ../js/ui/status/network.js:1436
#: ../js/ui/status/network.js:1426
msgid "VPN Settings"
msgstr "Innstillinger for VPN"
#: ../js/ui/status/network.js:1455
#: ../js/ui/status/network.js:1445
msgid "VPN"
msgstr "VPN"

908
po/pl.po

File diff suppressed because it is too large Load Diff

View File

@@ -20,16 +20,16 @@ msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-02-19 16:08+0000\n"
"PO-Revision-Date: 2014-02-19 15:01-0300\n"
"Last-Translator: Enrico Nicoletto <liverig@gmail.com>\n"
"POT-Creation-Date: 2014-03-05 20:31+0000\n"
"PO-Revision-Date: 2014-03-05 19:02-0300\n"
"Last-Translator: Rafael Ferreira <rafael.f.f1@gmail.com>\n"
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n>1);\n"
"X-Generator: Poedit 1.6.3\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 1.6.4\n"
"X-Project-Style: gnome\n"
#: ../data/50-gnome-shell-system.xml.in.h:1
@@ -242,21 +242,30 @@ msgid "The maximum accuracy level of location."
msgstr "O nível máximo de precisão de local."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
#| msgid ""
#| "Configures the maximum level of location accuracy applications are "
#| "allowed to see. Valid options are 'off' (disable location tracking), "
#| "'country', 'city', 'neighborhood', 'street', and 'exact' (typically "
#| "requires GPS receiver). Please keep in mind that this only controls what "
#| "Geoclue will allow applications to see and they can find user's location "
#| "on their own using network resources (albeit with street-level accuracy "
#| "at best)."
msgid ""
"Configures the maximum level of location accuracy applications are allowed "
"to see. Valid options are 'off' (disable location tracking), 'country', "
"'city', 'neighborhood', 'street', and 'exact' (typically requires GPS "
"receiver). Please keep in mind that this only controls what Geoclue will "
"receiver). Please keep in mind that this only controls what GeoClue will "
"allow applications to see and they can find user's location on their own "
"using network resources (albeit with street-level accuracy at best)."
msgstr ""
"Configura-se o nível máximo de precisão de local onde os aplicativos com "
"permissão podem ver. Opções válidas são 'off' (desabilita o rastreamento de "
"local), 'country', 'city', 'neighborhood', 'street', e 'exact' (geralmente "
"necessita de receptor de GPS). Por gentileza, tenha em mente que estes são "
"os únicos controles que o Geoclue permitirá aos aplicativos observarem e "
"eles podem localizar o local do usuário por si só, usando recursos de rede "
"(apesar de na melhor hipótese usarem precisão à nível de rua)."
"Configura o nível máximo de precisão de local a que os aplicativos com "
"permissão podem ver. Opções válidas são \"off\" (desabilita o rastreamento "
"de local), \"country\", \"city\", \"neighborhood\", \"street\" e \"exact"
"\" (geralmente necessita de receptor de GPS). Por gentileza, tenha em mente "
"que estes são os únicos controles que o GeoClue permitirá aos aplicativos "
"observarem e eles podem localizar o local do usuário por si só, usando "
"recursos de rede (apesar de na melhor hipótese usarem precisão à nível de "
"rua)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "The application icon mode."
@@ -327,9 +336,9 @@ msgstr ""
"Selecione uma extensão para configurar usando a caixa de seleção abaixo."
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:357
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:883
#: ../js/ui/status/network.js:873
msgid "Cancel"
msgstr "Cancelar"
@@ -562,35 +571,35 @@ msgid "Next month"
msgstr "Próximo mês"
#. Translators: Text to show if there are no events */
#: ../js/ui/calendar.js:762
#: ../js/ui/calendar.js:763
msgid "Nothing Scheduled"
msgstr "Nada agendado"
#. Translators: Shown on calendar heading when selected day occurs on current year */
#: ../js/ui/calendar.js:780
#: ../js/ui/calendar.js:781
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %d de %B"
#. Translators: Shown on calendar heading when selected day occurs on different year */
#: ../js/ui/calendar.js:783
#: ../js/ui/calendar.js:784
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %d de %B de %Y"
#: ../js/ui/calendar.js:794
#: ../js/ui/calendar.js:795
msgid "Today"
msgstr "Hoje"
#: ../js/ui/calendar.js:798
#: ../js/ui/calendar.js:799
msgid "Tomorrow"
msgstr "Amanhã"
#: ../js/ui/calendar.js:809
#: ../js/ui/calendar.js:810
msgid "This week"
msgstr "Esta semana"
#: ../js/ui/calendar.js:817
#: ../js/ui/calendar.js:818
msgid "Next week"
msgstr "Próxima semana"
@@ -623,8 +632,8 @@ msgstr "Senha:"
msgid "Type again:"
msgstr "Digite novamente:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:250
#: ../js/ui/status/network.js:327 ../js/ui/status/network.js:886
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
#: ../js/ui/status/network.js:317 ../js/ui/status/network.js:876
msgid "Connect"
msgstr "Conectar"
@@ -744,23 +753,18 @@ msgstr "Sem áudio"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:955
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%H%M"
msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/ui/components/telepathyClient.js:962
#| msgid "<b>Yesterday</b>, <b>%H:%M</b>"
msgid "Yesterday, %H%M"
msgstr "Ontem, %H%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/ui/components/telepathyClient.js:969
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%A, %H%M"
msgstr "%A, %H%M"
@@ -768,8 +772,6 @@ msgstr "%A, %H%M"
#. followed by a time string in 24h format.
#. i.e. "May 25, 14:30" */
#: ../js/ui/components/telepathyClient.js:976
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%B %d, %H%M"
msgstr "%d de %B, %H%M"
@@ -782,8 +784,6 @@ msgstr "%d de %B de %Y, %H%M"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:991
#| msgctxt "event list time"
#| msgid "%l%M%p"
msgid "%l%M %p"
msgstr "%l%M %p"
@@ -796,8 +796,6 @@ msgstr "Ontem, %l%M %p"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1005
#| msgctxt "event list time"
#| msgid "%l%M%p"
msgid "%A, %l%M %p"
msgstr "%A, %l%M %p"
@@ -805,8 +803,6 @@ msgstr "%A, %l%M %p"
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1012
#| msgctxt "event list time"
#| msgid "%l%M%p"
msgid "%B %d, %l%M %p"
msgstr "%d de %B, %l%M %p"
@@ -1016,96 +1012,106 @@ msgstr "Mostrar aplicativos"
msgid "Dash"
msgstr "Dash"
#: ../js/ui/dateMenu.js:86
#: ../js/ui/dateMenu.js:91
msgid "Open Calendar"
msgstr "Abrir agenda"
#: ../js/ui/dateMenu.js:90
#: ../js/ui/dateMenu.js:95
msgid "Open Clocks"
msgstr "Abrir relógios"
# O "&" foi inserido como "e" para versão 3.8.0 no gnome-control-center
#: ../js/ui/dateMenu.js:97
#: ../js/ui/dateMenu.js:102
msgid "Date & Time Settings"
msgstr "Configurações de data & hora"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. */
#: ../js/ui/dateMenu.js:187
#: ../js/ui/dateMenu.js:192
msgid "%A %B %e, %Y"
msgstr "%A, %e de %B de %Y"
#: ../js/ui/endSessionDialog.js:62
#: ../js/ui/endSessionDialog.js:66
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "Encerrar sessão de %s"
#: ../js/ui/endSessionDialog.js:63
#: ../js/ui/endSessionDialog.js:67
msgctxt "title"
msgid "Log Out"
msgstr "Encerrar sessão"
#: ../js/ui/endSessionDialog.js:65
#: ../js/ui/endSessionDialog.js:69
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s encerrará a sessão automaticamente em %d segundo."
msgstr[1] "%s encerrará a sessão automaticamente em %d segundos."
#: ../js/ui/endSessionDialog.js:70
#: ../js/ui/endSessionDialog.js:74
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "Sua sessão será encerrada automaticamente em %d segundo."
msgstr[1] "Sua sessão será encerrada automaticamente em %d segundos."
#: ../js/ui/endSessionDialog.js:75
#: ../js/ui/endSessionDialog.js:80
msgctxt "button"
msgid "Log Out"
msgstr "Encerrar sessão"
#: ../js/ui/endSessionDialog.js:81
#: ../js/ui/endSessionDialog.js:86
msgctxt "title"
msgid "Power Off"
msgstr "Desligar"
#: ../js/ui/endSessionDialog.js:83
#: ../js/ui/endSessionDialog.js:87
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "Instalar atualizações & desligar"
#: ../js/ui/endSessionDialog.js:89
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "O sistema será desligado automaticamente em %d segundo."
msgstr[1] "O sistema será desligado automaticamente em %d segundos."
#: ../js/ui/endSessionDialog.js:88 ../js/ui/endSessionDialog.js:104
#: ../js/ui/endSessionDialog.js:93
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "Instalar atualizações de software pendentes"
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
msgctxt "button"
msgid "Restart"
msgstr "Reiniciar"
#: ../js/ui/endSessionDialog.js:90
#: ../js/ui/endSessionDialog.js:98
msgctxt "button"
msgid "Power Off"
msgstr "Desligar"
#: ../js/ui/endSessionDialog.js:97
#: ../js/ui/endSessionDialog.js:105
msgctxt "title"
msgid "Restart"
msgstr "Reiniciar"
#: ../js/ui/endSessionDialog.js:99
#: ../js/ui/endSessionDialog.js:107
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "O sistema irá reiniciar automaticamente em %d segundo."
msgstr[1] "O sistema irá reiniciar automaticamente em %d segundos."
#: ../js/ui/endSessionDialog.js:112
#: ../js/ui/endSessionDialog.js:121
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "Reiniciar & Instalar atualizações"
#: ../js/ui/endSessionDialog.js:114
#: ../js/ui/endSessionDialog.js:123
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@@ -1117,27 +1123,43 @@ msgstr[1] ""
"O sistema irá reiniciar e instalar atualizações automaticamente em %d "
"segundos."
#: ../js/ui/endSessionDialog.js:119
#: ../js/ui/endSessionDialog.js:129
msgctxt "button"
msgid "Restart & Install"
msgstr "Reiniciar & Instalar"
msgid "Restart &amp; Install"
msgstr "Reiniciar &amp; instalar"
#: ../js/ui/endSessionDialog.js:275
#: ../js/ui/endSessionDialog.js:130
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "Instalar &amp; desligar"
#: ../js/ui/endSessionDialog.js:131
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Desligar após atualizações serem instaladas"
#: ../js/ui/endSessionDialog.js:315
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"Funcionando na bateria: por favor, conecte na tomada antes de instalar "
"atualizações."
#: ../js/ui/endSessionDialog.js:332
msgid "Some applications are busy or have unsaved work."
msgstr "Alguns aplicativos estão ocupados ou possuem trabalhos não salvos."
#: ../js/ui/endSessionDialog.js:282
#: ../js/ui/endSessionDialog.js:339
msgid "Other users are logged in."
msgstr "Outros usuários estão com sessão aberta."
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:486
#: ../js/ui/endSessionDialog.js:618
#, javascript-format
msgid "%s (remote)"
msgstr "%s (remoto)"
#. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:489
#: ../js/ui/endSessionDialog.js:621
#, javascript-format
msgid "%s (console)"
msgstr "%s (console)"
@@ -1181,7 +1203,7 @@ msgstr "Habilitado"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:717 ../js/ui/status/network.js:560
#: ../js/ui/lookingGlass.js:717 ../js/ui/status/network.js:550
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Desabilitado"
@@ -1206,39 +1228,39 @@ msgstr "Ver fonte"
msgid "Web Page"
msgstr "Página web"
#: ../js/ui/messageTray.js:1324
#: ../js/ui/messageTray.js:1326
msgid "Open"
msgstr "Abrir"
#: ../js/ui/messageTray.js:1331
#: ../js/ui/messageTray.js:1333
msgid "Remove"
msgstr "Remover"
#: ../js/ui/messageTray.js:1628
#: ../js/ui/messageTray.js:1630
msgid "Notifications"
msgstr "Notificações"
#: ../js/ui/messageTray.js:1635
#: ../js/ui/messageTray.js:1637
msgid "Clear Messages"
msgstr "Sem mensagens"
#: ../js/ui/messageTray.js:1654
#: ../js/ui/messageTray.js:1656
msgid "Notification Settings"
msgstr "Configurações de notificação"
#: ../js/ui/messageTray.js:1707
#: ../js/ui/messageTray.js:1709
msgid "Tray Menu"
msgstr "Menu de notificação"
#: ../js/ui/messageTray.js:1924
#: ../js/ui/messageTray.js:1926
msgid "No Messages"
msgstr "Sem mensagens"
#: ../js/ui/messageTray.js:1962
#: ../js/ui/messageTray.js:1964
msgid "Message Tray"
msgstr "Área de notificação"
#: ../js/ui/messageTray.js:2946
#: ../js/ui/messageTray.js:2948
msgid "System Information"
msgstr "Informações do sistema"
@@ -1405,10 +1427,10 @@ msgstr "Texto grande"
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:162 ../js/ui/status/network.js:151
#: ../js/ui/status/network.js:328 ../js/ui/status/network.js:1235
#: ../js/ui/status/network.js:1346 ../js/ui/status/rfkill.js:85
#: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:59
#: ../js/ui/status/location.js:159 ../js/ui/status/network.js:151
#: ../js/ui/status/network.js:318 ../js/ui/status/network.js:1225
#: ../js/ui/status/network.js:1336 ../js/ui/status/rfkill.js:85
#: ../js/ui/status/rfkill.js:105
msgid "Turn Off"
msgstr "Desligar"
@@ -1424,7 +1446,7 @@ msgid_plural "%d Connected Devices"
msgstr[0] "%d dispositivo conectado"
msgstr[1] "%d dispositivos conectados"
#: ../js/ui/status/bluetooth.js:102 ../js/ui/status/network.js:1263
#: ../js/ui/status/bluetooth.js:102 ../js/ui/status/network.js:1253
msgid "Not Connected"
msgstr "Não conectado"
@@ -1440,18 +1462,17 @@ msgstr "Exibir disposição de teclado"
msgid "Location"
msgstr "Localização"
#: ../js/ui/status/location.js:61 ../js/ui/status/location.js:161
#: ../js/ui/status/location.js:58 ../js/ui/status/location.js:158
#: ../js/ui/status/rfkill.js:84
msgid "On"
msgstr "On"
# Referente ao estado "desligado" da rede.
#: ../js/ui/status/location.js:158 ../js/ui/status/network.js:246
#: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1261
#: ../js/ui/status/location.js:155 ../js/ui/status/network.js:415
#: ../js/ui/status/network.js:1251 ../js/ui/status/network.js:1455
msgid "Off"
msgstr "Desligado"
msgstr "Off"
#: ../js/ui/status/location.js:159 ../js/ui/status/network.js:1235
#: ../js/ui/status/location.js:156 ../js/ui/status/network.js:1225
msgid "Turn On"
msgstr "Ligar"
@@ -1459,124 +1480,127 @@ msgstr "Ligar"
msgid "<unknown>"
msgstr "<desconhecido>"
#: ../js/ui/status/network.js:417
#| msgid "Connect"
msgid "Connected"
msgstr "Conectado"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:431
#: ../js/ui/status/network.js:421
msgid "unmanaged"
msgstr "não gerenciado"
#: ../js/ui/status/network.js:433
#: ../js/ui/status/network.js:423
msgid "disconnecting..."
msgstr "desconectando..."
#: ../js/ui/status/network.js:439 ../js/ui/status/network.js:1363
#: ../js/ui/status/network.js:429 ../js/ui/status/network.js:1353
msgid "connecting..."
msgstr "conectando..."
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:442 ../js/ui/status/network.js:1366
#: ../js/ui/status/network.js:432 ../js/ui/status/network.js:1356
msgid "authentication required"
msgstr "autenticação necessária"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */
#: ../js/ui/status/network.js:450
#: ../js/ui/status/network.js:440
msgid "firmware missing"
msgstr "firmware faltando"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:454
#: ../js/ui/status/network.js:444
msgid "unavailable"
msgstr "indisponível"
#: ../js/ui/status/network.js:456 ../js/ui/status/network.js:1368
#: ../js/ui/status/network.js:446 ../js/ui/status/network.js:1358
msgid "connection failed"
msgstr "conexão falhou"
#: ../js/ui/status/network.js:472
#: ../js/ui/status/network.js:462
msgid "Wired Settings"
msgstr "Configurações da rede cabeada"
#: ../js/ui/status/network.js:514 ../js/ui/status/network.js:592
#: ../js/ui/status/network.js:504 ../js/ui/status/network.js:582
msgid "Mobile Broadband Settings"
msgstr "Configurações de banda larga móvel"
#: ../js/ui/status/network.js:556 ../js/ui/status/network.js:1259
#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:1249
msgid "Hardware Disabled"
msgstr "Hardware desabilitado"
#: ../js/ui/status/network.js:600
#: ../js/ui/status/network.js:590
msgid "Use as Internet connection"
msgstr "Usar como conexão de Internet"
#: ../js/ui/status/network.js:781
#: ../js/ui/status/network.js:771
msgid "Airplane Mode is On"
msgstr "Modo avião ligado"
#: ../js/ui/status/network.js:782
#: ../js/ui/status/network.js:772
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "O Wi-Fi é desabilitado quando o modo avião está ligado."
#: ../js/ui/status/network.js:783
#: ../js/ui/status/network.js:773
msgid "Turn Off Airplane Mode"
msgstr "Desligar modo avião"
#: ../js/ui/status/network.js:792
#: ../js/ui/status/network.js:782
msgid "Wi-Fi is Off"
msgstr "Wi-Fi desligado"
#: ../js/ui/status/network.js:793
#: ../js/ui/status/network.js:783
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "O Wi-Fi precisa ser ligado a fim de conectar-se a uma rede."
#: ../js/ui/status/network.js:794
#: ../js/ui/status/network.js:784
msgid "Turn On Wi-Fi"
msgstr "Ligar Wi-Fi"
#: ../js/ui/status/network.js:819
#: ../js/ui/status/network.js:809
msgid "Wi-Fi Networks"
msgstr "Redes Wi-Fi"
#: ../js/ui/status/network.js:821
#: ../js/ui/status/network.js:811
msgid "Select a network"
msgstr "Selecione uma rede"
#: ../js/ui/status/network.js:850
#: ../js/ui/status/network.js:840
msgid "No Networks"
msgstr "Nenhuma rede"
#: ../js/ui/status/network.js:871 ../js/ui/status/rfkill.js:103
#: ../js/ui/status/network.js:861 ../js/ui/status/rfkill.js:103
msgid "Use hardware switch to turn off"
msgstr "Usar alternador de hardware para desligar"
#: ../js/ui/status/network.js:1141
#: ../js/ui/status/network.js:1131
msgid "Select Network"
msgstr "Selecione a rede"
#: ../js/ui/status/network.js:1147
#: ../js/ui/status/network.js:1137
msgid "Wi-Fi Settings"
msgstr "Configurações de Wi-Fi"
#: ../js/ui/status/network.js:1252
#: ../js/ui/status/network.js:1242
msgid "Hotspot Active"
msgstr "Ponto de acesso ativo"
#: ../js/ui/status/network.js:1255
#| msgid "Connect"
#: ../js/ui/status/network.js:1245
msgid "Connecting"
msgstr "Conectando"
#: ../js/ui/status/network.js:1434 ../js/ui/status/rfkill.js:88
#: ../js/ui/status/network.js:1424 ../js/ui/status/rfkill.js:88
msgid "Network Settings"
msgstr "Configurações de rede"
#: ../js/ui/status/network.js:1436
#| msgid "Settings"
#: ../js/ui/status/network.js:1426
msgid "VPN Settings"
msgstr "Configurações de VPN"
#: ../js/ui/status/network.js:1455
#: ../js/ui/status/network.js:1445
msgid "VPN"
msgstr "VPN"

519
po/tg.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -99,6 +99,15 @@ def run_shell(perf_output=None):
shell.wait()
return shell.returncode == 0
def restore_shell():
pid = os.fork()
if (pid == 0):
if "MUTTER_WM_CLASS_FILTER" in os.environ:
del os.environ["MUTTER_WM_CLASS_FILTER"]
os.execlp("gnome-shell", "gnome-shell", "--replace")
else:
sys.exit(0)
def upload_performance_report(report_text):
try:
config_home = os.environ['XDG_CONFIG_HOME']
@@ -320,6 +329,6 @@ if args:
normal_exit = run_performance_test()
if normal_exit:
sys.exit(0)
restore_shell()
else:
sys.exit(1)

View File

@@ -154,45 +154,6 @@ gnome_shell_plugin_init (GnomeShellPlugin *shell_plugin)
{
}
static gboolean
gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin)
{
MetaPlugin *plugin = META_PLUGIN (shell_plugin);
CoglDisplay *cogl_display =
cogl_context_get_display (shell_plugin->cogl_context);
CoglRenderer *renderer = cogl_display_get_renderer (cogl_display);
const char * (* query_extensions_string) (Display *dpy, int screen);
Bool (* query_extension) (Display *dpy, int *error, int *event);
MetaScreen *screen;
MetaDisplay *display;
Display *xdisplay;
const char *glx_extensions;
/* We will only get swap events if Cogl is using GLX */
if (cogl_renderer_get_winsys_id (renderer) != COGL_WINSYS_ID_GLX)
return FALSE;
screen = meta_plugin_get_screen (plugin);
display = meta_screen_get_display (screen);
xdisplay = meta_display_get_xdisplay (display);
query_extensions_string =
(void *) cogl_get_proc_address ("glXQueryExtensionsString");
query_extension =
(void *) cogl_get_proc_address ("glXQueryExtension");
query_extension (xdisplay,
&shell_plugin->glx_error_base,
&shell_plugin->glx_event_base);
glx_extensions =
query_extensions_string (xdisplay,
meta_screen_get_screen_number (screen));
return strstr (glx_extensions, "GLX_INTEL_swap_event") != NULL;
}
static void
gnome_shell_plugin_start (MetaPlugin *plugin)
{
@@ -205,8 +166,7 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
backend = clutter_get_default_backend ();
shell_plugin->cogl_context = clutter_backend_get_cogl_context (backend);
shell_plugin->have_swap_event =
gnome_shell_plugin_has_swap_event (shell_plugin);
shell_plugin->have_swap_event = clutter_feature_available (CLUTTER_FEATURE_SWAP_EVENTS);
shell_perf_log_define_event (shell_perf_log_get_default (),
"glx.swapComplete",

View File

@@ -756,8 +756,8 @@ update_scale_factor (GdkScreen *screen, gpointer data)
GValue value = G_VALUE_INIT;
g_value_init (&value, G_TYPE_INT);
gdk_screen_get_setting (global->gdk_screen, "gdk-window-scaling-factor", &value);
g_object_set (context, "scale-factor", g_value_get_int (&value), NULL);
if (gdk_screen_get_setting (global->gdk_screen, "gdk-window-scaling-factor", &value))
g_object_set (context, "scale-factor", g_value_get_int (&value), NULL);
}
/* This is an IBus workaround. The flow of events with IBus is that every time
@@ -819,8 +819,8 @@ gnome_shell_gdk_event_handler (GdkEvent *event_gdk,
if (event_gdk->key.window == global->ibus_window)
{
ClutterDeviceManager *device_manager = clutter_device_manager_get_default ();
ClutterInputDevice *keyboard = clutter_device_manager_get_core_device (device_manager,
CLUTTER_KEYBOARD_DEVICE);
ClutterInputDevice *keyboard = clutter_device_manager_get_device (device_manager,
META_VIRTUAL_CORE_KEYBOARD_ID);
ClutterEvent *event_clutter = clutter_event_new ((event_gdk->type == GDK_KEY_PRESS) ?
CLUTTER_KEY_PRESS : CLUTTER_KEY_RELEASE);
@@ -1280,8 +1280,8 @@ shell_global_sync_pointer (ShellGlobal *global)
event.y = y;
event.modifier_state = mods;
event.axes = NULL;
event.device = clutter_device_manager_get_core_device (clutter_device_manager_get_default (),
CLUTTER_POINTER_DEVICE);
event.device = clutter_device_manager_get_device (clutter_device_manager_get_default (),
META_VIRTUAL_CORE_POINTER_ID);
/* Leaving event.source NULL will force clutter to look it up, which
* will generate enter/leave events as a side effect, if they are

View File

@@ -4,7 +4,6 @@
#include "shell-js.h"
#include <jsapi.h>
#include <gio/gio.h>
#include <gjs/gjs.h>
#include <gjs/gjs-module.h>

View File

@@ -256,6 +256,7 @@ get_secrets_keyring_cb (GObject *source,
GList *items;
GList *l;
GHashTable *outer;
gboolean secrets_found = FALSE;
items = secret_service_search_finish (NULL, result, &secret_error);
@@ -312,6 +313,8 @@ get_secrets_keyring_cb (GObject *source,
else
g_hash_table_insert (closure->vpn_entries, secret_name, g_strdup (secret_value_get (secret, NULL)));
secrets_found = TRUE;
g_hash_table_unref (attributes);
secret_value_unref (secret);
break;
@@ -325,9 +328,13 @@ get_secrets_keyring_cb (GObject *source,
g_list_free_full (items, g_object_unref);
/* All VPN requests get sent to the VPN's auth dialog, since it knows better
* than the agent do about what secrets are required.
* than the agent about what secrets are required. Otherwise, if no secrets
* were found and interaction is allowed the ask for some secrets, because
* NetworkManager will fail the connection if not secrets are returned
* instead of asking again with REQUEST_NEW.
*/
if (closure->is_vpn)
if (closure->is_vpn ||
(!secrets_found && (closure->flags & NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION)))
{
nm_connection_update_secrets (closure->connection, closure->setting_name, closure->entries, NULL);
@@ -463,7 +470,6 @@ shell_network_agent_respond (ShellNetworkAgent *self,
{
ShellNetworkAgentPrivate *priv;
ShellAgentRequest *request;
NMConnection *dup;
GHashTable *outer;
g_return_if_fail (SHELL_IS_NETWORK_AGENT (self));
@@ -498,11 +504,16 @@ shell_network_agent_respond (ShellNetworkAgent *self,
/* response == SHELL_NETWORK_AGENT_CONFIRMED */
/* Save updated secrets */
dup = nm_connection_duplicate (request->connection);
/* Save any updated secrets */
if ((request->flags & NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION) ||
(request->flags & NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW))
{
NMConnection *dup = nm_connection_duplicate (request->connection);
nm_connection_update_secrets (dup, request->setting_name, request->entries, NULL);
nm_secret_agent_save_secrets (NM_SECRET_AGENT (self), dup, NULL, NULL);
nm_connection_update_secrets (dup, request->setting_name, request->entries, NULL);
nm_secret_agent_save_secrets (NM_SECRET_AGENT (self), dup, NULL, NULL);
g_object_unref (dup);
}
outer = g_hash_table_new (g_str_hash, g_str_equal);
g_hash_table_insert (outer, request->setting_name, request->entries);
@@ -510,7 +521,6 @@ shell_network_agent_respond (ShellNetworkAgent *self,
request->callback (NM_SECRET_AGENT (self), request->connection, outer, NULL, request->callback_data);
g_hash_table_destroy (outer);
g_object_unref (dup);
g_hash_table_remove (priv->requests, request_id);
}

View File

@@ -253,7 +253,7 @@ get_pointer_coords (int *x,
ClutterPoint point;
manager = clutter_device_manager_get_default ();
device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE);
device = clutter_device_manager_get_device (manager, META_VIRTUAL_CORE_POINTER_ID);
clutter_input_device_get_coords (device, NULL, &point);
*x = point.x;

View File

@@ -347,5 +347,13 @@ shell_util_cursor_tracker_to_clutter (MetaCursorTracker *tracker,
CoglTexture *sprite;
sprite = meta_cursor_tracker_get_sprite (tracker);
clutter_texture_set_cogl_texture (texture, sprite);
if (sprite)
{
clutter_actor_show (CLUTTER_ACTOR (texture));
clutter_texture_set_cogl_texture (texture, sprite);
}
else
{
clutter_actor_hide (CLUTTER_ACTOR (texture));
}
}

View File

@@ -46,6 +46,9 @@
#include <gtk/gtk.h>
#include <atk/atk-enum-types.h>
/* This is set in stone and also hard-coded in GDK. */
#define VIRTUAL_CORE_POINTER_ID 2
/*
* Forward declaration for sake of StWidgetChild
*/
@@ -1722,8 +1725,7 @@ st_widget_sync_hover (StWidget *widget)
ClutterActor *pointer_actor;
device_manager = clutter_device_manager_get_default ();
pointer = clutter_device_manager_get_core_device (device_manager,
CLUTTER_POINTER_DEVICE);
pointer = clutter_device_manager_get_device (device_manager, VIRTUAL_CORE_POINTER_ID);
pointer_actor = clutter_input_device_get_pointer_actor (pointer);
if (pointer_actor)
st_widget_set_hover (widget, clutter_actor_contains (CLUTTER_ACTOR (widget), pointer_actor));