Compare commits

...

32 Commits

Author SHA1 Message Date
Ray Strode
d985477a9d loginDialog: handle really long messages better
Right now if a long message comes in, the whole dialog grows. This
commit fixes that by making the label a label of the entire screen,
instead of a child of the prompt box. To ensure there's still height
allocated for it, this commit introduces a dummy placeholder actor.
2013-06-19 15:52:36 -04:00
Ray Strode
b188d57609 loginDialog: make entry a little wider by default
With recent changes the dialog is somewhat taller now that it was
before.

This comment makes the prompt entry longer to help square things
out.
2013-06-19 13:37:25 -04:00
Ray Strode
412af26e4e loginDialog: drop separate login hint label
There isn't really room for a login hint label and an auth message label
at the same time.  They shouldn't really be showing messages at the same
time anyway, so consolidate them.
2013-06-19 13:37:25 -04:00
Ray Strode
7b440f3864 loginDialog: pre-allocate prompt message height
Right now things jump around if a message comes in.
This commit makes sure there's room for a message to start.
2013-06-19 13:36:33 -04:00
Ray Strode
2d98903c90 loginDialog: drop padding between buttons and entry
Now that the closed session list preallocates space for its
open self, there is a lot of padding between the entry and
buttons.

This commit helps alleviate the padding problem by getting rid
of the large top padding set above the login buttons.
2013-06-19 13:35:26 -04:00
Ray Strode
9a0d0d2fd3 sessionList: always allocate full height
This helps to prevent stuff from jumping around on the login dialog
when the session list opens.
2013-06-19 13:35:26 -04:00
Ray Strode
9451c04a09 loginDialog: start to move login dialog away from modal dialog 2013-06-19 13:35:26 -04:00
Ray Strode
ca9099997c loginDialog: move user list to its own file
The userList code has no dependencies on anything else in
loginDialog.js so move it to its own file.

This is part of the greater reorganization effort to clean up
the login dialog / unlock dialog situation.
2013-06-18 08:01:27 -04:00
Ray Strode
4de18f2d4b loginDialog: move session list to its own file
The sessionList code has no dependencies on anything else in
loginDialog.js so move it to its own file.

This is part of the greater reorganization effort to clean up
the login dialog / unlock dialog situation.
2013-06-18 08:01:27 -04:00
Ray Strode
73d8f6c993 gdm: move all login/unlock code to auth/ directory
Right now the GDM and unlock code use a mish-mash of files
from ui/ and from gdm/.

This commit consolidates all the files into ui/auth as a
first step toward cleaning up the duplication of code between
the two features.
2013-06-18 08:01:27 -04:00
Ray Strode
2141138a6f gdm: move batch.js to misc/
batch.js has nothing to do with GDM, other than it's used by the login
dialog.

We eventually want to get rid of it entirely, but in the mean time move
it to misc/ for clarity.
2013-06-18 08:01:27 -04:00
Ray Strode
4f135be89a ui: move userAvatar to own file
There are a few places in the code that use the UserAvatar widget
without using the user menu.

Since the avatar is used outside of the user menu, move it from
userMenu.js to its own file.
2013-06-18 08:01:27 -04:00
Ray Strode
026ec2d4c2 ui: move AnimatedIcon out of panel.js
The class is generally useful, so it only makes sense in panel.js
for historical reasons. Because other parts of the code are
using it, though, problems are cropping up that require a
workaround like:

placeSpinner: function(...) {
    /* This is here because of recursive imports */
    const Panel = imports.ui.panel;
    Panel.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
    ...
}

This commit moves AnimatedIcon to its own file so we can drop that
workaround.
2013-06-18 08:01:24 -04:00
Ray Strode
a82fae3a2f unlockDialog: clean up unused imports 2013-06-14 08:40:20 -04:00
Ray Strode
892d224cd7 loginDialog: clean up unused imports 2013-06-14 08:16:49 -04:00
Victor Ibragimov
63e6d11892 Tajik updated 2013-05-30 17:29:52 +05:00
Adel Gadllah
0509bb9bb4 shell-gtk-embed: Lower tray icon windows to the bottom of the stack
Otherwise they break the "top level window" detection used by the
unredirect code in mutter, causes game windows not to be unredirected
when tray icons are present.

https://bugzilla.gnome.org/show_bug.cgi?id=701224
2013-05-30 00:57:37 +02:00
Adel Gadllah
5c78908a5f xdnd: Lower window activation timeout
The current one is perceived as too high by users, so try a shorter timeout.

https://bugzilla.gnome.org/show_bug.cgi?id=700150
2013-05-29 22:04:07 +02:00
Jasper St. Pierre
5a2269c6c6 overviewControls: Don't push window thumbs over when workspaces are invisible
Make the sliding control invisible when the thumbnails box is as well.

https://bugzilla.gnome.org/show_bug.cgi?id=701167
2013-05-29 13:04:45 -04:00
Jasper St. Pierre
a7e9655e32 searchDisplay: Remove the setResults/getResultsForDisplay dance
Now that we control our own destiny, I noticed that getResultsToDisplay
is the only user of this._notDisplayedResult, and it's called immediately
after setResults, which is the only thing that sets it. Just remove the
stateness entirely.

https://bugzilla.gnome.org/show_bug.cgi?id=693836
2013-05-29 11:32:50 -04:00
Jasper St. Pierre
1ec82d2ddd searchDisplay: Remove getVisibleResultCount
This is only used in one place, so we can quickly substitute
where it's needed.

https://bugzilla.gnome.org/show_bug.cgi?id=693836
2013-05-29 11:32:50 -04:00
Jasper St. Pierre
98eaef621a searchDisplay: Remove the "provider meta"
As everything is tracked on the SearchResults or subclasses of now,
just use that, which we call the "provider display".

https://bugzilla.gnome.org/show_bug.cgi?id=693836
2013-05-29 11:32:50 -04:00
Jasper St. Pierre
74a6ca58ef searchDisplay: Move the provider actors to the results display
Since the provider icon only appears in the list results, it makes
sense for that to be stored with the results class, rather than outside,
triggered by which sort of display it is.

https://bugzilla.gnome.org/show_bug.cgi?id=693836
2013-05-29 11:32:49 -04:00
Jasper St. Pierre
747faa43ae searchDisplay: Remove the providerIcon from the providerMeta
Since the resultsDisplay is tracking it, it's not needed.

https://bugzilla.gnome.org/show_bug.cgi?id=693836
2013-05-29 11:32:49 -04:00
Jasper St. Pierre
32a53f7412 searchDisplay: Remove focus management code
It turns out that this focus code broke sometime in the 3.6 cycle --
when updating results, the focus is always on the text entry, so this
never gets called. We'll eventually replace it with something that
keeps track of the focused result meta, but for now, remove it.

https://bugzilla.gnome.org/show_bug.cgi?id=693836
2013-05-29 11:32:49 -04:00
Jasper St. Pierre
9c94e9813c searchDisplay: Make renderResults private
There's no need to call this from outside now.

https://bugzilla.gnome.org/show_bug.cgi?id=693836
2013-05-29 11:32:49 -04:00
Jasper St. Pierre
19749bb37f searchDisplay: Make the results display in charge of updating the actor
While this is a very simple translation right now, soon enough it will
be so that it will have a less crazy "public" API and can do things like
cache result metas.

https://bugzilla.gnome.org/show_bug.cgi?id=693836
2013-05-29 11:32:49 -04:00
Jasper St. Pierre
5ab4c484a5 searchDisplay: Remove clearDisplayForProvider
Since the two paths that call this want to keep the actor in two different
states, it makes sense to just call the one function that's the same between
both individually.

https://bugzilla.gnome.org/show_bug.cgi?id=693836
2013-05-29 11:32:49 -04:00
Jasper St. Pierre
e602199bfb searchDisplay: Add a base class for common parts of search results
Right now, this doesn't give us very much, since IconGrid and StBoxLayout
have different APIs. But since we want to introduce result caching, it
makes to reduce the duplication we already have so we don't need to add
the code to do so in both places.

https://bugzilla.gnome.org/show_bug.cgi?id=693836
2013-05-29 11:32:49 -04:00
Jasper St. Pierre
62e1c08dd6 searchDisplay: Remove pendingClear
It turns out that every time we call getResultsForDisplay is
directly after a setResults, so pendingClear is always true.

https://bugzilla.gnome.org/show_bug.cgi?id=693836
2013-05-29 11:32:49 -04:00
Jasper St. Pierre
37e2b60cd3 search: Rename pushResults to setResults
pushResults, and the original async search API, were originally intended
so search results that weren't immediate could be added as they come in.
Since then, we've decided that the design of search results is that they
should finish at once with all results. Thus, the code was modified so
that pushResults always overwrote the current result set. As such, it makes
sense to rename the method so that the name matches the behavior.

https://bugzilla.gnome.org/show_bug.cgi?id=693836
2013-05-29 11:32:49 -04:00
Marek Černocký
f299078585 Updated Czech translation 2013-05-29 12:26:52 +02:00
31 changed files with 1351 additions and 1229 deletions

View File

