Compare commits
31 Commits
3.9.4
...
wip/login-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b19cef9dd5 | ||
|
|
2d4473c35a | ||
|
|
6d9fb50207 | ||
|
|
86b8885d96 | ||
|
|
cf7355e4d0 | ||
|
|
dab8c5ea56 | ||
|
|
4b889eac32 | ||
|
|
86835db8f2 | ||
|
|
bc317bf3f2 | ||
|
|
5c036eadf9 | ||
|
|
263474705b | ||
|
|
1e781ec78f | ||
|
|
ef1eabf033 | ||
|
|
2fa40555e6 | ||
|
|
2aae272d86 | ||
|
|
7db0900cc8 | ||
|
|
c1e2d66abd | ||
|
|
78b1ba56ce | ||
|
|
5385205b8e | ||
|
|
5c8bbb511e | ||
|
|
fde01f0b71 | ||
|
|
1c04ae3216 | ||
|
|
35b4907e52 | ||
|
|
2431b8e021 | ||
|
|
bd5c04b923 | ||
|
|
6e00b6e214 | ||
|
|
c9b079cbb5 | ||
|
|
9163372786 | ||
|
|
dabcd29fb6 | ||
|
|
d36e435801 | ||
|
|
a18fb27d0f |
@@ -470,10 +470,6 @@ StScrollBar StButton#vhandle:active {
|
||||
height: 1.86em;
|
||||
}
|
||||
|
||||
#panel.lock-screen {
|
||||
background-color: rgba(0,0,0,0.3);
|
||||
}
|
||||
|
||||
#panel.unlock-screen,
|
||||
#panel.login-screen {
|
||||
background-color: transparent;
|
||||
@@ -1161,11 +1157,6 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
/* Calendar popup */
|
||||
|
||||
#calendarArea {
|
||||
/* this is the total width of the popup */
|
||||
max-width: 720px;
|
||||
}
|
||||
|
||||
.calendar-vertical-separator {
|
||||
-stipple-width: 1px;
|
||||
-stipple-color: #505050;
|
||||
@@ -1303,7 +1294,7 @@ StScrollBar StButton#vhandle:active {
|
||||
}
|
||||
|
||||
.events-table {
|
||||
min-width: 320px;
|
||||
width: 320px;
|
||||
spacing-columns: 6pt;
|
||||
padding: 0 1.4em;
|
||||
}
|
||||
@@ -2244,6 +2235,10 @@ StScrollBar StButton#vhandle:active {
|
||||
min-width: 350px;
|
||||
}
|
||||
|
||||
.login-dialog-button-box {
|
||||
spacing: 5px;
|
||||
}
|
||||
|
||||
.login-dialog-prompt-login-hint-message {
|
||||
font-size: 10.5pt;
|
||||
}
|
||||
@@ -2325,6 +2320,9 @@ StScrollBar StButton#vhandle:active {
|
||||
font-weight: bold;
|
||||
color: #666666;
|
||||
padding-top: 1em;
|
||||
}
|
||||
|
||||
.login-dialog-user-selection-box .login-dialog-not-listed-label {
|
||||
padding-left: 2px;
|
||||
}
|
||||
|
||||
@@ -2353,7 +2351,7 @@ StScrollBar StButton#vhandle:active {
|
||||
}
|
||||
|
||||
.login-dialog-prompt-entry {
|
||||
width: 15em;
|
||||
width: 20em;
|
||||
}
|
||||
|
||||
.login-dialog-session-list-button StIcon {
|
||||
@@ -2433,6 +2431,11 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
/* Screen shield */
|
||||
|
||||
#panel.lock-screen,
|
||||
#screenShieldNotifications {
|
||||
background-color: rgba(0,0,0,0.3);
|
||||
}
|
||||
|
||||
.screen-shield-background {
|
||||
background: black;
|
||||
box-shadow: 0px 4px 8px rgba(0,0,0,0.9);
|
||||
@@ -2478,11 +2481,8 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
#screenShieldNotifications {
|
||||
border-radius: 8px;
|
||||
background-color: rgba(0.0, 0.0, 0.0, 0.9);
|
||||
border: 2px solid #868686;
|
||||
max-height: 500px;
|
||||
padding: 18px 0;
|
||||
box-shadow: .5em .5em 20px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
|
||||
.screen-shield-notifications-box {
|
||||
|
||||
@@ -32,7 +32,6 @@ const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Animation = imports.ui.animation;
|
||||
const Batch = imports.gdm.batch;
|
||||
const BoxPointer = imports.ui.boxpointer;
|
||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||
@@ -46,20 +45,11 @@ const UserWidget = imports.ui.userWidget;
|
||||
|
||||
const _FADE_ANIMATION_TIME = 0.25;
|
||||
const _SCROLL_ANIMATION_TIME = 0.5;
|
||||
const _DEFAULT_BUTTON_WELL_ICON_SIZE = 24;
|
||||
const _DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
|
||||
const _DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3;
|
||||
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
|
||||
const _LOGO_ICON_HEIGHT = 48;
|
||||
|
||||
let _loginDialog = null;
|
||||
|
||||
const DefaultButtonWellMode = {
|
||||
NONE: 0,
|
||||
SESSION_MENU_BUTTON: 1,
|
||||
SPINNER: 2
|
||||
};
|
||||
|
||||
const UserListItem = new Lang.Class({
|
||||
Name: 'UserListItem',
|
||||
|
||||
@@ -466,63 +456,19 @@ const LoginDialog = new Lang.Class({
|
||||
x_fill: true,
|
||||
y_fill: true });
|
||||
|
||||
this._promptBox = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
|
||||
vertical: true });
|
||||
|
||||
this._promptBox.connect('button-press-event',
|
||||
Lang.bind(this, function(actor, event) {
|
||||
if (event.get_key_symbol() == Clutter.KEY_Escape) {
|
||||
this._authPrompt = new GdmUtil.AuthPrompt({ visible: false });
|
||||
this._authPrompt.connect('cancel',
|
||||
Lang.bind(this, function() {
|
||||
this.cancel();
|
||||
}
|
||||
}));
|
||||
|
||||
this._promptBox.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
|
||||
align_axis: Clutter.AlignAxis.BOTH,
|
||||
factor: 0.5 }));
|
||||
this.actor.add_child(this._promptBox);
|
||||
this._promptUser = new St.Bin({ x_fill: true,
|
||||
x_align: St.Align.START });
|
||||
this._promptBox.add(this._promptUser,
|
||||
{ x_align: St.Align.START,
|
||||
x_fill: true,
|
||||
y_fill: true,
|
||||
expand: true });
|
||||
this._promptLabel = new St.Label({ style_class: 'login-dialog-prompt-label' });
|
||||
this._authPrompt.actor.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
|
||||
align_axis: Clutter.AlignAxis.BOTH,
|
||||
factor: 0.5 }));
|
||||
|
||||
this._promptBox.add(this._promptLabel,
|
||||
{ expand: true,
|
||||
x_fill: true,
|
||||
y_fill: true,
|
||||
x_align: St.Align.START });
|
||||
this._promptEntry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
|
||||
can_focus: true });
|
||||
this._promptEntryTextChangedId = 0;
|
||||
this._promptEntryActivateId = 0;
|
||||
this._promptBox.add(this._promptEntry,
|
||||
{ expand: true,
|
||||
x_fill: true,
|
||||
y_fill: false,
|
||||
x_align: St.Align.START });
|
||||
|
||||
this._promptEntry.grab_key_focus();
|
||||
|
||||
this._promptMessage = new St.Label({ visible: false });
|
||||
this._promptBox.add(this._promptMessage, { x_fill: true });
|
||||
|
||||
this._promptLoginHint = new St.Label({ style_class: 'login-dialog-prompt-login-hint-message' });
|
||||
this._promptLoginHint.hide();
|
||||
this._promptBox.add(this._promptLoginHint);
|
||||
|
||||
this._buttonBox = new St.BoxLayout({ style_class: 'modal-dialog-button-box',
|
||||
vertical: false });
|
||||
this._promptBox.add(this._buttonBox,
|
||||
{ expand: true,
|
||||
x_align: St.Align.MIDDLE,
|
||||
y_align: St.Align.END });
|
||||
this._cancelButton = null;
|
||||
this._signInButton = null;
|
||||
|
||||
this._promptBox.hide();
|
||||
this.actor.add_child(this._authPrompt.actor);
|
||||
this._userList.actor.add_constraint(new Clutter.BindConstraint({ source: this._authPrompt.actor,
|
||||
coordinate: Clutter.BindCoordinate.WIDTH }));
|
||||
|
||||
// translators: this message is shown below the user list on the
|
||||
// login screen. It can be activated to reveal an entry for
|
||||
@@ -573,8 +519,6 @@ const LoginDialog = new Lang.Class({
|
||||
this._onUserListActivated(item);
|
||||
}));
|
||||
|
||||
this._defaultButtonWell = new St.Widget();
|
||||
this._defaultButtonWellMode = DefaultButtonWellMode.NONE;
|
||||
|
||||
this._sessionMenuButton = new SessionMenuButton();
|
||||
this._sessionMenuButton.connect('session-activated',
|
||||
@@ -583,17 +527,8 @@ const LoginDialog = new Lang.Class({
|
||||
}));
|
||||
this._sessionMenuButton.actor.opacity = 0;
|
||||
this._sessionMenuButton.actor.show();
|
||||
this._defaultButtonWell.add_child(this._sessionMenuButton.actor);
|
||||
this._authPrompt.addActorToDefaultButtonWell(this._sessionMenuButton.actor);
|
||||
|
||||
let spinnerIcon = global.datadir + '/theme/process-working.svg';
|
||||
this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, _DEFAULT_BUTTON_WELL_ICON_SIZE);
|
||||
this._workSpinner.actor.opacity = 0;
|
||||
this._workSpinner.actor.show();
|
||||
|
||||
this._defaultButtonWell.add_child(this._workSpinner.actor);
|
||||
this._sessionMenuButton.actor.add_constraint(new Clutter.AlignConstraint({ source: this._workSpinner.actor,
|
||||
align_axis: Clutter.AlignAxis.BOTH,
|
||||
factor: 0.5 }));
|
||||
},
|
||||
|
||||
_updateDisableUserList: function() {
|
||||
@@ -641,7 +576,8 @@ const LoginDialog = new Lang.Class({
|
||||
this._userVerifier.clear();
|
||||
|
||||
this._updateSensitivity(true);
|
||||
this._promptMessage.hide();
|
||||
this._authPrompt.reset();
|
||||
|
||||
this._user = null;
|
||||
this._verifyingUser = false;
|
||||
|
||||
@@ -651,73 +587,11 @@ const LoginDialog = new Lang.Class({
|
||||
this._showUserList();
|
||||
},
|
||||
|
||||
_getActorForDefaultButtonWellMode: function(mode) {
|
||||
let actor;
|
||||
|
||||
if (mode == DefaultButtonWellMode.NONE)
|
||||
actor = null;
|
||||
else if (mode == DefaultButtonWellMode.SPINNER)
|
||||
actor = this._workSpinner.actor;
|
||||
else if (mode == DefaultButtonWellMode.SESSION_MENU_BUTTON)
|
||||
actor = this._sessionMenuButton.actor;
|
||||
|
||||
return actor;
|
||||
},
|
||||
|
||||
_setDefaultButtonWellMode: function(mode, immediately) {
|
||||
if (this._defaultButtonWellMode == DefaultButtonWellMode.NONE &&
|
||||
mode == DefaultButtonWellMode.NONE)
|
||||
return;
|
||||
|
||||
let oldActor = this._getActorForDefaultButtonWellMode(this._defaultButtonWellMode);
|
||||
|
||||
if (oldActor)
|
||||
Tweener.removeTweens(oldActor);
|
||||
|
||||
let actor = this._getActorForDefaultButtonWellMode(mode);
|
||||
|
||||
if (this._defaultButtonWellMode != mode && oldActor) {
|
||||
if (immediately)
|
||||
oldActor.opacity = 0;
|
||||
else
|
||||
Tweener.addTween(oldActor,
|
||||
{ opacity: 0,
|
||||
time: _DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
||||
delay: _DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
||||
transition: 'linear',
|
||||
onCompleteScope: this,
|
||||
onComplete: function() {
|
||||
if (mode == DefaultButtonWellMode.SPINNER) {
|
||||
if (this._workSpinner)
|
||||
this._workSpinner.stop();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
if (actor) {
|
||||
if (mode == DefaultButtonWellMode.SPINNER)
|
||||
this._workSpinner.play();
|
||||
|
||||
if (immediately)
|
||||
actor.opacity = 255;
|
||||
else
|
||||
Tweener.addTween(actor,
|
||||
{ opacity: 255,
|
||||
time: _DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
||||
delay: _DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
||||
transition: 'linear' });
|
||||
}
|
||||
|
||||
this._defaultButtonWellMode = mode;
|
||||
},
|
||||
|
||||
_verificationFailed: function() {
|
||||
this._promptEntry.text = '';
|
||||
this._authPrompt.clear();
|
||||
|
||||
this._updateSensitivity(true);
|
||||
this._setDefaultButtonWellMode(DefaultButtonWellMode.NONE, true);
|
||||
this._authPrompt.setActorInDefaultButtonWell(null, true);
|
||||
},
|
||||
|
||||
_onDefaultSessionChanged: function(client, sessionId) {
|
||||
@@ -725,24 +599,15 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_showMessage: function(userVerifier, message, styleClass) {
|
||||
if (message) {
|
||||
this._promptMessage.text = message;
|
||||
this._promptMessage.styleClass = styleClass;
|
||||
this._promptMessage.show();
|
||||
} else {
|
||||
this._promptMessage.hide();
|
||||
}
|
||||
this._authPrompt.setMessage(message, styleClass);
|
||||
},
|
||||
|
||||
_showLoginHint: function(verifier, message) {
|
||||
this._promptLoginHint.set_text(message)
|
||||
this._promptLoginHint.show();
|
||||
this._promptLoginHint.opacity = 255;
|
||||
this._authPrompt.setHint(message);
|
||||
},
|
||||
|
||||
_hideLoginHint: function() {
|
||||
this._promptLoginHint.hide();
|
||||
this._promptLoginHint.set_text('');
|
||||
this._authPrompt.setHint(null);
|
||||
},
|
||||
|
||||
cancel: function() {
|
||||
@@ -766,27 +631,16 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_showPrompt: function(forSecret) {
|
||||
this._promptLabel.show();
|
||||
this._promptEntry.show();
|
||||
this._promptLoginHint.opacity = 0;
|
||||
this._promptLoginHint.show();
|
||||
this._promptBox.opacity = 0;
|
||||
this._promptBox.show();
|
||||
Tweener.addTween(this._promptBox,
|
||||
this._authPrompt.actor.opacity = 0;
|
||||
this._authPrompt.actor.show();
|
||||
Tweener.addTween(this._authPrompt.actor,
|
||||
{ opacity: 255,
|
||||
time: _FADE_ANIMATION_TIME,
|
||||
transition: 'easeOutQuad' });
|
||||
|
||||
if (this._shouldShowSessionMenuButton())
|
||||
this._setDefaultButtonWellMode(DefaultButtonWellMode.SESSION_MENU_BUTTON, true);
|
||||
else
|
||||
this._setDefaultButtonWellMode(DefaultButtonWellMode.NONE, true);
|
||||
|
||||
this._promptEntry.grab_key_focus();
|
||||
|
||||
let hold = new Batch.Hold();
|
||||
let tasks = [function() {
|
||||
this._prepareDialog(forSecret, hold);
|
||||
this._preparePrompt(forSecret, hold);
|
||||
},
|
||||
|
||||
hold];
|
||||
@@ -796,122 +650,54 @@ const LoginDialog = new Lang.Class({
|
||||
return batch.run();
|
||||
},
|
||||
|
||||
_prepareDialog: function(forSecret, hold) {
|
||||
this._buttonBox.visible = true;
|
||||
this._buttonBox.remove_all_children();
|
||||
|
||||
_preparePrompt: function(forSecret, hold) {
|
||||
let cancelLabel;
|
||||
if (!this._disableUserList || this._verifyingUser) {
|
||||
this._cancelButton = new St.Button({ style_class: 'modal-dialog-button',
|
||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||
reactive: true,
|
||||
can_focus: true,
|
||||
label: _("Cancel") });
|
||||
this._cancelButton.connect('clicked',
|
||||
Lang.bind(this, function() {
|
||||
this.cancel();
|
||||
}));
|
||||
this._buttonBox.add(this._cancelButton,
|
||||
{ expand: false,
|
||||
x_fill: false,
|
||||
y_fill: false,
|
||||
x_align: St.Align.START,
|
||||
y_align: St.Align.END });
|
||||
cancelLabel = _("Cancel");
|
||||
} else {
|
||||
cancelLabel = null;
|
||||
}
|
||||
|
||||
this._buttonBox.add(this._defaultButtonWell,
|
||||
{ expand: true,
|
||||
x_fill: false,
|
||||
y_fill: false,
|
||||
x_align: St.Align.END,
|
||||
y_align: St.Align.MIDDLE });
|
||||
this._signInButton = new St.Button({ style_class: 'modal-dialog-button',
|
||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||
reactive: true,
|
||||
can_focus: true,
|
||||
label: forSecret ? C_("button", "Sign In") : _("Next") });
|
||||
this._signInButton.connect('clicked',
|
||||
Lang.bind(this, function() {
|
||||
hold.release();
|
||||
}));
|
||||
this._signInButton.add_style_pseudo_class('default');
|
||||
this._buttonBox.add(this._signInButton,
|
||||
{ expand: false,
|
||||
x_fill: false,
|
||||
y_fill: false,
|
||||
x_align: St.Align.END,
|
||||
y_align: St.Align.END });
|
||||
let nextLabel;
|
||||
if (forSecret) {
|
||||
nextLabel = C_("button", "Sign In");
|
||||
} else {
|
||||
nextLabel = _("Next");
|
||||
}
|
||||
|
||||
this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0);
|
||||
let signalId = this._authPrompt.connect('next', Lang.bind(this, function() {
|
||||
this._authPrompt.disconnect(signalId);
|
||||
hold.release();
|
||||
}));
|
||||
|
||||
this._promptEntryTextChangedId =
|
||||
this._promptEntry.clutter_text.connect('text-changed',
|
||||
Lang.bind(this, function() {
|
||||
this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0);
|
||||
}));
|
||||
|
||||
this._promptEntryActivateId =
|
||||
this._promptEntry.clutter_text.connect('activate', function() {
|
||||
hold.release();
|
||||
});
|
||||
this._authPrompt.resetButtons(cancelLabel, nextLabel);
|
||||
},
|
||||
|
||||
_updateSensitivity: function(sensitive) {
|
||||
this._promptEntry.reactive = sensitive;
|
||||
this._promptEntry.clutter_text.editable = sensitive;
|
||||
this._sessionMenuButton.updateSensitivity(sensitive);
|
||||
this._updateSignInButtonSensitivity(sensitive);
|
||||
},
|
||||
|
||||
_updateSignInButtonSensitivity: function(sensitive) {
|
||||
if (this._signInButton) {
|
||||
this._signInButton.reactive = sensitive;
|
||||
this._signInButton.can_focus = sensitive;
|
||||
}
|
||||
},
|
||||
|
||||
_hidePrompt: function() {
|
||||
if (this._promptEntryTextChangedId > 0) {
|
||||
this._promptEntry.clutter_text.disconnect(this._promptEntryTextChangedId);
|
||||
this._promptEntryTextChangedId = 0;
|
||||
}
|
||||
|
||||
if (this._promptEntryActivateId > 0) {
|
||||
this._promptEntry.clutter_text.disconnect(this._promptEntryActivateId);
|
||||
this._promptEntryActivateId = 0;
|
||||
}
|
||||
|
||||
this._setDefaultButtonWellMode(DefaultButtonWellMode.NONE, true);
|
||||
this._promptBox.hide();
|
||||
this._promptLoginHint.hide();
|
||||
|
||||
this._promptUser.set_child(null);
|
||||
|
||||
this._updateSensitivity(true);
|
||||
this._promptEntry.set_text('');
|
||||
|
||||
this._sessionMenuButton.close();
|
||||
this._promptLoginHint.hide();
|
||||
|
||||
this._buttonBox.remove_all_children();
|
||||
this._signInButton = null;
|
||||
this._cancelButton = null;
|
||||
this._authPrompt.updateSensitivity(sensitive);
|
||||
},
|
||||
|
||||
_askQuestion: function(verifier, serviceName, question, passwordChar) {
|
||||
this._promptLabel.set_text(question);
|
||||
this._authPrompt.setPasswordChar(passwordChar);
|
||||
this._authPrompt.setQuestion(question);
|
||||
|
||||
this._updateSensitivity(true);
|
||||
this._promptEntry.set_text('');
|
||||
this._promptEntry.clutter_text.set_password_char(passwordChar);
|
||||
|
||||
if (this._shouldShowSessionMenuButton())
|
||||
this._authPrompt.setActorInDefaultButtonWell(this._sessionMenuButton.actor, true);
|
||||
else
|
||||
this._authPrompt.setActorInDefaultButtonWell(null, true);
|
||||
|
||||
let tasks = [function() {
|
||||
return this._showPrompt(!!passwordChar);
|
||||
},
|
||||
|
||||
function() {
|
||||
let text = this._promptEntry.get_text();
|
||||
let text = this._authPrompt.getAnswer();
|
||||
|
||||
this._updateSensitivity(false);
|
||||
this._setDefaultButtonWellMode(DefaultButtonWellMode.SPINNER, false);
|
||||
this._authPrompt.startSpinning();
|
||||
this._userVerifier.answerQuery(serviceName, text);
|
||||
}];
|
||||
|
||||
@@ -933,9 +719,8 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_askForUsernameAndLogIn: function() {
|
||||
this._promptLabel.set_text(_("Username: "));
|
||||
this._promptEntry.set_text('');
|
||||
this._promptEntry.clutter_text.set_password_char('');
|
||||
this._authPrompt.setPasswordChar('');
|
||||
this._authPrompt.setQuestion(_("Username: "));
|
||||
|
||||
let realmManager = new Realmd.Manager();
|
||||
let signalId = realmManager.connect('login-format-changed',
|
||||
@@ -945,8 +730,8 @@ const LoginDialog = new Lang.Class({
|
||||
let tasks = [this._showPrompt,
|
||||
|
||||
function() {
|
||||
let userName = this._promptEntry.get_text();
|
||||
this._promptEntry.reactive = false;
|
||||
let userName = this._authPrompt.getAnswer();
|
||||
this._authPrompt._entry.reactive = false;
|
||||
return this._beginVerificationForUser(userName);
|
||||
},
|
||||
|
||||
@@ -1130,7 +915,8 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_showUserList: function() {
|
||||
this._hidePrompt();
|
||||
this._authPrompt.hide();
|
||||
this._sessionMenuButton.close();
|
||||
this._setUserListExpanded(true);
|
||||
this._notListedButton.show();
|
||||
this._userList.actor.grab_key_focus();
|
||||
@@ -1145,8 +931,7 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_beginVerificationForItem: function(item) {
|
||||
let userWidget = new UserWidget.UserWidget(item.user);
|
||||
this._promptUser.set_child(userWidget.actor);
|
||||
this._authPrompt.setUser(item.user);
|
||||
|
||||
let tasks = [function() {
|
||||
let userName = item.user.get_user_name();
|
||||
@@ -1214,7 +999,7 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
addCharacter: function(unichar) {
|
||||
this._promptEntry.clutter_text.insert_unichar(unichar);
|
||||
this._authPrompt.addCharacter(unichar);
|
||||
},
|
||||
});
|
||||
Signals.addSignalMethods(LoginDialog.prototype);
|
||||
|
||||
342
js/gdm/util.js
342
js/gdm/util.js
@@ -6,12 +6,16 @@ const GLib = imports.gi.GLib;
|
||||
const Lang = imports.lang;
|
||||
const Mainloop = imports.mainloop;
|
||||
const Signals = imports.signals;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Animation = imports.ui.animation;
|
||||
const Batch = imports.gdm.batch;
|
||||
const Fprint = imports.gdm.fingerprint;
|
||||
const Main = imports.ui.main;
|
||||
const Params = imports.misc.params;
|
||||
const ShellEntry = imports.ui.shellEntry;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const UserWidget = imports.ui.userWidget;
|
||||
|
||||
const PASSWORD_SERVICE_NAME = 'gdm-password';
|
||||
const FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
|
||||
@@ -30,6 +34,10 @@ const DISABLE_USER_LIST_KEY = 'disable-user-list';
|
||||
// Give user 16ms to read each character of a PAM message
|
||||
const USER_READ_TIME = 16
|
||||
|
||||
const DEFAULT_BUTTON_WELL_ICON_SIZE = 24;
|
||||
const DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
|
||||
const DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3;
|
||||
|
||||
function fadeInActor(actor) {
|
||||
if (actor.opacity == 255 && actor.visible)
|
||||
return null;
|
||||
@@ -459,3 +467,337 @@ const ShellUserVerifier = new Lang.Class({
|
||||
},
|
||||
});
|
||||
Signals.addSignalMethods(ShellUserVerifier.prototype);
|
||||
|
||||
const AuthPrompt = new Lang.Class({
|
||||
Name: 'AuthPrompt',
|
||||
|
||||
_init: function(params) {
|
||||
params = Params.parse(params,
|
||||
{ style_class: 'login-dialog-prompt-layout',
|
||||
vertical: true }, true);
|
||||
this.actor = new St.BoxLayout(params);
|
||||
this.actor.connect('button-press-event',
|
||||
Lang.bind(this, function(actor, event) {
|
||||
if (event.get_key_symbol() == Clutter.KEY_Escape) {
|
||||
this.emit('cancel');
|
||||
}
|
||||
}));
|
||||
|
||||
this._userWell = new St.Bin({ x_fill: true,
|
||||
x_align: St.Align.START });
|
||||
this.actor.add(this._userWell,
|
||||
{ x_align: St.Align.START,
|
||||
x_fill: true,
|
||||
y_fill: true,
|
||||
expand: true });
|
||||
this._label = new St.Label({ style_class: 'login-dialog-prompt-label' });
|
||||
|
||||
this.actor.add(this._label,
|
||||
{ expand: true,
|
||||
x_fill: true,
|
||||
y_fill: true,
|
||||
x_align: St.Align.START });
|
||||
this._entry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
|
||||
can_focus: true });
|
||||
ShellEntry.addContextMenu(this._entry, { isPassword: true });
|
||||
this._entryTextChangedId = 0;
|
||||
this._entryActivateId = 0;
|
||||
this.actor.add(this._entry,
|
||||
{ expand: true,
|
||||
x_fill: true,
|
||||
y_fill: false,
|
||||
x_align: St.Align.START });
|
||||
|
||||
this._entry.grab_key_focus();
|
||||
|
||||
this._message = new St.Label({ opacity: 0 });
|
||||
this.actor.add(this._message, { x_fill: true });
|
||||
|
||||
this._loginHint = new St.Label({ style_class: 'login-dialog-prompt-login-hint-message' });
|
||||
this.actor.add(this._loginHint);
|
||||
|
||||
this._buttonBox = new St.BoxLayout({ style_class: 'login-dialog-button-box',
|
||||
vertical: false });
|
||||
this.actor.add(this._buttonBox,
|
||||
{ expand: true,
|
||||
x_align: St.Align.MIDDLE,
|
||||
y_align: St.Align.END });
|
||||
this._cancelButton = null;
|
||||
this._nextButton = null;
|
||||
|
||||
this._defaultButtonWell = new St.Widget();
|
||||
this._defaultButtonWellActor = null;
|
||||
|
||||
let spinnerIcon = global.datadir + '/theme/process-working.svg';
|
||||
this._spinner = new Animation.AnimatedIcon(spinnerIcon, DEFAULT_BUTTON_WELL_ICON_SIZE);
|
||||
this._spinner.actor.opacity = 0;
|
||||
this._spinner.actor.show();
|
||||
this._defaultButtonWell.add_child(this._spinner.actor);
|
||||
},
|
||||
|
||||
addActorToDefaultButtonWell: function(actor) {
|
||||
this._defaultButtonWell.add_child(actor);
|
||||
|
||||
actor.add_constraint(new Clutter.AlignConstraint({ source: this._spinner.actor,
|
||||
align_axis: Clutter.AlignAxis.BOTH,
|
||||
factor: 0.5 }));
|
||||
},
|
||||
|
||||
setActorInDefaultButtonWell: function(actor, immediately) {
|
||||
if (!this._defaultButtonWellActor &&
|
||||
!actor)
|
||||
return;
|
||||
|
||||
let oldActor = this._defaultButtonWellActor;
|
||||
|
||||
if (oldActor)
|
||||
Tweener.removeTweens(oldActor);
|
||||
|
||||
let isWorkSpinner;
|
||||
if (actor == this._spinner.actor)
|
||||
isWorkSpinner = true;
|
||||
else
|
||||
isWorkSpinner = false;
|
||||
|
||||
if (this._defaultButtonWellActor != actor && oldActor) {
|
||||
if (immediately)
|
||||
oldActor.opacity = 0;
|
||||
else
|
||||
Tweener.addTween(oldActor,
|
||||
{ opacity: 0,
|
||||
time: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
||||
delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
||||
transition: 'linear',
|
||||
onCompleteScope: this,
|
||||
onComplete: function() {
|
||||
if (isWorkSpinner) {
|
||||
if (this._spinner)
|
||||
this._spinner.stop();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (actor) {
|
||||
if (isWorkSpinner)
|
||||
this._spinner.play();
|
||||
|
||||
if (immediately)
|
||||
actor.opacity = 255;
|
||||
else
|
||||
Tweener.addTween(actor,
|
||||
{ opacity: 255,
|
||||
time: DEFAULT_BUTTON_WELL_ANIMATION_TIME,
|
||||
delay: DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
|
||||
transition: 'linear' });
|
||||
}
|
||||
|
||||
this._defaultButtonWellActor = actor;
|
||||
},
|
||||
|
||||
startSpinning: function() {
|
||||
this.setActorInDefaultButtonWell(this._spinner.actor, true);
|
||||
},
|
||||
|
||||
stopSpinning: function() {
|
||||
this.setActorInDefaultButtonWell(null, true);
|
||||
},
|
||||
|
||||
clear: function() {
|
||||
this._entry.text = '';
|
||||
},
|
||||
|
||||
setPasswordChar: function(passwordChar) {
|
||||
this._entry.clutter_text.set_password_char(passwordChar);
|
||||
this._entry.menu.isPassword = passwordChar != '';
|
||||
},
|
||||
|
||||
setQuestion: function(question) {
|
||||
if (!this._initialAnswer) {
|
||||
this.clear();
|
||||
} else if (this._initialAnswer['activate-id']) {
|
||||
this._entry.clutter_text.disconnect(this._initialAnswer['activate-id']);
|
||||
delete this._initialAnswer['activate-id'];
|
||||
}
|
||||
|
||||
this._label.set_text(question);
|
||||
|
||||
this._label.show();
|
||||
this._entry.show();
|
||||
|
||||
this._loginHint.opacity = 0;
|
||||
this._loginHint.show();
|
||||
|
||||
this._entry.grab_key_focus();
|
||||
},
|
||||
|
||||
getAnswer: function() {
|
||||
let text;
|
||||
|
||||
if (this._initialAnswer && this._initialAnswer['text']) {
|
||||
text = this._initialAnswer['text'];
|
||||
this._initialAnswer = null;
|
||||
} else {
|
||||
text = this._entry.get_text();
|
||||
}
|
||||
|
||||
return text;
|
||||
},
|
||||
|
||||
setMessage: function(message, styleClass) {
|
||||
if (message) {
|
||||
this._message.text = message;
|
||||
this._message.styleClass = styleClass;
|
||||
this._message.opacity = 255;
|
||||
} else {
|
||||
this._message.opacity = 0;
|
||||
}
|
||||
},
|
||||
|
||||
resetButtons: function(cancelLabel, nextLabel) {
|
||||
if (this._initialAnswer && this._initialAnswer['text']) {
|
||||
this.emit('next');
|
||||
return;
|
||||
}
|
||||
|
||||
this._buttonBox.visible = true;
|
||||
this._buttonBox.remove_all_children();
|
||||
|
||||
if (cancelLabel) {
|
||||
this._cancelButton = new St.Button({ style_class: 'modal-dialog-button',
|
||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||
reactive: true,
|
||||
can_focus: true,
|
||||
label: cancelLabel });
|
||||
this._cancelButton.connect('clicked',
|
||||
Lang.bind(this, function() {
|
||||
this.emit('cancel');
|
||||
}));
|
||||
this._buttonBox.add(this._cancelButton,
|
||||
{ expand: false,
|
||||
x_fill: false,
|
||||
y_fill: false,
|
||||
x_align: St.Align.START,
|
||||
y_align: St.Align.END });
|
||||
}
|
||||
|
||||
this._buttonBox.add(this._defaultButtonWell,
|
||||
{ expand: true,
|
||||
x_fill: false,
|
||||
y_fill: false,
|
||||
x_align: St.Align.END,
|
||||
y_align: St.Align.MIDDLE });
|
||||
this._nextButton = new St.Button({ style_class: 'modal-dialog-button',
|
||||
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
|
||||
reactive: true,
|
||||
can_focus: true,
|
||||
label: nextLabel });
|
||||
this._nextButton.connect('clicked',
|
||||
Lang.bind(this, function() {
|
||||
this.emit('next');
|
||||
}));
|
||||
this._nextButton.add_style_pseudo_class('default');
|
||||
this._buttonBox.add(this._nextButton,
|
||||
{ expand: false,
|
||||
x_fill: false,
|
||||
y_fill: false,
|
||||
x_align: St.Align.END,
|
||||
y_align: St.Align.END });
|
||||
|
||||
this._updateNextButtonSensitivity(this._entry.text.length > 0);
|
||||
|
||||
this._entryTextChangedId =
|
||||
this._entry.clutter_text.connect('text-changed',
|
||||
Lang.bind(this, function() {
|
||||
this._updateNextButtonSensitivity(this._entry.text.length > 0);
|
||||
}));
|
||||
|
||||
this._entryActivateId =
|
||||
this._entry.clutter_text.connect('activate', Lang.bind(this, function() {
|
||||
this.emit('next');
|
||||
}));
|
||||
},
|
||||
|
||||
_updateNextButtonSensitivity: function(sensitive) {
|
||||
if (this._nextButton) {
|
||||
this._nextButton.reactive = sensitive;
|
||||
this._nextButton.can_focus = sensitive;
|
||||
}
|
||||
},
|
||||
|
||||
updateSensitivity: function(sensitive) {
|
||||
this._updateNextButtonSensitivity(sensitive);
|
||||
this._entry.reactive = sensitive;
|
||||
this._entry.clutter_text.editable = sensitive;
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
if (this._entryTextChangedId > 0) {
|
||||
this._entry.clutter_text.disconnect(this._entryTextChangedId);
|
||||
this._entryTextChangedId = 0;
|
||||
}
|
||||
|
||||
if (this._entryActivateId > 0) {
|
||||
this._entry.clutter_text.disconnect(this._entryActivateId);
|
||||
this._entryActivateId = 0;
|
||||
}
|
||||
|
||||
this.setActorInDefaultButtonWell(null, true);
|
||||
this.actor.hide();
|
||||
this._loginHint.opacity = 0;
|
||||
|
||||
this.setUser(null);
|
||||
|
||||
this.updateSensitivity(true);
|
||||
this._entry.set_text('');
|
||||
|
||||
this._buttonBox.remove_all_children();
|
||||
this._nextButton = null;
|
||||
this._cancelButton = null;
|
||||
},
|
||||
|
||||
setUser: function(user) {
|
||||
if (user) {
|
||||
let userWidget = new UserWidget.UserWidget(user);
|
||||
this._userWell.set_child(userWidget.actor);
|
||||
} else {
|
||||
this._userWell.set_child(null);
|
||||
}
|
||||
},
|
||||
|
||||
setHint: function(message) {
|
||||
if (message) {
|
||||
this._loginHint.set_text(message)
|
||||
this._loginHint.opacity = 255;
|
||||
} else {
|
||||
this._loginHint.opacity = 0;
|
||||
this._loginHint.set_text('');
|
||||
}
|
||||
},
|
||||
|
||||
reset: function() {
|
||||
this._message.opacity = 0;
|
||||
this.setUser(null);
|
||||
},
|
||||
|
||||
addCharacter: function(unichar) {
|
||||
if (!this._entry.visible)
|
||||
return;
|
||||
|
||||
if (!this._initialAnswer)
|
||||
this._initialAnswer = {};
|
||||
|
||||
this._entry.grab_key_focus();
|
||||
this._entry.clutter_text.insert_unichar(unichar);
|
||||
|
||||
if (!this._initialAnswer['activate-id'])
|
||||
this._initialAnswer['activate-id'] =
|
||||
this._entry.clutter_text.connect('activate', Lang.bind(this, function() {
|
||||
this._entry.clutter_text.disconnect(this._initialAnswer['activate-id']);
|
||||
delete this._initialAnswer['activate-id'];
|
||||
|
||||
this._initialAnswer['text'] = this._entry.get_text();
|
||||
}));
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(AuthPrompt.prototype);
|
||||
|
||||
@@ -110,6 +110,7 @@ const Button = new Lang.Class({
|
||||
|
||||
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
||||
this.actor.connect('key-press-event', Lang.bind(this, this._onSourceKeyPress));
|
||||
this.actor.connect('notify::visible', Lang.bind(this, this._onVisibilityChanged));
|
||||
|
||||
if (dontCreateMenu)
|
||||
this.menu = new PopupMenu.PopupDummyMenu(this.actor);
|
||||
@@ -183,6 +184,14 @@ const Button = new Lang.Class({
|
||||
return false;
|
||||
},
|
||||
|
||||
_onVisibilityChanged: function() {
|
||||
if (!this.menu)
|
||||
return;
|
||||
|
||||
if (!this.actor.visible)
|
||||
this.menu.close();
|
||||
},
|
||||
|
||||
_onMenuKeyPress: function(actor, event) {
|
||||
if (global.focus_manager.navigate_from_event(event))
|
||||
return true;
|
||||
|
||||
@@ -42,7 +42,6 @@ const PopupBaseMenuItem = new Lang.Class({
|
||||
params = Params.parse (params, { reactive: true,
|
||||
activate: true,
|
||||
hover: true,
|
||||
sensitive: true,
|
||||
style_class: null,
|
||||
can_focus: true
|
||||
});
|
||||
@@ -65,9 +64,8 @@ const PopupBaseMenuItem = new Lang.Class({
|
||||
this._spacing = 0;
|
||||
this.active = false;
|
||||
this._activatable = params.reactive && params.activate;
|
||||
this.sensitive = this._activatable && params.sensitive;
|
||||
|
||||
this.setSensitive(this.sensitive);
|
||||
this._sensitive = true;
|
||||
this.parentSensitive = true;
|
||||
|
||||
if (!this._activatable)
|
||||
this.actor.add_style_class_name('popup-inactive-menu-item');
|
||||
@@ -137,17 +135,24 @@ const PopupBaseMenuItem = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
setSensitive: function(sensitive) {
|
||||
if (!this._activatable)
|
||||
return;
|
||||
if (this.sensitive == sensitive)
|
||||
return;
|
||||
|
||||
this.sensitive = sensitive;
|
||||
syncSensitive: function() {
|
||||
let sensitive = this.getSensitive();
|
||||
this.actor.reactive = sensitive;
|
||||
this.actor.can_focus = sensitive;
|
||||
this.emit('sensitive-changed');
|
||||
return sensitive;
|
||||
},
|
||||
|
||||
this.emit('sensitive-changed', sensitive);
|
||||
getSensitive: function() {
|
||||
return this._activatable && this._sensitive && this.parentSensitive;
|
||||
},
|
||||
|
||||
setSensitive: function(sensitive) {
|
||||
if (this._sensitive == sensitive)
|
||||
return;
|
||||
|
||||
this._sensitive = sensitive;
|
||||
this.syncSensitive();
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
@@ -268,6 +273,7 @@ const PopupBaseMenuItem = new Lang.Class({
|
||||
},
|
||||
|
||||
_allocate: function(actor, box, flags) {
|
||||
let width = box.x2 - box.x1;
|
||||
let height = box.y2 - box.y1;
|
||||
let direction = this.actor.get_text_direction();
|
||||
|
||||
@@ -290,86 +296,46 @@ const PopupBaseMenuItem = new Lang.Class({
|
||||
|
||||
this._ornamentLabel.allocate(ornamentBox, flags);
|
||||
|
||||
let x;
|
||||
if (direction == Clutter.TextDirection.LTR)
|
||||
x = box.x1;
|
||||
else
|
||||
x = box.x2;
|
||||
// if direction is ltr, x is the right edge of the last added
|
||||
// actor, and it's constantly increasing, whereas if rtl, x is
|
||||
// the left edge and it decreases
|
||||
let x = box.x1;
|
||||
for (let i = 0, col = 0; i < this._children.length; i++) {
|
||||
let child = this._children[i];
|
||||
let childBox = new Clutter.ActorBox();
|
||||
|
||||
let [minWidth, naturalWidth] = child.actor.get_preferred_width(-1);
|
||||
let availWidth, extraWidth;
|
||||
if (this._columnWidths) {
|
||||
if (child.span == -1) {
|
||||
if (direction == Clutter.TextDirection.LTR)
|
||||
availWidth = box.x2 - x;
|
||||
else
|
||||
availWidth = x - box.x1;
|
||||
} else {
|
||||
|
||||
let availWidth;
|
||||
if (child.span == -1) {
|
||||
availWidth = box.x2 - x;
|
||||
} else {
|
||||
if (this._columnWidths) {
|
||||
availWidth = 0;
|
||||
for (let j = 0; j < child.span; j++)
|
||||
availWidth += this._columnWidths[col++];
|
||||
}
|
||||
extraWidth = availWidth - naturalWidth;
|
||||
} else {
|
||||
if (child.span == -1) {
|
||||
if (direction == Clutter.TextDirection.LTR)
|
||||
availWidth = box.x2 - x;
|
||||
else
|
||||
availWidth = x - box.x1;
|
||||
} else {
|
||||
availWidth = naturalWidth;
|
||||
}
|
||||
extraWidth = 0;
|
||||
}
|
||||
|
||||
if (direction == Clutter.TextDirection.LTR) {
|
||||
if (child.expand) {
|
||||
childBox.x1 = x;
|
||||
childBox.x2 = x + availWidth;
|
||||
} else if (child.align === St.Align.MIDDLE) {
|
||||
childBox.x1 = x + Math.round(extraWidth / 2);
|
||||
childBox.x2 = childBox.x1 + naturalWidth;
|
||||
} else if (child.align === St.Align.END) {
|
||||
childBox.x2 = x + availWidth;
|
||||
childBox.x1 = childBox.x2 - naturalWidth;
|
||||
} else {
|
||||
childBox.x1 = x;
|
||||
childBox.x2 = x + naturalWidth;
|
||||
}
|
||||
} else {
|
||||
if (child.expand) {
|
||||
childBox.x1 = x - availWidth;
|
||||
childBox.x2 = x;
|
||||
} else if (child.align === St.Align.MIDDLE) {
|
||||
childBox.x1 = x - Math.round(extraWidth / 2);
|
||||
childBox.x2 = childBox.x1 + naturalWidth;
|
||||
} else if (child.align === St.Align.END) {
|
||||
// align to the left
|
||||
childBox.x1 = x - availWidth;
|
||||
childBox.x2 = childBox.x1 + naturalWidth;
|
||||
} else {
|
||||
// align to the right
|
||||
childBox.x2 = x;
|
||||
childBox.x1 = x - naturalWidth;
|
||||
}
|
||||
}
|
||||
if (direction == Clutter.TextDirection.RTL)
|
||||
childBox.x1 = width - x - availWidth;
|
||||
else
|
||||
childBox.x1 = x;
|
||||
childBox.x2 = childBox.x1 + availWidth;
|
||||
|
||||
let [minHeight, naturalHeight] = child.actor.get_preferred_height(childBox.x2 - childBox.x1);
|
||||
childBox.y1 = Math.round(box.y1 + (height - naturalHeight) / 2);
|
||||
childBox.y2 = childBox.y1 + naturalHeight;
|
||||
|
||||
child.actor.allocate(childBox, flags);
|
||||
let [xAlign, yAlign] = St.get_align_factors(child.align,
|
||||
St.Align.MIDDLE);
|
||||
|
||||
if (direction == Clutter.TextDirection.LTR)
|
||||
x += availWidth + this._spacing;
|
||||
else
|
||||
x -= availWidth + this._spacing;
|
||||
// It's called "expand", but it's really more like "fill"
|
||||
let xFill = child.expand;
|
||||
child.actor.allocate_align_fill(childBox,
|
||||
xAlign, yAlign,
|
||||
xFill, true,
|
||||
flags);
|
||||
x += availWidth + this._spacing;
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -672,6 +638,7 @@ const PopupMenuBase = new Lang.Class({
|
||||
|
||||
_init: function(sourceActor, styleClass) {
|
||||
this.sourceActor = sourceActor;
|
||||
this._parent = null;
|
||||
|
||||
if (styleClass !== undefined) {
|
||||
this.box = new St.BoxLayout({ style_class: styleClass,
|
||||
@@ -691,9 +658,28 @@ const PopupMenuBase = new Lang.Class({
|
||||
this._activeMenuItem = null;
|
||||
this._settingsActions = { };
|
||||
|
||||
this._sensitive = true;
|
||||
this.parentSensitive = true;
|
||||
|
||||
this._sessionUpdatedId = Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
||||
},
|
||||
|
||||
_getTopMenu: function() {
|
||||
if (this._parent)
|
||||
return this._parent._getTopMenu();
|
||||
else
|
||||
return this;
|
||||
},
|
||||
|
||||
getSensitive: function() {
|
||||
return this._sensitive && this.parentSensitive;
|
||||
},
|
||||
|
||||
setSensitive: function(sensitive) {
|
||||
this._sensitive = sensitive;
|
||||
this.emit('sensitive-changed');
|
||||
},
|
||||
|
||||
_sessionUpdated: function() {
|
||||
this._setSettingsVisibility(Main.sessionMode.allowSettings);
|
||||
},
|
||||
@@ -746,25 +732,18 @@ const PopupMenuBase = new Lang.Class({
|
||||
return false;
|
||||
},
|
||||
|
||||
/**
|
||||
* _connectSubMenuSignals:
|
||||
* @object: a menu item, or a menu section
|
||||
* @menu: a sub menu, or a menu section
|
||||
*
|
||||
* Connects to signals on @menu that are necessary for
|
||||
* operating the submenu, and stores the ids on @object.
|
||||
*/
|
||||
_connectSubMenuSignals: function(object, menu) {
|
||||
object._subMenuActivateId = menu.connect('activate', Lang.bind(this, function() {
|
||||
this.emit('activate');
|
||||
this.close(BoxPointer.PopupAnimation.FULL);
|
||||
}));
|
||||
object._subMenuActiveChangeId = menu.connect('active-changed', Lang.bind(this, function(submenu, submenuItem) {
|
||||
if (this._activeMenuItem && this._activeMenuItem != submenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
this._activeMenuItem = submenuItem;
|
||||
this.emit('active-changed', submenuItem);
|
||||
}));
|
||||
itemActivated: function(animate) {
|
||||
if (animate == undefined)
|
||||
animate = BoxPointer.PopupAnimation.FULL;
|
||||
|
||||
this._getTopMenu().close(animate);
|
||||
},
|
||||
|
||||
_subMenuActiveChanged: function(submenu, submenuItem) {
|
||||
if (this._activeMenuItem && this._activeMenuItem != submenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
this._activeMenuItem = submenuItem;
|
||||
this.emit('active-changed', submenuItem);
|
||||
},
|
||||
|
||||
_connectItemSignals: function(menuItem) {
|
||||
@@ -779,7 +758,8 @@ const PopupMenuBase = new Lang.Class({
|
||||
this.emit('active-changed', null);
|
||||
}
|
||||
}));
|
||||
menuItem._sensitiveChangeId = menuItem.connect('sensitive-changed', Lang.bind(this, function(menuItem, sensitive) {
|
||||
menuItem._sensitiveChangeId = menuItem.connect('sensitive-changed', Lang.bind(this, function() {
|
||||
let sensitive = menuItem.getSensitive();
|
||||
if (!sensitive && this._activeMenuItem == menuItem) {
|
||||
if (!this.actor.navigate_focus(menuItem.actor,
|
||||
Gtk.DirectionType.TAB_FORWARD,
|
||||
@@ -792,8 +772,14 @@ const PopupMenuBase = new Lang.Class({
|
||||
}));
|
||||
menuItem._activateId = menuItem.connect('activate', Lang.bind(this, function (menuItem, event) {
|
||||
this.emit('activate', menuItem);
|
||||
this.close(BoxPointer.PopupAnimation.FULL);
|
||||
this.itemActivated(BoxPointer.PopupAnimation.FULL);
|
||||
}));
|
||||
|
||||
menuItem._parentSensitiveChangeId = this.connect('sensitive-changed', Lang.bind(this, function() {
|
||||
menuItem.parentSensitive = this.getSensitive();
|
||||
menuItem.syncSensitive();
|
||||
}));
|
||||
|
||||
// the weird name is to avoid a conflict with some random property
|
||||
// the menuItem may have, called destroyId
|
||||
// (FIXME: in the future it may make sense to have container objects
|
||||
@@ -803,11 +789,7 @@ const PopupMenuBase = new Lang.Class({
|
||||
menuItem.disconnect(menuItem._activateId);
|
||||
menuItem.disconnect(menuItem._activeChangeId);
|
||||
menuItem.disconnect(menuItem._sensitiveChangeId);
|
||||
if (menuItem.menu) {
|
||||
menuItem.menu.disconnect(menuItem._subMenuActivateId);
|
||||
menuItem.menu.disconnect(menuItem._subMenuActiveChangeId);
|
||||
this.disconnect(menuItem._closingId);
|
||||
}
|
||||
this.disconnect(menuItem._parentSensitiveChangeId);
|
||||
if (menuItem == this._activeMenuItem)
|
||||
this._activeMenuItem = null;
|
||||
}));
|
||||
@@ -864,19 +846,31 @@ const PopupMenuBase = new Lang.Class({
|
||||
}
|
||||
|
||||
if (menuItem instanceof PopupMenuSection) {
|
||||
this._connectSubMenuSignals(menuItem, menuItem);
|
||||
menuItem._parentOpenStateChangedId = this.connect('open-state-changed',
|
||||
function(self, open) {
|
||||
if (open)
|
||||
menuItem.open();
|
||||
else
|
||||
menuItem.close();
|
||||
});
|
||||
menuItem.connect('destroy', Lang.bind(this, function() {
|
||||
menuItem.disconnect(menuItem._subMenuActivateId);
|
||||
menuItem.disconnect(menuItem._subMenuActiveChangeId);
|
||||
this.disconnect(menuItem._parentOpenStateChangedId);
|
||||
let activateId = menuItem.connect('activate', Lang.bind(this, function() {
|
||||
this.emit('activate');
|
||||
}));
|
||||
let activeChangeId = menuItem.connect('active-changed', Lang.bind(this, this._subMenuActiveChanged));
|
||||
|
||||
let parentOpenStateChangedId = this.connect('open-state-changed', function(self, open) {
|
||||
if (open)
|
||||
menuItem.open();
|
||||
else
|
||||
menuItem.close();
|
||||
});
|
||||
let parentClosingId = this.connect('menu-closed', function() {
|
||||
menuItem.emit('menu-closed');
|
||||
});
|
||||
let subMenuSensitiveChangedId = this.connect('sensitive-changed', Lang.bind(this, function() {
|
||||
menuItem.parentSensitive = this.getSensitive();
|
||||
menuItem.emit('sensitive-changed');
|
||||
}));
|
||||
|
||||
menuItem.connect('destroy', Lang.bind(this, function() {
|
||||
menuItem.disconnect(activateId);
|
||||
menuItem.disconnect(activeChangeId);
|
||||
this.disconnect(subMenuSensitiveChangedId);
|
||||
this.disconnect(parentOpenStateChangedId);
|
||||
this.disconnect(parentClosingId);
|
||||
this.length--;
|
||||
}));
|
||||
} else if (menuItem instanceof PopupSubMenuMenuItem) {
|
||||
@@ -884,12 +878,21 @@ const PopupMenuBase = new Lang.Class({
|
||||
this.box.add(menuItem.menu.actor);
|
||||
else
|
||||
this.box.insert_child_below(menuItem.menu.actor, before_item);
|
||||
this._connectSubMenuSignals(menuItem, menuItem.menu);
|
||||
|
||||
this._connectItemSignals(menuItem);
|
||||
menuItem._closingId = this.connect('open-state-changed', function(self, open) {
|
||||
if (!open)
|
||||
menuItem.menu.close(BoxPointer.PopupAnimation.FADE);
|
||||
let subMenuActivateId = menuItem.connect('activate', Lang.bind(this, function() {
|
||||
this.emit('activate');
|
||||
}));
|
||||
let subMenuActiveChangeId = menuItem.menu.connect('active-changed', Lang.bind(this, this._subMenuActiveChanged));
|
||||
let closingId = this.connect('menu-closed', function() {
|
||||
menuItem.menu.close(BoxPointer.PopupAnimation.NONE);
|
||||
});
|
||||
|
||||
menuItem.connect('destroy', Lang.bind(this, function() {
|
||||
menuItem.menu.disconnect(subMenuActivateId);
|
||||
menuItem.menu.disconnect(subMenuActiveChangeId);
|
||||
this.disconnect(closingId);
|
||||
}));
|
||||
} else if (menuItem instanceof PopupSeparatorMenuItem) {
|
||||
this._connectItemSignals(menuItem);
|
||||
|
||||
@@ -903,6 +906,8 @@ const PopupMenuBase = new Lang.Class({
|
||||
else
|
||||
throw TypeError("Invalid argument to PopupMenuBase.addMenuItem()");
|
||||
|
||||
menuItem._parent = this;
|
||||
|
||||
this.length++;
|
||||
},
|
||||
|
||||
@@ -910,9 +915,12 @@ const PopupMenuBase = new Lang.Class({
|
||||
let columnWidths = [];
|
||||
let items = this.box.get_children();
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
if (!items[i].visible &&
|
||||
!(items[i]._delegate instanceof PopupSubMenu && items[i-1].visible))
|
||||
if (!items[i].visible)
|
||||
continue;
|
||||
|
||||
if (items[i]._delegate instanceof PopupSubMenu)
|
||||
continue;
|
||||
|
||||
if (items[i]._delegate instanceof PopupBaseMenuItem || items[i]._delegate instanceof PopupMenuBase) {
|
||||
let itemColumnWidths = items[i]._delegate.getColumnWidths();
|
||||
for (let j = 0; j < itemColumnWidths.length; j++) {
|
||||
@@ -927,6 +935,9 @@ const PopupMenuBase = new Lang.Class({
|
||||
setColumnWidths: function(widths) {
|
||||
let items = this.box.get_children();
|
||||
for (let i = 0; i < items.length; i++) {
|
||||
if (items[i]._delegate instanceof PopupSubMenu)
|
||||
continue;
|
||||
|
||||
if (items[i]._delegate instanceof PopupBaseMenuItem || items[i]._delegate instanceof PopupMenuBase)
|
||||
items[i]._delegate.setColumnWidths(widths);
|
||||
}
|
||||
@@ -1024,6 +1035,14 @@ const PopupMenu = new Lang.Class({
|
||||
this.actor.reactive = true;
|
||||
|
||||
this._childMenus = [];
|
||||
this._openedSubMenu = null;
|
||||
},
|
||||
|
||||
_setOpenedSubMenu: function(submenu) {
|
||||
if (this._openedSubMenu)
|
||||
this._openedSubMenu.close(true);
|
||||
|
||||
this._openedSubMenu = submenu;
|
||||
},
|
||||
|
||||
_boxGetPreferredWidth: function (actor, forHeight, alloc) {
|
||||
@@ -1097,8 +1116,11 @@ const PopupMenu = new Lang.Class({
|
||||
childMenu.close();
|
||||
});
|
||||
|
||||
if (this._boxPointer.actor.visible)
|
||||
this._boxPointer.hide(animate);
|
||||
if (this._boxPointer.actor.visible) {
|
||||
this._boxPointer.hide(animate, Lang.bind(this, function() {
|
||||
this.emit('menu-closed');
|
||||
}));
|
||||
}
|
||||
|
||||
if (!this.isOpen)
|
||||
return;
|
||||
@@ -1121,6 +1143,10 @@ const PopupDummyMenu = new Lang.Class({
|
||||
return false;
|
||||
},
|
||||
|
||||
getSensitive: function() {
|
||||
return true;
|
||||
},
|
||||
|
||||
open: function() { this.emit('open-state-changed', true); },
|
||||
close: function() { this.emit('open-state-changed', false); },
|
||||
toggle: function() {},
|
||||
@@ -1154,18 +1180,6 @@ const PopupSubMenu = new Lang.Class({
|
||||
this.actor.hide();
|
||||
},
|
||||
|
||||
_getTopMenu: function() {
|
||||
let actor = this.actor.get_parent();
|
||||
while (actor) {
|
||||
if (actor._delegate && actor._delegate instanceof PopupMenu)
|
||||
return actor._delegate;
|
||||
|
||||
actor = actor.get_parent();
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
|
||||
_needsScrollbar: function() {
|
||||
let topMenu = this._getTopMenu();
|
||||
let [topMinHeight, topNaturalHeight] = topMenu.actor.get_preferred_height(-1);
|
||||
@@ -1175,6 +1189,10 @@ const PopupSubMenu = new Lang.Class({
|
||||
return topMaxHeight >= 0 && topNaturalHeight >= topMaxHeight;
|
||||
},
|
||||
|
||||
getSensitive: function() {
|
||||
return this._sensitive && this.sourceActor._delegate.getSensitive();
|
||||
},
|
||||
|
||||
open: function(animate) {
|
||||
if (this.isOpen)
|
||||
return;
|
||||
@@ -1183,6 +1201,7 @@ const PopupSubMenu = new Lang.Class({
|
||||
return;
|
||||
|
||||
this.isOpen = true;
|
||||
this.emit('open-state-changed', true);
|
||||
|
||||
this.actor.show();
|
||||
|
||||
@@ -1221,12 +1240,10 @@ const PopupSubMenu = new Lang.Class({
|
||||
onCompleteScope: this,
|
||||
onComplete: function() {
|
||||
this.actor.set_height(-1);
|
||||
this.emit('open-state-changed', true);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
this._arrow.rotation_angle_z = 90;
|
||||
this.emit('open-state-changed', true);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1235,6 +1252,7 @@ const PopupSubMenu = new Lang.Class({
|
||||
return;
|
||||
|
||||
this.isOpen = false;
|
||||
this.emit('open-state-changed', false);
|
||||
|
||||
if (this._activeMenuItem)
|
||||
this._activeMenuItem.setActive(false);
|
||||
@@ -1252,8 +1270,6 @@ const PopupSubMenu = new Lang.Class({
|
||||
onComplete: function() {
|
||||
this.actor.hide();
|
||||
this.actor.set_height(-1);
|
||||
|
||||
this.emit('open-state-changed', false);
|
||||
},
|
||||
onUpdateScope: this,
|
||||
onUpdate: function() {
|
||||
@@ -1263,9 +1279,6 @@ const PopupSubMenu = new Lang.Class({
|
||||
} else {
|
||||
this._arrow.rotation_angle_z = 0;
|
||||
this.actor.hide();
|
||||
|
||||
this.isOpen = false;
|
||||
this.emit('open-state-changed', false);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1327,11 +1340,20 @@ const PopupSubMenuMenuItem = new Lang.Class({
|
||||
this.menu.connect('open-state-changed', Lang.bind(this, this._subMenuOpenStateChanged));
|
||||
},
|
||||
|
||||
syncSensitive: function() {
|
||||
let sensitive = this.parent();
|
||||
this._triangle.visible = sensitive;
|
||||
if (!sensitive)
|
||||
this.menu.close(false);
|
||||
},
|
||||
|
||||
_subMenuOpenStateChanged: function(menu, open) {
|
||||
if (open)
|
||||
this.actor.add_style_pseudo_class('open');
|
||||
else
|
||||
this.actor.remove_style_pseudo_class('open');
|
||||
|
||||
this._getTopMenu()._setOpenedSubMenu(this.menu);
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||
|
||||
const AccountsService = imports.gi.AccountsService;
|
||||
const Atk = imports.gi.Atk;
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gdm = imports.gi.Gdm;
|
||||
const Gio = imports.gi.Gio;
|
||||
@@ -12,10 +13,9 @@ const Signals = imports.signals;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
|
||||
const Layout = imports.ui.layout;
|
||||
const Main = imports.ui.main;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const Panel = imports.ui.panel;
|
||||
const ShellEntry = imports.ui.shellEntry;
|
||||
const Tweener = imports.ui.tweener;
|
||||
const UserWidget = imports.ui.userWidget;
|
||||
|
||||
@@ -28,21 +28,20 @@ const IDLE_TIMEOUT = 2 * 60;
|
||||
|
||||
const UnlockDialog = new Lang.Class({
|
||||
Name: 'UnlockDialog',
|
||||
Extends: ModalDialog.ModalDialog,
|
||||
|
||||
_init: function(parentActor) {
|
||||
this.parent({ shellReactive: true,
|
||||
styleClass: 'login-dialog',
|
||||
keybindingMode: Shell.KeyBindingMode.UNLOCK_SCREEN,
|
||||
parentActor: parentActor
|
||||
});
|
||||
this.actor = new St.Widget({ accessible_role: Atk.Role.WINDOW,
|
||||
style_class: 'login-dialog',
|
||||
visible: false });
|
||||
|
||||
this.actor.add_constraint(new Layout.MonitorConstraint({ primary: true }));
|
||||
parentActor.add_child(this.actor);
|
||||
|
||||
this._userManager = AccountsService.UserManager.get_default();
|
||||
this._userName = GLib.get_user_name();
|
||||
this._user = this._userManager.get_user(this._userName);
|
||||
|
||||
this._failCounter = 0;
|
||||
this._firstQuestion = true;
|
||||
|
||||
this._greeterClient = new Gdm.Client();
|
||||
this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient, { reauthenticationOnly: true });
|
||||
@@ -57,62 +56,21 @@ const UnlockDialog = new Lang.Class({
|
||||
this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint));
|
||||
this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint));
|
||||
|
||||
this._userWidget = new UserWidget.UserWidget(this._user);
|
||||
this.contentLayout.add_actor(this._userWidget.actor);
|
||||
this._promptBox = new St.BoxLayout({ vertical: true });
|
||||
this.actor.add_child(this._promptBox);
|
||||
this._promptBox.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
|
||||
align_axis: Clutter.AlignAxis.BOTH,
|
||||
factor: 0.5 }));
|
||||
|
||||
this._promptLayout = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
|
||||
vertical: true });
|
||||
|
||||
this._promptLabel = new St.Label({ style_class: 'login-dialog-prompt-label' });
|
||||
this._promptLayout.add(this._promptLabel,
|
||||
{ x_align: St.Align.START });
|
||||
|
||||
this._promptEntry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
|
||||
can_focus: true });
|
||||
this._promptEntry.clutter_text.connect('activate', Lang.bind(this, this._doUnlock));
|
||||
this._promptEntry.clutter_text.set_password_char('\u25cf');
|
||||
ShellEntry.addContextMenu(this._promptEntry, { isPassword: true });
|
||||
this.setInitialKeyFocus(this._promptEntry);
|
||||
this._promptEntry.clutter_text.connect('text-changed', Lang.bind(this, function() {
|
||||
this._updateOkButtonSensitivity(this._promptEntry.text.length > 0);
|
||||
}));
|
||||
|
||||
this._promptLayout.add(this._promptEntry,
|
||||
{ expand: true,
|
||||
x_fill: true });
|
||||
|
||||
this.contentLayout.add_actor(this._promptLayout);
|
||||
|
||||
this._promptMessage = new St.Label({ visible: false });
|
||||
this.contentLayout.add(this._promptMessage, { x_fill: true });
|
||||
|
||||
this._promptLoginHint = new St.Label({ style_class: 'login-dialog-prompt-login-hint' });
|
||||
this._promptLoginHint.hide();
|
||||
this.contentLayout.add_actor(this._promptLoginHint);
|
||||
this._authPrompt = new GdmUtil.AuthPrompt({ style_class: 'login-dialog-prompt-layout',
|
||||
vertical: true });
|
||||
this._authPrompt.setUser(this._user);
|
||||
this._authPrompt.setPasswordChar('\u25cf');
|
||||
this._authPrompt.resetButtons(_("Cancel"), _("Unlock"));
|
||||
this._authPrompt.connect('cancel', Lang.bind(this, this._escape));
|
||||
this._promptBox.add_child(this._authPrompt.actor);
|
||||
|
||||
this.allowCancel = false;
|
||||
this.buttonLayout.visible = true;
|
||||
this.addButton({ label: _("Cancel"),
|
||||
action: Lang.bind(this, this._escape),
|
||||
key: Clutter.KEY_Escape },
|
||||
{ expand: true,
|
||||
x_fill: false,
|
||||
y_fill: false,
|
||||
x_align: St.Align.START,
|
||||
y_align: St.Align.MIDDLE });
|
||||
this.placeSpinner({ expand: false,
|
||||
x_fill: false,
|
||||
y_fill: false,
|
||||
x_align: St.Align.END,
|
||||
y_align: St.Align.MIDDLE });
|
||||
this._okButton = this.addButton({ label: _("Unlock"),
|
||||
action: Lang.bind(this, this._doUnlock),
|
||||
default: true },
|
||||
{ expand: false,
|
||||
x_fill: false,
|
||||
y_fill: false,
|
||||
x_align: St.Align.END,
|
||||
y_align: St.Align.MIDDLE });
|
||||
|
||||
let screenSaverSettings = new Gio.Settings({ schema: 'org.gnome.desktop.screensaver' });
|
||||
if (screenSaverSettings.get_boolean('user-switch-enabled')) {
|
||||
@@ -125,9 +83,7 @@ const UnlockDialog = new Lang.Class({
|
||||
x_align: St.Align.START,
|
||||
x_fill: true });
|
||||
this._otherUserButton.connect('clicked', Lang.bind(this, this._otherUserClicked));
|
||||
this.dialogLayout.add(this._otherUserButton,
|
||||
{ x_align: St.Align.START,
|
||||
x_fill: false });
|
||||
this._promptBox.add_child(this._otherUserButton);
|
||||
} else {
|
||||
this._otherUserButton = null;
|
||||
}
|
||||
@@ -137,80 +93,49 @@ const UnlockDialog = new Lang.Class({
|
||||
let batch = new Batch.Hold();
|
||||
this._userVerifier.begin(this._userName, batch);
|
||||
|
||||
Main.ctrlAltTabManager.addGroup(this.dialogLayout, _("Unlock Window"), 'dialog-password-symbolic');
|
||||
Main.ctrlAltTabManager.addGroup(this.actor, _("Unlock Window"), 'dialog-password-symbolic');
|
||||
|
||||
this._idleMonitor = new GnomeDesktop.IdleMonitor();
|
||||
this._idleWatchId = this._idleMonitor.add_idle_watch(IDLE_TIMEOUT * 1000, Lang.bind(this, this._escape));
|
||||
},
|
||||
|
||||
_updateSensitivity: function(sensitive) {
|
||||
this._promptEntry.reactive = sensitive;
|
||||
this._promptEntry.clutter_text.editable = sensitive;
|
||||
this._updateOkButtonSensitivity(sensitive && this._promptEntry.text.length > 0);
|
||||
this._authPrompt.updateSensitivity(sensitive);
|
||||
|
||||
if (this._otherUserButton) {
|
||||
this._otherUserButton.reactive = sensitive;
|
||||
this._otherUserButton.can_focus = sensitive;
|
||||
}
|
||||
},
|
||||
|
||||
_updateOkButtonSensitivity: function(sensitive) {
|
||||
this._okButton.reactive = sensitive;
|
||||
this._okButton.can_focus = sensitive;
|
||||
},
|
||||
|
||||
_showMessage: function(userVerifier, message, styleClass) {
|
||||
if (message) {
|
||||
this._promptMessage.text = message;
|
||||
this._promptMessage.styleClass = styleClass;
|
||||
GdmUtil.fadeInActor(this._promptMessage);
|
||||
} else {
|
||||
GdmUtil.fadeOutActor(this._promptMessage);
|
||||
}
|
||||
this._authPrompt.setMessage(message, styleClass);
|
||||
},
|
||||
|
||||
_onAskQuestion: function(verifier, serviceName, question, passwordChar) {
|
||||
if (this._firstQuestion && this._firstQuestionAnswer) {
|
||||
this._userVerifier.answerQuery(serviceName, this._firstQuestionAnswer);
|
||||
this._firstQuestionAnswer = null;
|
||||
this._firstQuestion = false;
|
||||
return;
|
||||
}
|
||||
|
||||
this._promptLabel.text = question;
|
||||
|
||||
if (!this._firstQuestion)
|
||||
this._promptEntry.text = '';
|
||||
else
|
||||
this._firstQuestion = false;
|
||||
|
||||
this._promptEntry.clutter_text.set_password_char(passwordChar);
|
||||
this._promptEntry.menu.isPassword = passwordChar != '';
|
||||
|
||||
this._currentQuery = serviceName;
|
||||
|
||||
this._authPrompt.setPasswordChar(passwordChar);
|
||||
this._authPrompt.setQuestion(question);
|
||||
|
||||
let signalId = this._authPrompt.connect('next', Lang.bind(this, function() {
|
||||
this._authPrompt.disconnect(signalId);
|
||||
this._doUnlock();
|
||||
}));
|
||||
|
||||
this._updateSensitivity(true);
|
||||
this.setWorking(false);
|
||||
this._authPrompt.stopSpinning();
|
||||
},
|
||||
|
||||
_showLoginHint: function(verifier, message) {
|
||||
this._promptLoginHint.set_text(message)
|
||||
GdmUtil.fadeInActor(this._promptLoginHint);
|
||||
this._authPrompt.setHint(message);
|
||||
},
|
||||
|
||||
_hideLoginHint: function() {
|
||||
GdmUtil.fadeOutActor(this._promptLoginHint);
|
||||
this._authPrompt.setHint(null);
|
||||
},
|
||||
|
||||
_doUnlock: function() {
|
||||
if (this._firstQuestion) {
|
||||
// we haven't received a query yet, so stash the answer
|
||||
// and make ourself non-reactive
|
||||
// the actual reply to GDM will be sent as soon as asked
|
||||
this._firstQuestionAnswer = this._promptEntry.text;
|
||||
this._updateSensitivity(false);
|
||||
this.setWorking(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this._currentQuery)
|
||||
return;
|
||||
|
||||
@@ -218,13 +143,16 @@ const UnlockDialog = new Lang.Class({
|
||||
this._currentQuery = null;
|
||||
|
||||
this._updateSensitivity(false);
|
||||
this.setWorking(true);
|
||||
this._authPrompt.startSpinning();
|
||||
|
||||
this._userVerifier.answerQuery(query, this._promptEntry.text);
|
||||
this._userVerifier.answerQuery(query, this._authPrompt.getAnswer());
|
||||
},
|
||||
|
||||
_finishUnlock: function() {
|
||||
this._userVerifier.clear();
|
||||
this._authPrompt.clear();
|
||||
this._authPrompt.stopSpinning();
|
||||
this._updateSensitivity(true);
|
||||
this.emit('unlocked');
|
||||
},
|
||||
|
||||
@@ -253,12 +181,10 @@ const UnlockDialog = new Lang.Class({
|
||||
this._firstQuestion = true;
|
||||
this._userVerified = false;
|
||||
|
||||
this._promptEntry.text = '';
|
||||
this._promptEntry.clutter_text.set_password_char('\u25cf');
|
||||
this._promptEntry.menu.isPassword = true;
|
||||
this._authPrompt.clear();
|
||||
|
||||
this._updateSensitivity(false);
|
||||
this.setWorking(false);
|
||||
this._authPrompt.stopSpinning();
|
||||
},
|
||||
|
||||
_escape: function() {
|
||||
@@ -282,8 +208,6 @@ const UnlockDialog = new Lang.Class({
|
||||
this._idleMonitor.remove_watch(this._idleWatchId);
|
||||
this._idleWatchId = 0;
|
||||
}
|
||||
|
||||
this.parent();
|
||||
},
|
||||
|
||||
cancel: function() {
|
||||
@@ -293,6 +217,29 @@ const UnlockDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
addCharacter: function(unichar) {
|
||||
this._promptEntry.clutter_text.insert_unichar(unichar);
|
||||
this._authPrompt.addCharacter(unichar);
|
||||
},
|
||||
|
||||
open: function(timestamp) {
|
||||
this.actor.show();
|
||||
|
||||
if (this._isModal)
|
||||
return true;
|
||||
|
||||
if (!Main.pushModal(this.actor, { timestamp: timestamp,
|
||||
keybindingMode: Shell.KeyBindingMode.UNLOCK_SCREEN }))
|
||||
return false;
|
||||
|
||||
this._isModal = true;
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
popModal: function(timestamp) {
|
||||
if (this._isModal) {
|
||||
Main.popModal(this.actor, timestamp);
|
||||
this._isModal = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(UnlockDialog.prototype);
|
||||
|
||||
@@ -803,13 +803,13 @@ const UserMenuButton = new Lang.Class({
|
||||
},
|
||||
|
||||
_onLockScreenActivate: function() {
|
||||
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
Main.overview.hide();
|
||||
Main.screenShield.lock(true);
|
||||
},
|
||||
|
||||
_onLoginScreenActivate: function() {
|
||||
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
Main.overview.hide();
|
||||
if (Main.screenShield)
|
||||
Main.screenShield.lock(false);
|
||||
@@ -937,7 +937,7 @@ const UserMenuButton = new Lang.Class({
|
||||
this._session.ShutdownRemote();
|
||||
}));
|
||||
} else {
|
||||
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
||||
this.menu.itemActivated(BoxPointer.PopupAnimation.NONE);
|
||||
this._loginManager.suspend();
|
||||
}
|
||||
}
|
||||
|
||||
395
po/sk.po
395
po/sk.po
@@ -10,8 +10,8 @@ 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: 2013-05-24 21:21+0000\n"
|
||||
"PO-Revision-Date: 2013-05-24 23:24+0100\n"
|
||||
"POT-Creation-Date: 2013-07-13 07:31+0000\n"
|
||||
"PO-Revision-Date: 2013-07-13 20:32+0200\n"
|
||||
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
|
||||
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
|
||||
"Language: sk\n"
|
||||
@@ -384,38 +384,43 @@ msgstr "Rozšírenie"
|
||||
msgid "Select an extension to configure using the combobox above."
|
||||
msgstr "Použitím ponuky vyberte rozšírenie na nastavenie"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:371
|
||||
msgid "Session…"
|
||||
msgstr "Relácia…"
|
||||
# button
|
||||
#: ../js/gdm/loginDialog.js:308
|
||||
msgid "Choose Session"
|
||||
msgstr "Vybrať reláciu"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:326
|
||||
msgid "Session"
|
||||
msgstr "Relácia"
|
||||
|
||||
# https://bugzilla.gnome.org/show_bug.cgi?id=659972
|
||||
#. translators: this message is shown below the user list on the
|
||||
#. login screen. It can be activated to reveal an entry for
|
||||
#. manually entering the username.
|
||||
#: ../js/gdm/loginDialog.js:601
|
||||
#: ../js/gdm/loginDialog.js:533
|
||||
msgid "Not listed?"
|
||||
msgstr "Nie ste v zozname?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:810 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:96
|
||||
#: ../js/ui/userMenu.js:938
|
||||
#: ../js/ui/status/bluetooth.js:449 ../js/ui/unlockDialog.js:95
|
||||
#: ../js/ui/userMenu.js:884
|
||||
msgid "Cancel"
|
||||
msgstr "Zrušiť"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:791
|
||||
#: ../js/gdm/loginDialog.js:833
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Prihlásiť sa"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:791
|
||||
#: ../js/gdm/loginDialog.js:833
|
||||
msgid "Next"
|
||||
msgstr "Ďalej"
|
||||
|
||||
#. Translators: this message is shown below the username entry field
|
||||
#. to clue the user in on how to login to the local network realm
|
||||
#: ../js/gdm/loginDialog.js:888
|
||||
#: ../js/gdm/loginDialog.js:934
|
||||
#, c-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(napr., používateľ alebo %s)"
|
||||
@@ -423,12 +428,12 @@ msgstr "(napr., používateľ alebo %s)"
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/gdm/loginDialog.js:892 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/gdm/loginDialog.js:938 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/ui/components/networkAgent.js:278
|
||||
msgid "Username: "
|
||||
msgstr "Používateľské meno: "
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1158
|
||||
#: ../js/gdm/loginDialog.js:1205
|
||||
msgid "Login Window"
|
||||
msgstr "Prihlasovacie okno"
|
||||
|
||||
@@ -437,8 +442,8 @@ msgstr "Prihlasovacie okno"
|
||||
msgid "Power"
|
||||
msgstr "Napájanie"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700
|
||||
#: ../js/ui/userMenu.js:816
|
||||
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:651 ../js/ui/userMenu.js:655
|
||||
#: ../js/ui/userMenu.js:768
|
||||
msgid "Suspend"
|
||||
msgstr "Uspať"
|
||||
|
||||
@@ -446,18 +451,18 @@ msgstr "Uspať"
|
||||
msgid "Restart"
|
||||
msgstr "Reštartovať"
|
||||
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698
|
||||
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942
|
||||
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:653
|
||||
#: ../js/ui/userMenu.js:655 ../js/ui/userMenu.js:767 ../js/ui/userMenu.js:888
|
||||
msgid "Power Off"
|
||||
msgstr "Vypnúť"
|
||||
|
||||
#: ../js/gdm/util.js:247
|
||||
#: ../js/gdm/util.js:248
|
||||
msgid "Authentication error"
|
||||
msgstr "Chyba pri overovaní totožnosti"
|
||||
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: ../js/gdm/util.js:364
|
||||
#: ../js/gdm/util.js:365
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(alebo prejdite prstom)"
|
||||
|
||||
@@ -476,23 +481,23 @@ msgstr "Nepodarilo sa analyzovať príkaz:"
|
||||
msgid "Execution of '%s' failed:"
|
||||
msgstr "Spustenie „%s“ zlyhalo:"
|
||||
|
||||
#: ../js/ui/appDisplay.js:361
|
||||
#: ../js/ui/appDisplay.js:397
|
||||
msgid "Frequent"
|
||||
msgstr "Často používané"
|
||||
|
||||
#: ../js/ui/appDisplay.js:368
|
||||
#: ../js/ui/appDisplay.js:404
|
||||
msgid "All"
|
||||
msgstr "Všetky"
|
||||
|
||||
#: ../js/ui/appDisplay.js:960
|
||||
#: ../js/ui/appDisplay.js:996
|
||||
msgid "New Window"
|
||||
msgstr "Nové okno"
|
||||
|
||||
#: ../js/ui/appDisplay.js:963 ../js/ui/dash.js:284
|
||||
#: ../js/ui/appDisplay.js:999 ../js/ui/dash.js:284
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Odstrániť z obľúbených"
|
||||
|
||||
#: ../js/ui/appDisplay.js:964
|
||||
#: ../js/ui/appDisplay.js:1000
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Pridať do obľúbených"
|
||||
|
||||
@@ -506,7 +511,7 @@ msgstr "Program %s bol pridaný medzi obľúbené."
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "Program %s bol odstránený z obľúbených."
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789
|
||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:744
|
||||
msgid "Settings"
|
||||
msgstr "Nastavenia"
|
||||
|
||||
@@ -631,35 +636,35 @@ msgid "S"
|
||||
msgstr "So"
|
||||
|
||||
#. Translators: Text to show if there are no events
|
||||
#: ../js/ui/calendar.js:735
|
||||
#: ../js/ui/calendar.js:750
|
||||
msgid "Nothing Scheduled"
|
||||
msgstr "Žiadne naplánované udalosti"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on current year
|
||||
#: ../js/ui/calendar.js:751
|
||||
#: ../js/ui/calendar.js:768
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %e. %B"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on different year
|
||||
#: ../js/ui/calendar.js:754
|
||||
#: ../js/ui/calendar.js:771
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A, %e. %B %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:764
|
||||
#: ../js/ui/calendar.js:782
|
||||
msgid "Today"
|
||||
msgstr "Dnes"
|
||||
|
||||
#: ../js/ui/calendar.js:768
|
||||
#: ../js/ui/calendar.js:786
|
||||
msgid "Tomorrow"
|
||||
msgstr "Zajtra"
|
||||
|
||||
#: ../js/ui/calendar.js:779
|
||||
#: ../js/ui/calendar.js:797
|
||||
msgid "This week"
|
||||
msgstr "Tento týždeň"
|
||||
|
||||
#: ../js/ui/calendar.js:787
|
||||
#: ../js/ui/calendar.js:805
|
||||
msgid "Next week"
|
||||
msgstr "Ďalší týždeň"
|
||||
|
||||
@@ -851,14 +856,14 @@ msgstr "<b>%e.</b> <b>%B</b> <b>%Y</b> o <b>%H:%M</b>"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/components/telepathyClient.js:985
|
||||
#: ../js/ui/components/telepathyClient.js:986
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "Kontakt %s odteraz vystupuje ako %s"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1088
|
||||
#: ../js/ui/components/telepathyClient.js:1089
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Pozvánka do %s"
|
||||
@@ -866,38 +871,38 @@ msgstr "Pozvánka do %s"
|
||||
#. translators: first argument is the name of a contact and the second
|
||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||
#. * for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1096
|
||||
#: ../js/ui/components/telepathyClient.js:1097
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "Kontakt %s vás pozýva aby ste sa pridali do %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#: ../js/ui/components/telepathyClient.js:1137
|
||||
#: ../js/ui/components/telepathyClient.js:1177
|
||||
#: ../js/ui/components/telepathyClient.js:1240
|
||||
#: ../js/ui/components/telepathyClient.js:1099
|
||||
#: ../js/ui/components/telepathyClient.js:1138
|
||||
#: ../js/ui/components/telepathyClient.js:1178
|
||||
#: ../js/ui/components/telepathyClient.js:1241
|
||||
msgid "Decline"
|
||||
msgstr "Odmietnuť"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1099
|
||||
#: ../js/ui/components/telepathyClient.js:1178
|
||||
#: ../js/ui/components/telepathyClient.js:1241
|
||||
#: ../js/ui/components/telepathyClient.js:1100
|
||||
#: ../js/ui/components/telepathyClient.js:1179
|
||||
#: ../js/ui/components/telepathyClient.js:1242
|
||||
msgid "Accept"
|
||||
msgstr "Prijať"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1129
|
||||
#: ../js/ui/components/telepathyClient.js:1130
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Videohovor od kontaktu %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1132
|
||||
#: ../js/ui/components/telepathyClient.js:1133
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Hovor od kontaktu %s"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/components/telepathyClient.js:1139
|
||||
#: ../js/ui/components/telepathyClient.js:1140
|
||||
msgid "Answer"
|
||||
msgstr "Prijať hovor"
|
||||
|
||||
@@ -906,110 +911,110 @@ msgstr "Prijať hovor"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/components/telepathyClient.js:1171
|
||||
#: ../js/ui/components/telepathyClient.js:1172
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "Kontakt %s vám posiela %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#: ../js/ui/components/telepathyClient.js:1207
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "Kontakt %s by chcel získať oprávnenie vidieť, kedy ste pripojený"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1298
|
||||
#: ../js/ui/components/telepathyClient.js:1299
|
||||
msgid "Network error"
|
||||
msgstr "Chyba siete"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
#: ../js/ui/components/telepathyClient.js:1301
|
||||
msgid "Authentication failed"
|
||||
msgstr "Overenie totožnosti zlyhalo"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1302
|
||||
#: ../js/ui/components/telepathyClient.js:1303
|
||||
msgid "Encryption error"
|
||||
msgstr "Chyba šifrovania"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1304
|
||||
#: ../js/ui/components/telepathyClient.js:1305
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Neposkytnutý certifikát"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1306
|
||||
#: ../js/ui/components/telepathyClient.js:1307
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Nedôveryhodný certifikát"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1308
|
||||
#: ../js/ui/components/telepathyClient.js:1309
|
||||
msgid "Certificate expired"
|
||||
msgstr "Certifikát s ukončenou platnosťou"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1310
|
||||
#: ../js/ui/components/telepathyClient.js:1311
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Neaktivovaný certifikát"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1312
|
||||
#: ../js/ui/components/telepathyClient.js:1313
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Certifikát s nesúhlasným názvom hostiteľa"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1314
|
||||
#: ../js/ui/components/telepathyClient.js:1315
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Certifikát s nesúhlasným odtlačkom"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1316
|
||||
#: ../js/ui/components/telepathyClient.js:1317
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Sebou podpísaný certifikát"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1318
|
||||
#: ../js/ui/components/telepathyClient.js:1319
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Stav je nastavený na odhlásený"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1320
|
||||
#: ../js/ui/components/telepathyClient.js:1321
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Šifrovanie nie je dostupné"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1322
|
||||
#: ../js/ui/components/telepathyClient.js:1323
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Certifikát je neplatný"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1324
|
||||
#: ../js/ui/components/telepathyClient.js:1325
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Pripojenie bolo odmietnuté"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1326
|
||||
#: ../js/ui/components/telepathyClient.js:1327
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Nedá sa nadviazať spojenie"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1328
|
||||
#: ../js/ui/components/telepathyClient.js:1329
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Spojenie sa stratilo"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1330
|
||||
#: ../js/ui/components/telepathyClient.js:1331
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Tento účet je už pripojený k serveru"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1332
|
||||
#: ../js/ui/components/telepathyClient.js:1333
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr "Pripojenie bolo nahradené novým, ktoré používa rovnaký zdroj"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1334
|
||||
#: ../js/ui/components/telepathyClient.js:1335
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Účet na serveri už existuje"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1336
|
||||
#: ../js/ui/components/telepathyClient.js:1337
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "Server je momentálne príliš zaneprázdnený na zvládnutie pripojenia"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1338
|
||||
#: ../js/ui/components/telepathyClient.js:1339
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Certifikát bol zrušený"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1340
|
||||
#: ../js/ui/components/telepathyClient.js:1341
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Šifrovací algoritmus používaný certifikátom nie je bezpečný alebo je "
|
||||
"kryptograficky slabý"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
#: ../js/ui/components/telepathyClient.js:1343
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@@ -1017,22 +1022,22 @@ msgstr ""
|
||||
"Dĺžka certifikátu servera, alebo hĺbka reťazca certifikátu servera presahuje "
|
||||
"limit stanovený kryptografickou knižnicou."
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
#: ../js/ui/components/telepathyClient.js:1345
|
||||
msgid "Internal error"
|
||||
msgstr "Vnútorná chyba"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
#: ../js/ui/components/telepathyClient.js:1355
|
||||
#, c-format
|
||||
msgid "Unable to connect to %s"
|
||||
msgstr "Nepodarilo sa pripojiť účet %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1359
|
||||
#: ../js/ui/components/telepathyClient.js:1360
|
||||
msgid "View account"
|
||||
msgstr "Zobraziť účet"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1398
|
||||
#: ../js/ui/components/telepathyClient.js:1399
|
||||
msgid "Unknown reason"
|
||||
msgstr "Neznámy dôvod"
|
||||
|
||||
@@ -1047,26 +1052,26 @@ msgstr "Zobrazí aplikácie"
|
||||
|
||||
#. Translators: this is the name of the dock/favorites area on
|
||||
#. the left of the overview
|
||||
#: ../js/ui/dash.js:435
|
||||
#: ../js/ui/dash.js:439
|
||||
msgid "Dash"
|
||||
msgstr "Dok"
|
||||
|
||||
#: ../js/ui/dateMenu.js:86
|
||||
#: ../js/ui/dateMenu.js:85
|
||||
msgid "Open Calendar"
|
||||
msgstr "Otvoriť kalendár"
|
||||
|
||||
#: ../js/ui/dateMenu.js:90
|
||||
#: ../js/ui/dateMenu.js:89
|
||||
msgid "Open Clocks"
|
||||
msgstr "Otvoriť hodiny"
|
||||
|
||||
#: ../js/ui/dateMenu.js:97
|
||||
#: ../js/ui/dateMenu.js:96
|
||||
msgid "Date & Time Settings"
|
||||
msgstr "Nastavenia dátumu a času"
|
||||
|
||||
#. 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:208
|
||||
#: ../js/ui/dateMenu.js:201
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%A, %e. %B %Y"
|
||||
|
||||
@@ -1175,7 +1180,7 @@ msgstr "Inštalovať"
|
||||
msgid "Download and install '%s' from extensions.gnome.org?"
|
||||
msgstr "Stiahnuť a nainštalovať „%s“ z extensions.gnome.org?"
|
||||
|
||||
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:314
|
||||
#: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:333
|
||||
#: ../js/ui/status/power.js:211
|
||||
msgid "Keyboard"
|
||||
msgstr "Klávesnica"
|
||||
@@ -1229,33 +1234,33 @@ msgstr "Zobraziť zdroj"
|
||||
msgid "Web Page"
|
||||
msgstr "Webová stránka"
|
||||
|
||||
#: ../js/ui/messageTray.js:1182
|
||||
#: ../js/ui/messageTray.js:1241
|
||||
msgid "Open"
|
||||
msgstr "Otvoriť"
|
||||
|
||||
#: ../js/ui/messageTray.js:1189
|
||||
#: ../js/ui/messageTray.js:1248
|
||||
msgid "Remove"
|
||||
msgstr "Odstrániť"
|
||||
|
||||
#: ../js/ui/messageTray.js:1501
|
||||
#: ../js/ui/messageTray.js:1560
|
||||
msgid "Clear Messages"
|
||||
msgstr "Vymazať správy"
|
||||
|
||||
#: ../js/ui/messageTray.js:1528
|
||||
#: ../js/ui/messageTray.js:1587
|
||||
msgid "Notification Settings"
|
||||
msgstr "Nastavenia oznámení"
|
||||
|
||||
#: ../js/ui/messageTray.js:1707
|
||||
#: ../js/ui/messageTray.js:1770
|
||||
msgid "No Messages"
|
||||
msgstr "Žiadne správy"
|
||||
|
||||
# DK: zvazoval som pouzit "Panel správ"
|
||||
# neviem co bude vhodnejsie ako preklad "tray"
|
||||
#: ../js/ui/messageTray.js:1780
|
||||
#: ../js/ui/messageTray.js:1842
|
||||
msgid "Message Tray"
|
||||
msgstr "Lišta správ"
|
||||
|
||||
#: ../js/ui/messageTray.js:2800
|
||||
#: ../js/ui/messageTray.js:2854
|
||||
msgid "System Information"
|
||||
msgstr "Informácie o systéme"
|
||||
|
||||
@@ -1264,7 +1269,7 @@ msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Neznámy"
|
||||
|
||||
#: ../js/ui/overviewControls.js:472 ../js/ui/screenShield.js:150
|
||||
#: ../js/ui/overviewControls.js:474 ../js/ui/screenShield.js:150
|
||||
#, c-format
|
||||
msgid "%d new message"
|
||||
msgid_plural "%d new messages"
|
||||
@@ -1289,17 +1294,17 @@ msgstr "Prehľad"
|
||||
msgid "Type to search…"
|
||||
msgstr "Zadajte text na vyhľadanie…"
|
||||
|
||||
#: ../js/ui/panel.js:642
|
||||
#: ../js/ui/panel.js:567
|
||||
msgid "Quit"
|
||||
msgstr "Ukončiť"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:693
|
||||
#: ../js/ui/panel.js:618
|
||||
msgid "Activities"
|
||||
msgstr "Aktivity"
|
||||
|
||||
#: ../js/ui/panel.js:989
|
||||
#: ../js/ui/panel.js:914
|
||||
msgid "Top Bar"
|
||||
msgstr "Horná lišta"
|
||||
|
||||
@@ -1308,7 +1313,7 @@ msgstr "Horná lišta"
|
||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||
#. switches containing "◯" and "|"). Other values will
|
||||
#. simply result in invisible toggle switches.
|
||||
#: ../js/ui/popupMenu.js:738
|
||||
#: ../js/ui/popupMenu.js:549
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-intl"
|
||||
|
||||
@@ -1337,7 +1342,7 @@ msgstr[0] "%d nových oznámení"
|
||||
msgstr[1] "%d nové oznámenie"
|
||||
msgstr[2] "%d nové oznámenia"
|
||||
|
||||
#: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:807
|
||||
#: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:759
|
||||
msgid "Lock"
|
||||
msgstr "Uzamknúť"
|
||||
|
||||
@@ -1352,19 +1357,19 @@ msgstr "Prostredie GNOME vyžaduje uzamknutie obrazovky"
|
||||
#.
|
||||
#. XXX: another option is to kick the user into the gdm login
|
||||
#. screen, where we're not affected by grabs
|
||||
#: ../js/ui/screenShield.js:773 ../js/ui/screenShield.js:1213
|
||||
#: ../js/ui/screenShield.js:788 ../js/ui/screenShield.js:1215
|
||||
msgid "Unable to lock"
|
||||
msgstr "Nepodarilo sa uzamknúť obrazovku"
|
||||
|
||||
#: ../js/ui/screenShield.js:774 ../js/ui/screenShield.js:1214
|
||||
#: ../js/ui/screenShield.js:789 ../js/ui/screenShield.js:1216
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Uzamknutie bolo zablokované aplikáciou"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:453
|
||||
#: ../js/ui/searchDisplay.js:445
|
||||
msgid "Searching…"
|
||||
msgstr "Hľadá sa…"
|
||||
|
||||
#: ../js/ui/searchDisplay.js:497
|
||||
#: ../js/ui/searchDisplay.js:489
|
||||
msgid "No results."
|
||||
msgstr "Žiadne výsledky."
|
||||
|
||||
@@ -1392,7 +1397,7 @@ msgstr "Heslo"
|
||||
msgid "Remember Password"
|
||||
msgstr "Zapamätať heslo"
|
||||
|
||||
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:109
|
||||
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:108
|
||||
msgid "Unlock"
|
||||
msgstr "Odblokovať"
|
||||
|
||||
@@ -1448,9 +1453,9 @@ msgid "Large Text"
|
||||
msgstr "Veľký text"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32
|
||||
#: ../js/ui/status/bluetooth.js:289 ../js/ui/status/bluetooth.js:321
|
||||
#: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388
|
||||
#: ../js/ui/status/network.js:739
|
||||
#: ../js/ui/status/bluetooth.js:290 ../js/ui/status/bluetooth.js:327
|
||||
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:391
|
||||
#: ../js/ui/status/bluetooth.js:422 ../js/ui/status/network.js:713
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
@@ -1471,106 +1476,117 @@ msgid "Bluetooth Settings"
|
||||
msgstr "Nastavenia Bluetooth"
|
||||
|
||||
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
||||
#: ../js/ui/status/bluetooth.js:104 ../js/ui/status/network.js:142
|
||||
#: ../js/ui/status/bluetooth.js:105 ../js/ui/status/network.js:140
|
||||
msgid "hardware disabled"
|
||||
msgstr "hardvér zakázaný"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:197
|
||||
#: ../js/ui/status/bluetooth.js:198
|
||||
msgid "Connection"
|
||||
msgstr "Pripojenie"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:404
|
||||
#: ../js/ui/status/bluetooth.js:209 ../js/ui/status/network.js:399
|
||||
msgid "disconnecting..."
|
||||
msgstr "odpája sa…"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:410
|
||||
#: ../js/ui/status/network.js:1343
|
||||
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:405
|
||||
#: ../js/ui/status/network.js:1298
|
||||
msgid "connecting..."
|
||||
msgstr "pripája sa…"
|
||||
|
||||
# menu item
|
||||
#: ../js/ui/status/bluetooth.js:239
|
||||
#: ../js/ui/status/bluetooth.js:240
|
||||
msgid "Send Files…"
|
||||
msgstr "Odoslať súbory…"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:246
|
||||
#: ../js/ui/status/bluetooth.js:247
|
||||
msgid "Keyboard Settings"
|
||||
msgstr "Nastavenia klávesnice"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:249
|
||||
#: ../js/ui/status/bluetooth.js:250
|
||||
msgid "Mouse Settings"
|
||||
msgstr "Nastavenia myši"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:254 ../js/ui/status/volume.js:316
|
||||
#: ../js/ui/status/bluetooth.js:255 ../js/ui/status/volume.js:313
|
||||
msgid "Sound Settings"
|
||||
msgstr "Nastavenia zvuku"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:322
|
||||
#: ../js/ui/status/bluetooth.js:328 ../js/ui/status/bluetooth.js:356
|
||||
#, c-format
|
||||
msgid "Authorization request from %s"
|
||||
msgstr "Žiadosť o potvrdenie prístupu od %s"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:328
|
||||
#, c-format
|
||||
msgid "Device %s wants access to the service '%s'"
|
||||
msgstr "Zariadenie %s chce pristupovať k službe „%s“"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:330
|
||||
msgid "Always grant access"
|
||||
msgstr "Vždy povoliť prístup"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:331
|
||||
msgid "Grant this time only"
|
||||
msgstr "Povoliť iba teraz"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:332
|
||||
msgid "Reject"
|
||||
msgstr "Odmietnuť"
|
||||
|
||||
#. Translators: argument is the device short name
|
||||
#: ../js/ui/status/bluetooth.js:359
|
||||
#, c-format
|
||||
msgid "Pairing confirmation for %s"
|
||||
msgstr "Potvrdenie spárovania pre %s"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:365 ../js/ui/status/bluetooth.js:396
|
||||
#: ../js/ui/status/bluetooth.js:334 ../js/ui/status/bluetooth.js:399
|
||||
#: ../js/ui/status/bluetooth.js:430
|
||||
#, c-format
|
||||
msgid "Device %s wants to pair with this computer"
|
||||
msgstr "Zariadenie %s sa chce spárovať s týmto počítačom"
|
||||
|
||||
# button
|
||||
#: ../js/ui/status/bluetooth.js:336
|
||||
msgid "Allow"
|
||||
msgstr "Povoliť"
|
||||
|
||||
# button
|
||||
#: ../js/ui/status/bluetooth.js:337
|
||||
msgid "Deny"
|
||||
msgstr "Zakázať"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:362
|
||||
#, c-format
|
||||
msgid "Device %s wants access to the service '%s'"
|
||||
msgstr "Zariadenie %s chce pristupovať k službe „%s“"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:364
|
||||
msgid "Always grant access"
|
||||
msgstr "Vždy povoliť prístup"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:365
|
||||
msgid "Grant this time only"
|
||||
msgstr "Povoliť iba teraz"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:366
|
||||
msgid "Reject"
|
||||
msgstr "Odmietnuť"
|
||||
|
||||
#. Translators: argument is the device short name
|
||||
#: ../js/ui/status/bluetooth.js:393
|
||||
#, c-format
|
||||
msgid "Pairing confirmation for %s"
|
||||
msgstr "Potvrdenie spárovania pre %s"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:400
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Please confirm whether the Passkey '%06d' matches the one on the device."
|
||||
msgstr "Prosím, potvrďte, či sa heslo „%06d“ zhoduje s tým na zariadení."
|
||||
|
||||
#. Translators: this is the verb, not the noun
|
||||
#: ../js/ui/status/bluetooth.js:369
|
||||
#: ../js/ui/status/bluetooth.js:403
|
||||
msgid "Matches"
|
||||
msgstr "Zhoduje sa"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:370
|
||||
#: ../js/ui/status/bluetooth.js:404
|
||||
msgid "Does not match"
|
||||
msgstr "Nezhoduje sa"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:389
|
||||
#: ../js/ui/status/bluetooth.js:423
|
||||
#, c-format
|
||||
msgid "Pairing request for %s"
|
||||
msgstr "Požiadavka na spárovanie pre %s"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:397
|
||||
#: ../js/ui/status/bluetooth.js:431
|
||||
msgid "Please enter the PIN mentioned on the device."
|
||||
msgstr "Zadajte PIN, ktoré je uvedené na zariadení."
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:414
|
||||
#: ../js/ui/status/bluetooth.js:448
|
||||
msgid "OK"
|
||||
msgstr "Ok"
|
||||
|
||||
#: ../js/ui/status/keyboard.js:368
|
||||
#: ../js/ui/status/keyboard.js:396
|
||||
msgid "Show Keyboard Layout"
|
||||
msgstr "Zobraziť rozloženie klávesnice"
|
||||
|
||||
#: ../js/ui/status/keyboard.js:373
|
||||
#: ../js/ui/status/keyboard.js:401
|
||||
msgid "Region & Language Settings"
|
||||
msgstr "Miestne a jazykové nastavenia"
|
||||
|
||||
@@ -1583,87 +1599,81 @@ msgstr "Hlasitosť, sieť, batéria"
|
||||
msgid "<unknown>"
|
||||
msgstr "<neznáme>"
|
||||
|
||||
#: ../js/ui/status/network.js:127
|
||||
#: ../js/ui/status/network.js:125
|
||||
msgid "Wi-Fi"
|
||||
msgstr "Wi-Fi"
|
||||
|
||||
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
||||
#: ../js/ui/status/network.js:164
|
||||
#: ../js/ui/status/network.js:162
|
||||
msgid "disabled"
|
||||
msgstr "zakázané"
|
||||
|
||||
#. 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:402
|
||||
#: ../js/ui/status/network.js:397
|
||||
msgid "unmanaged"
|
||||
msgstr "nespravované"
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password
|
||||
#: ../js/ui/status/network.js:413 ../js/ui/status/network.js:1346
|
||||
#: ../js/ui/status/network.js:408 ../js/ui/status/network.js:1301
|
||||
msgid "authentication required"
|
||||
msgstr "požaduje sa overenie totožnosti"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing
|
||||
#: ../js/ui/status/network.js:423
|
||||
#: ../js/ui/status/network.js:419
|
||||
msgid "firmware missing"
|
||||
msgstr "chýba firmvér"
|
||||
|
||||
#. Translators: this is for wired network devices that are physically disconnected
|
||||
#: ../js/ui/status/network.js:430
|
||||
msgid "cable unplugged"
|
||||
msgstr "kábel odpojený"
|
||||
|
||||
#. 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:435
|
||||
#: ../js/ui/status/network.js:423
|
||||
msgid "unavailable"
|
||||
msgstr "nedostupné"
|
||||
|
||||
#: ../js/ui/status/network.js:437 ../js/ui/status/network.js:1348
|
||||
#: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1303
|
||||
msgid "connection failed"
|
||||
msgstr "pripojenie zlyhalo"
|
||||
|
||||
#: ../js/ui/status/network.js:490 ../js/ui/status/network.js:1236
|
||||
#: ../js/ui/status/network.js:1424
|
||||
#: ../js/ui/status/network.js:478 ../js/ui/status/network.js:1190
|
||||
msgid "More…"
|
||||
msgstr "Viac…"
|
||||
|
||||
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
||||
#. and we cannot access its settings (including the name)
|
||||
#: ../js/ui/status/network.js:518 ../js/ui/status/network.js:1191
|
||||
#: ../js/ui/status/network.js:506 ../js/ui/status/network.js:1142
|
||||
msgid "Connected (private)"
|
||||
msgstr "Pripojené (súkromne)"
|
||||
|
||||
#: ../js/ui/status/network.js:597
|
||||
#: ../js/ui/status/network.js:572
|
||||
msgid "Wired"
|
||||
msgstr "Drôtové pripojenie"
|
||||
|
||||
#: ../js/ui/status/network.js:611
|
||||
#: ../js/ui/status/network.js:592
|
||||
msgid "Mobile broadband"
|
||||
msgstr "Širokopásmové pripojenie"
|
||||
|
||||
#: ../js/ui/status/network.js:1522
|
||||
#: ../js/ui/status/network.js:1474
|
||||
msgid "Enable networking"
|
||||
msgstr "Povoliť sieť"
|
||||
|
||||
#: ../js/ui/status/network.js:1583
|
||||
#: ../js/ui/status/network.js:1522
|
||||
msgid "Network Settings"
|
||||
msgstr "Nastavenia siete"
|
||||
|
||||
#: ../js/ui/status/network.js:1600
|
||||
#: ../js/ui/status/network.js:1539
|
||||
msgid "Network Manager"
|
||||
msgstr "Správca siete"
|
||||
|
||||
#: ../js/ui/status/network.js:1690
|
||||
#: ../js/ui/status/network.js:1623
|
||||
msgid "Connection failed"
|
||||
msgstr "Pripojenie zlyhalo"
|
||||
|
||||
#: ../js/ui/status/network.js:1691
|
||||
#: ../js/ui/status/network.js:1624
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktivácia pripojenia k sieti zlyhala"
|
||||
|
||||
#: ../js/ui/status/network.js:2047
|
||||
#: ../js/ui/status/network.js:1938
|
||||
msgid "Networking is disabled"
|
||||
msgstr "Sieť je zakázaná"
|
||||
|
||||
@@ -1768,72 +1778,72 @@ msgctxt "device"
|
||||
msgid "Unknown"
|
||||
msgstr "Neznáme"
|
||||
|
||||
#: ../js/ui/status/volume.js:124
|
||||
#: ../js/ui/status/volume.js:121
|
||||
msgid "Volume changed"
|
||||
msgstr "Hlasitosť bola zmenená"
|
||||
|
||||
#. Translators: This is the label for audio volume
|
||||
#: ../js/ui/status/volume.js:249 ../js/ui/status/volume.js:297
|
||||
#: ../js/ui/status/volume.js:246 ../js/ui/status/volume.js:294
|
||||
msgid "Volume"
|
||||
msgstr "Hlasitosť"
|
||||
|
||||
#: ../js/ui/status/volume.js:258
|
||||
#: ../js/ui/status/volume.js:255
|
||||
msgid "Microphone"
|
||||
msgstr "Mikrofón"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:120
|
||||
#: ../js/ui/unlockDialog.js:119
|
||||
msgid "Log in as another user"
|
||||
msgstr "Prihlásiť ako iný používateľ"
|
||||
|
||||
#: ../js/ui/unlockDialog.js:141
|
||||
#: ../js/ui/unlockDialog.js:140
|
||||
msgid "Unlock Window"
|
||||
msgstr "Odomykacie okno"
|
||||
|
||||
#: ../js/ui/userMenu.js:193
|
||||
#: ../js/ui/userMenu.js:149
|
||||
msgid "Available"
|
||||
msgstr "Prítomný"
|
||||
|
||||
#: ../js/ui/userMenu.js:196
|
||||
#: ../js/ui/userMenu.js:152
|
||||
msgid "Busy"
|
||||
msgstr "Zaneprázdnený"
|
||||
|
||||
#: ../js/ui/userMenu.js:199
|
||||
#: ../js/ui/userMenu.js:155
|
||||
msgid "Invisible"
|
||||
msgstr "Neviditeľný"
|
||||
|
||||
#: ../js/ui/userMenu.js:202
|
||||
#: ../js/ui/userMenu.js:158
|
||||
msgid "Away"
|
||||
msgstr "Neprítomný"
|
||||
|
||||
#: ../js/ui/userMenu.js:205
|
||||
#: ../js/ui/userMenu.js:161
|
||||
msgid "Idle"
|
||||
msgstr "Nečinný"
|
||||
|
||||
#: ../js/ui/userMenu.js:208
|
||||
#: ../js/ui/userMenu.js:164
|
||||
msgid "Offline"
|
||||
msgstr "Odhlásený"
|
||||
|
||||
#: ../js/ui/userMenu.js:781
|
||||
#: ../js/ui/userMenu.js:736
|
||||
msgid "Notifications"
|
||||
msgstr "Upozornenia"
|
||||
|
||||
#: ../js/ui/userMenu.js:797
|
||||
#: ../js/ui/userMenu.js:749
|
||||
msgid "Switch User"
|
||||
msgstr "Prepnúť používateľa"
|
||||
|
||||
#: ../js/ui/userMenu.js:802
|
||||
#: ../js/ui/userMenu.js:754
|
||||
msgid "Log Out"
|
||||
msgstr "Odhlásiť sa"
|
||||
|
||||
#: ../js/ui/userMenu.js:822
|
||||
#: ../js/ui/userMenu.js:774
|
||||
msgid "Install Updates & Restart"
|
||||
msgstr "Nainštalovať aktualizácie a reštartovať"
|
||||
|
||||
#: ../js/ui/userMenu.js:840
|
||||
#: ../js/ui/userMenu.js:792
|
||||
msgid "Your chat status will be set to busy"
|
||||
msgstr "Váš stav bude nastavený na zaneprázdnený"
|
||||
|
||||
#: ../js/ui/userMenu.js:841
|
||||
#: ../js/ui/userMenu.js:793
|
||||
msgid ""
|
||||
"Notifications are now disabled, including chat messages. Your online status "
|
||||
"has been adjusted to let others know that you might not see their messages."
|
||||
@@ -1841,22 +1851,22 @@ msgstr ""
|
||||
"Oznámenia, vrátane správ rozhovoru, sú teraz zakázané. Váš stav online bol "
|
||||
"nastavený tak, aby ostatní vedeli, že nemusíte vidieť ich správy."
|
||||
|
||||
#: ../js/ui/userMenu.js:888
|
||||
#: ../js/ui/userMenu.js:834
|
||||
msgid "Other users are logged in."
|
||||
msgstr "Sú prihlásení iní používatelia."
|
||||
|
||||
#: ../js/ui/userMenu.js:893
|
||||
#: ../js/ui/userMenu.js:839
|
||||
msgid "Shutting down might cause them to lose unsaved work."
|
||||
msgstr "Vypnutie môže spôsobiť stratu neuloženej práce."
|
||||
|
||||
#. Translators: Remote here refers to a remote session, like a ssh login
|
||||
#: ../js/ui/userMenu.js:921
|
||||
#: ../js/ui/userMenu.js:867
|
||||
#, c-format
|
||||
msgid "%s (remote)"
|
||||
msgstr "%s (vzdialená relácia)"
|
||||
|
||||
#. Translators: Console here refers to a tty like a VT console
|
||||
#: ../js/ui/userMenu.js:924
|
||||
#: ../js/ui/userMenu.js:870
|
||||
#, c-format
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (konzola)"
|
||||
@@ -1918,19 +1928,19 @@ msgstr[2] "%u vstupy"
|
||||
msgid "System Sounds"
|
||||
msgstr "Systémové zvuky"
|
||||
|
||||
#: ../src/main.c:372
|
||||
#: ../src/main.c:353
|
||||
msgid "Print version"
|
||||
msgstr "Verzia pre tlač"
|
||||
|
||||
#: ../src/main.c:378
|
||||
#: ../src/main.c:359
|
||||
msgid "Mode used by GDM for login screen"
|
||||
msgstr "Režim používaný GDM pre prihlasovaciu obrazovku"
|
||||
|
||||
#: ../src/main.c:384
|
||||
#: ../src/main.c:365
|
||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||
msgstr "Použitie zvláštneho režimu, napr. „gdm“ pre prihlasovaciu obrazovku"
|
||||
|
||||
#: ../src/main.c:390
|
||||
#: ../src/main.c:371
|
||||
msgid "List possible modes"
|
||||
msgstr "Zoznam možných režimov"
|
||||
|
||||
@@ -1952,6 +1962,9 @@ msgstr "Heslo nemôže byť prázdne"
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "Dialógové okno overenia totožnosti bolo zatvorené používateľom"
|
||||
|
||||
#~ msgid "cable unplugged"
|
||||
#~ msgstr "kábel odpojený"
|
||||
|
||||
#~ msgid "Whether to collect stats about applications usage"
|
||||
#~ msgstr "Či sa majú zhromažďovať štatistické údaje o používaní aplikácií"
|
||||
|
||||
|
||||
133
po/tg.po
133
po/tg.po
@@ -8,8 +8,8 @@ msgstr ""
|
||||
"Project-Id-Version: Tajik Gnome\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2013-06-14 18:16+0000\n"
|
||||
"PO-Revision-Date: 2013-06-16 23:32+0500\n"
|
||||
"POT-Creation-Date: 2013-07-03 17:55+0000\n"
|
||||
"PO-Revision-Date: 2013-07-12 16:00+0500\n"
|
||||
"Last-Translator: Victor Ibragimov <victor.ibragimov@gmail.com>\n"
|
||||
"Language-Team: \n"
|
||||
"Language: Tajik\n"
|
||||
@@ -375,18 +375,23 @@ msgstr ""
|
||||
"Пасвандеро интихоб кунед, то ин ки бо ҷаъбаи мураккаби боло онро "
|
||||
"конфигуратсия кунед."
|
||||
|
||||
#: ../js/gdm/loginDialog.js:370
|
||||
msgid "Session…"
|
||||
msgstr "Ҷаласа..."
|
||||
#: ../js/gdm/loginDialog.js:308
|
||||
msgid "Choose Session"
|
||||
msgstr "Интихоби ҷаласа"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:326
|
||||
#| msgid "Session…"
|
||||
msgid "Session"
|
||||
msgstr "Ҷаласа"
|
||||
|
||||
#. translators: this message is shown below the user list on the
|
||||
#. login screen. It can be activated to reveal an entry for
|
||||
#. manually entering the username.
|
||||
#: ../js/gdm/loginDialog.js:600
|
||||
#: ../js/gdm/loginDialog.js:528
|
||||
msgid "Not listed?"
|
||||
msgstr "Вуҷуд надора?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:775 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/gdm/loginDialog.js:810 ../js/ui/components/networkAgent.js:137
|
||||
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
|
||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||
#: ../js/ui/status/bluetooth.js:449 ../js/ui/unlockDialog.js:95
|
||||
@@ -394,18 +399,18 @@ msgstr "Вуҷуд надора?"
|
||||
msgid "Cancel"
|
||||
msgstr "Бекор кардан"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:790
|
||||
#: ../js/gdm/loginDialog.js:833
|
||||
msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Ворид шудан"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:790
|
||||
#: ../js/gdm/loginDialog.js:833
|
||||
msgid "Next"
|
||||
msgstr "Навбатӣ"
|
||||
|
||||
#. Translators: this message is shown below the username entry field
|
||||
#. to clue the user in on how to login to the local network realm
|
||||
#: ../js/gdm/loginDialog.js:887
|
||||
#: ../js/gdm/loginDialog.js:934
|
||||
#, c-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(масалан, корбар ё %s)"
|
||||
@@ -413,12 +418,12 @@ msgstr "(масалан, корбар ё %s)"
|
||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||
#. is not visible here since we only care about phase2 authentication
|
||||
#. (and don't even care of which one)
|
||||
#: ../js/gdm/loginDialog.js:891 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/gdm/loginDialog.js:938 ../js/ui/components/networkAgent.js:260
|
||||
#: ../js/ui/components/networkAgent.js:278
|
||||
msgid "Username: "
|
||||
msgstr "Номи корбар:"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:1157
|
||||
#: ../js/gdm/loginDialog.js:1205
|
||||
msgid "Login Window"
|
||||
msgstr "Равзанаи воридшавӣ"
|
||||
|
||||
@@ -441,13 +446,13 @@ msgstr "Бозоғозидан"
|
||||
msgid "Power Off"
|
||||
msgstr "Хомӯш кардан"
|
||||
|
||||
#: ../js/gdm/util.js:247
|
||||
#: ../js/gdm/util.js:248
|
||||
msgid "Authentication error"
|
||||
msgstr "Хатои санҷиши ҳаққоният"
|
||||
|
||||
#. Translators: this message is shown below the password entry field
|
||||
#. to indicate the user can swipe their finger instead
|
||||
#: ../js/gdm/util.js:364
|
||||
#: ../js/gdm/util.js:365
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(ё бо ангут ламс кунед)"
|
||||
|
||||
@@ -838,14 +843,14 @@ msgstr "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> "
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name.
|
||||
#: ../js/ui/components/telepathyClient.js:985
|
||||
#: ../js/ui/components/telepathyClient.js:986
|
||||
#, c-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s аллакой бо номи %s номида мешавад"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1088
|
||||
#: ../js/ui/components/telepathyClient.js:1089
|
||||
#, c-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Даъватнома барои to %s"
|
||||
@@ -853,38 +858,38 @@ msgstr "Даъватнома барои to %s"
|
||||
#. translators: first argument is the name of a contact and the second
|
||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||
#. * for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1096
|
||||
#: ../js/ui/components/telepathyClient.js:1097
|
||||
#, c-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s шуморо барои ҳамроҳ шудан ба %s даъват мекунад"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1098
|
||||
#: ../js/ui/components/telepathyClient.js:1137
|
||||
#: ../js/ui/components/telepathyClient.js:1177
|
||||
#: ../js/ui/components/telepathyClient.js:1240
|
||||
#: ../js/ui/components/telepathyClient.js:1099
|
||||
#: ../js/ui/components/telepathyClient.js:1138
|
||||
#: ../js/ui/components/telepathyClient.js:1178
|
||||
#: ../js/ui/components/telepathyClient.js:1241
|
||||
msgid "Decline"
|
||||
msgstr "Рад кардан"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1099
|
||||
#: ../js/ui/components/telepathyClient.js:1178
|
||||
#: ../js/ui/components/telepathyClient.js:1241
|
||||
#: ../js/ui/components/telepathyClient.js:1100
|
||||
#: ../js/ui/components/telepathyClient.js:1179
|
||||
#: ../js/ui/components/telepathyClient.js:1242
|
||||
msgid "Accept"
|
||||
msgstr "Қабул кардан"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1129
|
||||
#: ../js/ui/components/telepathyClient.js:1130
|
||||
#, c-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Занги видеоӣ аз %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1132
|
||||
#: ../js/ui/components/telepathyClient.js:1133
|
||||
#, c-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Занг аз %s"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun
|
||||
#: ../js/ui/components/telepathyClient.js:1139
|
||||
#: ../js/ui/components/telepathyClient.js:1140
|
||||
msgid "Answer"
|
||||
msgstr "Ҷавоб"
|
||||
|
||||
@@ -893,110 +898,110 @@ msgstr "Ҷавоб"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#.
|
||||
#: ../js/ui/components/telepathyClient.js:1171
|
||||
#: ../js/ui/components/telepathyClient.js:1172
|
||||
#, c-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s ба шумо %s-ро мефиристад"
|
||||
|
||||
#. To translators: The parameter is the contact's alias
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#: ../js/ui/components/telepathyClient.js:1207
|
||||
#, c-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s аз шумо иҷозат мепурсад, ки тавонад шуморо дар онлайн бинад"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1298
|
||||
#: ../js/ui/components/telepathyClient.js:1299
|
||||
msgid "Network error"
|
||||
msgstr "Хатои шабака"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
#: ../js/ui/components/telepathyClient.js:1301
|
||||
msgid "Authentication failed"
|
||||
msgstr "Санҷиши ҳаққоният қатъ шудааст."
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1302
|
||||
#: ../js/ui/components/telepathyClient.js:1303
|
||||
msgid "Encryption error"
|
||||
msgstr "Хатои рамзгузорӣ"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1304
|
||||
#: ../js/ui/components/telepathyClient.js:1305
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Гувоҳинома таъмин нашудааст"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1306
|
||||
#: ../js/ui/components/telepathyClient.js:1307
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Гувоҳиномаи беэътибор"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1308
|
||||
#: ../js/ui/components/telepathyClient.js:1309
|
||||
msgid "Certificate expired"
|
||||
msgstr "Гувоҳинома аз мӯҳлаташ гузашт"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1310
|
||||
#: ../js/ui/components/telepathyClient.js:1311
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Гувоҳинома фаъол нашудааст"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1312
|
||||
#: ../js/ui/components/telepathyClient.js:1313
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Номувофиқати гувоҳиномаи номи мизоҷон"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1314
|
||||
#: ../js/ui/components/telepathyClient.js:1315
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Номувофиқати гувоҳиномаи нақши ангуштон"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1316
|
||||
#: ../js/ui/components/telepathyClient.js:1317
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Гувоҳиномаи худимзошуда"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1318
|
||||
#: ../js/ui/components/telepathyClient.js:1319
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Вазъият ба \"офлайн\" гузаштааст"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1320
|
||||
#: ../js/ui/components/telepathyClient.js:1321
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Рамзгузорӣ дастрас нест"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1322
|
||||
#: ../js/ui/components/telepathyClient.js:1323
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Гувоҳинома нодуруст аст"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1324
|
||||
#: ../js/ui/components/telepathyClient.js:1325
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Пайваст рад карда шудааст"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1326
|
||||
#: ../js/ui/components/telepathyClient.js:1327
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Пайвастшавӣ имконнопазир аст"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1328
|
||||
#: ../js/ui/components/telepathyClient.js:1329
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Пайваст гум шудааст"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1330
|
||||
#: ../js/ui/components/telepathyClient.js:1331
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Ин ҳисоб аллакай ба сервер пайваст шудааст"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1332
|
||||
#: ../js/ui/components/telepathyClient.js:1333
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr "Пайваст тавассути сарчашмаи якхела бо пайвасти нав ҷойиваз карда шуд"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1334
|
||||
#: ../js/ui/components/telepathyClient.js:1335
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Ҳисоб дар сервер аллакай мавҷуд аст"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1336
|
||||
#: ../js/ui/components/telepathyClient.js:1337
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "Барои коркарди ин пайваст сервер дар айни ҳол хеле машғул мебошад"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1338
|
||||
#: ../js/ui/components/telepathyClient.js:1339
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Гувоҳинома лағв карда шуд"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1340
|
||||
#: ../js/ui/components/telepathyClient.js:1341
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Гувоҳинома алгоритми хатарноки рамзро истифода мебарад, ё ки рамзгузории "
|
||||
"суст дорад"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
#: ../js/ui/components/telepathyClient.js:1343
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@@ -1004,22 +1009,22 @@ msgstr ""
|
||||
"Дарозии гувоҳиномаи сервер, ё ки чуқурии занҷири гувоҳиномаи сервер, аз "
|
||||
"маҳдудиятҳое, ки бо китобхонаи рамзгузорӣ таъин шудаанд, дарозтар мебошад"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
#: ../js/ui/components/telepathyClient.js:1345
|
||||
msgid "Internal error"
|
||||
msgstr "Хатогии дохилӣ"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example.
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
#: ../js/ui/components/telepathyClient.js:1355
|
||||
#, c-format
|
||||
msgid "Unable to connect to %s"
|
||||
msgstr "Пайвастшавӣ ба %s имконнопазир аст"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1359
|
||||
#: ../js/ui/components/telepathyClient.js:1360
|
||||
msgid "View account"
|
||||
msgstr "Намоиш додани ҳисоб"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1398
|
||||
#: ../js/ui/components/telepathyClient.js:1399
|
||||
msgid "Unknown reason"
|
||||
msgstr "Сабаби номаълум"
|
||||
|
||||
@@ -1052,7 +1057,7 @@ msgstr "Танзимоти сана ва вақт"
|
||||
#. 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:202
|
||||
#: ../js/ui/dateMenu.js:201
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%A %B %e, %Y"
|
||||
|
||||
@@ -1263,17 +1268,17 @@ msgstr "Хулоса"
|
||||
msgid "Type to search…"
|
||||
msgstr "Ҷустуҷӯ кардан..."
|
||||
|
||||
#: ../js/ui/panel.js:642
|
||||
#: ../js/ui/panel.js:567
|
||||
msgid "Quit"
|
||||
msgstr "Баромад"
|
||||
|
||||
#. Translators: If there is no suitable word for "Activities"
|
||||
#. in your language, you can use the word for "Overview".
|
||||
#: ../js/ui/panel.js:693
|
||||
#: ../js/ui/panel.js:618
|
||||
msgid "Activities"
|
||||
msgstr "Фаъолиятҳо"
|
||||
|
||||
#: ../js/ui/panel.js:989
|
||||
#: ../js/ui/panel.js:914
|
||||
msgid "Top Bar"
|
||||
msgstr "Панели боло"
|
||||
|
||||
@@ -1282,7 +1287,7 @@ msgstr "Панели боло"
|
||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||
#. switches containing "◯" and "|"). Other values will
|
||||
#. simply result in invisible toggle switches.
|
||||
#: ../js/ui/popupMenu.js:545
|
||||
#: ../js/ui/popupMenu.js:549
|
||||
msgid "toggle-switch-us"
|
||||
msgstr "toggle-switch-us"
|
||||
|
||||
@@ -1321,11 +1326,11 @@ msgstr "GNOME бояд экранро қулф кунад"
|
||||
#.
|
||||
#. XXX: another option is to kick the user into the gdm login
|
||||
#. screen, where we're not affected by grabs
|
||||
#: ../js/ui/screenShield.js:773 ../js/ui/screenShield.js:1213
|
||||
#: ../js/ui/screenShield.js:775 ../js/ui/screenShield.js:1215
|
||||
msgid "Unable to lock"
|
||||
msgstr "Қулф карда намешавад"
|
||||
|
||||
#: ../js/ui/screenShield.js:774 ../js/ui/screenShield.js:1214
|
||||
#: ../js/ui/screenShield.js:776 ../js/ui/screenShield.js:1216
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Қулф аз тарави барнома баста шудааст"
|
||||
|
||||
@@ -1632,7 +1637,7 @@ msgstr "Пайваст қатъ шудааст"
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Фаъолсозии пайвасти шабака қатъ шудааст."
|
||||
|
||||
#: ../js/ui/status/network.js:1933
|
||||
#: ../js/ui/status/network.js:1938
|
||||
msgid "Networking is disabled"
|
||||
msgstr "Шабака ғайрифаъол аст"
|
||||
|
||||
|
||||
562
po/zh_CN.po
562
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
@@ -104,8 +104,8 @@ shell_slicer_paint_child (ShellSlicer *self)
|
||||
return;
|
||||
|
||||
st_bin_get_alignment (ST_BIN (self), &x_align, &y_align);
|
||||
_st_get_align_factors (x_align, y_align,
|
||||
&x_align_factor, &y_align_factor);
|
||||
st_get_align_factors (x_align, y_align,
|
||||
&x_align_factor, &y_align_factor);
|
||||
|
||||
clutter_actor_get_allocation_box (CLUTTER_ACTOR (self), &self_box);
|
||||
clutter_actor_get_allocation_box (child, &child_box);
|
||||
|
||||
@@ -108,8 +108,8 @@ st_bin_allocate (ClutterActor *self,
|
||||
gdouble x_align_f, y_align_f;
|
||||
|
||||
st_theme_node_get_content_box (theme_node, box, &childbox);
|
||||
_st_get_align_factors (priv->x_align, priv->y_align,
|
||||
&x_align_f, &y_align_f);
|
||||
st_get_align_factors (priv->x_align, priv->y_align,
|
||||
&x_align_f, &y_align_f);
|
||||
clutter_actor_allocate_align_fill (priv->child, &childbox,
|
||||
x_align_f, y_align_f,
|
||||
priv->x_fill, priv->y_fill,
|
||||
|
||||
@@ -736,7 +736,7 @@ st_box_layout_allocate (ClutterActor *actor,
|
||||
"expand", &expand,
|
||||
NULL);
|
||||
|
||||
_st_get_align_factors (xalign, yalign, &xalign_f, &yalign_f);
|
||||
st_get_align_factors (xalign, yalign, &xalign_f, &yalign_f);
|
||||
|
||||
if (priv->is_vertical)
|
||||
{
|
||||
|
||||
@@ -98,66 +98,6 @@ _st_actor_get_preferred_height (ClutterActor *actor,
|
||||
clutter_actor_get_preferred_height (actor, for_width, min_height_p, natural_height_p);
|
||||
}
|
||||
|
||||
/**
|
||||
* _st_get_align_factors:
|
||||
* @x_align: an #StAlign
|
||||
* @y_align: an #StAlign
|
||||
* @x_align_out: (out) (allow-none): @x_align as a #gdouble
|
||||
* @y_align_out: (out) (allow-none): @y_align as a #gdouble
|
||||
*
|
||||
* Converts @x_align and @y_align to #gdouble values.
|
||||
*/
|
||||
void
|
||||
_st_get_align_factors (StAlign x_align,
|
||||
StAlign y_align,
|
||||
gdouble *x_align_out,
|
||||
gdouble *y_align_out)
|
||||
{
|
||||
if (x_align_out)
|
||||
{
|
||||
switch (x_align)
|
||||
{
|
||||
case ST_ALIGN_START:
|
||||
*x_align_out = 0.0;
|
||||
break;
|
||||
|
||||
case ST_ALIGN_MIDDLE:
|
||||
*x_align_out = 0.5;
|
||||
break;
|
||||
|
||||
case ST_ALIGN_END:
|
||||
*x_align_out = 1.0;
|
||||
break;
|
||||
|
||||
default:
|
||||
g_warn_if_reached ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (y_align_out)
|
||||
{
|
||||
switch (y_align)
|
||||
{
|
||||
case ST_ALIGN_START:
|
||||
*y_align_out = 0.0;
|
||||
break;
|
||||
|
||||
case ST_ALIGN_MIDDLE:
|
||||
*y_align_out = 0.5;
|
||||
break;
|
||||
|
||||
case ST_ALIGN_END:
|
||||
*y_align_out = 1.0;
|
||||
break;
|
||||
|
||||
default:
|
||||
g_warn_if_reached ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* _st_set_text_from_style:
|
||||
* @text: Target #ClutterText
|
||||
|
||||
@@ -45,11 +45,6 @@ G_END_DECLS
|
||||
|
||||
ClutterActor *_st_widget_get_dnd_clone (StWidget *widget);
|
||||
|
||||
void _st_get_align_factors (StAlign x_align,
|
||||
StAlign y_align,
|
||||
gdouble *x_align_out,
|
||||
gdouble *y_align_out);
|
||||
|
||||
void _st_actor_get_preferred_width (ClutterActor *actor,
|
||||
gfloat for_height,
|
||||
gboolean y_fill,
|
||||
|
||||
@@ -257,8 +257,8 @@ st_table_homogeneous_allocate (ClutterActor *self,
|
||||
row_span = meta->row_span;
|
||||
col_span = meta->col_span;
|
||||
|
||||
_st_get_align_factors (meta->x_align, meta->y_align,
|
||||
&x_align_f, &y_align_f);
|
||||
st_get_align_factors (meta->x_align, meta->y_align,
|
||||
&x_align_f, &y_align_f);
|
||||
|
||||
if (ltr)
|
||||
{
|
||||
@@ -609,8 +609,8 @@ st_table_preferred_allocate (ClutterActor *self,
|
||||
row_span = meta->row_span;
|
||||
col_span = meta->col_span;
|
||||
|
||||
_st_get_align_factors (meta->x_align, meta->y_align,
|
||||
&x_align_f, &y_align_f);
|
||||
st_get_align_factors (meta->x_align, meta->y_align,
|
||||
&x_align_f, &y_align_f);
|
||||
|
||||
/* initialise the width and height */
|
||||
col_width = col_widths[col];
|
||||
|
||||
@@ -1391,7 +1391,7 @@ st_theme_node_render_resources (StThemeNodePaintState *state,
|
||||
*/
|
||||
st_theme_node_paint_state_free (state);
|
||||
|
||||
state->node = node;
|
||||
st_theme_node_paint_state_set_node (state, node);
|
||||
state->alloc_width = width;
|
||||
state->alloc_height = height;
|
||||
|
||||
@@ -1526,7 +1526,7 @@ st_theme_node_update_resources (StThemeNodePaintState *state,
|
||||
}
|
||||
}
|
||||
|
||||
state->node = node;
|
||||
st_theme_node_paint_state_set_node (state, node);
|
||||
state->alloc_width = width;
|
||||
state->alloc_height = height;
|
||||
|
||||
@@ -2347,7 +2347,7 @@ st_theme_node_needs_new_box_shadow_for_size (StThemeNodePaintState *state,
|
||||
|
||||
/* The allocation hasn't changed, no need to recompute a new
|
||||
box-shadow. */
|
||||
if (state->alloc_width == width ||
|
||||
if (state->alloc_width == width &&
|
||||
state->alloc_height == height)
|
||||
return FALSE;
|
||||
|
||||
@@ -2523,8 +2523,9 @@ st_theme_node_paint (StThemeNode *node,
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
st_theme_node_paint_state_free (StThemeNodePaintState *state)
|
||||
static void
|
||||
st_theme_node_paint_state_node_free_internal (StThemeNodePaintState *state,
|
||||
gboolean unref_node)
|
||||
{
|
||||
int corner_id;
|
||||
|
||||
@@ -2539,14 +2540,46 @@ st_theme_node_paint_state_free (StThemeNodePaintState *state)
|
||||
if (state->corner_material[corner_id] != COGL_INVALID_HANDLE)
|
||||
cogl_handle_unref (state->corner_material[corner_id]);
|
||||
|
||||
if (unref_node)
|
||||
st_theme_node_paint_state_set_node (state, NULL);
|
||||
|
||||
st_theme_node_paint_state_init (state);
|
||||
}
|
||||
|
||||
static void
|
||||
st_theme_node_paint_state_node_freed (StThemeNodePaintState *state)
|
||||
{
|
||||
st_theme_node_paint_state_node_free_internal (state, FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
st_theme_node_paint_state_set_node (StThemeNodePaintState *state, StThemeNode *node)
|
||||
{
|
||||
if (state->node)
|
||||
g_object_weak_unref (G_OBJECT (state->node),
|
||||
(GWeakNotify) st_theme_node_paint_state_node_freed,
|
||||
state);
|
||||
|
||||
state->node = node;
|
||||
if (state->node)
|
||||
g_object_weak_ref (G_OBJECT (state->node),
|
||||
(GWeakNotify) st_theme_node_paint_state_node_freed,
|
||||
state);
|
||||
}
|
||||
|
||||
void
|
||||
st_theme_node_paint_state_free (StThemeNodePaintState *state)
|
||||
{
|
||||
st_theme_node_paint_state_node_free_internal (state, TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
st_theme_node_paint_state_init (StThemeNodePaintState *state)
|
||||
{
|
||||
int corner_id;
|
||||
|
||||
state->alloc_width = 0;
|
||||
state->alloc_height = 0;
|
||||
state->node = NULL;
|
||||
state->box_shadow_material = COGL_INVALID_HANDLE;
|
||||
state->prerendered_texture = COGL_INVALID_HANDLE;
|
||||
@@ -2567,7 +2600,7 @@ st_theme_node_paint_state_copy (StThemeNodePaintState *state,
|
||||
|
||||
st_theme_node_paint_state_free (state);
|
||||
|
||||
state->node = other->node;
|
||||
st_theme_node_paint_state_set_node (state, other->node);
|
||||
|
||||
state->alloc_width = other->alloc_width;
|
||||
state->alloc_height = other->alloc_height;
|
||||
|
||||
@@ -281,6 +281,8 @@ void st_theme_node_paint_state_free (StThemeNodePaintState *state);
|
||||
void st_theme_node_paint_state_copy (StThemeNodePaintState *state,
|
||||
StThemeNodePaintState *other);
|
||||
void st_theme_node_paint_state_invalidate (StThemeNodePaintState *state);
|
||||
void st_theme_node_paint_state_set_node (StThemeNodePaintState *state,
|
||||
StThemeNode *node);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
@@ -67,6 +67,8 @@ struct _StWidgetPrivate
|
||||
gboolean hover : 1;
|
||||
gboolean can_focus : 1;
|
||||
|
||||
gulong texture_file_changed_id;
|
||||
|
||||
AtkObject *accessible;
|
||||
AtkRole accessible_role;
|
||||
AtkStateSet *local_state_set;
|
||||
@@ -362,9 +364,11 @@ st_widget_dispose (GObject *gobject)
|
||||
priv->label_actor = NULL;
|
||||
}
|
||||
|
||||
g_signal_handlers_disconnect_by_func (st_texture_cache_get_default (),
|
||||
st_widget_texture_cache_changed,
|
||||
actor);
|
||||
if (priv->texture_file_changed_id != 0)
|
||||
{
|
||||
g_signal_handler_disconnect (st_texture_cache_get_default (), priv->texture_file_changed_id);
|
||||
priv->texture_file_changed_id = 0;
|
||||
}
|
||||
|
||||
g_clear_object (&priv->prev_first_child);
|
||||
g_clear_object (&priv->prev_last_child);
|
||||
@@ -1552,8 +1556,8 @@ st_widget_init (StWidget *actor)
|
||||
|
||||
g_signal_connect (actor, "notify::first-child", G_CALLBACK (st_widget_first_child_notify), NULL);
|
||||
g_signal_connect (actor, "notify::last-child", G_CALLBACK (st_widget_last_child_notify), NULL);
|
||||
g_signal_connect (st_texture_cache_get_default (), "texture-file-changed",
|
||||
G_CALLBACK (st_widget_texture_cache_changed), actor);
|
||||
priv->texture_file_changed_id = g_signal_connect (st_texture_cache_get_default (), "texture-file-changed",
|
||||
G_CALLBACK (st_widget_texture_cache_changed), actor);
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (priv->paint_states); i++)
|
||||
st_theme_node_paint_state_init (&priv->paint_states[i]);
|
||||
@@ -2881,3 +2885,63 @@ st_widget_get_focus_chain (StWidget *widget)
|
||||
{
|
||||
return ST_WIDGET_GET_CLASS (widget)->get_focus_chain (widget);
|
||||
}
|
||||
|
||||
/**
|
||||
* st_get_align_factors:
|
||||
* @x_align: an #StAlign
|
||||
* @y_align: an #StAlign
|
||||
* @x_align_out: (out) (allow-none): @x_align as a #gdouble
|
||||
* @y_align_out: (out) (allow-none): @y_align as a #gdouble
|
||||
*
|
||||
* Converts @x_align and @y_align to #gdouble values.
|
||||
*/
|
||||
void
|
||||
st_get_align_factors (StAlign x_align,
|
||||
StAlign y_align,
|
||||
gdouble *x_align_out,
|
||||
gdouble *y_align_out)
|
||||
{
|
||||
if (x_align_out)
|
||||
{
|
||||
switch (x_align)
|
||||
{
|
||||
case ST_ALIGN_START:
|
||||
*x_align_out = 0.0;
|
||||
break;
|
||||
|
||||
case ST_ALIGN_MIDDLE:
|
||||
*x_align_out = 0.5;
|
||||
break;
|
||||
|
||||
case ST_ALIGN_END:
|
||||
*x_align_out = 1.0;
|
||||
break;
|
||||
|
||||
default:
|
||||
g_warn_if_reached ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (y_align_out)
|
||||
{
|
||||
switch (y_align)
|
||||
{
|
||||
case ST_ALIGN_START:
|
||||
*y_align_out = 0.0;
|
||||
break;
|
||||
|
||||
case ST_ALIGN_MIDDLE:
|
||||
*y_align_out = 0.5;
|
||||
break;
|
||||
|
||||
case ST_ALIGN_END:
|
||||
*y_align_out = 1.0;
|
||||
break;
|
||||
|
||||
default:
|
||||
g_warn_if_reached ();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,7 +151,6 @@ StThemeNode * st_widget_peek_theme_node (StWidget *widg
|
||||
GList * st_widget_get_focus_chain (StWidget *widget);
|
||||
void st_widget_paint_background (StWidget *widget);
|
||||
|
||||
|
||||
/* debug methods */
|
||||
char *st_describe_actor (ClutterActor *actor);
|
||||
void st_set_slow_down_factor (gfloat factor);
|
||||
@@ -169,6 +168,12 @@ void st_widget_set_accessible_name (StWidget *widget,
|
||||
const gchar *name);
|
||||
const gchar * st_widget_get_accessible_name (StWidget *widget);
|
||||
|
||||
/* utility methods */
|
||||
void st_get_align_factors (StAlign x_align,
|
||||
StAlign y_align,
|
||||
gdouble *x_align_out,
|
||||
gdouble *y_align_out);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __ST_WIDGET_H__ */
|
||||
|
||||
Reference in New Issue
Block a user