Compare commits
79 Commits
3.11.90
...
wip/waylan
Author | SHA1 | Date | |
---|---|---|---|
![]() |
28f4030aa2 | ||
![]() |
67fe376564 | ||
![]() |
fb824131ae | ||
![]() |
056375cbcf | ||
![]() |
84431cbc65 | ||
![]() |
92c283da4d | ||
![]() |
6e27ef8ff9 | ||
![]() |
0c511c884b | ||
![]() |
7afb503666 | ||
![]() |
0b9d01a1c0 | ||
![]() |
b978d99820 | ||
![]() |
6d8d094e0c | ||
![]() |
97e0175f48 | ||
![]() |
ebef4ff174 | ||
![]() |
82b8b32355 | ||
![]() |
5b4337f716 | ||
![]() |
5eb377bd3b | ||
![]() |
8173110842 | ||
![]() |
fee97da26b | ||
![]() |
0cc10e0c5d | ||
![]() |
0ba05b29b9 | ||
![]() |
ef8123e3a2 | ||
![]() |
257e1f3096 | ||
![]() |
6441ae77d9 | ||
![]() |
3f0938072f | ||
![]() |
2fe06a28aa | ||
![]() |
38750ba798 | ||
![]() |
b4c01f8905 | ||
![]() |
104d70c88e | ||
![]() |
133a350f2f | ||
![]() |
496ab55357 | ||
![]() |
a391758e31 | ||
![]() |
eaf8ad4949 | ||
![]() |
2f583bdcf3 | ||
![]() |
db19012a41 | ||
![]() |
62be46884e | ||
![]() |
3f2e6a48a9 | ||
![]() |
ff124e5f74 | ||
![]() |
c07421c195 | ||
![]() |
de8348d3b9 | ||
![]() |
184df8a853 | ||
![]() |
12768a147c | ||
![]() |
94161cea37 | ||
![]() |
52a4ef7cf7 | ||
![]() |
3432f71500 | ||
![]() |
8282aa6c24 | ||
![]() |
59f9eaa1c9 | ||
![]() |
4433b735c4 | ||
![]() |
9cd30fa6b5 | ||
![]() |
2c7bbfb500 | ||
![]() |
51a1d23bf9 | ||
![]() |
c02e6e82bc | ||
![]() |
e37a3fa7e6 | ||
![]() |
e23c2ffecc | ||
![]() |
744f11d045 | ||
![]() |
b7eb1f3e8b | ||
![]() |
3f28091e52 | ||
![]() |
b4ee86955d | ||
![]() |
8b866efe92 | ||
![]() |
fb61ab8df7 | ||
![]() |
990956ece7 | ||
![]() |
414b592d53 | ||
![]() |
751154d9da | ||
![]() |
29addc499c | ||
![]() |
caa98de581 | ||
![]() |
1fd1ec4312 | ||
![]() |
f4607626e4 | ||
![]() |
b494c15e4b | ||
![]() |
3c0defa125 | ||
![]() |
f2df4d95de | ||
![]() |
fabcf20e06 | ||
![]() |
b9510b9ab7 | ||
![]() |
52a2ebad04 | ||
![]() |
89a2dc71fc | ||
![]() |
adb0de43d8 | ||
![]() |
e2a811a720 | ||
![]() |
5bcafc5c17 | ||
![]() |
2d24536caf | ||
![]() |
b088c4086b |
19
NEWS
19
NEWS
@@ -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]
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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>
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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() {
|
||||
|
214
js/gdm/util.js
214
js/gdm/util.js
@@ -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);
|
||||
}
|
||||
},
|
||||
|
@@ -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>';
|
||||
|
||||
|
@@ -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');
|
||||
}));
|
||||
|
@@ -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() {
|
||||
|
@@ -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; ' +
|
||||
|
@@ -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();
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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) {
|
||||
|
@@ -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));
|
||||
|
@@ -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';
|
||||
},
|
||||
|
@@ -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() {
|
||||
|
@@ -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)
|
||||
|
180
po/nb.po
180
po/nb.po
@@ -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 & Install"
|
||||
msgstr "Start på nytt og installer"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:275
|
||||
#: ../js/ui/endSessionDialog.js:130
|
||||
msgctxt "button"
|
||||
msgid "Install & 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"
|
||||
|
||||
|
248
po/pt_BR.po
248
po/pt_BR.po
@@ -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 & Install"
|
||||
msgstr "Reiniciar & instalar"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:275
|
||||
#: ../js/ui/endSessionDialog.js:130
|
||||
msgctxt "button"
|
||||
msgid "Install & Power Off"
|
||||
msgstr "Instalar & 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"
|
||||
|
||||
|
643
po/zh_CN.po
643
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
|
@@ -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",
|
||||
|
@@ -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
|
||||
|
@@ -4,7 +4,6 @@
|
||||
|
||||
#include "shell-js.h"
|
||||
|
||||
#include <jsapi.h>
|
||||
#include <gio/gio.h>
|
||||
#include <gjs/gjs.h>
|
||||
#include <gjs/gjs-module.h>
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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));
|
||||
}
|
||||
}
|
||||
|
@@ -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));
|
||||
|
Reference in New Issue
Block a user