@@ -381,6 +381,7 @@ StScrollBar StButton#vhandle:active {
/* Entries */ /* Entries */
#searchEntry, #searchEntry,
.login-dialog StEntry,
.notification StEntry, .notification StEntry,
.modal-dialog StEntry { .modal-dialog StEntry {
color: rgb(64, 64, 64); color: rgb(64, 64, 64);
@@ -392,6 +393,7 @@ StScrollBar StButton#vhandle:active {
} }
#searchEntry, #searchEntry,
.login-dialog StEntry,
.run-dialog-entry, .run-dialog-entry,
.notification StEntry { .notification StEntry {
border: 2px solid rgba(245,245,245,0.2); border: 2px solid rgba(245,245,245,0.2);
@@ -404,6 +406,7 @@ StScrollBar StButton#vhandle:active {
#searchEntry:focus, #searchEntry:focus,
#searchEntry:hover, #searchEntry:hover,
.login-dialog StEntry:focus,
.notification StEntry:focus, .notification StEntry:focus,
.modal-dialog StEntry { .modal-dialog StEntry {
border: 2px solid rgb(136,138,133); border: 2px solid rgb(136,138,133);
@@ -413,6 +416,7 @@ StScrollBar StButton#vhandle:active {
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.6); box-shadow: inset 0px 2px 4px rgba(0,0,0,0.6);
} }
.login-dialog StEntry:focus,
.notification StEntry:focus, .notification StEntry:focus,
.modal-dialog StEntry:focus { .modal-dialog StEntry:focus {
border: 2px solid #3465a4; border: 2px solid #3465a4;
@@ -436,6 +440,7 @@ StScrollBar StButton#vhandle:active {
transition-duration: 0ms; transition-duration: 0ms;
} }
.login-dialog StEntry,
.notification StEntry, .notification StEntry,
.modal-dialog StEntry { .modal-dialog StEntry {
border-radius: 5px; border-radius: 5px;
@@ -449,6 +454,7 @@ StScrollBar StButton#vhandle:active {
padding: 0 4px; padding: 0 4px;
} }
.login-dialog StEntry:insensitive,
.modal-dialog StEntry:insensitive { .modal-dialog StEntry:insensitive {
border-color: #666666; border-color: #666666;
color: #9f9f9f; color: #9f9f9f;
@@ -2234,8 +2240,13 @@ StScrollBar StButton#vhandle:active {
min-width: 350px; min-width: 350px;
} }
.login-dialog-button-box {
spacing: 21px;
}
.login-dialog-prompt-login-hint-message { .login-dialog-prompt-login-hint-message {
font-size: 10.5pt; font-size: 10.5pt;
min-width: 480px;
} }
.login-dialog-user-list-view { .login-dialog-user-list-view {
@@ -2342,7 +2353,7 @@ StScrollBar StButton#vhandle:active {
} }
.login-dialog-prompt-entry { .login-dialog-prompt-entry {
width: 15em; width: 480px;
} }
.login-dialog-session-list, .login-dialog-session-list,

View File

@@ -17,13 +17,8 @@ misc/config.js: misc/config.js.in Makefile
jsdir = $(pkgdatadir)/js jsdir = $(pkgdatadir)/js
nobase_dist_js_DATA = \ nobase_dist_js_DATA = \
gdm/batch.js \
gdm/fingerprint.js \
gdm/loginDialog.js \
gdm/powerMenu.js \
gdm/realmd.js \
gdm/util.js \
extensionPrefs/main.js \ extensionPrefs/main.js \
misc/batch.js \
misc/config.js \ misc/config.js \
misc/extensionUtils.js \ misc/extensionUtils.js \
misc/fileUtils.js \ misc/fileUtils.js \
@@ -37,6 +32,7 @@ nobase_dist_js_DATA = \
misc/util.js \ misc/util.js \
perf/core.js \ perf/core.js \
ui/altTab.js \ ui/altTab.js \
ui/animation.js \
ui/appDisplay.js \ ui/appDisplay.js \
ui/appFavorites.js \ ui/appFavorites.js \
ui/backgroundMenu.js \ ui/backgroundMenu.js \
@@ -95,7 +91,7 @@ nobase_dist_js_DATA = \
ui/status/bluetooth.js \ ui/status/bluetooth.js \
ui/switcherPopup.js \ ui/switcherPopup.js \
ui/tweener.js \ ui/tweener.js \
ui/unlockDialog.js \ ui/userAvatar.js \
ui/userMenu.js \ ui/userMenu.js \
ui/userWidget.js \ ui/userWidget.js \
ui/viewSelector.js \ ui/viewSelector.js \
@@ -107,6 +103,14 @@ nobase_dist_js_DATA = \
ui/workspacesView.js \ ui/workspacesView.js \
ui/workspaceSwitcherPopup.js \ ui/workspaceSwitcherPopup.js \
ui/xdndHandler.js \ ui/xdndHandler.js \
ui/auth/fingerprint.js \
ui/auth/loginDialog.js \
ui/auth/powerMenu.js \
ui/auth/realmd.js \
ui/auth/sessionList.js \
ui/auth/unlockDialog.js \
ui/auth/userList.js \
ui/auth/util.js \
ui/components/__init__.js \ ui/components/__init__.js \
ui/components/autorunManager.js \ ui/components/autorunManager.js \
ui/components/automountManager.js \ ui/components/automountManager.js \

84
js/ui/animation.js Normal file
View File

@@ -0,0 +1,84 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const St = imports.gi.St;
const Signals = imports.signals;
const Atk = imports.gi.Atk;
const ANIMATED_ICON_UPDATE_TIMEOUT = 100;
const Animation = new Lang.Class({
Name: 'Animation',
_init: function(filename, width, height, speed) {
this.actor = new St.Bin();
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._speed = speed;
this._isLoaded = false;
this._isPlaying = false;
this._timeoutId = 0;
this._frame = 0;
this._animations = St.TextureCache.get_default().load_sliced_image (filename, width, height,
Lang.bind(this, this._animationsLoaded));
this.actor.set_child(this._animations);
},
play: function() {
if (this._isLoaded && this._timeoutId == 0) {
if (this._frame == 0)
this._showFrame(0);
this._timeoutId = Mainloop.timeout_add(this._speed, Lang.bind(this, this._update));
}
this._isPlaying = true;
},
stop: function() {
if (this._timeoutId > 0) {
Mainloop.source_remove(this._timeoutId);
this._timeoutId = 0;
}
this._isPlaying = false;
},
_showFrame: function(frame) {
let oldFrameActor = this._animations.get_child_at_index(this._frame);
if (oldFrameActor)
oldFrameActor.hide();
this._frame = (frame % this._animations.get_n_children());
let newFrameActor = this._animations.get_child_at_index(this._frame);
if (newFrameActor)
newFrameActor.show();
},
_update: function() {
this._showFrame(this._frame + 1);
return true;
},
_animationsLoaded: function() {
this._isLoaded = true;
if (this._isPlaying)
this.play();
},
_onDestroy: function() {
this.stop();
}
});
const AnimatedIcon = new Lang.Class({
Name: 'AnimatedIcon',
Extends: Animation,
_init: function(filename, size) {
this.parent(filename, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
}
});

View File

@@ -509,11 +509,11 @@ const AppSearchProvider = new Lang.Class({
}, },
getInitialResultSet: function(terms) { getInitialResultSet: function(terms) {
this.searchSystem.pushResults(this, this._appSys.initial_search(terms)); this.searchSystem.setResults(this, this._appSys.initial_search(terms));
}, },
getSubsearchResultSet: function(previousResults, terms) { getSubsearchResultSet: function(previousResults, terms) {
this.searchSystem.pushResults(this, this._appSys.subsearch(previousResults, terms)); this.searchSystem.setResults(this, this._appSys.subsearch(previousResults, terms));
}, },
activateResult: function(app) { activateResult: function(app) {

View File

@@ -19,6 +19,7 @@
*/ */
const AccountsService = imports.gi.AccountsService; const AccountsService = imports.gi.AccountsService;
const Atk = imports.gi.Atk;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const CtrlAltTab = imports.ui.ctrlAltTab; const CtrlAltTab = imports.ui.ctrlAltTab;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
@@ -28,464 +29,50 @@ const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Lang = imports.lang; const Lang = imports.lang;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const Realmd = imports.gdm.realmd; const Realmd = imports.ui.auth.realmd;
const Signals = imports.signals; const Signals = imports.signals;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
const Gdm = imports.gi.Gdm; const Gdm = imports.gi.Gdm;
const Batch = imports.gdm.batch; const Animation = imports.ui.animation;
const Fprint = imports.gdm.fingerprint; const AuthUtil = imports.ui.auth.util;
const GdmUtil = imports.gdm.util; const Batch = imports.misc.batch;
const Lightbox = imports.ui.lightbox; const Fprint = imports.ui.auth.fingerprint;
const Layout = imports.ui.layout;
const Main = imports.ui.main; const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const PanelMenu = imports.ui.panelMenu; const SessionList = imports.ui.auth.sessionList;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const UserMenu = imports.ui.userMenu; const UserAvatar = imports.ui.userAvatar;
const UserList = imports.ui.auth.userList;
const UserWidget = imports.ui.userWidget; const UserWidget = imports.ui.userWidget;
const _FADE_ANIMATION_TIME = 0.25; const _FADE_ANIMATION_TIME = 0.25;
const _SCROLL_ANIMATION_TIME = 0.5; const _SCROLL_ANIMATION_TIME = 0.5;
const _WORK_SPINNER_ICON_SIZE = 24;
const _WORK_SPINNER_ANIMATION_DELAY = 1.0;
const _WORK_SPINNER_ANIMATION_TIME = 0.3;
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0; const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
const _LOGO_ICON_HEIGHT = 48; const _LOGO_ICON_HEIGHT = 48;
let _loginDialog = null; let _loginDialog = null;
const UserListItem = new Lang.Class({
Name: 'UserListItem',
_init: function(user) {
this.user = user;
this._userChangedId = this.user.connect('changed',
Lang.bind(this, this._onUserChanged));
let layout = new St.BoxLayout({ vertical: false });
this.actor = new St.Button({ style_class: 'login-dialog-user-list-item',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
can_focus: true,
child: layout,
reactive: true,
x_align: St.Align.START,
x_fill: true });
this._userAvatar = new UserMenu.UserAvatarWidget(this.user,
{ styleClass: 'login-dialog-user-list-item-icon' });
layout.add(this._userAvatar.actor);
let textLayout = new St.BoxLayout({ style_class: 'login-dialog-user-list-item-text-box',
vertical: true });
layout.add(textLayout, { expand: true });
this._nameLabel = new St.Label({ style_class: 'login-dialog-user-list-item-name' });
this.actor.label_actor = this._nameLabel;
textLayout.add(this._nameLabel,
{ y_fill: false,
y_align: St.Align.MIDDLE,
expand: true });
this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator',
scale_x: 0 });
textLayout.add(this._timedLoginIndicator,
{ x_fill: true,
x_align: St.Align.MIDDLE,
y_fill: false,
y_align: St.Align.END });
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this._onUserChanged();
},
_onUserChanged: function() {
this._nameLabel.set_text(this.user.get_real_name());
this._userAvatar.update();
this._updateLoggedIn();
},
syncStyleClasses: function() {
this._updateLoggedIn();
if (global.stage.get_key_focus() == this.actor)
this.actor.add_style_pseudo_class('focus');
else
this.actor.remove_style_pseudo_class('focus');
},
_updateLoggedIn: function() {
if (this.user.is_logged_in())
this.actor.add_style_pseudo_class('logged-in');
else
this.actor.remove_style_pseudo_class('logged-in');
},
_onClicked: function() {
this.emit('activate');
},
showTimedLoginIndicator: function(time) {
let hold = new Batch.Hold();
this.hideTimedLoginIndicator();
Tweener.addTween(this._timedLoginIndicator,
{ scale_x: 1.,
time: time,
transition: 'linear',
onComplete: function() {
hold.release();
},
onCompleteScope: this
});
return hold;
},
hideTimedLoginIndicator: function() {
Tweener.removeTweens(this._timedLoginIndicator);
this._timedLoginIndicator.scale_x = 0.;
}
});
Signals.addSignalMethods(UserListItem.prototype);
const UserList = new Lang.Class({
Name: 'UserList',
_init: function() {
this.actor = new St.ScrollView({ style_class: 'login-dialog-user-list-view'});
this.actor.set_policy(Gtk.PolicyType.NEVER,
Gtk.PolicyType.AUTOMATIC);
this._box = new St.BoxLayout({ vertical: true,
style_class: 'login-dialog-user-list',
pseudo_class: 'expanded' });
this.actor.add_actor(this._box);
this._items = {};
this.actor.connect('key-focus-in', Lang.bind(this, this._moveFocusToItems));
},
_moveFocusToItems: function() {
let hasItems = Object.keys(this._items).length > 0;
if (!hasItems)
return;
if (global.stage.get_key_focus() != this.actor)
return;
let focusSet = this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
if (!focusSet) {
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
this._moveFocusToItems();
return false;
}));
}
},
_onItemActivated: function(activatedItem) {
this.emit('activate', activatedItem);
},
updateStyle: function(isExpanded) {
let tasks = [];
if (isExpanded)
this._box.add_style_pseudo_class('expanded');
else
this._box.remove_style_pseudo_class('expanded');
for (let userName in this._items) {
let item = this._items[userName];
item.actor.sync_hover();
item.syncStyleClasses();
}
},
scrollToItem: function(item) {
let box = item.actor.get_allocation_box();
let adjustment = this.actor.get_vscroll_bar().get_adjustment();
let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0);
Tweener.removeTweens(adjustment);
Tweener.addTween (adjustment,
{ value: value,
time: _SCROLL_ANIMATION_TIME,
transition: 'easeOutQuad' });
},
jumpToItem: function(item) {
let box = item.actor.get_allocation_box();
let adjustment = this.actor.get_vscroll_bar().get_adjustment();
let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0);
adjustment.set_value(value);
},
getItemFromUserName: function(userName) {
let item = this._items[userName];
if (!item)
return null;
return item;
},
addUser: function(user) {
if (!user.is_loaded)
return;
if (user.is_system_account())
return;
if (user.locked)
return;
let userName = user.get_user_name();
if (!userName)
return;
this.removeUser(user);
let item = new UserListItem(user);
this._box.add(item.actor, { x_fill: true });
this._items[userName] = item;
item.connect('activate',
Lang.bind(this, this._onItemActivated));
// Try to keep the focused item front-and-center
item.actor.connect('key-focus-in',
Lang.bind(this,
function() {
this.scrollToItem(item);
}));
this._moveFocusToItems();
this.emit('item-added', item);
},
removeUser: function(user) {
if (!user.is_loaded)
return;
let userName = user.get_user_name();
if (!userName)
return;
let item = this._items[userName];
if (!item)
return;
item.actor.destroy();
delete this._items[userName];
}
});
Signals.addSignalMethods(UserList.prototype);
const SessionListItem = new Lang.Class({
Name: 'SessionListItem',
_init: function(id, name) {
this.id = id;
this.actor = new St.Button({ style_class: 'login-dialog-session-list-item',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
can_focus: true,
reactive: true,
x_fill: true,
x_align: St.Align.START });
this._box = new St.BoxLayout({ style_class: 'login-dialog-session-list-item-box' });
this.actor.add_actor(this._box);
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this._dot = new St.DrawingArea({ style_class: 'login-dialog-session-list-item-dot' });
this._dot.connect('repaint', Lang.bind(this, this._onRepaintDot));
this._box.add_actor(this._dot);
this.setShowDot(false);
let label = new St.Label({ style_class: 'login-dialog-session-list-item-label',
text: name });
this.actor.label_actor = label;
this._box.add_actor(label);
},
setShowDot: function(show) {
if (show)
this._dot.opacity = 255;
else
this._dot.opacity = 0;
},
_onRepaintDot: function(area) {
let cr = area.get_context();
let [width, height] = area.get_surface_size();
let color = area.get_theme_node().get_foreground_color();
cr.setSourceRGBA (color.red / 255,
color.green / 255,
color.blue / 255,
color.alpha / 255);
cr.arc(width / 2, height / 2, width / 3, 0, 2 * Math.PI);
cr.fill();
cr.$dispose();
},
_onClicked: function() {
this.emit('activate');
}
});
Signals.addSignalMethods(SessionListItem.prototype);
const SessionList = new Lang.Class({
Name: 'SessionList',
_init: function() {
this.actor = new St.Bin();
this._box = new St.BoxLayout({ style_class: 'login-dialog-session-list',
vertical: true});
this.actor.child = this._box;
this._button = new St.Button({ style_class: 'login-dialog-session-list-button',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
can_focus: true,
x_fill: true,
y_fill: true });
let box = new St.BoxLayout();
this._button.add_actor(box);
this._triangle = new St.Label({ style_class: 'login-dialog-session-list-triangle',
text: '\u25B8' });
box.add_actor(this._triangle);
let label = new St.Label({ style_class: 'login-dialog-session-list-label',
text: _("Session…") });
box.add_actor(label);
this._button.connect('clicked',
Lang.bind(this, this._onClicked));
this._box.add_actor(this._button);
this._scrollView = new St.ScrollView({ style_class: 'login-dialog-session-list-scroll-view'});
this._scrollView.set_policy(Gtk.PolicyType.NEVER,
Gtk.PolicyType.AUTOMATIC);
this._box.add_actor(this._scrollView);
this._itemList = new St.BoxLayout({ style_class: 'login-dialog-session-item-list',
vertical: true });
this._scrollView.add_actor(this._itemList);
this._scrollView.hide();
this.isOpen = false;
this._populate();
},
open: function() {
if (this.isOpen)
return;
this._button.add_style_pseudo_class('open');
this._scrollView.show();
this._triangle.set_text('\u25BE');
this.isOpen = true;
},
close: function() {
if (!this.isOpen)
return;
this._button.remove_style_pseudo_class('open');
this._scrollView.hide();
this._triangle.set_text('\u25B8');
this.isOpen = false;
},
_onClicked: function() {
if (!this.isOpen)
this.open();
else
this.close();
},
updateSensitivity: function(sensitive) {
this._button.reactive = sensitive;
this._button.can_focus = sensitive;
for (let id in this._items)
this._items[id].actor.reactive = sensitive;
},
setActiveSession: function(sessionId) {
if (sessionId == this._activeSessionId)
return;
if (this._activeSessionId)
this._items[this._activeSessionId].setShowDot(false);
this._items[sessionId].setShowDot(true);
this._activeSessionId = sessionId;
this.emit('session-activated', this._activeSessionId);
},
_populate: function() {
this._itemList.destroy_all_children();
this._activeSessionId = null;
this._items = {};
let ids = Gdm.get_session_ids();
ids.sort();
if (ids.length <= 1) {
this._box.hide();
this._button.hide();
} else {
this._button.show();
this._box.show();
}
for (let i = 0; i < ids.length; i++) {
let [sessionName, sessionDescription] = Gdm.get_session_name_and_description(ids[i]);
let item = new SessionListItem(ids[i], sessionName);
this._itemList.add_actor(item.actor);
this._items[ids[i]] = item;
if (!this._activeSessionId)
this.setActiveSession(ids[i]);
item.connect('activate',
Lang.bind(this, function() {
this.setActiveSession(item.id);
}));
}
}
});
Signals.addSignalMethods(SessionList.prototype);
const LoginDialog = new Lang.Class({ const LoginDialog = new Lang.Class({
Name: 'LoginDialog', Name: 'LoginDialog',
Extends: ModalDialog.ModalDialog,
_init: function(parentActor) { _init: function(parentActor) {
this.parent({ shellReactive: true, this.actor = new St.Widget({ accessible_role: Atk.Role.WINDOW,
styleClass: 'login-dialog', style_class: 'login-dialog' });
parentActor: parentActor,
keybindingMode: Shell.KeyBindingMode.LOGIN_SCREEN,
shouldFadeIn: false });
this.connect('destroy',
Lang.bind(this, this._onDestroy));
this.connect('opened',
Lang.bind(this, this._onOpened));
this.actor.add_constraint(new Layout.MonitorConstraint({ primary: true }));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
parentActor.add_child(this.actor);
Main.ctrlAltTabManager.addGroup(this.actor,
_("Login Window"),
'dialog-password-symbolic',
{ sortGroup: CtrlAltTab.SortGroup.MIDDLE });
this._userManager = AccountsService.UserManager.get_default() this._userManager = AccountsService.UserManager.get_default()
this._greeterClient = new Gdm.Client(); this._greeterClient = new Gdm.Client();
@@ -501,24 +88,24 @@ const LoginDialog = new Lang.Class({
Lang.bind(this, this._onTimedLoginRequested)); Lang.bind(this, this._onTimedLoginRequested));
} }
this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient); this._userVerifier = new AuthUtil.ShellUserVerifier(this._greeterClient);
this._userVerifier.connect('ask-question', Lang.bind(this, this._askQuestion)); this._userVerifier.connect('ask-question', Lang.bind(this, this._askQuestion));
this._userVerifier.connect('show-message', Lang.bind(this, this._showMessage)); this._userVerifier.connect('show-message', Lang.bind(this, this._onShowMessage));
this._userVerifier.connect('verification-failed', Lang.bind(this, this._verificationFailed)); this._userVerifier.connect('verification-failed', Lang.bind(this, this._verificationFailed));
this._userVerifier.connect('reset', Lang.bind(this, this._reset)); this._userVerifier.connect('reset', Lang.bind(this, this._reset));
this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint)); this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint));
this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint)); this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint));
this._verifyingUser = false; this._verifyingUser = false;
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA }); this._settings = new Gio.Settings({ schema: AuthUtil.LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY, this._settings.connect('changed::' + AuthUtil.BANNER_MESSAGE_KEY,
Lang.bind(this, this._updateBanner)); Lang.bind(this, this._updateBanner));
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_TEXT_KEY, this._settings.connect('changed::' + AuthUtil.BANNER_MESSAGE_TEXT_KEY,
Lang.bind(this, this._updateBanner)); Lang.bind(this, this._updateBanner));
this._settings.connect('changed::' + GdmUtil.DISABLE_USER_LIST_KEY, this._settings.connect('changed::' + AuthUtil.DISABLE_USER_LIST_KEY,
Lang.bind(this, this._updateDisableUserList)); Lang.bind(this, this._updateDisableUserList));
this._settings.connect('changed::' + GdmUtil.LOGO_KEY, this._settings.connect('changed::' + AuthUtil.LOGO_KEY,
Lang.bind(this, this._updateLogo)); Lang.bind(this, this._updateLogo));
this._textureCache = St.TextureCache.get_default(); this._textureCache = St.TextureCache.get_default();
@@ -527,28 +114,31 @@ const LoginDialog = new Lang.Class({
this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box', this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box',
vertical: true }); vertical: true });
this.contentLayout.add(this._userSelectionBox);
this._userSelectionBox.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
align_axis: Clutter.AlignAxis.BOTH,
factor: 0.5 }));
this.actor.add_child(this._userSelectionBox);
this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner', this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner',
text: '' }); text: '' });
this._userSelectionBox.add(this._bannerLabel); this._userSelectionBox.add(this._bannerLabel);
this._updateBanner(); this._updateBanner();
this._userList = new UserList(); this._userList = new UserList.UserList();
this._userSelectionBox.add(this._userList.actor, this._userSelectionBox.add(this._userList.actor,
{ expand: true, { expand: true,
x_fill: true, x_fill: true,
y_fill: true }); y_fill: true });
this.setInitialKeyFocus(this._userList.actor); this._userList.actor.grab_key_focus();
this._promptBox = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout', this._promptBox = new St.BoxLayout({ style_class: 'login-dialog-prompt-layout',
vertical: true }); vertical: true });
this.contentLayout.add(this._promptBox, this._promptBox.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
{ expand: true, align_axis: Clutter.AlignAxis.BOTH,
x_fill: true, factor: 0.5 }));
y_fill: true, this.actor.add_child(this._promptBox);
x_align: St.Align.START });
this._promptUser = new St.Bin({ x_fill: true, this._promptUser = new St.Bin({ x_fill: true,
x_align: St.Align.START }); x_align: St.Align.START });
this._promptBox.add(this._promptUser, this._promptBox.add(this._promptUser,
@@ -568,21 +158,29 @@ const LoginDialog = new Lang.Class({
this._promptEntryTextChangedId = 0; this._promptEntryTextChangedId = 0;
this._promptEntryActivateId = 0; this._promptEntryActivateId = 0;
this._promptBox.add(this._promptEntry, this._promptBox.add(this._promptEntry,
{ expand: true, { expand: false,
x_fill: true, x_fill: false });
y_fill: false,
x_align: St.Align.START });
this._promptMessage = new St.Label({ visible: false }); this._promptMessage = new St.Label({ opacity: 0 });
this._promptBox.add(this._promptMessage, { x_fill: true }); this.actor.add_child(this._promptMessage);
this._promptLoginHint = new St.Label({ style_class: 'login-dialog-prompt-login-hint-message' }); this._promptMessagePlaceholder = new Clutter.Actor({ width: 1, height: 1 });
this._promptLoginHint.hide(); this._promptBox.add_child(this._promptMessagePlaceholder);
this._promptBox.add(this._promptLoginHint);
this._signInButton = null; this._promptMessagePlaceholder.add_constraint(new Clutter.BindConstraint({ source: this._promptMessage,
coordinate: Clutter.BindCoordinate.HEIGHT }));
this._sessionList = new SessionList(); this._promptMessage.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
align_axis: Clutter.AlignAxis.X_AXIS,
factor: 0.5 }));
this._promptMessagePlaceholder.connect("notify::y", Lang.bind(this, function() {
let [placeholderX , placeholderY] = this._promptMessagePlaceholder.get_transformed_position();
let [actorX, actorY] = this.actor.get_transformed_position();
this._promptMessage.y = placeholderY - actorY;
}));
this._sessionList = new SessionList.SessionList();
this._sessionList.connect('session-activated', this._sessionList.connect('session-activated',
Lang.bind(this, function(list, sessionId) { Lang.bind(this, function(list, sessionId) {
this._greeter.call_select_session_sync (sessionId, null); this._greeter.call_select_session_sync (sessionId, null);
@@ -593,6 +191,16 @@ const LoginDialog = new Lang.Class({
x_fill: false, x_fill: false,
y_fill: true, y_fill: true,
x_align: St.Align.START }); x_align: St.Align.START });
this._buttonBox = new St.BoxLayout({ style_class: 'login-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._promptBox.hide();
// translators: this message is shown below the user list on the // translators: this message is shown below the user list on the
@@ -617,7 +225,13 @@ const LoginDialog = new Lang.Class({
this._logoBin = new St.Bin({ style_class: 'login-dialog-logo-bin', y_expand: true }); this._logoBin = new St.Bin({ style_class: 'login-dialog-logo-bin', y_expand: true });
this._logoBin.set_y_align(Clutter.ActorAlign.END); this._logoBin.set_y_align(Clutter.ActorAlign.END);
this.backgroundStack.add_actor(this._logoBin); this._logoBin.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
align_axis: Clutter.AlignAxis.X_AXIS,
factor: 0.5 }));
this._logoBin.add_constraint(new Clutter.AlignConstraint({ source: this.actor,
align_axis: Clutter.AlignAxis.Y_AXIS,
factor: 1.0 }));
this.actor.add_actor(this._logoBin);
this._updateLogo(); this._updateLogo();
if (!this._userManager.is_loaded) if (!this._userManager.is_loaded)
@@ -640,7 +254,7 @@ const LoginDialog = new Lang.Class({
}, },
_updateDisableUserList: function() { _updateDisableUserList: function() {
let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY); let disableUserList = this._settings.get_boolean(AuthUtil.DISABLE_USER_LIST_KEY);
// If this is the first time around, set initial focus // If this is the first time around, set initial focus
if (this._disableUserList == undefined && disableUserList) if (this._disableUserList == undefined && disableUserList)
@@ -655,8 +269,8 @@ const LoginDialog = new Lang.Class({
}, },
_updateBanner: function() { _updateBanner: function() {
let enabled = this._settings.get_boolean(GdmUtil.BANNER_MESSAGE_KEY); let enabled = this._settings.get_boolean(AuthUtil.BANNER_MESSAGE_KEY);
let text = this._settings.get_string(GdmUtil.BANNER_MESSAGE_TEXT_KEY); let text = this._settings.get_string(AuthUtil.BANNER_MESSAGE_TEXT_KEY);
if (enabled && text) { if (enabled && text) {
this._bannerLabel.set_text(text); this._bannerLabel.set_text(text);
@@ -678,7 +292,7 @@ const LoginDialog = new Lang.Class({
}, },
_updateLogo: function() { _updateLogo: function() {
let path = this._settings.get_string(GdmUtil.LOGO_KEY); let path = this._settings.get_string(AuthUtil.LOGO_KEY);
this._logoFileUri = path ? Gio.file_new_for_path(path).get_uri() : null; this._logoFileUri = path ? Gio.file_new_for_path(path).get_uri() : null;
this._updateLogoTexture(this._textureCache, this._logoFileUri); this._updateLogoTexture(this._textureCache, this._logoFileUri);
@@ -688,7 +302,7 @@ const LoginDialog = new Lang.Class({
this._userVerifier.clear(); this._userVerifier.clear();
this._updateSensitivity(true); this._updateSensitivity(true);
this._promptMessage.hide(); this._promptMessage.opacity = 0;
this._user = null; this._user = null;
this._verifyingUser = false; this._verifyingUser = false;
@@ -698,36 +312,69 @@ const LoginDialog = new Lang.Class({
this._showUserList(); this._showUserList();
}, },
_setWorking: function(working) {
if (!this._workSpinner)
return;
Tweener.removeTweens(this._workSpinner.actor);
if (working) {
this._workSpinner.play();
Tweener.addTween(this._workSpinner.actor,
{ opacity: 255,
delay: _WORK_SPINNER_ANIMATION_DELAY,
time: _WORK_SPINNER_ANIMATION_TIME,
transition: 'linear'
});
} else {
Tweener.addTween(this._workSpinner.actor,
{ opacity: 0,
time: _WORK_SPINNER_ANIMATION_TIME,
transition: 'linear',
onCompleteScope: this,
onComplete: function() {
if (this._workSpinner)
this._workSpinner.stop();
}
});
}
},
_verificationFailed: function() { _verificationFailed: function() {
this._promptEntry.text = ''; this._promptEntry.text = '';
this._updateSensitivity(true); this._updateSensitivity(true);
this.setWorking(false); this._setWorking(false);
}, },
_onDefaultSessionChanged: function(client, sessionId) { _onDefaultSessionChanged: function(client, sessionId) {
this._sessionList.setActiveSession(sessionId); this._sessionList.setActiveSession(sessionId);
}, },
_showMessage: function(userVerifier, message, styleClass) { _showMessage: function(message, styleClass) {
if (message) { if (message) {
this._promptMessage.text = message; this._promptMessage.text = message;
this._promptMessage.styleClass = styleClass; this._promptMessage.styleClass = styleClass;
this._promptMessage.show(); this._promptMessage.opacity = 255;
} else { } else {
this._promptMessage.hide(); this._promptMessage.opacity = 0;
} }
}, },
_onShowMessage: function(userVerifier, message, styleClass) {
this._showMessage(message, styleClass);
this._loginHintShown = false;
},
_showLoginHint: function(verifier, message) { _showLoginHint: function(verifier, message) {
this._promptLoginHint.set_text(message) this._showMessage(message, 'login-dialog-prompt-login-hint-message');
this._promptLoginHint.show(); this._loginHintShown = true;
this._promptLoginHint.opacity = 255;
}, },
_hideLoginHint: function() { _hideLoginHint: function() {
this._promptLoginHint.hide(); if (!this._loginHintShown)
this._promptLoginHint.set_text(''); return;
this._showMessage('', 'login-dialog-prompt-login-hint-message');
this._loginHintShown = false;
}, },
cancel: function() { cancel: function() {
@@ -741,8 +388,6 @@ const LoginDialog = new Lang.Class({
this._sessionList.actor.hide(); this._sessionList.actor.hide();
this._promptLabel.show(); this._promptLabel.show();
this._promptEntry.show(); this._promptEntry.show();
this._promptLoginHint.opacity = 0;
this._promptLoginHint.show();
this._promptBox.opacity = 0; this._promptBox.opacity = 0;
this._promptBox.show(); this._promptBox.show();
Tweener.addTween(this._promptBox, Tweener.addTween(this._promptBox,
@@ -768,33 +413,62 @@ const LoginDialog = new Lang.Class({
}, },
_prepareDialog: function(forSecret, hold) { _prepareDialog: function(forSecret, hold) {
this.buttonLayout.visible = true; this._buttonBox.visible = true;
this.clearButtons(); this._buttonBox.destroy_all_children();
if (!this._disableUserList || this._verifyingUser) if (!this._disableUserList || this._verifyingUser) {
this.addButton({ action: Lang.bind(this, this.cancel), this._cancelButton = new St.Button({ style_class: 'modal-dialog-button',
label: _("Cancel"), button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
key: Clutter.Escape }, reactive: true,
{ expand: true, can_focus: true,
x_fill: false, label: _("Cancel") });
y_fill: false, this._cancelButton.connect('clicked',
x_align: St.Align.START, Lang.bind(this, function() {
y_align: St.Align.MIDDLE }); this.cancel();
this.placeSpinner({ expand: false, }));
x_fill: false, global.stage.connect('captured-event',
y_fill: false, Lang.bind(this, function(actor, event) {
x_align: St.Align.END, if (event.type() == Clutter.EventType.KEY_PRESS &&
y_align: St.Align.MIDDLE }); event.get_key_symbol() == Clutter.KEY_Escape) {
this._signInButton = this.addButton({ action: Lang.bind(this, function() { this.cancel();
hold.release(); }
}), }));
label: forSecret ? C_("button", "Sign In") : _("Next"), this._buttonBox.add(this._cancelButton,
default: true }, { expand: true,
{ expand: false, x_fill: false,
x_fill: false, y_fill: false,
y_fill: false, x_align: St.Align.START,
x_align: St.Align.END, y_align: St.Align.END });
y_align: St.Align.MIDDLE }); }
let spinnerIcon = global.datadir + '/theme/process-working.svg';
this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, _WORK_SPINNER_ICON_SIZE);
this._workSpinner.actor.opacity = 0;
this._workSpinner.actor.show();
this._buttonBox.add(this._workSpinner.actor,
{ expand: false,
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: true,
x_fill: false,
y_fill: false,
x_align: St.Align.END,
y_align: St.Align.END });
this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0); this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0);
@@ -804,10 +478,10 @@ const LoginDialog = new Lang.Class({
this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0); this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0);
})); }));
this._promptEntryActivateId = this._promptEntryActivateId =
this._promptEntry.clutter_text.connect('activate', function() { this._promptEntry.clutter_text.connect('activate', function() {
hold.release(); hold.release();
}); });
}, },
_updateSensitivity: function(sensitive) { _updateSensitivity: function(sensitive) {
@@ -825,7 +499,7 @@ const LoginDialog = new Lang.Class({
}, },
_hidePrompt: function() { _hidePrompt: function() {
this.setButtons([]); this._buttonBox.destroy_all_children();
if (this._promptEntryTextChangedId > 0) { if (this._promptEntryTextChangedId > 0) {
this._promptEntry.clutter_text.disconnect(this._promptEntryTextChangedId); this._promptEntry.clutter_text.disconnect(this._promptEntryTextChangedId);
@@ -837,9 +511,8 @@ const LoginDialog = new Lang.Class({
this._promptEntryActivateId = 0; this._promptEntryActivateId = 0;
} }
this.setWorking(false); this._setWorking(false);
this._promptBox.hide(); this._promptBox.hide();
this._promptLoginHint.hide();
this._promptUser.set_child(null); this._promptUser.set_child(null);
@@ -847,10 +520,10 @@ const LoginDialog = new Lang.Class({
this._promptEntry.set_text(''); this._promptEntry.set_text('');
this._sessionList.close(); this._sessionList.close();
this._promptLoginHint.hide();
this.clearButtons(); this._buttonBox.destroy_all_children();
this._signInButton = null; this._signInButton = null;
this._cancelButton = null;
}, },
_askQuestion: function(verifier, serviceName, question, passwordChar) { _askQuestion: function(verifier, serviceName, question, passwordChar) {
@@ -867,7 +540,7 @@ const LoginDialog = new Lang.Class({
function() { function() {
let text = this._promptEntry.get_text(); let text = this._promptEntry.get_text();
this._updateSensitivity(false); this._updateSensitivity(false);
this.setWorking(true); this._setWorking(true);
this._userVerifier.answerQuery(serviceName, text); this._userVerifier.answerQuery(serviceName, text);
}]; }];
@@ -916,7 +589,7 @@ const LoginDialog = new Lang.Class({
}, },
_startSession: function(serviceName) { _startSession: function(serviceName) {
Tweener.addTween(this.dialogLayout, Tweener.addTween(this.actor,
{ opacity: 0, { opacity: 0,
time: _FADE_ANIMATION_TIME, time: _FADE_ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
@@ -925,7 +598,7 @@ const LoginDialog = new Lang.Class({
for (let i = 0; i < children.length; i++) { for (let i = 0; i < children.length; i++) {
if (children[i] != Main.layoutManager.screenShieldGroup) if (children[i] != Main.layoutManager.screenShieldGroup)
children[i].opacity = this.dialogLayout.opacity; children[i].opacity = this.actor.opacity;
} }
}, },
onUpdateScope: this, onUpdateScope: this,
@@ -1081,7 +754,7 @@ const LoginDialog = new Lang.Class({
_hideUserListAndLogIn: function() { _hideUserListAndLogIn: function() {
this._setUserListExpanded(false); this._setUserListExpanded(false);
GdmUtil.cloneAndFadeOutActor(this._userSelectionBox); AuthUtil.cloneAndFadeOutActor(this._userSelectionBox);
this._askForUsernameAndLogIn(); this._askForUsernameAndLogIn();
}, },
@@ -1113,7 +786,7 @@ const LoginDialog = new Lang.Class({
_onUserListActivated: function(activatedItem) { _onUserListActivated: function(activatedItem) {
let tasks = [function() { let tasks = [function() {
return GdmUtil.cloneAndFadeOutActor(this._userSelectionBox); return AuthUtil.cloneAndFadeOutActor(this._userSelectionBox);
}, },
function() { function() {
this._setUserListExpanded(false); this._setUserListExpanded(false);
@@ -1131,6 +804,8 @@ const LoginDialog = new Lang.Class({
this._userManager.disconnect(this._userManagerLoadedId); this._userManager.disconnect(this._userManagerLoadedId);
this._userManagerLoadedId = 0; this._userManagerLoadedId = 0;
} }
Main.ctrlAltTabManager.removeGroup(this.actor);
}, },
_loadUserList: function() { _loadUserList: function() {
@@ -1153,20 +828,6 @@ const LoginDialog = new Lang.Class({
})); }));
}, },
_onOpened: function() {
Main.ctrlAltTabManager.addGroup(this.dialogLayout,
_("Login Window"),
'dialog-password-symbolic',
{ sortGroup: CtrlAltTab.SortGroup.MIDDLE });
},
close: function() {
this.parent();
Main.ctrlAltTabManager.removeGroup(this.dialogLayout);
},
addCharacter: function(unichar) { addCharacter: function(unichar) {
this._promptEntry.clutter_text.insert_unichar(unichar); this._promptEntry.clutter_text.insert_unichar(unichar);
}, },

View File

@@ -23,7 +23,7 @@ const Lang = imports.lang;
const LoginManager = imports.misc.loginManager; const LoginManager = imports.misc.loginManager;
const GdmUtil = imports.gdm.util; const AuthUtil = imports.ui.auth.util;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
@@ -37,7 +37,7 @@ const PowerMenuButton = new Lang.Class({
this._loginManager = LoginManager.getLoginManager(); this._loginManager = LoginManager.getLoginManager();
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA }); this._settings = new Gio.Settings({ schema: AuthUtil.LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed::disable-restart-buttons', this._settings.connect('changed::disable-restart-buttons',
Lang.bind(this, this._updateVisibility)); Lang.bind(this, this._updateVisibility));

230
js/ui/auth/sessionList.js Normal file
View File

@@ -0,0 +1,230 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/*
* Copyright 2011 Red Hat, Inc
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Signals = imports.signals;
const St = imports.gi.St;
const Gdm = imports.gi.Gdm;
const SessionListItem = new Lang.Class({
Name: 'SessionListItem',
_init: function(id, name) {
this.id = id;
this.actor = new St.Button({ style_class: 'login-dialog-session-list-item',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
can_focus: true,
reactive: true,
x_fill: true,
x_align: St.Align.START });
this._box = new St.BoxLayout({ style_class: 'login-dialog-session-list-item-box' });
this.actor.add_actor(this._box);
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this._dot = new St.DrawingArea({ style_class: 'login-dialog-session-list-item-dot' });
this._dot.connect('repaint', Lang.bind(this, this._onRepaintDot));
this._box.add_actor(this._dot);
this.setShowDot(false);
let label = new St.Label({ style_class: 'login-dialog-session-list-item-label',
text: name });
this.actor.label_actor = label;
this._box.add_actor(label);
},
setShowDot: function(show) {
if (show)
this._dot.opacity = 255;
else
this._dot.opacity = 0;
},
_onRepaintDot: function(area) {
let cr = area.get_context();
let [width, height] = area.get_surface_size();
let color = area.get_theme_node().get_foreground_color();
cr.setSourceRGBA (color.red / 255,
color.green / 255,
color.blue / 255,
color.alpha / 255);
cr.arc(width / 2, height / 2, width / 3, 0, 2 * Math.PI);
cr.fill();
cr.$dispose();
},
_onClicked: function() {
this.emit('activate');
}
});
Signals.addSignalMethods(SessionListItem.prototype);
const SessionList = new Lang.Class({
Name: 'SessionList',
_init: function() {
this.actor = new St.Bin();
this._box = new St.BoxLayout({ style_class: 'login-dialog-session-list',
vertical: true});
this.actor.child = this._box;
this._button = new St.Button({ style_class: 'login-dialog-session-list-button',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
can_focus: true,
x_fill: true,
y_fill: true });
let box = new St.BoxLayout();
this._button.add_actor(box);
this._triangle = new St.Label({ style_class: 'login-dialog-session-list-triangle',
text: '\u25B8' });
box.add_actor(this._triangle);
let label = new St.Label({ style_class: 'login-dialog-session-list-label',
text: _("Session…") });
box.add_actor(label);
this._button.connect('clicked',
Lang.bind(this, this._onClicked));
this._box.add_actor(this._button);
this._scrollView = new St.ScrollView({ style_class: 'login-dialog-session-list-scroll-view'});
this._scrollView.set_policy(Gtk.PolicyType.NEVER,
Gtk.PolicyType.AUTOMATIC);
this._box.add_actor(this._scrollView);
this._itemList = new St.BoxLayout({ style_class: 'login-dialog-session-item-list',
vertical: true });
this._scrollView.add_actor(this._itemList);
this._hideSessions();
this.isOpen = false;
this._populate();
},
_hideSessions: function() {
this._itemList.can_focus = false;
this._itemList.reactive = false;
this._scrollView.opacity = 0;
},
_showSessions: function() {
this._scrollView.opacity = 255;
this._itemList.reactive = true;
this._itemList.can_focus = true;
},
open: function() {
if (this.isOpen)
return;
this._button.add_style_pseudo_class('open');
this._showSessions();
this._triangle.set_text('\u25BE');
this.isOpen = true;
},
close: function() {
if (!this.isOpen)
return;
this._button.remove_style_pseudo_class('open');
this._hideSessions();
this._triangle.set_text('\u25B8');
this.isOpen = false;
},
_onClicked: function() {
if (!this.isOpen)
this.open();
else
this.close();
},
updateSensitivity: function(sensitive) {
this._button.reactive = sensitive;
this._button.can_focus = sensitive;
for (let id in this._items)
this._items[id].actor.reactive = sensitive;
},
setActiveSession: function(sessionId) {
if (sessionId == this._activeSessionId)
return;
if (this._activeSessionId)
this._items[this._activeSessionId].setShowDot(false);
this._items[sessionId].setShowDot(true);
this._activeSessionId = sessionId;
this.emit('session-activated', this._activeSessionId);
},
_populate: function() {
this._itemList.destroy_all_children();
this._activeSessionId = null;
this._items = {};
let ids = Gdm.get_session_ids();
ids.sort();
if (ids.length <= 1) {
this._box.hide();
this._button.hide();
} else {
this._button.show();
this._box.show();
}
for (let i = 0; i < ids.length; i++) {
let [sessionName, sessionDescription] = Gdm.get_session_name_and_description(ids[i]);
let item = new SessionListItem(ids[i], sessionName);
this._itemList.add_actor(item.actor);
this._items[ids[i]] = item;
if (!this._activeSessionId)
this.setActiveSession(ids[i]);
item.connect('activate',
Lang.bind(this, function() {
this.setActiveSession(item.id);
}));
item.actor.can_focus = this._itemList.can_focus;
let signalId = this._itemList.connect('notify::can-focus',
Lang.bind(this, function() {
item.actor.can_focus = this._itemList.can_focus;
}));
item.actor.connect('destroy',
Lang.bind(this, function() {
this._itemList.disconnect(signalId);
}));
}
}
});
Signals.addSignalMethods(SessionList.prototype);

View File

@@ -6,23 +6,17 @@ const Gdm = imports.gi.Gdm;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GnomeDesktop = imports.gi.GnomeDesktop; const GnomeDesktop = imports.gi.GnomeDesktop;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang; const Lang = imports.lang;
const Signals = imports.signals;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
const Main = imports.ui.main; const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const Panel = imports.ui.panel;
const ShellEntry = imports.ui.shellEntry; const ShellEntry = imports.ui.shellEntry;
const Tweener = imports.ui.tweener;
const UserMenu = imports.ui.userMenu;
const UserWidget = imports.ui.userWidget; const UserWidget = imports.ui.userWidget;
const Batch = imports.gdm.batch; const AuthUtil = imports.ui.auth.util;
const GdmUtil = imports.gdm.util; const Batch = imports.misc.batch;
const LoginDialog = imports.gdm.loginDialog;
// The timeout before going back automatically to the lock screen (in seconds) // The timeout before going back automatically to the lock screen (in seconds)
const IDLE_TIMEOUT = 2 * 60; const IDLE_TIMEOUT = 2 * 60;
@@ -46,7 +40,7 @@ const UnlockDialog = new Lang.Class({
this._firstQuestion = true; this._firstQuestion = true;
this._greeterClient = new Gdm.Client(); this._greeterClient = new Gdm.Client();
this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient, { reauthenticationOnly: true }); this._userVerifier = new AuthUtil.ShellUserVerifier(this._greeterClient, { reauthenticationOnly: true });
this._userVerified = false; this._userVerified = false;
this._userVerifier.connect('ask-question', Lang.bind(this, this._onAskQuestion)); this._userVerifier.connect('ask-question', Lang.bind(this, this._onAskQuestion));
@@ -163,9 +157,9 @@ const UnlockDialog = new Lang.Class({
if (message) { if (message) {
this._promptMessage.text = message; this._promptMessage.text = message;
this._promptMessage.styleClass = styleClass; this._promptMessage.styleClass = styleClass;
GdmUtil.fadeInActor(this._promptMessage); AuthUtil.fadeInActor(this._promptMessage);
} else { } else {
GdmUtil.fadeOutActor(this._promptMessage); AuthUtil.fadeOutActor(this._promptMessage);
} }
}, },
@@ -194,11 +188,11 @@ const UnlockDialog = new Lang.Class({
_showLoginHint: function(verifier, message) { _showLoginHint: function(verifier, message) {
this._promptLoginHint.set_text(message) this._promptLoginHint.set_text(message)
GdmUtil.fadeInActor(this._promptLoginHint); AuthUtil.fadeInActor(this._promptLoginHint);
}, },
_hideLoginHint: function() { _hideLoginHint: function() {
GdmUtil.fadeOutActor(this._promptLoginHint); AuthUtil.fadeOutActor(this._promptLoginHint);
}, },
_doUnlock: function() { _doUnlock: function() {

251
js/ui/auth/userList.js Normal file
View File

@@ -0,0 +1,251 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const AccountsService = imports.gi.AccountsService;
const Gtk = imports.gi.Gtk;
const Meta = imports.gi.Meta;
const Lang = imports.lang;
const Signals = imports.signals;
const St = imports.gi.St;
const Gdm = imports.gi.Gdm;
const Batch = imports.misc.batch;
const Tweener = imports.ui.tweener;
const UserAvatar = imports.ui.userAvatar;
const _SCROLL_ANIMATION_TIME = 0.5;
const UserListItem = new Lang.Class({
Name: 'UserListItem',
_init: function(user) {
this.user = user;
this._userChangedId = this.user.connect('changed',
Lang.bind(this, this._onUserChanged));
let layout = new St.BoxLayout({ vertical: false });
this.actor = new St.Button({ style_class: 'login-dialog-user-list-item',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
can_focus: true,
child: layout,
reactive: true,
x_align: St.Align.START,
x_fill: true });
this._userAvatar = new UserAvatar.UserAvatar(this.user,
{ styleClass: 'login-dialog-user-list-item-icon' });
layout.add(this._userAvatar.actor);
let textLayout = new St.BoxLayout({ style_class: 'login-dialog-user-list-item-text-box',
vertical: true });
layout.add(textLayout, { expand: true });
this._nameLabel = new St.Label({ style_class: 'login-dialog-user-list-item-name' });
this.actor.label_actor = this._nameLabel;
textLayout.add(this._nameLabel,
{ y_fill: false,
y_align: St.Align.MIDDLE,
expand: true });
this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator',
scale_x: 0 });
textLayout.add(this._timedLoginIndicator,
{ x_fill: true,
x_align: St.Align.MIDDLE,
y_fill: false,
y_align: St.Align.END });
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this._onUserChanged();
},
_onUserChanged: function() {
this._nameLabel.set_text(this.user.get_real_name());
this._userAvatar.update();
this._updateLoggedIn();
},
syncStyleClasses: function() {
this._updateLoggedIn();
if (global.stage.get_key_focus() == this.actor)
this.actor.add_style_pseudo_class('focus');
else
this.actor.remove_style_pseudo_class('focus');
},
_updateLoggedIn: function() {
if (this.user.is_logged_in())
this.actor.add_style_pseudo_class('logged-in');
else
this.actor.remove_style_pseudo_class('logged-in');
},
_onClicked: function() {
this.emit('activate');
},
showTimedLoginIndicator: function(time) {
let hold = new Batch.Hold();
this.hideTimedLoginIndicator();
Tweener.addTween(this._timedLoginIndicator,
{ scale_x: 1.,
time: time,
transition: 'linear',
onComplete: function() {
hold.release();
},
onCompleteScope: this
});
return hold;
},
hideTimedLoginIndicator: function() {
Tweener.removeTweens(this._timedLoginIndicator);
this._timedLoginIndicator.scale_x = 0.;
}
});
Signals.addSignalMethods(UserListItem.prototype);
const UserList = new Lang.Class({
Name: 'UserList',
_init: function() {
this.actor = new St.ScrollView({ style_class: 'login-dialog-user-list-view'});
this.actor.set_policy(Gtk.PolicyType.NEVER,
Gtk.PolicyType.AUTOMATIC);
this._box = new St.BoxLayout({ vertical: true,
style_class: 'login-dialog-user-list',
pseudo_class: 'expanded' });
this.actor.add_actor(this._box);
this._items = {};
this.actor.connect('key-focus-in', Lang.bind(this, this._moveFocusToItems));
},
_moveFocusToItems: function() {
let hasItems = Object.keys(this._items).length > 0;
if (!hasItems)
return;
if (global.stage.get_key_focus() != this.actor)
return;
let focusSet = this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
if (!focusSet) {
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
this._moveFocusToItems();
return false;
}));
}
},
_onItemActivated: function(activatedItem) {
this.emit('activate', activatedItem);
},
updateStyle: function(isExpanded) {
let tasks = [];
if (isExpanded)
this._box.add_style_pseudo_class('expanded');
else
this._box.remove_style_pseudo_class('expanded');
for (let userName in this._items) {
let item = this._items[userName];
item.actor.sync_hover();
item.syncStyleClasses();
}
},
scrollToItem: function(item) {
let box = item.actor.get_allocation_box();
let adjustment = this.actor.get_vscroll_bar().get_adjustment();
let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0);
Tweener.removeTweens(adjustment);
Tweener.addTween (adjustment,
{ value: value,
time: _SCROLL_ANIMATION_TIME,
transition: 'easeOutQuad' });
},
jumpToItem: function(item) {
let box = item.actor.get_allocation_box();
let adjustment = this.actor.get_vscroll_bar().get_adjustment();
let value = (box.y1 + adjustment.step_increment / 2.0) - (adjustment.page_size / 2.0);
adjustment.set_value(value);
},
getItemFromUserName: function(userName) {
let item = this._items[userName];
if (!item)
return null;
return item;
},
addUser: function(user) {
if (!user.is_loaded)
return;
if (user.is_system_account())
return;
if (user.locked)
return;
let userName = user.get_user_name();
if (!userName)
return;
this.removeUser(user);
let item = new UserListItem(user);
this._box.add(item.actor, { x_fill: true });
this._items[userName] = item;
item.connect('activate',
Lang.bind(this, this._onItemActivated));
// Try to keep the focused item front-and-center
item.actor.connect('key-focus-in',
Lang.bind(this,
function() {
this.scrollToItem(item);
}));
this._moveFocusToItems();
this.emit('item-added', item);
},
removeUser: function(user) {
if (!user.is_loaded)
return;
let userName = user.get_user_name();
if (!userName)
return;
let item = this._items[userName];
if (!item)
return;
item.actor.destroy();
delete this._items[userName];
}
});
Signals.addSignalMethods(UserList.prototype);

View File

@@ -7,8 +7,8 @@ const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Signals = imports.signals; const Signals = imports.signals;
const Batch = imports.gdm.batch; const Batch = imports.misc.batch;
const Fprint = imports.gdm.fingerprint; const Fprint = imports.ui.auth.fingerprint;
const Main = imports.ui.main; const Main = imports.ui.main;
const Params = imports.misc.params; const Params = imports.misc.params;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;

View File

@@ -16,7 +16,7 @@ const PolkitAgent = imports.gi.PolkitAgent;
const Components = imports.ui.components; const Components = imports.ui.components;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const ShellEntry = imports.ui.shellEntry; const ShellEntry = imports.ui.shellEntry;
const UserMenu = imports.ui.userMenu; const UserAvatar = imports.ui.userAvatar;
const DIALOG_ICON_SIZE = 48; const DIALOG_ICON_SIZE = 48;
@@ -100,9 +100,9 @@ const AuthenticationDialog = new Lang.Class({
let userBox = new St.BoxLayout({ style_class: 'polkit-dialog-user-layout', let userBox = new St.BoxLayout({ style_class: 'polkit-dialog-user-layout',
vertical: false }); vertical: false });
messageBox.add(userBox); messageBox.add(userBox);
this._userAvatar = new UserMenu.UserAvatarWidget(this._user, this._userAvatar = new UserAvatar.UserAvatar(this._user,
{ iconSize: DIALOG_ICON_SIZE, { iconSize: DIALOG_ICON_SIZE,
styleClass: 'polkit-dialog-user-icon' }); styleClass: 'polkit-dialog-user-icon' });
this._userAvatar.actor.hide(); this._userAvatar.actor.hide();
userBox.add(this._userAvatar.actor, userBox.add(this._userAvatar.actor,
{ x_fill: true, { x_fill: true,

View File

@@ -35,7 +35,7 @@ const GnomeSession = imports.misc.gnomeSession;
const Main = imports.ui.main; const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const UserMenu = imports.ui.userMenu; const UserAvatar = imports.ui.userAvatar;
let _endSessionDialog = null; let _endSessionDialog = null;
@@ -360,9 +360,9 @@ const EndSessionDialog = new Lang.Class({
icon_size: _DIALOG_ICON_SIZE, icon_size: _DIALOG_ICON_SIZE,
style_class: dialogContent.iconStyleClass }); style_class: dialogContent.iconStyleClass });
} else { } else {
let avatarWidget = new UserMenu.UserAvatarWidget(this._user, let avatarWidget = new UserAvatar.UserAvatar(this._user,
{ iconSize: _DIALOG_ICON_SIZE, { iconSize: _DIALOG_ICON_SIZE,
styleClass: dialogContent.iconStyleClass }); styleClass: dialogContent.iconStyleClass });
this._iconBin.child = avatarWidget.actor; this._iconBin.child = avatarWidget.actor;
avatarWidget.update(); avatarWidget.update();
} }

View File

@@ -14,6 +14,7 @@ const Atk = imports.gi.Atk;
const Params = imports.misc.params; const Params = imports.misc.params;
const Animation = imports.ui.animation;
const Layout = imports.ui.layout; const Layout = imports.ui.layout;
const Lightbox = imports.ui.lightbox; const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main; const Main = imports.ui.main;
@@ -187,10 +188,8 @@ const ModalDialog = new Lang.Class({
}, },
placeSpinner: function(layoutInfo) { placeSpinner: function(layoutInfo) {
/* This is here because of recursive imports */
const Panel = imports.ui.panel;
let spinnerIcon = global.datadir + '/theme/process-working.svg'; let spinnerIcon = global.datadir + '/theme/process-working.svg';
this._workSpinner = new Panel.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE); this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
this._workSpinner.actor.opacity = 0; this._workSpinner.actor.opacity = 0;
this._workSpinner.actor.show(); this._workSpinner.actor.show();

View File

@@ -29,7 +29,7 @@ const ANIMATION_TIME = 0.25;
// and don't want the shading animation to get cut off // and don't want the shading animation to get cut off
const SHADE_ANIMATION_TIME = .20; const SHADE_ANIMATION_TIME = .20;
const DND_WINDOW_SWITCH_TIMEOUT = 1250; const DND_WINDOW_SWITCH_TIMEOUT = 750;
const OVERVIEW_ACTIVATION_TIMEOUT = 0.5; const OVERVIEW_ACTIVATION_TIMEOUT = 0.5;

View File

@@ -1,5 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const GObject = imports.gi.GObject;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Lang = imports.lang; const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
@@ -246,6 +247,7 @@ const ThumbnailsSlider = new Lang.Class({
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this.updateSlide)); Main.layoutManager.connect('monitors-changed', Lang.bind(this, this.updateSlide));
this.actor.connect('notify::hover', Lang.bind(this, this.updateSlide)); this.actor.connect('notify::hover', Lang.bind(this, this.updateSlide));
this._thumbnailsBox.actor.bind_property('visible', this.actor, 'visible', GObject.BindingFlags.SYNC_CREATE);
}, },
_getAlwaysZoomOut: function() { _getAlwaysZoomOut: function() {

View File

@@ -15,6 +15,7 @@ const Signals = imports.signals;
const Atk = imports.gi.Atk; const Atk = imports.gi.Atk;
const Animation = imports.ui.animation;
const Config = imports.misc.config; const Config = imports.misc.config;
const CtrlAltTab = imports.ui.ctrlAltTab; const CtrlAltTab = imports.ui.ctrlAltTab;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
@@ -29,7 +30,6 @@ const PANEL_ICON_SIZE = 24;
const BUTTON_DND_ACTIVATION_TIMEOUT = 250; const BUTTON_DND_ACTIVATION_TIMEOUT = 250;
const ANIMATED_ICON_UPDATE_TIMEOUT = 100;
const SPINNER_ANIMATION_TIME = 0.2; const SPINNER_ANIMATION_TIME = 0.2;
// To make sure the panel corners blend nicely with the panel, // To make sure the panel corners blend nicely with the panel,
@@ -75,81 +75,6 @@ function _unpremultiply(color) {
blue: blue, alpha: color.alpha }); blue: blue, alpha: color.alpha });
}; };
const Animation = new Lang.Class({
Name: 'Animation',
_init: function(filename, width, height, speed) {
this.actor = new St.Bin();
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._speed = speed;
this._isLoaded = false;
this._isPlaying = false;
this._timeoutId = 0;
this._frame = 0;
this._animations = St.TextureCache.get_default().load_sliced_image (filename, width, height,
Lang.bind(this, this._animationsLoaded));
this.actor.set_child(this._animations);
},
play: function() {
if (this._isLoaded && this._timeoutId == 0) {
if (this._frame == 0)
this._showFrame(0);
this._timeoutId = Mainloop.timeout_add(this._speed, Lang.bind(this, this._update));
}
this._isPlaying = true;
},
stop: function() {
if (this._timeoutId > 0) {
Mainloop.source_remove(this._timeoutId);
this._timeoutId = 0;
}
this._isPlaying = false;
},
_showFrame: function(frame) {
let oldFrameActor = this._animations.get_child_at_index(this._frame);
if (oldFrameActor)
oldFrameActor.hide();
this._frame = (frame % this._animations.get_n_children());
let newFrameActor = this._animations.get_child_at_index(this._frame);
if (newFrameActor)
newFrameActor.show();
},
_update: function() {
this._showFrame(this._frame + 1);
return true;
},
_animationsLoaded: function() {
this._isLoaded = true;
if (this._isPlaying)
this.play();
},
_onDestroy: function() {
this.stop();
}
});
const AnimatedIcon = new Lang.Class({
Name: 'AnimatedIcon',
Extends: Animation,
_init: function(filename, size) {
this.parent(filename, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
}
});
const TextShadower = new Lang.Class({ const TextShadower = new Lang.Class({
Name: 'TextShadower', Name: 'TextShadower',
@@ -360,7 +285,7 @@ const AppMenuButton = new Lang.Class({
if (!success || this._spinnerIcon == icon) if (!success || this._spinnerIcon == icon)
return; return;
this._spinnerIcon = icon; this._spinnerIcon = icon;
this._spinner = new AnimatedIcon(this._spinnerIcon, PANEL_ICON_SIZE); this._spinner = new Animation.AnimatedIcon(this._spinnerIcon, PANEL_ICON_SIZE);
this._container.add_actor(this._spinner.actor); this._container.add_actor(this._spinner.actor);
this._spinner.actor.hide(); this._spinner.actor.hide();
this._spinner.actor.lower_bottom(); this._spinner.actor.lower_bottom();
@@ -931,7 +856,7 @@ const PANEL_ITEM_IMPLEMENTATIONS = {
'battery': imports.ui.status.power.Indicator, 'battery': imports.ui.status.power.Indicator,
'lockScreen': imports.ui.status.lockScreenMenu.Indicator, 'lockScreen': imports.ui.status.lockScreenMenu.Indicator,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator, 'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
'powerMenu': imports.gdm.powerMenu.PowerMenuButton, 'powerMenu': imports.ui.auth.powerMenu.PowerMenuButton,
'userMenu': imports.ui.userMenu.UserMenuButton 'userMenu': imports.ui.userMenu.UserMenuButton
}; };

View File

@@ -205,7 +205,7 @@ const RemoteSearchProvider = new Lang.Class({
_getResultsFinished: function(results, error) { _getResultsFinished: function(results, error) {
if (error) if (error)
return; return;
this.searchSystem.pushResults(this, results[0]); this.searchSystem.setResults(this, results[0]);
}, },
getInitialResultSet: function(terms) { getInitialResultSet: function(terms) {
@@ -217,7 +217,7 @@ const RemoteSearchProvider = new Lang.Class({
this._cancellable); this._cancellable);
} catch(e) { } catch(e) {
log('Error calling GetInitialResultSet for provider %s: %s'.format(this.id, e.toString())); log('Error calling GetInitialResultSet for provider %s: %s'.format(this.id, e.toString()));
this.searchSystem.pushResults(this, []); this.searchSystem.setResults(this, []);
} }
}, },
@@ -230,7 +230,7 @@ const RemoteSearchProvider = new Lang.Class({
this._cancellable); this._cancellable);
} catch(e) { } catch(e) {
log('Error calling GetSubsearchResultSet for provider %s: %s'.format(this.id, e.toString())); log('Error calling GetSubsearchResultSet for provider %s: %s'.format(this.id, e.toString()));
this.searchSystem.pushResults(this, []); this.searchSystem.setResults(this, []);
} }
}, },

View File

@@ -51,7 +51,7 @@ const SearchSystem = new Lang.Class({
this._previousResults = []; this._previousResults = [];
}, },
pushResults: function(provider, results) { setResults: function(provider, results) {
let i = this._providers.indexOf(provider); let i = this._providers.indexOf(provider);
if (i == -1) if (i == -1)
return; return;

View File

@@ -180,13 +180,82 @@ const GridSearchResult = new Lang.Class({
} }
}); });
const ListSearchResults = new Lang.Class({ const SearchResultsBase = new Lang.Class({
Name: 'ListSearchResults', Name: 'SearchResultsBase',
_init: function(provider) { _init: function(provider) {
this.provider = provider; this.provider = provider;
this.actor = new St.BoxLayout({ style_class: 'search-section-content' }); this._terms = [];
this.actor = new St.BoxLayout({ style_class: 'search-section',
vertical: true });
this._resultDisplayBin = new St.Bin({ x_fill: true,
y_fill: true });
this.actor.add(this._resultDisplayBin, { expand: true });
let separator = new Separator.HorizontalSeparator({ style_class: 'search-section-separator' });
this.actor.add(separator.actor);
},
destroy: function() {
this.actor.destroy();
this._terms = [];
},
_clearResultDisplay: function() {
},
clear: function() {
this._clearResultDisplay();
this.actor.hide();
},
_keyFocusIn: function(icon) {
this.emit('key-focus-in', icon);
},
_setMoreIconVisible: function(visible) {
},
updateSearch: function(providerResults, terms, callback) {
this._terms = terms;
if (providerResults.length == 0) {
this._clearResultDisplay();
this.actor.hide();
callback();
} else {
let maxResults = this._getMaxDisplayedResults();
let results = providerResults.slice(0, maxResults);
let hasMoreResults = results.length < providerResults.length;
this.provider.getResultMetas(results, Lang.bind(this, function(metas) {
this.clear();
// To avoid CSS transitions causing flickering when
// the first search result stays the same, we hide the
// content while filling in the results.
this.actor.hide();
this._clearResultDisplay();
this._renderResults(metas);
this._setMoreIconVisible(hasMoreResults && this.provider.canLaunchSearch);
this.actor.show();
callback();
}));
}
}
});
const ListSearchResults = new Lang.Class({
Name: 'ListSearchResults',
Extends: SearchResultsBase,
_init: function(provider) {
this.parent(provider);
this._container = new St.BoxLayout({ style_class: 'search-section-content' });
this.providerIcon = new ProviderIcon(provider); this.providerIcon = new ProviderIcon(provider);
this.providerIcon.connect('clicked', Lang.bind(this, this.providerIcon.connect('clicked', Lang.bind(this,
function() { function() {
@@ -194,48 +263,27 @@ const ListSearchResults = new Lang.Class({
Main.overview.toggle(); Main.overview.toggle();
})); }));
this.actor.add(this.providerIcon, { x_fill: false, this._container.add(this.providerIcon, { x_fill: false,
y_fill: false, y_fill: false,
x_align: St.Align.START, x_align: St.Align.START,
y_align: St.Align.START }); y_align: St.Align.START });
this._content = new St.BoxLayout({ style_class: 'list-search-results', this._content = new St.BoxLayout({ style_class: 'list-search-results',
vertical: true }); vertical: true });
this.actor.add(this._content, { expand: true }); this._container.add(this._content, { expand: true });
this._notDisplayedResult = []; this._resultDisplayBin.set_child(this._container);
this._terms = [];
this._pendingClear = false;
}, },
getResultsForDisplay: function() { _setMoreIconVisible: function(visible) {
let alreadyVisible = this._pendingClear ? 0 : this.getVisibleResultCount(); this.providerIcon.moreIcon.visible = true;
let canDisplay = MAX_LIST_SEARCH_RESULTS_ROWS - alreadyVisible;
let newResults = this._notDisplayedResult.splice(0, canDisplay);
return newResults;
}, },
getVisibleResultCount: function() { _getMaxDisplayedResults: function() {
return this._content.get_n_children(); return MAX_LIST_SEARCH_RESULTS_ROWS;
}, },
hasMoreResults: function() { _renderResults: function(metas) {
return this._notDisplayedResult.length > 0;
},
setResults: function(results, terms) {
// copy the lists
this._notDisplayedResult = results.slice(0);
this._terms = terms.slice(0);
this._pendingClear = true;
},
_keyFocusIn: function(icon) {
this.emit('key-focus-in', icon);
},
renderResults: function(metas) {
for (let i = 0; i < metas.length; i++) { for (let i = 0; i < metas.length; i++) {
let display = new ListSearchResult(this.provider, metas[i], this._terms); let display = new ListSearchResult(this.provider, metas[i], this._terms);
display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn)); display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
@@ -243,13 +291,12 @@ const ListSearchResults = new Lang.Class({
} }
}, },
clear: function () { _clearResultDisplay: function () {
this._content.destroy_all_children(); this._content.destroy_all_children();
this._pendingClear = false;
}, },
getFirstResult: function() { getFirstResult: function() {
if (this.getVisibleResultCount() > 0) if (this._content.get_n_children() > 0)
return this._content.get_child_at_index(0)._delegate; return this._content.get_child_at_index(0)._delegate;
else else
return null; return null;
@@ -259,50 +306,24 @@ Signals.addSignalMethods(ListSearchResults.prototype);
const GridSearchResults = new Lang.Class({ const GridSearchResults = new Lang.Class({
Name: 'GridSearchResults', Name: 'GridSearchResults',
Extends: SearchResultsBase,
_init: function(provider) { _init: function(provider) {
this.provider = provider; this.parent(provider);
this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS, this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS,
xAlign: St.Align.START }); xAlign: St.Align.START });
this.actor = new St.Bin({ x_align: St.Align.MIDDLE }); this._bin = new St.Bin({ x_align: St.Align.MIDDLE });
this._bin.set_child(this._grid.actor);
this.actor.set_child(this._grid.actor); this._resultDisplayBin.set_child(this._bin);
this._notDisplayedResult = [];
this._terms = [];
this._pendingClear = false;
}, },
getResultsForDisplay: function() { _getMaxDisplayedResults: function() {
let alreadyVisible = this._pendingClear ? 0 : this._grid.visibleItemsCount(); return this._grid.childrenInRow(this._bin.width) * this._grid.getRowLimit();
let canDisplay = this._grid.childrenInRow(this.actor.width) * this._grid.getRowLimit()
- alreadyVisible;
let newResults = this._notDisplayedResult.splice(0, canDisplay);
return newResults;
}, },
getVisibleResultCount: function() { _renderResults: function(metas) {
return this._grid.visibleItemsCount();
},
hasMoreResults: function() {
return this._notDisplayedResult.length > 0;
},
setResults: function(results, terms) {
// copy the lists
this._notDisplayedResult = results.slice(0);
this._terms = terms.slice(0);
this._pendingClear = true;
},
_keyFocusIn: function(icon) {
this.emit('key-focus-in', icon);
},
renderResults: function(metas) {
for (let i = 0; i < metas.length; i++) { for (let i = 0; i < metas.length; i++) {
let display = new GridSearchResult(this.provider, metas[i], this._terms); let display = new GridSearchResult(this.provider, metas[i], this._terms);
display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn)); display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
@@ -310,13 +331,12 @@ const GridSearchResults = new Lang.Class({
} }
}, },
clear: function () { _clearResultDisplay: function () {
this._grid.removeAll(); this._grid.removeAll();
this._pendingClear = false;
}, },
getFirstResult: function() { getFirstResult: function() {
if (this.getVisibleResultCount() > 0) if (this._grid.visibleItemsCount() > 0)
return this._grid.getItemAtIndex(0)._delegate; return this._grid.getItemAtIndex(0)._delegate;
else else
return null; return null;
@@ -366,9 +386,9 @@ const SearchResults = new Lang.Class({
this._content.add(this._statusBin, { expand: true }); this._content.add(this._statusBin, { expand: true });
this._statusBin.add_actor(this._statusText); this._statusBin.add_actor(this._statusText);
this._providers = this._searchSystem.getProviders(); this._providers = this._searchSystem.getProviders();
this._providerMeta = []; this._providerDisplays = {};
for (let i = 0; i < this._providers.length; i++) { for (let i = 0; i < this._providers.length; i++) {
this.createProviderMeta(this._providers[i]); this.createProviderDisplay(this._providers[i]);
} }
this._highlightDefault = false; this._highlightDefault = false;
@@ -386,61 +406,33 @@ const SearchResults = new Lang.Class({
Util.ensureActorVisibleInScrollView(this._scrollView, icon); Util.ensureActorVisibleInScrollView(this._scrollView, icon);
}, },
createProviderMeta: function(provider) { createProviderDisplay: function(provider) {
let providerBox = new St.BoxLayout({ style_class: 'search-section', let providerDisplay = null;
vertical: true });
let providerIcon = null;
let resultDisplay = null;
if (provider.appInfo) { if (provider.appInfo) {
resultDisplay = new ListSearchResults(provider); providerDisplay = new ListSearchResults(provider);
providerIcon = resultDisplay.providerIcon;
} else { } else {
resultDisplay = new GridSearchResults(provider); providerDisplay = new GridSearchResults(provider);
} }
resultDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn)); providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this._providerDisplays[provider.id] = providerDisplay;
let resultDisplayBin = new St.Bin({ child: resultDisplay.actor, this._content.add(providerDisplay.actor);
x_fill: true,
y_fill: true });
providerBox.add(resultDisplayBin, { expand: true });
let separator = new Separator.HorizontalSeparator({ style_class: 'search-section-separator' });
providerBox.add(separator.actor);
this._providerMeta.push({ provider: provider,
actor: providerBox,
icon: providerIcon,
resultDisplay: resultDisplay });
this._content.add(providerBox);
}, },
destroyProviderMeta: function(provider) { destroyProviderDisplay: function(provider) {
for (let i=0; i < this._providerMeta.length; i++) { this._providerDisplays[provider.id].destroy();
let meta = this._providerMeta[i]; delete this._providerDisplays[provider.id];
if (meta.provider == provider) {
meta.actor.destroy();
this._providerMeta.splice(i, 1);
break;
}
}
}, },
_clearDisplay: function() { _clearDisplay: function() {
for (let i = 0; i < this._providerMeta.length; i++) { for (let i = 0; i < this._providers.length; i++) {
let meta = this._providerMeta[i]; let provider = this._providers[i];
meta.resultDisplay.clear(); let providerDisplay = this._providerDisplays[provider.id];
meta.actor.hide(); providerDisplay.clear();
} }
}, },
_clearDisplayForProvider: function(provider) {
let meta = this._metaForProvider(provider);
meta.resultDisplay.clear();
meta.actor.hide();
},
reset: function() { reset: function() {
this._searchSystem.reset(); this._searchSystem.reset();
this._statusBin.hide(); this._statusBin.hide();
@@ -454,20 +446,17 @@ const SearchResults = new Lang.Class({
this._statusBin.show(); this._statusBin.show();
}, },
_metaForProvider: function(provider) {
return this._providerMeta[this._providers.indexOf(provider)];
},
_maybeSetInitialSelection: function() { _maybeSetInitialSelection: function() {
let newDefaultResult = null; let newDefaultResult = null;
for (let i = 0; i < this._providerMeta.length; i++) { for (let i = 0; i < this._providers.length; i++) {
let meta = this._providerMeta[i]; let provider = this._providers[i];
let display = this._providerDisplays[provider.id];
if (!meta.actor.visible) if (!display.actor.visible)
continue; continue;
let firstResult = meta.resultDisplay.getFirstResult(); let firstResult = display.getFirstResult();
if (firstResult) { if (firstResult) {
newDefaultResult = firstResult; newDefaultResult = firstResult;
break; // select this one! break; // select this one!
@@ -487,11 +476,14 @@ const SearchResults = new Lang.Class({
_updateStatusText: function () { _updateStatusText: function () {
let haveResults = false; let haveResults = false;
for (let i = 0; i < this._providerMeta.length; ++i) for (let i = 0; i < this._providers.length; i++) {
if (this._providerMeta[i].resultDisplay.getFirstResult()) { let provider = this._providers[i];
let display = this._providerDisplays[provider.id];
if (display.getFirstResult()) {
haveResults = true; haveResults = true;
break; break;
} }
}
if (!haveResults) { if (!haveResults) {
this._statusText.set_text(_("No results.")); this._statusText.set_text(_("No results."));
@@ -504,42 +496,12 @@ const SearchResults = new Lang.Class({
_updateResults: function(searchSystem, results) { _updateResults: function(searchSystem, results) {
let terms = searchSystem.getTerms(); let terms = searchSystem.getTerms();
let [provider, providerResults] = results; let [provider, providerResults] = results;
let meta = this._metaForProvider(provider); let display = this._providerDisplays[provider.id];
if (providerResults.length == 0) { display.updateSearch(providerResults, terms, Lang.bind(this, function() {
this._clearDisplayForProvider(provider);
meta.resultDisplay.setResults([], []);
this._maybeSetInitialSelection(); this._maybeSetInitialSelection();
this._updateStatusText(); this._updateStatusText();
} else { }));
meta.resultDisplay.setResults(providerResults, terms);
let results = meta.resultDisplay.getResultsForDisplay();
if (meta.icon)
meta.icon.moreIcon.visible =
meta.resultDisplay.hasMoreResults() &&
provider.canLaunchSearch;
provider.getResultMetas(results, Lang.bind(this, function(metas) {
this._clearDisplayForProvider(provider);
meta.actor.show();
// Hiding drops the key focus if we have it
let focus = global.stage.get_key_focus();
// To avoid CSS transitions causing flickering when
// the first search result stays the same, we hide the
// content while filling in the results.
this._content.hide();
meta.resultDisplay.renderResults(metas);
this._maybeSetInitialSelection();
this._updateStatusText();
this._content.show();
if (this._content.contains(focus))
global.stage.set_key_focus(focus);
}));
}
}, },
activateDefault: function() { activateDefault: function() {

View File

@@ -42,7 +42,7 @@ const _modes = {
hasNotifications: true, hasNotifications: true,
isGreeter: true, isGreeter: true,
isPrimary: true, isPrimary: true,
unlockDialog: imports.gdm.loginDialog.LoginDialog, unlockDialog: imports.ui.auth.loginDialog.LoginDialog,
components: ['polkitAgent'], components: ['polkitAgent'],
panel: { panel: {
left: [], left: [],
@@ -89,7 +89,7 @@ const _modes = {
hasNotifications: true, hasNotifications: true,
isLocked: false, isLocked: false,
isPrimary: true, isPrimary: true,
unlockDialog: imports.ui.unlockDialog.UnlockDialog, unlockDialog: imports.ui.auth.unlockDialog.UnlockDialog,
components: ['networkAgent', 'polkitAgent', 'telepathyClient', components: ['networkAgent', 'polkitAgent', 'telepathyClient',
'keyring', 'recorder', 'autorunManager', 'automountManager'], 'keyring', 'recorder', 'autorunManager', 'automountManager'],
panel: { panel: {

52
js/ui/userAvatar.js Normal file
View File

@@ -0,0 +1,52 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const St = imports.gi.St;
const Params = imports.misc.params;
const DIALOG_ICON_SIZE = 64;
// Adapted from gdm/gui/user-switch-applet/applet.c
//
// Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>.
// Copyright (C) 2008,2009 Red Hat, Inc.
const UserAvatar = new Lang.Class({
Name: 'UserAvatar',
_init: function(user, params) {
this._user = user;
params = Params.parse(params, { reactive: false,
iconSize: DIALOG_ICON_SIZE,
styleClass: 'status-chooser-user-icon' });
this._iconSize = params.iconSize;
this.actor = new St.Bin({ style_class: params.styleClass,
track_hover: params.reactive,
reactive: params.reactive });
},
setSensitive: function(sensitive) {
this.actor.can_focus = sensitive;
this.actor.reactive = sensitive;
},
update: function() {
let iconFile = this._user.get_icon_file();
if (iconFile && !GLib.file_test(iconFile, GLib.FileTest.EXISTS))
iconFile = null;
if (iconFile) {
let file = Gio.File.new_for_path(iconFile);
this.actor.child = null;
this.actor.style = 'background-image: url("%s");'.format(iconFile);
} else {
this.actor.style = null;
this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic',
icon_size: this._iconSize });
}
}
});

View File

@@ -21,6 +21,7 @@ const ModalDialog = imports.ui.modalDialog;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Params = imports.misc.params; const Params = imports.misc.params;
const UserAvatar = imports.ui.userAvatar;
const Util = imports.misc.util; const Util = imports.misc.util;
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown'; const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
@@ -57,48 +58,6 @@ const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session
const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface); const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface);
// Adapted from gdm/gui/user-switch-applet/applet.c
//
// Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>.
// Copyright (C) 2008,2009 Red Hat, Inc.
const UserAvatarWidget = new Lang.Class({
Name: 'UserAvatarWidget',
_init: function(user, params) {
this._user = user;
params = Params.parse(params, { reactive: false,
iconSize: DIALOG_ICON_SIZE,
styleClass: 'status-chooser-user-icon' });
this._iconSize = params.iconSize;
this.actor = new St.Bin({ style_class: params.styleClass,
track_hover: params.reactive,
reactive: params.reactive });
},
setSensitive: function(sensitive) {
this.actor.can_focus = sensitive;
this.actor.reactive = sensitive;
},
update: function() {
let iconFile = this._user.get_icon_file();
if (iconFile && !GLib.file_test(iconFile, GLib.FileTest.EXISTS))
iconFile = null;
if (iconFile) {
let file = Gio.File.new_for_path(iconFile);
this.actor.child = null;
this.actor.style = 'background-image: url("%s");'.format(iconFile);
} else {
this.actor.style = null;
this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic',
icon_size: this._iconSize });
}
}
});
const IMStatusItem = new Lang.Class({ const IMStatusItem = new Lang.Class({
Name: 'IMStatusItem', Name: 'IMStatusItem',
Extends: PopupMenu.PopupBaseMenuItem, Extends: PopupMenu.PopupBaseMenuItem,
@@ -170,7 +129,7 @@ const IMStatusChooserItem = new Lang.Class({
this._userManager = AccountsService.UserManager.get_default(); this._userManager = AccountsService.UserManager.get_default();
this._user = this._userManager.get_user(GLib.get_user_name()); this._user = this._userManager.get_user(GLib.get_user_name());
this._avatar = new UserAvatarWidget(this._user, { reactive: true }); this._avatar = new UserAvatar.UserAvatar(this._user, { reactive: true });
this._iconBin = new St.Button({ child: this._avatar.actor }); this._iconBin = new St.Button({ child: this._avatar.actor });
this.addActor(this._iconBin); this.addActor(this._iconBin);
@@ -908,7 +867,7 @@ const UserMenuButton = new Lang.Class({
let session = sessions[i]; let session = sessions[i];
let userEntry = new St.BoxLayout({ style_class: 'login-dialog-user-list-item', let userEntry = new St.BoxLayout({ style_class: 'login-dialog-user-list-item',
vertical: false }); vertical: false });
let avatar = new UserAvatarWidget(session.user); let avatar = new UserAvatar.UserAvatar(session.user);
avatar.update(); avatar.update();
userEntry.add(avatar.actor); userEntry.add(avatar.actor);

View File

@@ -6,7 +6,7 @@ const AccountsService = imports.gi.AccountsService;
const Lang = imports.lang; const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
const UserMenu = imports.ui.userMenu; const UserAvatar = imports.ui.userAvatar;
const UserWidget = new Lang.Class({ const UserWidget = new Lang.Class({
Name: 'UserWidget', Name: 'UserWidget',
@@ -18,7 +18,7 @@ const UserWidget = new Lang.Class({
vertical: false }); vertical: false });
this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._avatar = new UserMenu.UserAvatarWidget(user); this._avatar = new UserAvatar.UserAvatar(user);
this.actor.add(this._avatar.actor, this.actor.add(this._avatar.actor,
{ x_fill: true, y_fill: true }); { x_fill: true, y_fill: true });

View File

@@ -508,12 +508,12 @@ const ViewSelector = new Lang.Class({
return; return;
this._searchSystem.registerProvider(provider); this._searchSystem.registerProvider(provider);
this._searchResults.createProviderMeta(provider); this._searchResults.createProviderDisplay(provider);
}, },
removeSearchProvider: function(provider) { removeSearchProvider: function(provider) {
this._searchSystem.unregisterProvider(provider); this._searchSystem.unregisterProvider(provider);
this._searchResults.destroyProviderMeta(provider); this._searchResults.destroyProviderDisplay(provider);
}, },
getActivePage: function() { getActivePage: function() {

View File

@@ -134,9 +134,9 @@ const WandaSearchProvider = new Lang.Class({
getInitialResultSet: function(terms) { getInitialResultSet: function(terms) {
if (terms.join(' ') == MAGIC_FISH_KEY) { if (terms.join(' ') == MAGIC_FISH_KEY) {
this.searchSystem.pushResults(this, [ FISH_NAME ]); this.searchSystem.setResults(this, [ FISH_NAME ]);
} else { } else {
this.searchSystem.pushResults(this, []); this.searchSystem.setResults(this, []);
} }
}, },

321
po/cs.po
View File

@@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-04-26 16:24+0000\n" "POT-Creation-Date: 2013-05-28 07:17+0000\n"
"PO-Revision-Date: 2013-04-26 19:18+0200\n" "PO-Revision-Date: 2013-05-29 12:26+0200\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n" "Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: Czech <gnome-cs-list@gnome.org>\n" "Language-Team: Czech <gnome-cs-list@gnome.org>\n"
"Language: cs\n" "Language: cs\n"
@@ -102,26 +102,10 @@ msgstr ""
"EnableExtension a DisableExtension sběrnice DBus na org.gnome.Shell." "EnableExtension a DisableExtension sběrnice DBus na org.gnome.Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 #: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Whether to collect stats about applications usage"
msgstr "Zda sbírat statistická data o používání aplikací"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"Program GNOME Shell obvykle sleduje aktivní aplikace, aby mohl nabídnout ty "
"nejpoužívanější (např. ve spouštěčích). Data budou uchovávána v soukromí, "
"přesto ale můžete z důvodu ochrany soukromí tuto funkci zakázat. Vezměte "
"prosím v potaz skutečnost, že zakázaní funkce neodstraní již uložená data."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of desktop file IDs for favorite applications" msgid "List of desktop file IDs for favorite applications"
msgstr "Seznam ID souborů desktop oblíbených aplikací" msgstr "Seznam ID souborů desktop oblíbených aplikací"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 #: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid "" msgid ""
"The applications corresponding to these identifiers will be displayed in the " "The applications corresponding to these identifiers will be displayed in the "
"favorites area." "favorites area."
@@ -129,11 +113,11 @@ msgstr ""
"Aplikace odpovídající těmto identifikátorům budou zobrazeny oblasti " "Aplikace odpovídající těmto identifikátorům budou zobrazeny oblasti "
"oblíbených." "oblíbených."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 #: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of categories that should be displayed as folders" msgid "List of categories that should be displayed as folders"
msgstr "Seznam kategorií k zobrazení v podobě složek" msgstr "Seznam kategorií k zobrazení v podobě složek"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 #: ../data/org.gnome.shell.gschema.xml.in.in.h:8
msgid "" msgid ""
"Each category name in this list will be represented as folder in the " "Each category name in this list will be represented as folder in the "
"application view, rather than being displayed inline in the main view." "application view, rather than being displayed inline in the main view."
@@ -141,15 +125,15 @@ msgstr ""
"Každá kategorie v tomto seznamu bude zobrazena jako složka, místo toho aby " "Každá kategorie v tomto seznamu bude zobrazena jako složka, místo toho aby "
"byla zobrazena v hlavním pohledu." "byla zobrazena v hlavním pohledu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 #: ../data/org.gnome.shell.gschema.xml.in.in.h:9
msgid "History for command (Alt-F2) dialog" msgid "History for command (Alt-F2) dialog"
msgstr "Historie příkazového dialogového okna (Alt-F2)" msgstr "Historie příkazového dialogového okna (Alt-F2)"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 #: ../data/org.gnome.shell.gschema.xml.in.in.h:10
msgid "History for the looking glass dialog" msgid "History for the looking glass dialog"
msgstr "Historie dialogového okna „looking glass“ (Alt-F2)" msgstr "Historie dialogového okna „looking glass“ (Alt-F2)"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.in.h:11
msgid "" msgid ""
"Internally used to store the last IM presence explicitly set by the user. " "Internally used to store the last IM presence explicitly set by the user. "
"The value here is from the TpConnectionPresenceType enumeration." "The value here is from the TpConnectionPresenceType enumeration."
@@ -158,7 +142,7 @@ msgstr ""
"byl ručně nastaven v rychlé komunikaci. Tato hodnota pochází z výčtu " "byl ručně nastaven v rychlé komunikaci. Tato hodnota pochází z výčtu "
"TpConnectionPresenceType." "TpConnectionPresenceType."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.in.h:12
msgid "" msgid ""
"Internally used to store the last session presence status for the user. The " "Internally used to store the last session presence status for the user. The "
"value here is from the GsmPresenceStatus enumeration." "value here is from the GsmPresenceStatus enumeration."
@@ -166,11 +150,11 @@ msgstr ""
"Interně používáno k uchování posledního stavu přítomnosti uživatele v " "Interně používáno k uchování posledního stavu přítomnosti uživatele v "
"sezení. Tato hodnota pochází z výčtu GsmPresenceStatus." "sezení. Tato hodnota pochází z výčtu GsmPresenceStatus."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "Always show the 'Log out' menuitem in the user menu." msgid "Always show the 'Log out' menuitem in the user menu."
msgstr "V nabídce uživatele vždy zobrazovat položku „Odhlásit“." msgstr "V nabídce uživatele vždy zobrazovat položku „Odhlásit“."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid "" msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-" "This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations." "user, single-session situations."
@@ -178,14 +162,14 @@ msgstr ""
"Tento klíč ruší automatické skrývání položky nabídky „Odhlásit“ v situacích " "Tento klíč ruší automatické skrývání položky nabídky „Odhlásit“ v situacích "
"s jedním uživatelem a jedním sezením." "s jedním uživatelem a jedním sezením."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "" msgid ""
"Whether to remember password for mounting encrypted or remote filesystems" "Whether to remember password for mounting encrypted or remote filesystems"
msgstr "" msgstr ""
"Zdali si pamatovat heslo k připojování šifrovaných či vzdálených souborových " "Zdali si pamatovat heslo k připojování šifrovaných či vzdálených souborových "
"systémů" "systémů"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "" msgid ""
"The shell will request a password when an encrypted device or a remote " "The shell will request a password when an encrypted device or a remote "
"filesystem is mounted. If the password can be saved for future use a " "filesystem is mounted. If the password can be saved for future use a "
@@ -197,76 +181,76 @@ msgstr ""
"zaškrtávací pole „Pamatovat si heslo“. Tento klíč určuje výchozí stav této " "zaškrtávací pole „Pamatovat si heslo“. Tento klíč určuje výchozí stav této "
"volby." "volby."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Zobrazovat v kalendáři čísla týdnů" msgstr "Zobrazovat v kalendáři čísla týdnů"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "Je-li zapnuto, zobrazovat v kalendáři čísla týdnů dle ISO." msgstr "Je-li zapnuto, zobrazovat v kalendáři čísla týdnů dle ISO."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Klávesová zkratka na otevření nabídky aplikace" msgstr "Klávesová zkratka na otevření nabídky aplikace"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Klávesová zkratka na otevření nabídky aplikace." msgstr "Klávesová zkratka na otevření nabídky aplikace."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to open the \"Show Applications\" view" msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Klávesová zkratka k otevření nabídky aplikací" msgstr "Klávesová zkratka k otevření nabídky aplikací"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "" msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview." "Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "Klávesová zkratka k otevření nabídky aplikací v Přehledu aktivit" msgstr "Klávesová zkratka k otevření nabídky aplikací v Přehledu aktivit"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Keybinding to open the overview" msgid "Keybinding to open the overview"
msgstr "Klávesová zkratka k otevření přehledu" msgstr "Klávesová zkratka k otevření přehledu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "Keybinding to open the Activities Overview." msgid "Keybinding to open the Activities Overview."
msgstr "Klávesová zkratka k otevření přehledu činností" msgstr "Klávesová zkratka k otevření přehledu činností"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Klávesová zkratka k přepnutí viditelnosti lišty zpráv" msgstr "Klávesová zkratka k přepnutí viditelnosti lišty zpráv"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Klávesová zkratka k přepnutí viditelnosti lišty zpráv." msgstr "Klávesová zkratka k přepnutí viditelnosti lišty zpráv."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to focus the active notification" msgid "Keybinding to focus the active notification"
msgstr "Klávesová zkratka k zaměření aktivního upozornění" msgstr "Klávesová zkratka k zaměření aktivního upozornění"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 #: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "Keybinding to focus the active notification." msgid "Keybinding to focus the active notification."
msgstr "Klávesová zkratka k zaměření aktivního upozornění." msgstr "Klávesová zkratka k zaměření aktivního upozornění."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Klávesová zkratka k záznamu obrazovky" msgstr "Klávesová zkratka k záznamu obrazovky"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Klávesová zkratka k započnutí nebo ukončení záznamu dění na obrazovce." msgstr "Klávesová zkratka k započnutí nebo ukončení záznamu dění na obrazovce."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Která klávesnice se má používat" msgstr "Která klávesnice se má používat"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 #: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Typ klávesnice, který se má používat." msgstr "Typ klávesnice, který se má používat."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 #: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Frekvence snímků při nahrávání dění na obrazovce." msgstr "Frekvence snímků při nahrávání dění na obrazovce."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36 #: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@@ -274,11 +258,11 @@ msgstr ""
"Frekvence snímků za sekundu výsledné nahrávky dění na obrazovce, která byla " "Frekvence snímků za sekundu výsledné nahrávky dění na obrazovce, která byla "
"nahrána záznamovým programem GNOME Shell." "nahrána záznamovým programem GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 #: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Roura systému gstreamer určená ke kódování nahrávky dění na obrazovce" msgstr "Roura systému gstreamer určená ke kódování nahrávky dění na obrazovce"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 #: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@@ -303,11 +287,11 @@ msgstr ""
"nahráváním do WEBM s kodekem VP8. %T je použito jako zástupný symbol odhadu " "nahráváním do WEBM s kodekem VP8. %T je použito jako zástupný symbol odhadu "
"nejvhodnějšího počtu vláken na systému." "nejvhodnějšího počtu vláken na systému."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 #: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Přípona souboru s nahrávkou dění na obrazovce" msgstr "Přípona souboru s nahrávkou dění na obrazovce"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 #: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@@ -317,11 +301,11 @@ msgstr ""
"názvu vycházejícího z aktuálního data a bude používat tuto příponu. Při " "názvu vycházejícího z aktuálního data a bude používat tuto příponu. Při "
"nahrávání do jiného formátu kontejneru by měla být provedena úprava pravidel." "nahrávání do jiného formátu kontejneru by měla být provedena úprava pravidel."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 #: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "The application icon mode." msgid "The application icon mode."
msgstr "Režim ikon aplikací" msgstr "Režim ikon aplikací"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43 #: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid "" msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities " "Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
@@ -331,20 +315,20 @@ msgstr ""
"only“ (zobrazí náhled okna), „app-icon-only“ (zobrazí pouze ikonu aplikace) " "only“ (zobrazí náhled okna), „app-icon-only“ (zobrazí pouze ikonu aplikace) "
"a „both“ (zobrazí náhled i ikonu)." "a „both“ (zobrazí náhled i ikonu)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44 #: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
msgstr "Připojovat modální dialogová okna k rodičovským oknům" msgstr "Připojovat modální dialogová okna k rodičovským oknům"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45 #: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid "" msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell." "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "Tento kíč přepisuje klíč v org.gnome.mutter, když běží GNOME Shell." msgstr "Tento kíč přepisuje klíč v org.gnome.mutter, když běží GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46 #: ../data/org.gnome.shell.gschema.xml.in.in.h:44
msgid "Arrangement of buttons on the titlebar" msgid "Arrangement of buttons on the titlebar"
msgstr "Uspořádání tlačítek v záhlaví" msgstr "Uspořádání tlačítek v záhlaví"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47 #: ../data/org.gnome.shell.gschema.xml.in.in.h:45
msgid "" msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running " "This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell." "GNOME Shell."
@@ -352,15 +336,15 @@ msgstr ""
"Tento kíč přepisuje klíč v org.gnome.desktop.wm.preferences, když běží GNOME " "Tento kíč přepisuje klíč v org.gnome.desktop.wm.preferences, když běží GNOME "
"Shell." "Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48 #: ../data/org.gnome.shell.gschema.xml.in.in.h:46
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "Nechat okna upuštěná při okraji obrazovky vytvářet dlaždice" msgstr "Nechat okna upuštěná při okraji obrazovky vytvářet dlaždice"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:49 #: ../data/org.gnome.shell.gschema.xml.in.in.h:47
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "Pracovní plochy jsou spravovány dynamicky" msgstr "Pracovní plochy jsou spravovány dynamicky"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:50 #: ../data/org.gnome.shell.gschema.xml.in.in.h:48
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
msgstr "Pracovní plochy pouze na hlavním monitoru" msgstr "Pracovní plochy pouze na hlavním monitoru"
@@ -379,43 +363,50 @@ msgid "Select an extension to configure using the combobox above."
msgstr "" msgstr ""
"Pomocí rozbalovacího seznamu výše zvolte rozšíření, které chete nastavit." "Pomocí rozbalovacího seznamu výše zvolte rozšíření, které chete nastavit."
#: ../js/gdm/loginDialog.js:405 #: ../js/gdm/loginDialog.js:371
msgid "Session…" msgid "Session…"
msgstr "Sezení…" msgstr "Sezení…"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:630 #: ../js/gdm/loginDialog.js:601
msgid "Not listed?" msgid "Not listed?"
msgstr "Nejste na seznamu?" msgstr "Nejste na seznamu?"
#: ../js/gdm/loginDialog.js:787 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:376 #: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:100 #: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:96
#: ../js/ui/userMenu.js:938 #: ../js/ui/userMenu.js:938
msgid "Cancel" msgid "Cancel"
msgstr "Zrušit" msgstr "Zrušit"
#: ../js/gdm/loginDialog.js:803 #: ../js/gdm/loginDialog.js:791
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Přihlásit se" msgstr "Přihlásit se"
#: ../js/gdm/loginDialog.js:803 #: ../js/gdm/loginDialog.js:791
msgid "Next" msgid "Next"
msgstr "Následující" msgstr "Následující"
#. 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
#, c-format
msgid "(e.g., user or %s)"
msgstr "(např. uživatel nebo %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:918 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:892 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Uživatelské jméno: " msgstr "Uživatelské jméno: "
#: ../js/gdm/loginDialog.js:1174 #: ../js/gdm/loginDialog.js:1158
msgid "Login Window" msgid "Login Window"
msgstr "Přihlašovací okno" msgstr "Přihlašovací okno"
@@ -438,21 +429,16 @@ msgstr "Restartovat"
msgid "Power Off" msgid "Power Off"
msgstr "Vypnout" msgstr "Vypnout"
#: ../js/gdm/util.js:249 #: ../js/gdm/util.js:247
msgid "Authentication error" msgid "Authentication error"
msgstr "Chyba ověření" msgstr "Chyba ověření"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:366 #: ../js/gdm/util.js:364
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(nebo otiskněte prst)" msgstr "(nebo otiskněte prst)"
#: ../js/gdm/util.js:391
#, c-format
msgid "(e.g., user or %s)"
msgstr "(např. uživatel nebo %s)"
#: ../js/misc/util.js:97 #: ../js/misc/util.js:97
msgid "Command not found" msgid "Command not found"
msgstr "Příkaz nenalezen" msgstr "Příkaz nenalezen"
@@ -468,23 +454,23 @@ msgstr "Nelze analyzovat příkaz:"
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Vykonání „%s“ selhalo:" msgstr "Vykonání „%s“ selhalo:"
#: ../js/ui/appDisplay.js:351 #: ../js/ui/appDisplay.js:361
msgid "Frequent" msgid "Frequent"
msgstr "Časté" msgstr "Časté"
#: ../js/ui/appDisplay.js:358 #: ../js/ui/appDisplay.js:368
msgid "All" msgid "All"
msgstr "Všechny" msgstr "Všechny"
#: ../js/ui/appDisplay.js:916 #: ../js/ui/appDisplay.js:960
msgid "New Window" msgid "New Window"
msgstr "Nové okno" msgstr "Nové okno"
#: ../js/ui/appDisplay.js:919 ../js/ui/dash.js:284 #: ../js/ui/appDisplay.js:963 ../js/ui/dash.js:284
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Odstranit z oblíbených" msgstr "Odstranit z oblíbených"
#: ../js/ui/appDisplay.js:920 #: ../js/ui/appDisplay.js:964
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Přidat mezi oblíbené" msgstr "Přidat mezi oblíbené"
@@ -623,35 +609,35 @@ msgid "S"
msgstr "So" msgstr "So"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:720 #: ../js/ui/calendar.js:735
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Nic nenaplánováno" msgstr "Nic nenaplánováno"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:736 #: ../js/ui/calendar.js:751
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %e. %B" msgstr "%A, %e. %B"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:739 #: ../js/ui/calendar.js:754
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %e. %B %Y" msgstr "%A, %e. %B %Y"
#: ../js/ui/calendar.js:749 #: ../js/ui/calendar.js:764
msgid "Today" msgid "Today"
msgstr "Dnes" msgstr "Dnes"
#: ../js/ui/calendar.js:753 #: ../js/ui/calendar.js:768
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Zítra" msgstr "Zítra"
#: ../js/ui/calendar.js:764 #: ../js/ui/calendar.js:779
msgid "This week" msgid "This week"
msgstr "Tento týden" msgstr "Tento týden"
#: ../js/ui/calendar.js:772 #: ../js/ui/calendar.js:787
msgid "Next week" msgid "Next week"
msgstr "Následující týden" msgstr "Následující týden"
@@ -676,11 +662,11 @@ msgstr "Otevřít s %s"
msgid "Eject" msgid "Eject"
msgstr "Vysunout" msgstr "Vysunout"
#: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268 #: ../js/ui/components/keyring.js:88 ../js/ui/components/polkitAgent.js:280
msgid "Password:" msgid "Password:"
msgstr "Heslo:" msgstr "Heslo:"
#: ../js/ui/components/keyring.js:101 #: ../js/ui/components/keyring.js:107
msgid "Type again:" msgid "Type again:"
msgstr "Napište znovu:" msgstr "Napište znovu:"
@@ -760,15 +746,15 @@ msgstr "Heslo k mobilní širokopásmové síti"
msgid "A password is required to connect to '%s'." msgid "A password is required to connect to '%s'."
msgstr "Pro připojení k „%s“ je vyžadováno heslo." msgstr "Pro připojení k „%s“ je vyžadováno heslo."
#: ../js/ui/components/polkitAgent.js:55 #: ../js/ui/components/polkitAgent.js:54
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Je vyžadováno ověření" msgstr "Je vyžadováno ověření"
#: ../js/ui/components/polkitAgent.js:93 #: ../js/ui/components/polkitAgent.js:92
msgid "Administrator" msgid "Administrator"
msgstr "Správce" msgstr "Správce"
#: ../js/ui/components/polkitAgent.js:165 #: ../js/ui/components/polkitAgent.js:170
msgid "Authenticate" msgid "Authenticate"
msgstr "Ověřit" msgstr "Ověřit"
@@ -776,7 +762,7 @@ msgstr "Ověřit"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383 #: ../js/ui/components/polkitAgent.js:266 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again." msgid "Sorry, that didn't work. Please try again."
msgstr "Ověření bohužel nebylo úspěšné. Zkuste to prosím znovu." msgstr "Ověření bohužel nebylo úspěšné. Zkuste to prosím znovu."
@@ -1039,15 +1025,15 @@ msgstr "Zobrazit aplikace"
msgid "Dash" msgid "Dash"
msgstr "Oblíbené" msgstr "Oblíbené"
#: ../js/ui/dateMenu.js:91 #: ../js/ui/dateMenu.js:86
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Otevřít kalendář" msgstr "Otevřít kalendář"
#: ../js/ui/dateMenu.js:96 #: ../js/ui/dateMenu.js:90
msgid "Open Clocks" msgid "Open Clocks"
msgstr "Otevřít Hodiny" msgstr "Otevřít Hodiny"
#: ../js/ui/dateMenu.js:105 #: ../js/ui/dateMenu.js:97
msgid "Date & Time Settings" msgid "Date & Time Settings"
msgstr "Nastavení data a času" msgstr "Nastavení data a času"
@@ -1055,7 +1041,7 @@ msgstr "Nastavení data a času"
#. Translators: This is the date format to use when the calendar popup is #. 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"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:215 #: ../js/ui/dateMenu.js:208
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e. %B, %Y" msgstr "%A, %e. %B, %Y"
@@ -1161,56 +1147,56 @@ msgstr "Instalovat"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Stáhnout a nainstalovat „%s“ z extensions.gnome.org?" msgstr "Stáhnout a nainstalovat „%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 #: ../js/ui/status/power.js:211
msgid "Keyboard" msgid "Keyboard"
msgstr "Klávesnice" msgstr "Klávesnice"
#: ../js/ui/lookingGlass.js:693 #: ../js/ui/lookingGlass.js:689
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Nejsou nainstalována žádná rozšíření" msgstr "Nejsou nainstalována žádná rozšíření"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:747 #: ../js/ui/lookingGlass.js:743
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "Rozšíření %s nevyvolalo žádné chyby." msgstr "Rozšíření %s nevyvolalo žádné chyby."
#: ../js/ui/lookingGlass.js:753 #: ../js/ui/lookingGlass.js:749
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Skrývat chyby" msgstr "Skrývat chyby"
#: ../js/ui/lookingGlass.js:757 ../js/ui/lookingGlass.js:817 #: ../js/ui/lookingGlass.js:753 ../js/ui/lookingGlass.js:813
msgid "Show Errors" msgid "Show Errors"
msgstr "Zobrazovat chyby" msgstr "Zobrazovat chyby"
#: ../js/ui/lookingGlass.js:766 #: ../js/ui/lookingGlass.js:762
msgid "Enabled" msgid "Enabled"
msgstr "Povoleno" msgstr "Povoleno"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:769 ../src/gvc/gvc-mixer-control.c:1830 #: ../js/ui/lookingGlass.js:765 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Zakázáno" msgstr "Zakázáno"
#: ../js/ui/lookingGlass.js:771 #: ../js/ui/lookingGlass.js:767
msgid "Error" msgid "Error"
msgstr "Chyba" msgstr "Chyba"
#: ../js/ui/lookingGlass.js:773 #: ../js/ui/lookingGlass.js:769
msgid "Out of date" msgid "Out of date"
msgstr "Neaktuální" msgstr "Neaktuální"
#: ../js/ui/lookingGlass.js:775 #: ../js/ui/lookingGlass.js:771
msgid "Downloading" msgid "Downloading"
msgstr "Stahování" msgstr "Stahování"
#: ../js/ui/lookingGlass.js:799 #: ../js/ui/lookingGlass.js:795
msgid "View Source" msgid "View Source"
msgstr "Zobrazit zdroj" msgstr "Zobrazit zdroj"
#: ../js/ui/lookingGlass.js:808 #: ../js/ui/lookingGlass.js:804
msgid "Web Page" msgid "Web Page"
msgstr "Webová stránka" msgstr "Webová stránka"
@@ -1230,15 +1216,15 @@ msgstr "Vymazat zprávy"
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Nastavení upozornění" msgstr "Nastavení upozornění"
#: ../js/ui/messageTray.js:1710 #: ../js/ui/messageTray.js:1707
msgid "No Messages" msgid "No Messages"
msgstr "Žádné zprávy" msgstr "Žádné zprávy"
#: ../js/ui/messageTray.js:1783 #: ../js/ui/messageTray.js:1780
msgid "Message Tray" msgid "Message Tray"
msgstr "Lišta zpráv" msgstr "Lišta zpráv"
#: ../js/ui/messageTray.js:2801 #: ../js/ui/messageTray.js:2805
msgid "System Information" msgid "System Information"
msgstr "Informace o systému" msgstr "Informace o systému"
@@ -1247,7 +1233,7 @@ msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Neznámé" msgstr "Neznámé"
#: ../js/ui/overviewControls.js:472 ../js/ui/screenShield.js:149 #: ../js/ui/overviewControls.js:472 ../js/ui/screenShield.js:150
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
@@ -1267,17 +1253,17 @@ msgstr "Přehled"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: ../js/ui/overview.js:260 #: ../js/ui/overview.js:258
msgid "Type to search…" msgid "Type to search…"
msgstr "Vyhledávejte psaním…" msgstr "Vyhledávejte psaním…"
#: ../js/ui/panel.js:641 #: ../js/ui/panel.js:642
msgid "Quit" msgid "Quit"
msgstr "Ukončit" msgstr "Ukončit"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:692 #: ../js/ui/panel.js:693
msgid "Activities" msgid "Activities"
msgstr "Činnosti" msgstr "Činnosti"
@@ -1290,7 +1276,7 @@ msgstr "Horní lišta"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:718 #: ../js/ui/popupMenu.js:738
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@@ -1304,11 +1290,11 @@ msgstr "Zavřít"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:86 #: ../js/ui/screenShield.js:87
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %e. %B" msgstr "%A, %e. %B"
#: ../js/ui/screenShield.js:151 #: ../js/ui/screenShield.js:152
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@@ -1316,11 +1302,11 @@ msgstr[0] "%d nové upozornění"
msgstr[1] "%d nová upozornění" msgstr[1] "%d nová upozornění"
msgstr[2] "%d nových upozornění" msgstr[2] "%d nových upozornění"
#: ../js/ui/screenShield.js:438 ../js/ui/userMenu.js:807 #: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:807
msgid "Lock" msgid "Lock"
msgstr "Uzamknout" msgstr "Uzamknout"
#: ../js/ui/screenShield.js:641 #: ../js/ui/screenShield.js:652
msgid "GNOME needs to lock the screen" msgid "GNOME needs to lock the screen"
msgstr "GNOME potřebuje uzamknout obrazovku" msgstr "GNOME potřebuje uzamknout obrazovku"
@@ -1331,11 +1317,11 @@ msgstr "GNOME potřebuje uzamknout obrazovku"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:762 ../js/ui/screenShield.js:1198 #: ../js/ui/screenShield.js:773 ../js/ui/screenShield.js:1213
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Nelze uzamknout obrazovku" msgstr "Nelze uzamknout obrazovku"
#: ../js/ui/screenShield.js:763 ../js/ui/screenShield.js:1199 #: ../js/ui/screenShield.js:774 ../js/ui/screenShield.js:1214
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Zamknutí bylo zablokováno některou z aplikací" msgstr "Zamknutí bylo zablokováno některou z aplikací"
@@ -1347,19 +1333,19 @@ msgstr "Hledá se…"
msgid "No results." msgid "No results."
msgstr "Žádné výsledky." msgstr "Žádné výsledky."
#: ../js/ui/shellEntry.js:29 #: ../js/ui/shellEntry.js:27
msgid "Copy" msgid "Copy"
msgstr "Kopírovat" msgstr "Kopírovat"
#: ../js/ui/shellEntry.js:34 #: ../js/ui/shellEntry.js:32
msgid "Paste" msgid "Paste"
msgstr "Vložit" msgstr "Vložit"
#: ../js/ui/shellEntry.js:101 #: ../js/ui/shellEntry.js:99
msgid "Show Text" msgid "Show Text"
msgstr "Zobrazit text" msgstr "Zobrazit text"
#: ../js/ui/shellEntry.js:103 #: ../js/ui/shellEntry.js:101
msgid "Hide Text" msgid "Hide Text"
msgstr "Skrýt text" msgstr "Skrýt text"
@@ -1371,7 +1357,7 @@ msgstr "Heslo"
msgid "Remember Password" msgid "Remember Password"
msgstr "Pamatovat si heslo" msgstr "Pamatovat si heslo"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:114 #: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:109
msgid "Unlock" msgid "Unlock"
msgstr "Odemknout" msgstr "Odemknout"
@@ -1426,7 +1412,7 @@ msgstr "Styl velkého textu"
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32 #: ../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:289 ../js/ui/status/bluetooth.js:321
#: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388 #: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388
#: ../js/ui/status/network.js:761 #: ../js/ui/status/network.js:739
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@@ -1447,7 +1433,7 @@ msgid "Bluetooth Settings"
msgstr "Nastavit Bluetooth" msgstr "Nastavit Bluetooth"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill #. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:104 ../js/ui/status/network.js:149 #: ../js/ui/status/bluetooth.js:104 ../js/ui/status/network.js:142
msgid "hardware disabled" msgid "hardware disabled"
msgstr "zařízení zakázáno" msgstr "zařízení zakázáno"
@@ -1455,12 +1441,12 @@ msgstr "zařízení zakázáno"
msgid "Connection" msgid "Connection"
msgstr "Připojení" msgstr "Připojení"
#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:426 #: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:404
msgid "disconnecting..." msgid "disconnecting..."
msgstr "odpojování…" msgstr "odpojování…"
#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:432 #: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:410
#: ../js/ui/status/network.js:1417 #: ../js/ui/status/network.js:1343
msgid "connecting..." msgid "connecting..."
msgstr "připojování…" msgstr "připojování…"
@@ -1515,8 +1501,9 @@ msgstr "Zařízení %s se chce spárovat s tímto počítačem"
#: ../js/ui/status/bluetooth.js:366 #: ../js/ui/status/bluetooth.js:366
#, c-format #, c-format
msgid "Please confirm whether the PIN '%06d' matches the one on the device." msgid ""
msgstr "Ověřte prosím, zda PIN „%06d“ odpovídá tomu na zařízení." "Please confirm whether the Passkey '%06d' matches the one on the device."
msgstr "Ověřte prosím, zda klíč „%06d“ odpovídá tomu na zařízení."
#. Translators: this is the verb, not the noun #. Translators: this is the verb, not the noun
#: ../js/ui/status/bluetooth.js:369 #: ../js/ui/status/bluetooth.js:369
@@ -1540,11 +1527,11 @@ msgstr "Zadejte prosím PIN, který je uveden na zařízení."
msgid "OK" msgid "OK"
msgstr "Budiž" msgstr "Budiž"
#: ../js/ui/status/keyboard.js:368 #: ../js/ui/status/keyboard.js:396
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Zobrazit rozložení klávesnice" msgstr "Zobrazit rozložení klávesnice"
#: ../js/ui/status/keyboard.js:373 #: ../js/ui/status/keyboard.js:401
msgid "Region & Language Settings" msgid "Region & Language Settings"
msgstr "Místní a jazyková nastavení" msgstr "Místní a jazyková nastavení"
@@ -1552,91 +1539,91 @@ msgstr "Místní a jazyková nastavení"
msgid "Volume, network, battery" msgid "Volume, network, battery"
msgstr "Hlasitost, síť, baterie" msgstr "Hlasitost, síť, baterie"
#: ../js/ui/status/network.js:82 #: ../js/ui/status/network.js:75
msgid "<unknown>" msgid "<unknown>"
msgstr "<neznámé>" msgstr "<neznámé>"
#: ../js/ui/status/network.js:134 #: ../js/ui/status/network.js:127
msgid "Wi-Fi" msgid "Wi-Fi"
msgstr "Wi-Fi" msgstr "Wi-Fi"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch #. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:171 #: ../js/ui/status/network.js:164
msgid "disabled" msgid "disabled"
msgstr "zakázáno" msgstr "zakázáno"
#. Translators: this is for network devices that are physically present but are not #. 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) #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:424 #: ../js/ui/status/network.js:402
msgid "unmanaged" msgid "unmanaged"
msgstr "nespravováno" msgstr "nespravováno"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:435 ../js/ui/status/network.js:1420 #: ../js/ui/status/network.js:413 ../js/ui/status/network.js:1346
msgid "authentication required" msgid "authentication required"
msgstr "je vyžadováno ověření" msgstr "je vyžadováno ověření"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing #. module, which is missing
#: ../js/ui/status/network.js:445 #: ../js/ui/status/network.js:423
msgid "firmware missing" msgid "firmware missing"
msgstr "nedostupný firmware" msgstr "nedostupný firmware"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:452 #: ../js/ui/status/network.js:430
msgid "cable unplugged" msgid "cable unplugged"
msgstr "kabel byl odpojen" msgstr "kabel byl odpojen"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:457 #: ../js/ui/status/network.js:435
msgid "unavailable" msgid "unavailable"
msgstr "nedostupné" msgstr "nedostupné"
#: ../js/ui/status/network.js:459 ../js/ui/status/network.js:1422 #: ../js/ui/status/network.js:437 ../js/ui/status/network.js:1348
msgid "connection failed" msgid "connection failed"
msgstr "připojení selhalo" msgstr "připojení selhalo"
#: ../js/ui/status/network.js:512 ../js/ui/status/network.js:1306 #: ../js/ui/status/network.js:490 ../js/ui/status/network.js:1236
#: ../js/ui/status/network.js:1498 #: ../js/ui/status/network.js:1424
msgid "More…" msgid "More…"
msgstr "Další…" msgstr "Další…"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active, #. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name) #. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:540 ../js/ui/status/network.js:1261 #: ../js/ui/status/network.js:518 ../js/ui/status/network.js:1191
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Připojení (soukromé)" msgstr "Připojení (soukromé)"
#: ../js/ui/status/network.js:619 #: ../js/ui/status/network.js:597
msgid "Wired" msgid "Wired"
msgstr "Drátová" msgstr "Drátová"
#: ../js/ui/status/network.js:633 #: ../js/ui/status/network.js:611
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "Mobilní širokopásmová" msgstr "Mobilní širokopásmová"
#: ../js/ui/status/network.js:1596 #: ../js/ui/status/network.js:1522
msgid "Enable networking" msgid "Enable networking"
msgstr "Povolit síť" msgstr "Povolit síť"
#: ../js/ui/status/network.js:1657 #: ../js/ui/status/network.js:1583
msgid "Network Settings" msgid "Network Settings"
msgstr "Nastavení sítě" msgstr "Nastavení sítě"
#: ../js/ui/status/network.js:1674 #: ../js/ui/status/network.js:1600
msgid "Network Manager" msgid "Network Manager"
msgstr "Network Manager" msgstr "Network Manager"
#: ../js/ui/status/network.js:1764 #: ../js/ui/status/network.js:1690
msgid "Connection failed" msgid "Connection failed"
msgstr "Připojení selhalo" msgstr "Připojení selhalo"
#: ../js/ui/status/network.js:1765 #: ../js/ui/status/network.js:1691
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktivace síťového připojení selhala" msgstr "Aktivace síťového připojení selhala"
#: ../js/ui/status/network.js:2123 #: ../js/ui/status/network.js:2047
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Síť je zakázána" msgstr "Síť je zakázána"
@@ -1754,11 +1741,11 @@ msgstr "Hlasitost"
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:125 #: ../js/ui/unlockDialog.js:120
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Přihlásit se jako jiný uživatel" msgstr "Přihlásit se jako jiný uživatel"
#: ../js/ui/unlockDialog.js:146 #: ../js/ui/unlockDialog.js:141
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Odemykací okno" msgstr "Odemykací okno"
@@ -1885,23 +1872,23 @@ msgstr[0] "%u vstup"
msgstr[1] "%u vstupy" msgstr[1] "%u vstupy"
msgstr[2] "%u vstupů" msgstr[2] "%u vstupů"
#: ../src/gvc/gvc-mixer-control.c:2371 #: ../src/gvc/gvc-mixer-control.c:2373
msgid "System Sounds" msgid "System Sounds"
msgstr "Systémové zvuky" msgstr "Systémové zvuky"
#: ../src/main.c:347 #: ../src/main.c:372
msgid "Print version" msgid "Print version"
msgstr "Vypsat verzi" msgstr "Vypsat verzi"
#: ../src/main.c:353 #: ../src/main.c:378
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Režim použitý GDM pro přihlašovací obrazovku" msgstr "Režim použitý GDM pro přihlašovací obrazovku"
#: ../src/main.c:359 #: ../src/main.c:384
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Použít pro přihlašovací obrazovku určitý mód, např. „gdm“." msgstr "Použít pro přihlašovací obrazovku určitý mód, např. „gdm“."
#: ../src/main.c:365 #: ../src/main.c:390
msgid "List possible modes" msgid "List possible modes"
msgstr "Vypsat možné režimy" msgstr "Vypsat možné režimy"
@@ -1910,11 +1897,11 @@ msgstr "Vypsat možné režimy"
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Nelze spustit „%s“" msgstr "Nelze spustit „%s“"
#: ../src/shell-keyring-prompt.c:708 #: ../src/shell-keyring-prompt.c:714
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "Hesla si neodpovídají." msgstr "Hesla si neodpovídají."
#: ../src/shell-keyring-prompt.c:716 #: ../src/shell-keyring-prompt.c:722
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "Heslo nemůže být prázdné." msgstr "Heslo nemůže být prázdné."

387
po/tg.po
View File

@@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: Tajik Gnome\n" "Project-Id-Version: Tajik Gnome\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-03-14 18:11+0000\n" "POT-Creation-Date: 2013-05-29 22:58+0000\n"
"PO-Revision-Date: 2013-05-27 18:18+0500\n" "PO-Revision-Date: 2013-05-30 17:27+0500\n"
"Last-Translator: Victor Ibragimov <victor.ibragimov@gmail.com>\n" "Last-Translator: Victor Ibragimov <victor.ibragimov@gmail.com>\n"
"Language-Team: \n" "Language-Team: \n"
"Language: Tajik\n" "Language: Tajik\n"
@@ -40,10 +40,14 @@ msgid "Focus the active notification"
msgstr "Гузоштани фокус ба огоҳии фаъол" msgstr "Гузоштани фокус ба огоҳии фаъол"
#: ../data/50-gnome-shell-system.xml.in.h:4 #: ../data/50-gnome-shell-system.xml.in.h:4
msgid "Show the overview"
msgstr "Намоиш додани хулоса"
#: ../data/50-gnome-shell-system.xml.in.h:5
msgid "Show all applications" msgid "Show all applications"
msgstr "Намоиш додани ҳамаи барномаҳо" msgstr "Намоиш додани ҳамаи барномаҳо"
#: ../data/50-gnome-shell-system.xml.in.h:5 #: ../data/50-gnome-shell-system.xml.in.h:6
msgid "Open the application menu" msgid "Open the application menu"
msgstr "Кушодани менюи барномаҳо" msgstr "Кушодани менюи барномаҳо"
@@ -96,27 +100,10 @@ msgstr ""
"таҳрир кунед." "таҳрир кунед."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 #: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Whether to collect stats about applications usage"
msgstr "Ҷамъ кардан ё ҷамъ накардани омор дар бораи истифодабарии барномаҳо"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"Одатан ин восит барномаҳои фаъолро нигоҳдорӣ мекунад, то ин ки барномаҳои аз "
"ҳама зиёд истифодашаванда (масалан оғозкунандагон) ҳамеша мавҷуд бошанд. "
"Гарчанде ки ин иттилоот махфӣ нигоҳ дошта мешавад, шумо метавонед интихоб "
"кунед, ки инро барои сабабҳои махфият ғайрифаъол кунед. Лутфан, ба қайд "
"гиред, ки чунин амал иттилооти аллакай захирашударо тоза намекунад."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of desktop file IDs for favorite applications" msgid "List of desktop file IDs for favorite applications"
msgstr "Рӯйхати рамзҳои ID-и файлҳои мизи корӣ барои барномаҳои дӯстдошта" msgstr "Рӯйхати рамзҳои ID-и файлҳои мизи корӣ барои барномаҳои дӯстдошта"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:8 #: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid "" msgid ""
"The applications corresponding to these identifiers will be displayed in the " "The applications corresponding to these identifiers will be displayed in the "
"favorites area." "favorites area."
@@ -124,11 +111,11 @@ msgstr ""
"Барномаҳое, ки ба ин идентификаторҳо мувофиқ мебошанд, дар ноҳияи " "Барномаҳое, ки ба ин идентификаторҳо мувофиқ мебошанд, дар ноҳияи "
"баргузидаҳо намоиш дода мешаванд." "баргузидаҳо намоиш дода мешаванд."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9 #: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of categories that should be displayed as folders" msgid "List of categories that should be displayed as folders"
msgstr "Рӯйхати категорияҳо, ки бояд ҳамчун ҷузвдонҳо намоиш дода шаванд" msgstr "Рӯйхати категорияҳо, ки бояд ҳамчун ҷузвдонҳо намоиш дода шаванд"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10 #: ../data/org.gnome.shell.gschema.xml.in.in.h:8
msgid "" msgid ""
"Each category name in this list will be represented as folder in the " "Each category name in this list will be represented as folder in the "
"application view, rather than being displayed inline in the main view." "application view, rather than being displayed inline in the main view."
@@ -136,15 +123,15 @@ msgstr ""
"Ҳар як номи категория, ки дар ин рӯйхат мавҷуд аст, дар намуди барномаҳо " "Ҳар як номи категория, ки дар ин рӯйхат мавҷуд аст, дар намуди барномаҳо "
"ҳамчун ҷузвдон ифода мешавад, ба ҷойи намоишдиҳии шомил дар намуди асосӣ." "ҳамчун ҷузвдон ифода мешавад, ба ҷойи намоишдиҳии шомил дар намуди асосӣ."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 #: ../data/org.gnome.shell.gschema.xml.in.in.h:9
msgid "History for command (Alt-F2) dialog" msgid "History for command (Alt-F2) dialog"
msgstr "Таърихи равзанаи гуфтугӯи фармон (Alt-F2)" msgstr "Таърихи равзанаи гуфтугӯи фармон (Alt-F2)"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12 #: ../data/org.gnome.shell.gschema.xml.in.in.h:10
msgid "History for the looking glass dialog" msgid "History for the looking glass dialog"
msgstr "Таърих барои равзанаи гуфтугӯи оина" msgstr "Таърих барои равзанаи гуфтугӯи оина"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.in.h:11
msgid "" msgid ""
"Internally used to store the last IM presence explicitly set by the user. " "Internally used to store the last IM presence explicitly set by the user. "
"The value here is from the TpConnectionPresenceType enumeration." "The value here is from the TpConnectionPresenceType enumeration."
@@ -153,7 +140,7 @@ msgstr ""
"таври бевосита таъин шудааст, истифода мешавад. Дар ин ҷо қимат аз шумориши " "таври бевосита таъин шудааст, истифода мешавад. Дар ин ҷо қимат аз шумориши "
"TpConnectionPresenceType ба вуҷуд меояд." "TpConnectionPresenceType ба вуҷуд меояд."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.in.h:12
msgid "" msgid ""
"Internally used to store the last session presence status for the user. The " "Internally used to store the last session presence status for the user. The "
"value here is from the GsmPresenceStatus enumeration." "value here is from the GsmPresenceStatus enumeration."
@@ -162,11 +149,11 @@ msgstr ""
"корбар истифода мешавад. Дар ин ҷо қимат аз шумориши GsmPresenceStatus ба " "корбар истифода мешавад. Дар ин ҷо қимат аз шумориши GsmPresenceStatus ба "
"вуҷуд меояд." "вуҷуд меояд."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "Always show the 'Log out' menuitem in the user menu." msgid "Always show the 'Log out' menuitem in the user menu."
msgstr "Ҳамеша намоиш додани объекти менюи \"Баромадан\" дар менюи корбар." msgstr "Ҳамеша намоиш додани объекти менюи \"Баромадан\" дар менюи корбар."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid "" msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-" "This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations." "user, single-session situations."
@@ -174,14 +161,14 @@ msgstr ""
"Ин калид пинҳонкунии худкори объекти менюи \"Баромадан\"-ро дар вазъиятҳои " "Ин калид пинҳонкунии худкори объекти менюи \"Баромадан\"-ро дар вазъиятҳои "
"корбари ягона ва ҷаласаи ягона бекор мекунад." "корбари ягона ва ҷаласаи ягона бекор мекунад."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "" msgid ""
"Whether to remember password for mounting encrypted or remote filesystems" "Whether to remember password for mounting encrypted or remote filesystems"
msgstr "" msgstr ""
"Дар ёд доштан ё дар ёд надоштани парол барои васл кардани системаҳои файлии " "Дар ёд доштан ё дар ёд надоштани парол барои васл кардани системаҳои файлии "
"рамздор ё дурдаст" "рамздор ё дурдаст"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "" msgid ""
"The shell will request a password when an encrypted device or a remote " "The shell will request a password when an encrypted device or a remote "
"filesystem is mounted. If the password can be saved for future use a " "filesystem is mounted. If the password can be saved for future use a "
@@ -193,32 +180,42 @@ msgstr ""
"доштани парол\" мавҷуд мешавад. Ин калид ҳолати пешфарзи байрақчаро таъин " "доштани парол\" мавҷуд мешавад. Ин калид ҳолати пешфарзи байрақчаро таъин "
"мекунад." "мекунад."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Намоиш додани ҳафта дар тақвим" msgstr "Намоиш додани ҳафта дар тақвим"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "Агар дуруст бошад, санаи ҳафтаи ISO дар тақвим намоиш дода мешавад." msgstr "Агар дуруст бошад, санаи ҳафтаи ISO дар тақвим намоиш дода мешавад."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Тугма барои кушодани менюи барнома" msgstr "Тугма барои кушодани менюи барнома"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Тугма барои кушодани менюи барнома." msgstr "Тугма барои кушодани менюи барнома."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to open the \"Show Applications\" view" msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Тугма барои кушодани намуди \"Намоиш додани барномаҳо\"" msgstr "Тугма барои кушодани намуди \"Намоиш додани барномаҳо\""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "" msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview." "Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "" msgstr ""
"Тугма барои кушодани намуди \"Намоиш додани барномаҳо\"-и Хулосаи фаъолият." "Тугма барои кушодани намуди \"Намоиш додани барномаҳо\"-и Хулосаи фаъолият."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
#| msgid "Keybinding to open the \"Show Applications\" view"
msgid "Keybinding to open the overview"
msgstr "Тугмабандӣ барои кушодани хулоса"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
#| msgid "Keybinding to open the \"Show Applications\" view"
msgid "Keybinding to open the Activities Overview."
msgstr "Тугмабандӣ барои кушодани хулосаи фаъолият."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Тугма барои иваз кардани намоёнии қуттии паёмҳо" msgstr "Тугма барои иваз кардани намоёнии қуттии паёмҳо"
@@ -380,44 +377,50 @@ msgstr ""
"Пасвандеро интихоб кунед, то ин ки бо ҷаъбаи мураккаби боло онро " "Пасвандеро интихоб кунед, то ин ки бо ҷаъбаи мураккаби боло онро "
"конфигуратсия кунед." "конфигуратсия кунед."
#: ../js/gdm/loginDialog.js:405 #: ../js/gdm/loginDialog.js:371
#| msgid "Session..."
msgid "Session…" msgid "Session…"
msgstr "Ҷаласа..." msgstr "Ҷаласа..."
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:630 #: ../js/gdm/loginDialog.js:601
msgid "Not listed?" msgid "Not listed?"
msgstr "Вуҷуд надора?" msgstr "Вуҷуд надора?"
#: ../js/gdm/loginDialog.js:784 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:375 #: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:98 #: ../js/ui/status/bluetooth.js:415 ../js/ui/unlockDialog.js:96
#: ../js/ui/userMenu.js:938 #: ../js/ui/userMenu.js:938
msgid "Cancel" msgid "Cancel"
msgstr "Бекор кардан" msgstr "Бекор кардан"
#: ../js/gdm/loginDialog.js:800 #: ../js/gdm/loginDialog.js:791
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Ворид шудан" msgstr "Ворид шудан"
#: ../js/gdm/loginDialog.js:800 #: ../js/gdm/loginDialog.js:791
msgid "Next" msgid "Next"
msgstr "Навбатӣ" 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:888
#, c-format
msgid "(e.g., user or %s)"
msgstr "(масалан, корбар ё %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:915 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:892 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Номи корбар:" msgstr "Номи корбар:"
#: ../js/gdm/loginDialog.js:1159 #: ../js/gdm/loginDialog.js:1158
msgid "Login Window" msgid "Login Window"
msgstr "Равзанаи воридшавӣ" msgstr "Равзанаи воридшавӣ"
@@ -440,21 +443,16 @@ msgstr "Бозоғозидан"
msgid "Power Off" msgid "Power Off"
msgstr "Хомӯш кардан" msgstr "Хомӯш кардан"
#: ../js/gdm/util.js:182 #: ../js/gdm/util.js:247
msgid "Authentication error" msgid "Authentication error"
msgstr "Хатои санҷиши ҳаққоният" msgstr "Хатои санҷиши ҳаққоният"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:299 #: ../js/gdm/util.js:364
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(ё бо ангут ламс кунед)" msgstr "(ё бо ангут ламс кунед)"
#: ../js/gdm/util.js:324
#, c-format
msgid "(e.g., user or %s)"
msgstr "(масалан, корбар ё %s)"
#: ../js/misc/util.js:97 #: ../js/misc/util.js:97
msgid "Command not found" msgid "Command not found"
msgstr "Фармон ёфт нашудааст" msgstr "Фармон ёфт нашудааст"
@@ -470,23 +468,23 @@ msgstr "Фармон иҷро нашудааст:"
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Иҷрокунии '%s' қатъ шудааст:" msgstr "Иҷрокунии '%s' қатъ шудааст:"
#: ../js/ui/appDisplay.js:325 #: ../js/ui/appDisplay.js:361
msgid "Frequent" msgid "Frequent"
msgstr "Роиҷ" msgstr "Роиҷ"
#: ../js/ui/appDisplay.js:332 #: ../js/ui/appDisplay.js:368
msgid "All" msgid "All"
msgstr "Ҳама" msgstr "Ҳама"
#: ../js/ui/appDisplay.js:890 #: ../js/ui/appDisplay.js:960
msgid "New Window" msgid "New Window"
msgstr "Равзанаи нав" msgstr "Равзанаи нав"
#: ../js/ui/appDisplay.js:893 ../js/ui/dash.js:284 #: ../js/ui/appDisplay.js:963 ../js/ui/dash.js:284
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Тоза кардан аз Баргузидаҳо" msgstr "Тоза кардан аз Баргузидаҳо"
#: ../js/ui/appDisplay.js:894 #: ../js/ui/appDisplay.js:964
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Илова кардан ба Баргузидаҳо" msgstr "Илова кардан ба Баргузидаҳо"
@@ -523,7 +521,7 @@ msgctxt "event list time"
msgid "%H\\u2236%M" msgid "%H\\u2236%M"
msgstr "%H\\u2236%M" msgstr "%H\\u2236%M"
#. Transators: Shown in calendar event list, if 12h format, #. Translators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is #. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space #. a thin space
#: ../js/ui/calendar.js:77 #: ../js/ui/calendar.js:77
@@ -625,35 +623,35 @@ msgid "S"
msgstr "Ш" msgstr "Ш"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:720 #: ../js/ui/calendar.js:735
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Ягон чиз ба нақша нагирифтааст" msgstr "Ягон чиз ба нақша нагирифтааст"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:736 #: ../js/ui/calendar.js:751
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %B %d" msgstr "%A, %B %d"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:739 #: ../js/ui/calendar.js:754
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %B %d, %Y" msgstr "%A, %B %d, %Y"
#: ../js/ui/calendar.js:749 #: ../js/ui/calendar.js:764
msgid "Today" msgid "Today"
msgstr "Имрӯз" msgstr "Имрӯз"
#: ../js/ui/calendar.js:753 #: ../js/ui/calendar.js:768
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Фардо" msgstr "Фардо"
#: ../js/ui/calendar.js:764 #: ../js/ui/calendar.js:779
msgid "This week" msgid "This week"
msgstr "Ҳафтаи ҷорӣ" msgstr "Ҳафтаи ҷорӣ"
#: ../js/ui/calendar.js:772 #: ../js/ui/calendar.js:787
msgid "Next week" msgid "Next week"
msgstr "Ҳафтаи навбатӣ" msgstr "Ҳафтаи навбатӣ"
@@ -669,20 +667,20 @@ msgstr "Диски берунӣ ҷудо шудааст"
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Дастгоҳҳои ҷудошаванда" msgstr "Дастгоҳҳои ҷудошаванда"
#: ../js/ui/components/autorunManager.js:593 #: ../js/ui/components/autorunManager.js:594
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Кушодан бо %s" msgstr "Кушодан бо %s"
#: ../js/ui/components/autorunManager.js:619 #: ../js/ui/components/autorunManager.js:620
msgid "Eject" msgid "Eject"
msgstr "Баровардан" msgstr "Баровардан"
#: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268 #: ../js/ui/components/keyring.js:88 ../js/ui/components/polkitAgent.js:280
msgid "Password:" msgid "Password:"
msgstr "Парол:" msgstr "Парол:"
#: ../js/ui/components/keyring.js:101 #: ../js/ui/components/keyring.js:107
msgid "Type again:" msgid "Type again:"
msgstr "Аз нав ворид кунед:" msgstr "Аз нав ворид кунед:"
@@ -762,15 +760,15 @@ msgstr "Пароли шабакаи паҳннавори мобилӣ"
msgid "A password is required to connect to '%s'." msgid "A password is required to connect to '%s'."
msgstr "Барои пайваст шудан ба '%s' парол лозим аст." msgstr "Барои пайваст шудан ба '%s' парол лозим аст."
#: ../js/ui/components/polkitAgent.js:55 #: ../js/ui/components/polkitAgent.js:54
msgid "Authentication Required" msgid "Authentication Required"
msgstr "Санҷиши ҳаққоният лозим аст" msgstr "Санҷиши ҳаққоният лозим аст"
#: ../js/ui/components/polkitAgent.js:93 #: ../js/ui/components/polkitAgent.js:92
msgid "Administrator" msgid "Administrator"
msgstr "Маъмур" msgstr "Маъмур"
#: ../js/ui/components/polkitAgent.js:165 #: ../js/ui/components/polkitAgent.js:170
msgid "Authenticate" msgid "Authenticate"
msgstr "Санҷиши ҳаққоният" msgstr "Санҷиши ҳаққоният"
@@ -778,12 +776,12 @@ msgstr "Санҷиши ҳаққоният"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383 #: ../js/ui/components/polkitAgent.js:266 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again." msgid "Sorry, that didn't work. Please try again."
msgstr "Мутаассифона, ин амал иҷро нашуд. Лутфан, амалро такрор кунед." msgstr "Мутаассифона, ин амал иҷро нашуд. Лутфан, амалро такрор кунед."
#. Translators: this is a filename used for screencast recording #. Translators: this is a filename used for screencast recording
#: ../js/ui/components/recorder.js:48 #: ../js/ui/components/recorder.js:47
#, no-c-format #, no-c-format
msgid "Screencast from %d %t" msgid "Screencast from %d %t"
msgstr "Рӯйдодҳои экран аз %d %t" msgstr "Рӯйдодҳои экран аз %d %t"
@@ -1041,23 +1039,22 @@ msgstr "Намоиш додани барномаҳо"
msgid "Dash" msgid "Dash"
msgstr "Рах" msgstr "Рах"
#: ../js/ui/dateMenu.js:91 #: ../js/ui/dateMenu.js:86
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Кушодани тақвим" msgstr "Кушодани тақвим"
#: ../js/ui/dateMenu.js:96 #: ../js/ui/dateMenu.js:90
msgid "Open Clocks" msgid "Open Clocks"
msgstr "Кушодани соат" msgstr "Кушодани соат"
#: ../js/ui/dateMenu.js:105 #: ../js/ui/dateMenu.js:97
#| msgid "Date and Time Settings"
msgid "Date & Time Settings" msgid "Date & Time Settings"
msgstr "Танзимоти сана ва вақт" msgstr "Танзимоти сана ва вақт"
#. Translators: This is the date format to use when the calendar popup is #. 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"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:215 #: ../js/ui/dateMenu.js:208
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A %B %e, %Y" msgstr "%A %B %e, %Y"
@@ -1160,56 +1157,56 @@ msgstr "Насб кардан"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "\"%s\"-ро аз extensions.gnome.org боргирӣ ва насб мекунед?" msgstr "\"%s\"-ро аз 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 #: ../js/ui/status/power.js:211
msgid "Keyboard" msgid "Keyboard"
msgstr "Клавиатура" msgstr "Клавиатура"
#: ../js/ui/lookingGlass.js:693 #: ../js/ui/lookingGlass.js:689
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Ягон пасванд насб нашудааст" msgstr "Ягон пасванд насб нашудааст"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:747 #: ../js/ui/lookingGlass.js:743
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s ягон хато надорад." msgstr "%s ягон хато надорад."
#: ../js/ui/lookingGlass.js:753 #: ../js/ui/lookingGlass.js:749
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Пинҳон кардани хатоҳо" msgstr "Пинҳон кардани хатоҳо"
#: ../js/ui/lookingGlass.js:757 ../js/ui/lookingGlass.js:817 #: ../js/ui/lookingGlass.js:753 ../js/ui/lookingGlass.js:813
msgid "Show Errors" msgid "Show Errors"
msgstr "Намоиш додани хатоҳо" msgstr "Намоиш додани хатоҳо"
#: ../js/ui/lookingGlass.js:766 #: ../js/ui/lookingGlass.js:762
msgid "Enabled" msgid "Enabled"
msgstr "Фаъол" msgstr "Фаъол"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:769 ../src/gvc/gvc-mixer-control.c:1830 #: ../js/ui/lookingGlass.js:765 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Ғайрифаъол" msgstr "Ғайрифаъол"
#: ../js/ui/lookingGlass.js:771 #: ../js/ui/lookingGlass.js:767
msgid "Error" msgid "Error"
msgstr "Хатогӣ" msgstr "Хатогӣ"
#: ../js/ui/lookingGlass.js:773 #: ../js/ui/lookingGlass.js:769
msgid "Out of date" msgid "Out of date"
msgstr "Аз мӯҳлат гузашта" msgstr "Аз мӯҳлат гузашта"
#: ../js/ui/lookingGlass.js:775 #: ../js/ui/lookingGlass.js:771
msgid "Downloading" msgid "Downloading"
msgstr "Боргирӣ рафта истодааст" msgstr "Боргирӣ рафта истодааст"
#: ../js/ui/lookingGlass.js:799 #: ../js/ui/lookingGlass.js:795
msgid "View Source" msgid "View Source"
msgstr "Намоиш додани манбаъ" msgstr "Намоиш додани манбаъ"
#: ../js/ui/lookingGlass.js:808 #: ../js/ui/lookingGlass.js:804
msgid "Web Page" msgid "Web Page"
msgstr "Саҳифаи веб" msgstr "Саҳифаи веб"
@@ -1226,7 +1223,6 @@ msgid "Clear Messages"
msgstr "Пок кардани паёмҳо" msgstr "Пок кардани паёмҳо"
#: ../js/ui/messageTray.js:1528 #: ../js/ui/messageTray.js:1528
#| msgid "Notifications"
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Танзимоти огоҳиҳо" msgstr "Танзимоти огоҳиҳо"
@@ -1238,26 +1234,26 @@ msgstr "Ягон паём нест"
msgid "Message Tray" msgid "Message Tray"
msgstr "Қуттии паёмҳо" msgstr "Қуттии паёмҳо"
#: ../js/ui/messageTray.js:2816 #: ../js/ui/messageTray.js:2811
msgid "System Information" msgid "System Information"
msgstr "Маълумоти система" msgstr "Маълумоти система"
#: ../js/ui/notificationDaemon.js:629 ../src/shell-app.c:374 #: ../js/ui/notificationDaemon.js:629 ../src/shell-app.c:378
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Номаълум" msgstr "Номаълум"
#: ../js/ui/overviewControls.js:463 ../js/ui/screenShield.js:148 #: ../js/ui/overviewControls.js:474 ../js/ui/screenShield.js:150
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d паёми нав" msgstr[0] "%d паёми нав"
#: ../js/ui/overview.js:84 #: ../js/ui/overview.js:82
msgid "Undo" msgid "Undo"
msgstr "Ботил сохтан" msgstr "Ботил сохтан"
#: ../js/ui/overview.js:129 #: ../js/ui/overview.js:127
msgid "Overview" msgid "Overview"
msgstr "Хулоса" msgstr "Хулоса"
@@ -1265,21 +1261,21 @@ msgstr "Хулоса"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: ../js/ui/overview.js:271 #: ../js/ui/overview.js:258
msgid "Type to search…" msgid "Type to search…"
msgstr "Ҷустуҷӯ кардан..." msgstr "Ҷустуҷӯ кардан..."
#: ../js/ui/panel.js:612 #: ../js/ui/panel.js:642
msgid "Quit" msgid "Quit"
msgstr "Баромад" msgstr "Баромад"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:636 #: ../js/ui/panel.js:693
msgid "Activities" msgid "Activities"
msgstr "Фаъолиятҳо" msgstr "Фаъолиятҳо"
#: ../js/ui/panel.js:933 #: ../js/ui/panel.js:989
msgid "Top Bar" msgid "Top Bar"
msgstr "Панели боло" msgstr "Панели боло"
@@ -1288,35 +1284,35 @@ msgstr "Панели боло"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:727 #: ../js/ui/popupMenu.js:738
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-us" msgstr "toggle-switch-us"
#: ../js/ui/runDialog.js:73 #: ../js/ui/runDialog.js:74
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Фармонеро ворид кунед" msgstr "Фармонеро ворид кунед"
#: ../js/ui/runDialog.js:109 #: ../js/ui/runDialog.js:110
msgid "Close" msgid "Close"
msgstr "Пӯшидан" msgstr "Пӯшидан"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:85 #: ../js/ui/screenShield.js:87
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %B %d" msgstr "%A, %B %d"
#: ../js/ui/screenShield.js:150 #: ../js/ui/screenShield.js:152
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
msgstr[0] "%d огоҳии нав" msgstr[0] "%d огоҳии нав"
#: ../js/ui/screenShield.js:437 ../js/ui/userMenu.js:807 #: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:807
msgid "Lock" msgid "Lock"
msgstr "Қулф кардан" msgstr "Қулф кардан"
#: ../js/ui/screenShield.js:635 #: ../js/ui/screenShield.js:652
msgid "GNOME needs to lock the screen" msgid "GNOME needs to lock the screen"
msgstr "GNOME бояд экранро қулф кунад" msgstr "GNOME бояд экранро қулф кунад"
@@ -1327,37 +1323,35 @@ msgstr "GNOME бояд экранро қулф кунад"
#. #.
#. XXX: another option is to kick the user into the gdm login #. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs #. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:756 ../js/ui/screenShield.js:1151 #: ../js/ui/screenShield.js:773 ../js/ui/screenShield.js:1213
#| msgid "Unable to connect to %s"
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Қулф карда намешавад" msgstr "Қулф карда намешавад"
#: ../js/ui/screenShield.js:757 ../js/ui/screenShield.js:1152 #: ../js/ui/screenShield.js:774 ../js/ui/screenShield.js:1214
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Қулф аз тарави барнома баста шудааст" msgstr "Қулф аз тарави барнома баста шудааст"
#: ../js/ui/searchDisplay.js:451 #: ../js/ui/searchDisplay.js:445
#| msgid "Searching..."
msgid "Searching…" msgid "Searching…"
msgstr "Ҷустуҷӯ рафта истодааст..." msgstr "Ҷустуҷӯ рафта истодааст..."
#: ../js/ui/searchDisplay.js:495 #: ../js/ui/searchDisplay.js:489
msgid "No results." msgid "No results."
msgstr "Ягон натиҷа нест." msgstr "Ягон натиҷа нест."
#: ../js/ui/shellEntry.js:29 #: ../js/ui/shellEntry.js:27
msgid "Copy" msgid "Copy"
msgstr "Нусха бардоштан" msgstr "Нусха бардоштан"
#: ../js/ui/shellEntry.js:34 #: ../js/ui/shellEntry.js:32
msgid "Paste" msgid "Paste"
msgstr "Гузоштан" msgstr "Гузоштан"
#: ../js/ui/shellEntry.js:106 #: ../js/ui/shellEntry.js:99
msgid "Show Text" msgid "Show Text"
msgstr "Намоиш додани матн" msgstr "Намоиш додани матн"
#: ../js/ui/shellEntry.js:108 #: ../js/ui/shellEntry.js:101
msgid "Hide Text" msgid "Hide Text"
msgstr "Пинҳон кардани матн" msgstr "Пинҳон кардани матн"
@@ -1369,7 +1363,7 @@ msgstr "Парол"
msgid "Remember Password" msgid "Remember Password"
msgstr "Ба ёд гирифтани парол" msgstr "Ба ёд гирифтани парол"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:112 #: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:109
msgid "Unlock" msgid "Unlock"
msgstr "Кушодан" msgstr "Кушодан"
@@ -1424,7 +1418,7 @@ msgstr "Матни бузург"
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:32 #: ../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:289 ../js/ui/status/bluetooth.js:321
#: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388 #: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388
#: ../js/ui/status/network.js:826 #: ../js/ui/status/network.js:739
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@@ -1445,7 +1439,7 @@ msgid "Bluetooth Settings"
msgstr "Танзимоти Bluetooth" msgstr "Танзимоти Bluetooth"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill #. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:104 ../js/ui/status/network.js:178 #: ../js/ui/status/bluetooth.js:104 ../js/ui/status/network.js:142
msgid "hardware disabled" msgid "hardware disabled"
msgstr "сахтафзор ғайрифаъол шудааст" msgstr "сахтафзор ғайрифаъол шудааст"
@@ -1453,17 +1447,16 @@ msgstr "сахтафзор ғайрифаъол шудааст"
msgid "Connection" msgid "Connection"
msgstr "Пайвастшавӣ" msgstr "Пайвастшавӣ"
#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:460 #: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:404
msgid "disconnecting..." msgid "disconnecting..."
msgstr "қатъ кардани пайваст..." msgstr "қатъ кардани пайваст..."
#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:466 #: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:410
#: ../js/ui/status/network.js:1546 #: ../js/ui/status/network.js:1343
msgid "connecting..." msgid "connecting..."
msgstr "пайвастшавӣ..." msgstr "пайвастшавӣ..."
#: ../js/ui/status/bluetooth.js:239 #: ../js/ui/status/bluetooth.js:239
#| msgid "Send Files..."
msgid "Send Files…" msgid "Send Files…"
msgstr "Фиристодани файлҳо…" msgstr "Фиристодани файлҳо…"
@@ -1514,9 +1507,11 @@ msgstr "Дастгоҳи %s мехоҳад, ки бо ин компютер ҷу
#: ../js/ui/status/bluetooth.js:366 #: ../js/ui/status/bluetooth.js:366
#, c-format #, c-format
msgid "Please confirm whether the PIN '%06d' matches the one on the device." #| msgid "Please confirm whether the PIN '%06d' matches the one on the device."
msgid ""
"Please confirm whether the Passkey '%06d' matches the one on the device."
msgstr "" msgstr ""
"Лутфан, тасдиқ кунед, ки рамзи PIN-и \"%06d\" ба рамзи дар дастгоҳ " "Лутфан, тасдиқ кунед, ки калиди хусусии '%06d' ба калиди дар дастгоҳ "
"мавҷудбуда мувофиқат мекунад." "мавҷудбуда мувофиқат мекунад."
#. Translators: this is the verb, not the noun #. Translators: this is the verb, not the noun
@@ -1541,11 +1536,11 @@ msgstr "Лутфан, рамзи PIN-ро, ки дар дастгоҳ гуфта
msgid "OK" msgid "OK"
msgstr "OK" msgstr "OK"
#: ../js/ui/status/keyboard.js:368 #: ../js/ui/status/keyboard.js:396
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Намоиш додани тарҳбандии клавиатура" msgstr "Намоиш додани тарҳбандии клавиатура"
#: ../js/ui/status/keyboard.js:373 #: ../js/ui/status/keyboard.js:401
msgid "Region & Language Settings" msgid "Region & Language Settings"
msgstr "Танзимоти забон ва минтақа" msgstr "Танзимоти забон ва минтақа"
@@ -1553,117 +1548,91 @@ msgstr "Танзимоти забон ва минтақа"
msgid "Volume, network, battery" msgid "Volume, network, battery"
msgstr "Ҳаҷм, шабака, батарея" msgstr "Ҳаҷм, шабака, батарея"
#: ../js/ui/status/network.js:104 #: ../js/ui/status/network.js:75
msgid "<unknown>" msgid "<unknown>"
msgstr "<номаълум>" msgstr "<номаълум>"
#: ../js/ui/status/network.js:127
msgid "Wi-Fi"
msgstr "Wi-Fi"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch #. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:200 #: ../js/ui/status/network.js:164
msgid "disabled" msgid "disabled"
msgstr "ғайрифаъол" msgstr "ғайрифаъол"
#. Translators: this is for network devices that are physically present but are not #. 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) #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:458 #: ../js/ui/status/network.js:402
msgid "unmanaged" msgid "unmanaged"
msgstr "идоранашуда" msgstr "идоранашуда"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1549 #: ../js/ui/status/network.js:413 ../js/ui/status/network.js:1346
msgid "authentication required" msgid "authentication required"
msgstr "санҷиши ҳаққоният лозим аст" msgstr "санҷиши ҳаққоният лозим аст"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing #. module, which is missing
#: ../js/ui/status/network.js:479 #: ../js/ui/status/network.js:423
msgid "firmware missing" msgid "firmware missing"
msgstr "нармафзори дарунсохт вуҷуд надорад" msgstr "нармафзори дарунсохт вуҷуд надорад"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:486 #: ../js/ui/status/network.js:430
msgid "cable unplugged" msgid "cable unplugged"
msgstr "сим ҷудо шудааст" msgstr "сим ҷудо шудааст"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:491 #: ../js/ui/status/network.js:435
msgid "unavailable" msgid "unavailable"
msgstr "дастнорас" msgstr "дастнорас"
#: ../js/ui/status/network.js:493 ../js/ui/status/network.js:1551 #: ../js/ui/status/network.js:437 ../js/ui/status/network.js:1348
msgid "connection failed" msgid "connection failed"
msgstr "пайваст қатъ шудааст" msgstr "пайваст қатъ шудааст"
#: ../js/ui/status/network.js:552 ../js/ui/status/network.js:1435 #: ../js/ui/status/network.js:490 ../js/ui/status/network.js:1236
#: ../js/ui/status/network.js:1627 #: ../js/ui/status/network.js:1424
msgid "More…" msgid "More…"
msgstr "Бештар..." msgstr "Бештар..."
#. TRANSLATORS: this is the indication that a connection for another logged in user is active, #. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name) #. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1365 #: ../js/ui/status/network.js:518 ../js/ui/status/network.js:1191
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Пайваст шудааст (шахсӣ)" msgstr "Пайваст шудааст (шахсӣ)"
#: ../js/ui/status/network.js:667 #: ../js/ui/status/network.js:597
msgid "Wired" msgid "Wired"
msgstr "Симдор" msgstr "Симдор"
#: ../js/ui/status/network.js:668 #: ../js/ui/status/network.js:611
msgid "Auto Ethernet"
msgstr "Ethernet-и худкор"
#: ../js/ui/status/network.js:695
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "Паҳннавори мобилӣ" msgstr "Паҳннавори мобилӣ"
#: ../js/ui/status/network.js:728 #: ../js/ui/status/network.js:1522
msgid "Auto broadband"
msgstr "Паҳннавори худкор"
#: ../js/ui/status/network.js:731
msgid "Auto dial-up"
msgstr "Шуморагирии худкор"
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:861 ../js/ui/status/network.js:1382
#, c-format
msgid "Auto %s"
msgstr "Худкор %s"
#: ../js/ui/status/network.js:863
msgid "Auto bluetooth"
msgstr "Bluetooth-и худкор"
#: ../js/ui/status/network.js:1384
msgid "Auto wireless"
msgstr "Бесими худкор"
#: ../js/ui/status/network.js:1729
msgid "Enable networking" msgid "Enable networking"
msgstr "Фаъол кардани шабака" msgstr "Фаъол кардани шабака"
#: ../js/ui/status/network.js:1771 #: ../js/ui/status/network.js:1583
msgid "Wi-Fi"
msgstr "Wi-Fi"
#: ../js/ui/status/network.js:1790
msgid "Network Settings" msgid "Network Settings"
msgstr "Танзимоти шабака" msgstr "Танзимоти шабака"
#: ../js/ui/status/network.js:1807 #: ../js/ui/status/network.js:1600
msgid "Network Manager" msgid "Network Manager"
msgstr "Мудири шабака" msgstr "Мудири шабака"
#: ../js/ui/status/network.js:1897 #: ../js/ui/status/network.js:1690
msgid "Connection failed" msgid "Connection failed"
msgstr "Пайваст қатъ шудааст" msgstr "Пайваст қатъ шудааст"
#: ../js/ui/status/network.js:1898 #: ../js/ui/status/network.js:1691
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Фаъолсозии пайвасти шабака қатъ шудааст." msgstr "Фаъолсозии пайвасти шабака қатъ шудааст."
#: ../js/ui/status/network.js:2276 #: ../js/ui/status/network.js:2047
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Шабака ғайрифаъол аст" msgstr "Шабака ғайрифаъол аст"
@@ -1720,7 +1689,6 @@ msgid "AC Adapter"
msgstr "Адаптери AC" msgstr "Адаптери AC"
#: ../js/ui/status/power.js:203 #: ../js/ui/status/power.js:203
#| msgid "Battery"
msgid "Laptop Battery" msgid "Laptop Battery"
msgstr "Батареяи лэптоп" msgstr "Батареяи лэптоп"
@@ -1741,7 +1709,6 @@ msgid "PDA"
msgstr "PDA" msgstr "PDA"
#: ../js/ui/status/power.js:215 #: ../js/ui/status/power.js:215
#| msgid "Cell phone"
msgid "Cell Phone" msgid "Cell Phone"
msgstr "Телефони мобилӣ" msgstr "Телефони мобилӣ"
@@ -1763,7 +1730,6 @@ msgid "Unknown"
msgstr "Номаълум" msgstr "Номаълум"
#: ../js/ui/status/volume.js:124 #: ../js/ui/status/volume.js:124
#| msgid "Volume"
msgid "Volume changed" msgid "Volume changed"
msgstr "Ҳаҷм тағйир ёфт" msgstr "Ҳаҷм тағйир ёфт"
@@ -1776,11 +1742,11 @@ msgstr "Баландии садо"
msgid "Microphone" msgid "Microphone"
msgstr "Микрофон" msgstr "Микрофон"
#: ../js/ui/unlockDialog.js:123 #: ../js/ui/unlockDialog.js:120
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Ворид шудан бо корбари дигар" msgstr "Ворид шудан бо корбари дигар"
#: ../js/ui/unlockDialog.js:144 #: ../js/ui/unlockDialog.js:141
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Кушодани равзана" msgstr "Кушодани равзана"
@@ -1904,38 +1870,37 @@ msgid "%u Input"
msgid_plural "%u Inputs" msgid_plural "%u Inputs"
msgstr[0] "%u вуруд" msgstr[0] "%u вуруд"
#: ../src/gvc/gvc-mixer-control.c:2371 #: ../src/gvc/gvc-mixer-control.c:2373
#| msgid "System"
msgid "System Sounds" msgid "System Sounds"
msgstr "Системаи садо" msgstr "Системаи садо"
#: ../src/main.c:347 #: ../src/main.c:372
msgid "Print version" msgid "Print version"
msgstr "Версияи чоп" msgstr "Версияи чоп"
#: ../src/main.c:353 #: ../src/main.c:378
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Усуле, ки бо GDM барои экрани воридшавӣ истифода мешавад" msgstr "Усуле, ки бо GDM барои экрани воридшавӣ истифода мешавад"
#: ../src/main.c:359 #: ../src/main.c:384
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "" msgstr ""
"Истифода бурдани ҳолати мушаххас, масалан \"gdm\" барои экрани воридшавӣ" "Истифода бурдани ҳолати мушаххас, масалан \"gdm\" барои экрани воридшавӣ"
#: ../src/main.c:365 #: ../src/main.c:390
msgid "List possible modes" msgid "List possible modes"
msgstr "Рӯйхати ҳолатҳои имконпазир" msgstr "Рӯйхати ҳолатҳои имконпазир"
#: ../src/shell-app.c:622 #: ../src/shell-app.c:626
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Оғози '%s' қатъ шудааст" msgstr "Оғози '%s' қатъ шудааст"
#: ../src/shell-keyring-prompt.c:708 #: ../src/shell-keyring-prompt.c:714
msgid "Passwords do not match." msgid "Passwords do not match."
msgstr "Паролҳо мувофиқат намекунанд." msgstr "Паролҳо мувофиқат намекунанд."
#: ../src/shell-keyring-prompt.c:716 #: ../src/shell-keyring-prompt.c:722
msgid "Password cannot be blank" msgid "Password cannot be blank"
msgstr "Парол бояд холӣ набошад" msgstr "Парол бояд холӣ набошад"
@@ -1943,6 +1908,40 @@ msgstr "Парол бояд холӣ набошад"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Равзанаи гуфтугӯи санҷиши ҳакконият бо корбар бекор карда шуд" msgstr "Равзанаи гуфтугӯи санҷиши ҳакконият бо корбар бекор карда шуд"
#~ msgid "Whether to collect stats about applications usage"
#~ msgstr "Ҷамъ кардан ё ҷамъ накардани омор дар бораи истифодабарии барномаҳо"
#~ msgid ""
#~ "The shell normally monitors active applications in order to present the "
#~ "most used ones (e.g. in launchers). While this data will be kept private, "
#~ "you may want to disable this for privacy reasons. Please note that doing "
#~ "so won't remove already saved data."
#~ msgstr ""
#~ "Одатан ин восит барномаҳои фаъолро нигоҳдорӣ мекунад, то ин ки барномаҳои "
#~ "аз ҳама зиёд истифодашаванда (масалан оғозкунандагон) ҳамеша мавҷуд "
#~ "бошанд. Гарчанде ки ин иттилоот махфӣ нигоҳ дошта мешавад, шумо метавонед "
#~ "интихоб кунед, ки инро барои сабабҳои махфият ғайрифаъол кунед. Лутфан, "
#~ "ба қайд гиред, ки чунин амал иттилооти аллакай захирашударо тоза "
#~ "намекунад."
#~ msgid "Auto Ethernet"
#~ msgstr "Ethernet-и худкор"
#~ msgid "Auto broadband"
#~ msgstr "Паҳннавори худкор"
#~ msgid "Auto dial-up"
#~ msgstr "Шуморагирии худкор"
#~ msgid "Auto %s"
#~ msgstr "Худкор %s"
#~ msgid "Auto bluetooth"
#~ msgstr "Bluetooth-и худкор"
#~ msgid "Auto wireless"
#~ msgstr "Бесими худкор"
#~ msgctxt "title" #~ msgctxt "title"
#~ msgid "Sign In" #~ msgid "Sign In"
#~ msgstr "Ворид шудан" #~ msgstr "Ворид шудан"

View File

@@ -106,6 +106,8 @@ shell_gtk_embed_window_created_cb (MetaDisplay *display,
0, 0 /* offset x/y */); 0, 0 /* offset x/y */);
cairo_region_destroy (empty_region); cairo_region_destroy (empty_region);
gdk_window_lower (gdk_window);
/* Now that we've found the window we don't need to listen for /* Now that we've found the window we don't need to listen for
new windows anymore */ new windows anymore */
g_signal_handler_disconnect (display, g_signal_handler_disconnect (display,