Compare commits

..

48 Commits

Author SHA1 Message Date
2dbe511519 Bump version to 3.9.4
Update NEWS.
2013-07-10 19:50:29 +02:00
e031a5d28b st-theme-node: Update corner textures on allocation size changes
Commit 318283fc70 optimized box-shadow rendering by not recreating
shadow materials on every allocation change. Other handles cannot
be reused and are updated regularly, however the patch missed the
cached corner materials - while those can be reused, we still need
to ensure that the currently used paint state references them.

https://bugzilla.gnome.org/show_bug.cgi?id=703909
2013-07-10 17:35:11 +02:00
f9b32474b0 st-theme-node: Don't update resources on each paint
Up to commit 318283fc70, resources were only updated when
the allocated size had changed. There is no good reason to change
this for theme nodes without box shadows.

https://bugzilla.gnome.org/show_bug.cgi?id=703909
2013-07-10 17:35:11 +02:00
53d268a7ef st: Remove support for fixed positioning in BoxLayout
It is the job of layout containers to arrange their children; having
a hidden feature that *also* allows children to be positioned freely
outside the parent's allocation is just odd.
With the last user of the feature gone, kill it.

https://bugzilla.gnome.org/show_bug.cgi?id=703808
2013-07-09 23:19:20 +02:00
70da558802 overview: Add coverPane to stack instead of BoxLayout
The event catcher that covers the entire primary monitor during
transitions is currently inside a BoxLayout, relying in its
odd support for fixed position actors.
We already have a proper stack widget in place, move it there.

https://bugzilla.gnome.org/show_bug.cgi?id=703808
2013-07-09 23:19:20 +02:00
11215374ff lookingGlass: Use uiGroup as parent instead of panelBox
Currently lookingGlass relies on some odd BoxLayout behavior, which
allows children to use fixed positioning without affecting the parent's
size request. As this behavior is scheduled for removal, add the
looking glass dialog directly to Main.uiGroup.

https://bugzilla.gnome.org/show_bug.cgi?id=703808
2013-07-09 23:19:20 +02:00
cb45a38838 calendar: Fix line-wrapping of calendar events
Commit 929636ebd0 broke line-wrapping of longish calendar events,
add back the required CSS width.

https://bugzilla.gnome.org/show_bug.cgi?id=703893
2013-07-09 23:19:19 +02:00
bb4d430ebf style: Fix extension list style in looking glass
No idea how this got unnoticed since forever, but code and stylesheet
didn't quite agree on the same name ...

https://bugzilla.gnome.org/show_bug.cgi?id=703807
2013-07-09 22:06:13 +02:00
c17f84ca23 style: Fix focused app view controls
Moving from fixed width to horizontal padding for the app view control
buttons broke the focus style, in that buttons may change size on
keyboard focus changes. Fix this by using the correct horizontal padding
when focused.

https://bugzilla.gnome.org/show_bug.cgi?id=703807
2013-07-09 22:06:13 +02:00
0ae1f9ffc7 modalDialog: Minor coding style fix
https://bugzilla.gnome.org/show_bug.cgi?id=703807
2013-07-09 22:06:13 +02:00
d15bcd9845 loginDialog: don't call nonexistent setInitialKeyFocus function
commit ea02380c15 changed the login
dialog to not use ModalDialog anymore.  There's still one lingering
setInitialKeyFocus method call in the source, which will cause an
exception to be thrown when users have their user list disabled.

This commit fixes that.

https://bugzilla.gnome.org/show_bug.cgi?id=703874
2013-07-09 12:52:18 -04:00
f79a11d993 st-theme-node: init cached state properly 2013-07-09 11:25:28 +01:00
9391d9d11b st-theme-node: reuse box-shadow materials between paint states when possible 2013-07-09 11:25:24 +01:00
aee90a3116 st-theme-node: refactor calls to render css box 2013-07-09 11:24:26 +01:00
ffac5279a7 tests: add animated box-shadow test to demo optimized painting 2013-07-09 11:24:26 +01:00
318283fc70 st: optimize box-shadow rendering
Currently the box-shadow is rendering is done like this :

The first time we want to render a node that requires a box-shadow, St
creates an cogl offscreen surface of the size of the allocation and
renders the box into this offscreen buffer using modulation on the
alpha channel, this buffer is then blurred according to the CSS
parameters.

The problem with this method is that every time an StWidget is
resized, its box-shadow offscreen buffer has to be resized and
therefore rendered and blurred.

This patches propose an optimization for this use case by rendering
the box-shadow only once but at a size that is independent of the
StWidget's size. Then every time we need to paint this box-shadow, we
just render this offscreen buffer using a 9-slices.

This method only works when the allocation of the widget is bigger
than the minimum shadow size on which we can apply a 9-slices, that is
given my the radius of the corners. If the allocation is smaller than
this minimum size, we then fallback to the fully render/blur the
shadow (like before this patch).

https://bugzilla.gnome.org/show_bug.cgi?id=689858
2013-07-09 11:24:26 +01:00
3582ba0c77 layout: Don't use the input mode to block events to windows
Instead, use the standard Clutter scene graph and our Chrome system.

This also removes our last use of the input mode, so remove that as
well.

https://bugzilla.gnome.org/show_bug.cgi?id=700735
2013-07-08 17:05:17 -04:00
985d0c786c global: Automatically unshape the stage X window when we take a modal
This prevents the "client" from having to do it, and removes one part
of the FULLSCREEN input mode.

https://bugzilla.gnome.org/show_bug.cgi?id=700735
2013-07-08 17:05:17 -04:00
9c8c282e08 global: Clean up the code that actually sets the shape on the stage
Instead of having "dummy" setters that do work, split out the parts
that do work into their own function.

https://bugzilla.gnome.org/show_bug.cgi?id=700735
2013-07-08 17:05:16 -04:00
93dc7a51c0 Rework window / actor focus handling
The duality of the Clutter's key focus and mutter's window focus has long been
a problem for us in lots of case, and caused us to create large and complicated
hacks to get around the issue, including GrabHelper's focus grab model.

Instead of doing this, tie basic focus management into the core of gnome-shell,
instead of requiring complex "application-level" management to get it done
right.

Do this by making sure that only one of an actor or window can be focused at
the same time, and apply the appropriate logic to drop one or the other,
reactively.

Modals are considered a special case, as we grab all keyboard events, but at
the X level, the client window still has focus. Make sure to not do any input
synchronization when we have a modal.

At the same time, remove the FOCUSED input mode, as it's no longer necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=700735
2013-07-08 17:05:16 -04:00
393577ee78 grabHelper: Remove explicitly having to select modal
https://bugzilla.gnome.org/show_bug.cgi?id=700735
2013-07-08 16:51:51 -04:00
eef593a34e messageTray: Don't use focus grabs
We can easily implement much of the same behavior ourselves by
keeping track of Clutter's focus events. Reintroduce heavily
modified FocusGrabber to do the work for us.

This will temporarily break when the user selects a window until
we can make gnome-shell automatically set the stage focus.

This also removes our only use of focus grabs, so remove those
as well.

https://bugzilla.gnome.org/show_bug.cgi?id=700735
2013-07-08 16:51:50 -04:00
3790e924e9 grabHelper: Rewrite documentation for GrabHelper.grab()
The previous docs were badly maintained. This does not mention
grabFocus grabs, as they'll be removed shortly.

https://bugzilla.gnome.org/show_bug.cgi?id=700735
2013-07-08 16:17:01 -04:00
2f165aade8 Updated Vietnamese translation 2013-07-06 18:29:12 +07:00
2c502aec45 po/vi: import from Damned Lies 2013-07-06 18:24:32 +07:00
6bbf246752 Updated German translation 2013-07-05 17:24:23 +02:00
0b3e8e29cf Updated Indonesian translation 2013-07-05 10:23:35 +07:00
d509ab7779 ScreenShield: when the user goes idle, check for active before pushing a modal
We can't assume "isActive implies isModal", so there is a risk
of pushing a modal that nothing else will ever pop, because we
take the early return and don't activate the user active watch.

https://bugzilla.gnome.org/show_bug.cgi?id=700901
2013-07-04 15:16:27 +02:00
502a9aefdc Updated Norwegian bokmål translation 2013-07-04 11:09:57 +02:00
ccba18aa8f network: Fix a recursion issue when updating VPN
_updateIcon should not attempt to sync any active connections, as the
icon-changed signal can be emitted in response to something done during
_syncActiveConnection. In the case of VPN, removeActiveConnection would
cause an icon-changed signal to be emitted immediately, but the state
would not be updated, causing us to call removeActiveConnection over and
over.

Explicitly sync all active connections when we know it needs to be done,
and simply make _updateIcon synchronize with the current device's icon.

https://bugzilla.gnome.org/show_bug.cgi?id=703565
2013-07-03 13:55:08 -04:00
586ebcd5be background: fix asynchronous management of background loading operations
This fixes a blue background being drawn when switching the monitors
configuration using hardware keys
(clone/multimonitor/external/internal).

The problem is that the shell gather all background loading requests
under the same meta_background_load_file_async call using one
GCancellable (the first one to come). So when the shell receives a
batch of 12 or so XRandr events, it creates 12 new background managers
which end up trying to load 12 times the same background picture. All
of these requests are batched into the same
meta_background_load_file_async using the first GCancellable received
on the first request. Unfortunately, when the first request is
cancelled by the following event indicating a new monitor setup, all
of the background picture requests are dropped on the floor, and
nothing gets loaded (hence the blue screen background).

https://bugzilla.gnome.org/show_bug.cgi?id=703001
2013-07-03 17:03:02 +01:00
317b9a9c87 dnd: Make the draggable much faster
It turns out that picking a 3200x1200 scene on notebook chipsets
every time the mouse is moved isn't exactly the fastest thing. Defer
picking to an idle to ensure that it won't get in the way of keeping
up with mouse events.

https://bugzilla.gnome.org/show_bug.cgi?id=703443
2013-07-02 14:17:38 -04:00
67f10ea7eb network-agent: Remove prototype of unused function
This causes a debug SpiderMonkey build to fail when it throws an
exception for the missing symbol, but doesn't properly return FALSE
when executing the script.

https://bugzilla.gnome.org/show_bug.cgi?id=703442
2013-07-02 14:17:38 -04:00
793edd3a2b Make autorun notifications work
The code that checks for various conditions is confusing and
undercommented. It appears one of the recent refactorings
inadvertedly inverted the sense of the 'hidden mountpoint'
check, and caused autorun to not work for anything that does
not have a 'native root' - which is pretty much all volumes
implemented by gvfs.

https://bugzilla.gnome.org/show_bug.cgi?id=703418
2013-07-01 16:54:01 -04:00
5dabaf2fe9 Fix launching apps / search results in new workspaces by dragging
When I landed the new workspace tracker move, I didn't realize there
was public API being used by clients here. Add that back.

https://bugzilla.gnome.org/show_bug.cgi?id=698593
2013-07-01 13:22:05 -04:00
1d9b25f771 Update gvc 2013-07-01 13:20:02 -04:00
74cd20116a boxpointer: fix left/right arrow side calculation
Commit d6cace32 introduced a typo in the left/right arrow side
calculation code that causes in most scenarios (where the monitor
width is greater then the height) to not flip the box when it doesn't
fit inside the monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=703403
2013-07-01 18:42:00 +02:00
867695eb4f workspace: Remove unused zooming property
We no longer support zooming.

https://bugzilla.gnome.org/show_bug.cgi?id=703304
2013-06-29 11:56:37 +02:00
9e3592ebf3 Updated Czech translation 2013-06-28 18:33:47 +02:00
f8ec14d625 Updated Galician translations 2013-06-28 01:35:26 +02:00
1f21e50663 Updated Spanish translation 2013-06-27 13:02:31 +02:00
7403545a48 screenShield: fix empty screen shield
If the drag action ends after something else has put the screen shield
into a different state we can end up in an inconsistent screen shield
state where the whole thing is empty.

https://bugzilla.gnome.org/show_bug.cgi?id=703126
2013-06-27 11:14:09 +01:00
1d95b317ba st-widget: Fix paint state leak
https://bugzilla.gnome.org/show_bug.cgi?id=703160
2013-06-27 09:26:05 +01:00
f7568b69d4 loginDialog: make spinner and session menu button share position
They never need to be shown at the same time, and the design has
the UI fade between them.

This commit implements that.

https://bugzilla.gnome.org/show_bug.cgi?id=702818
2013-06-26 15:20:10 -04:00
8d7649eaec loginDialog: Move the session list to a PopupMenu
There are some issues with the existing session menu. First, it looks
kinda bad. It seems like it's hanging around there, but it doesn't really know
what to do with itself.

Second, when it expands down it requires that the buttons below move
down with it. This kind of movement is awkward and looks a bit weird.

Third, its current position makes the "dialog" tall and unwieldy when
you add things like messages for fingerprint readers or authentication errors.

This commit moves the session list to a menu behind a button to address
the above problems.

Based on a patch by Jasper St. Pierre.

https://bugzilla.gnome.org/show_bug.cgi?id=702818
2013-06-26 14:42:31 -04:00
10b1c7e8a3 Updated Czech translation 2013-06-26 19:13:33 +02:00
b1c936164c overview: Really fix zoom animation
Commit 16fa186b63 attempted to fix the zoom animation problem
by throwing changes on the floor while the overview is animating. This has
the side effect that we might end up missing some positioning changes causes
windows to overlap the workspace thumbnails.

So revert those changes and fix it by simply by passing
WindowPositionFlags.ANIMATE during the overview animation.
This way the animation works as expected and we don't miss any position changes.

https://bugzilla.gnome.org/show_bug.cgi?id=703105
2013-06-26 18:06:54 +02:00
74ad6abfc2 loginDialog: don't show Not Listed? button before user list
Right now, there's a weird flicker at start up where the
Not Listed? button shows up before the user list, which looks
pretty bad if you're watching for it.

This commit fixes that problem by hiding the Not Listed button
initially and showing it at the appropriate time.

https://bugzilla.gnome.org/show_bug.cgi?id=703132
2013-06-26 10:53:39 -04:00
43 changed files with 2464 additions and 1879 deletions

29
NEWS

@ -1,3 +1,32 @@
3.9.4
=====
* Fix chat entries not being focused when expanded [Jasper; #698778]
* Fix alignment of "Not Listed?" label [Mathieu; #702307]
* Fix alignment of time stamps in chat notifications [Carlos; #687809]
* Round the ends of slider trough [Jasper; #702825]
* Add support for "box-shadow: none" [Cosimo; #702782]
* Keep chrome below popup windows [Florian; #702338]
* Move the session list to a popup menu [Ray; #702818]
* Fix autorun notifications for "non-native" volumes [Matthias; #703418]
* dnd: Speed up by not picking on each motion event [Jasper; #703443]
* Fix management of asynchronous background loading [Lionel; #703001]
* Rework focus handling [Jasper; #700735]
* Optimize box-shadow rendering [Lionel; #689858]
* Remove support for fixed positioning in BoxLayouts [Florian; #703808]
* Misc bug fixes and cleanups [Adel, Jasper, Florian, Ray, Lionel, Emilio;
#702849, #610279, #703132, #703105, #703160, #703126, #703304, #703403,
#698593, #703442, #703565, #700901, #703874, #703807, #703893, #703909]
Contributors:
Mathieu Bridon, Giovanni Campagna, Cosimo Cecchi, Matthias Clasen,
Fran Diéguez, Adel Gadllah, Lionel Landwerlin, Florian Müllner,
Emilio Pozuelo Monfort, Carlos Soriano, Jasper St. Pierre, Ray Strode
Translations:
Baurzhan Muftakhidinov [kk], Marek Černocký [cs], Daniel Mustieles [es],
Fran Diéguez [gl], Kjartan Maraas [nb], Andika Triwidada [id],
Benjamin Steinwender [de], Nguyễn Thái Ngọc Duy [vi], Trần Ngọc Quân [vi]
3.9.3 3.9.3
===== =====
* Don't push window thumbs when workspace switcher is hidden [Jasper; #701167] * Don't push window thumbs when workspace switcher is hidden [Jasper; #701167]

@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.9.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[3.9.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c]) AC_CONFIG_SRCDIR([src/shell-global.c])
@ -63,7 +63,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.13.4 CLUTTER_MIN_VERSION=1.13.4
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.35.4 GJS_MIN_VERSION=1.35.4
MUTTER_MIN_VERSION=3.9.3 MUTTER_MIN_VERSION=3.9.4
GTK_MIN_VERSION=3.7.9 GTK_MIN_VERSION=3.7.9
GIO_MIN_VERSION=2.37.0 GIO_MIN_VERSION=2.37.0
LIBECAL_MIN_VERSION=3.5.3 LIBECAL_MIN_VERSION=3.5.3

@ -327,10 +327,6 @@ StScrollBar StButton#vhandle:active {
border-width: 2px; border-width: 2px;
} }
.app-view-control:focus {
padding: 3px;
}
.app-view-control:first-child:ltr:focus, .app-view-control:first-child:ltr:focus,
.app-view-control:last-child:rtl:focus { .app-view-control:last-child:rtl:focus {
border-right-width: 1px; border-right-width: 1px;
@ -911,6 +907,11 @@ StScrollBar StButton#vhandle:active {
padding: 4px 32px; padding: 4px 32px;
} }
.app-view-control:focus {
padding: 3px 31px;
}
.search-display > StBoxLayout, .search-display > StBoxLayout,
.all-apps > StBoxLayout, .all-apps > StBoxLayout,
.frequent-apps > StBoxLayout { .frequent-apps > StBoxLayout {
@ -1132,7 +1133,7 @@ StScrollBar StButton#vhandle:active {
padding: 4px; padding: 4px;
} }
.lg-extension-list { .lg-extensions-list {
padding: 4px; padding: 4px;
spacing: 6px; spacing: 6px;
} }
@ -1160,6 +1161,11 @@ StScrollBar StButton#vhandle:active {
/* Calendar popup */ /* Calendar popup */
#calendarArea {
/* this is the total width of the popup */
max-width: 720px;
}
.calendar-vertical-separator { .calendar-vertical-separator {
-stipple-width: 1px; -stipple-width: 1px;
-stipple-color: #505050; -stipple-color: #505050;

@ -46,14 +46,20 @@ 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 _DEFAULT_BUTTON_WELL_ICON_SIZE = 24;
const _WORK_SPINNER_ANIMATION_DELAY = 1.0; const _DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
const _WORK_SPINNER_ANIMATION_TIME = 0.3; const _DEFAULT_BUTTON_WELL_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 DefaultButtonWellMode = {
NONE: 0,
SESSION_MENU_BUTTON: 1,
SPINNER: 2
};
const UserListItem = new Lang.Class({ const UserListItem = new Lang.Class({
Name: 'UserListItem', Name: 'UserListItem',
@ -290,8 +296,8 @@ const UserList = new Lang.Class({
}); });
Signals.addSignalMethods(UserList.prototype); Signals.addSignalMethods(UserList.prototype);
const SessionList = new Lang.Class({ const SessionMenuButton = new Lang.Class({
Name: 'SessionList', Name: 'SessionMenuButton',
_init: function() { _init: function() {
let gearIcon = new St.Icon({ icon_name: 'emblem-system-symbolic' }); let gearIcon = new St.Icon({ icon_name: 'emblem-system-symbolic' });
@ -389,7 +395,7 @@ const SessionList = new Lang.Class({
} }
} }
}); });
Signals.addSignalMethods(SessionList.prototype); Signals.addSignalMethods(SessionMenuButton.prototype);
const LoginDialog = new Lang.Class({ const LoginDialog = new Lang.Class({
Name: 'LoginDialog', Name: 'LoginDialog',
@ -498,6 +504,8 @@ const LoginDialog = new Lang.Class({
y_fill: false, y_fill: false,
x_align: St.Align.START }); x_align: St.Align.START });
this._promptEntry.grab_key_focus();
this._promptMessage = new St.Label({ visible: false }); this._promptMessage = new St.Label({ visible: false });
this._promptBox.add(this._promptMessage, { x_fill: true }); this._promptBox.add(this._promptMessage, { x_fill: true });
@ -530,6 +538,7 @@ const LoginDialog = new Lang.Class({
x_fill: true }); x_fill: true });
this._notListedButton.connect('clicked', Lang.bind(this, this._hideUserListAndLogIn)); this._notListedButton.connect('clicked', Lang.bind(this, this._hideUserListAndLogIn));
this._notListedButton.hide();
this._userSelectionBox.add(this._notListedButton, this._userSelectionBox.add(this._notListedButton,
{ expand: false, { expand: false,
@ -565,34 +574,31 @@ const LoginDialog = new Lang.Class({
})); }));
this._defaultButtonWell = new St.Widget(); this._defaultButtonWell = new St.Widget();
this._defaultButtonWellMode = DefaultButtonWellMode.NONE;
this._sessionList = new SessionList(); this._sessionMenuButton = new SessionMenuButton();
this._sessionList.connect('session-activated', this._sessionMenuButton.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);
})); }));
this._sessionList.actor.opacity = 0; this._sessionMenuButton.actor.opacity = 0;
this._sessionList.actor.show(); this._sessionMenuButton.actor.show();
this._defaultButtonWell.add_child(this._sessionList.actor); this._defaultButtonWell.add_child(this._sessionMenuButton.actor);
let spinnerIcon = global.datadir + '/theme/process-working.svg'; let spinnerIcon = global.datadir + '/theme/process-working.svg';
this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, _WORK_SPINNER_ICON_SIZE); this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, _DEFAULT_BUTTON_WELL_ICON_SIZE);
this._workSpinner.actor.opacity = 0; this._workSpinner.actor.opacity = 0;
this._workSpinner.actor.show(); this._workSpinner.actor.show();
this._defaultButtonWell.add_child(this._workSpinner.actor); this._defaultButtonWell.add_child(this._workSpinner.actor);
this._sessionList.actor.add_constraint(new Clutter.AlignConstraint({ source: this._workSpinner.actor, this._sessionMenuButton.actor.add_constraint(new Clutter.AlignConstraint({ source: this._workSpinner.actor,
align_axis: Clutter.AlignAxis.BOTH, align_axis: Clutter.AlignAxis.BOTH,
factor: 0.5 })); factor: 0.5 }));
}, },
_updateDisableUserList: function() { _updateDisableUserList: function() {
let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY); let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
// If this is the first time around, set initial focus
if (this._disableUserList == undefined && disableUserList)
this.setInitialKeyFocus(this._promptEntry);
if (disableUserList != this._disableUserList) { if (disableUserList != this._disableUserList) {
this._disableUserList = disableUserList; this._disableUserList = disableUserList;
@ -645,57 +651,77 @@ const LoginDialog = new Lang.Class({
this._showUserList(); this._showUserList();
}, },
_setWorking: function(working) { _getActorForDefaultButtonWellMode: function(mode) {
if (!this._workSpinner) let actor;
if (mode == DefaultButtonWellMode.NONE)
actor = null;
else if (mode == DefaultButtonWellMode.SPINNER)
actor = this._workSpinner.actor;
else if (mode == DefaultButtonWellMode.SESSION_MENU_BUTTON)
actor = this._sessionMenuButton.actor;
return actor;
},
_setDefaultButtonWellMode: function(mode, immediately) {
if (this._defaultButtonWellMode == DefaultButtonWellMode.NONE &&
mode == DefaultButtonWellMode.NONE)
return; return;
Tweener.removeTweens(this._workSpinner.actor); let oldActor = this._getActorForDefaultButtonWellMode(this._defaultButtonWellMode);
if (working) {
if (this._sessionList.actor.opacity > 0) if (oldActor)
Tweener.addTween(this._sessionList.actor, Tweener.removeTweens(oldActor);
let actor = this._getActorForDefaultButtonWellMode(mode);
if (this._defaultButtonWellMode != mode && oldActor) {
if (immediately)
oldActor.opacity = 0;
else
Tweener.addTween(oldActor,
{ opacity: 0, { opacity: 0,
delay: _WORK_SPINNER_ANIMATION_DELAY, time: _DEFAULT_BUTTON_WELL_ANIMATION_TIME,
time: _WORK_SPINNER_ANIMATION_TIME, delay: _DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
transition: 'linear' transition: 'linear',
onCompleteScope: this,
onComplete: function() {
if (mode == DefaultButtonWellMode.SPINNER) {
if (this._workSpinner)
this._workSpinner.stop();
}
}
}); });
this._workSpinner.play();
Tweener.addTween(this._workSpinner.actor,
{ opacity: 255,
delay: _WORK_SPINNER_ANIMATION_DELAY,
time: _WORK_SPINNER_ANIMATION_TIME,
transition: 'linear'
});
} else {
if (this._sessionList.actor.opacity == 0 && this._shouldShowSessionList())
Tweener.addTween(this._sessionList.actor,
{ opacity: 255,
delay: _WORK_SPINNER_ANIMATION_DELAY,
time: _WORK_SPINNER_ANIMATION_TIME,
transition: 'linear'
});
Tweener.addTween(this._workSpinner.actor,
{ opacity: 0,
time: _WORK_SPINNER_ANIMATION_TIME,
transition: 'linear',
onCompleteScope: this,
onComplete: function() {
if (this._workSpinner)
this._workSpinner.stop();
}
});
} }
if (actor) {
if (mode == DefaultButtonWellMode.SPINNER)
this._workSpinner.play();
if (immediately)
actor.opacity = 255;
else
Tweener.addTween(actor,
{ opacity: 255,
time: _DEFAULT_BUTTON_WELL_ANIMATION_TIME,
delay: _DEFAULT_BUTTON_WELL_ANIMATION_DELAY,
transition: 'linear' });
}
this._defaultButtonWellMode = mode;
}, },
_verificationFailed: function() { _verificationFailed: function() {
this._promptEntry.text = ''; this._promptEntry.text = '';
this._updateSensitivity(true); this._updateSensitivity(true);
this._setWorking(false); this._setDefaultButtonWellMode(DefaultButtonWellMode.NONE, true);
}, },
_onDefaultSessionChanged: function(client, sessionId) { _onDefaultSessionChanged: function(client, sessionId) {
this._sessionList.setActiveSession(sessionId); this._sessionMenuButton.setActiveSession(sessionId);
}, },
_showMessage: function(userVerifier, message, styleClass) { _showMessage: function(userVerifier, message, styleClass) {
@ -726,7 +752,7 @@ const LoginDialog = new Lang.Class({
this._reset(); this._reset();
}, },
_shouldShowSessionList: function() { _shouldShowSessionMenuButton: function() {
if (this._verifyingUser) if (this._verifyingUser)
return true; return true;
@ -751,11 +777,10 @@ const LoginDialog = new Lang.Class({
time: _FADE_ANIMATION_TIME, time: _FADE_ANIMATION_TIME,
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
if (this._shouldShowSessionList()) { if (this._shouldShowSessionMenuButton())
this._sessionList.actor.opacity = 255; this._setDefaultButtonWellMode(DefaultButtonWellMode.SESSION_MENU_BUTTON, true);
} else { else
this._sessionList.actor.opacity = 0; this._setDefaultButtonWellMode(DefaultButtonWellMode.NONE, true);
}
this._promptEntry.grab_key_focus(); this._promptEntry.grab_key_focus();
@ -833,7 +858,7 @@ const LoginDialog = new Lang.Class({
_updateSensitivity: function(sensitive) { _updateSensitivity: function(sensitive) {
this._promptEntry.reactive = sensitive; this._promptEntry.reactive = sensitive;
this._promptEntry.clutter_text.editable = sensitive; this._promptEntry.clutter_text.editable = sensitive;
this._sessionList.updateSensitivity(sensitive); this._sessionMenuButton.updateSensitivity(sensitive);
this._updateSignInButtonSensitivity(sensitive); this._updateSignInButtonSensitivity(sensitive);
}, },
@ -855,7 +880,7 @@ const LoginDialog = new Lang.Class({
this._promptEntryActivateId = 0; this._promptEntryActivateId = 0;
} }
this._setWorking(false); this._setDefaultButtonWellMode(DefaultButtonWellMode.NONE, true);
this._promptBox.hide(); this._promptBox.hide();
this._promptLoginHint.hide(); this._promptLoginHint.hide();
@ -864,7 +889,7 @@ const LoginDialog = new Lang.Class({
this._updateSensitivity(true); this._updateSensitivity(true);
this._promptEntry.set_text(''); this._promptEntry.set_text('');
this._sessionList.close(); this._sessionMenuButton.close();
this._promptLoginHint.hide(); this._promptLoginHint.hide();
this._buttonBox.remove_all_children(); this._buttonBox.remove_all_children();
@ -886,7 +911,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._setDefaultButtonWellMode(DefaultButtonWellMode.SPINNER, false);
this._userVerifier.answerQuery(serviceName, text); this._userVerifier.answerQuery(serviceName, text);
}]; }];
@ -1107,6 +1132,7 @@ const LoginDialog = new Lang.Class({
_showUserList: function() { _showUserList: function() {
this._hidePrompt(); this._hidePrompt();
this._setUserListExpanded(true); this._setUserListExpanded(true);
this._notListedButton.show();
this._userList.actor.grab_key_focus(); this._userList.actor.grab_key_focus();
}, },

@ -142,23 +142,20 @@ const BackgroundCache = new Lang.Class({
cancellable: null, cancellable: null,
onFinished: null }); onFinished: null });
for (let i = 0; i < this._pendingFileLoads.length; i++) { let fileLoad = { filename: params.filename,
if (this._pendingFileLoads[i].filename == params.filename && style: params.style,
this._pendingFileLoads[i].style == params.style) { shouldCopy: false,
this._pendingFileLoads[i].callers.push({ shouldCopy: true, monitorIndex: params.monitorIndex,
monitorIndex: params.monitorIndex, effects: params.effects,
effects: params.effects, onFinished: params.onFinished,
onFinished: params.onFinished }); cancellable: new Gio.Cancellable(), };
return; this._pendingFileLoads.push(fileLoad);
}
}
this._pendingFileLoads.push({ filename: params.filename, if (params.cancellable) {
style: params.style, params.cancellable.connect(Lang.bind(this, function(c) {
callers: [{ shouldCopy: false, fileLoad.cancellable.cancel();
monitorIndex: params.monitorIndex, }));
effects: params.effects, }
onFinished: params.onFinished }] });
let content = new Meta.Background({ meta_screen: global.screen, let content = new Meta.Background({ meta_screen: global.screen,
monitor: params.monitorIndex, monitor: params.monitorIndex,
@ -166,9 +163,19 @@ const BackgroundCache = new Lang.Class({
content.load_file_async(params.filename, content.load_file_async(params.filename,
params.style, params.style,
params.cancellable, fileLoad.cancellable,
Lang.bind(this, Lang.bind(this,
function(object, result) { function(object, result) {
if (fileLoad.cancellable.is_cancelled()) {
if (params.cancellable && params.cancellable.is_cancelled()) {
if (params.onFinished)
params.onFinished(null);
this._removePendingFileLoad(fileLoad);
return;
}
return;
}
try { try {
content.load_file_finish(result); content.load_file_finish(result);
@ -178,22 +185,25 @@ const BackgroundCache = new Lang.Class({
content = null; content = null;
} }
let needsCopy = false;
for (let i = 0; i < this._pendingFileLoads.length; i++) { for (let i = 0; i < this._pendingFileLoads.length; i++) {
let pendingLoad = this._pendingFileLoads[i]; let pendingLoad = this._pendingFileLoads[i];
if (pendingLoad.filename != params.filename || if (pendingLoad.filename != params.filename ||
pendingLoad.style != params.style) pendingLoad.style != params.style)
continue; continue;
for (let j = 0; j < pendingLoad.callers.length; j++) { if (pendingLoad.cancellable.is_cancelled())
if (pendingLoad.callers[j].onFinished) { continue;
if (content && pendingLoad.callers[j].shouldCopy) {
content = object.copy(pendingLoad.callers[j].monitorIndex,
pendingLoad.callers[j].effects);
} pendingLoad.cancellable.cancel();
if (pendingLoad.onFinished) {
pendingLoad.callers[j].onFinished(content); if (content && needsCopy) {
content = object.copy(pendingLoad.monitorIndex,
pendingLoad.effects);
} }
needsCopy = true;
pendingLoad.onFinished(content);
} }
this._pendingFileLoads.splice(i, 1); this._pendingFileLoads.splice(i, 1);
@ -201,6 +211,15 @@ const BackgroundCache = new Lang.Class({
})); }));
}, },
_removePendingFileLoad: function(fileLoad) {
for (let i = 0; i < this._pendingFileLoads.length; i++) {
if (this._pendingFileLoads[i].cancellable == fileLoad.cancellable) {
this._pendingFileLoads.splice(i, 1);
break;
}
}
},
getImageContent: function(params) { getImageContent: function(params) {
params = Params.parse(params, { monitorIndex: 0, params = Params.parse(params, { monitorIndex: 0,
style: null, style: null,

@ -589,12 +589,12 @@ const BoxPointer = new Lang.Class({
return St.Side.TOP; return St.Side.TOP;
break; break;
case St.Side.LEFT: case St.Side.LEFT:
if (sourceAllocation.y2 + boxWidth > monitor.x + monitor.width && if (sourceAllocation.x2 + boxWidth > monitor.x + monitor.width &&
boxWidth < sourceAllocation.x1 - monitor.x) boxWidth < sourceAllocation.x1 - monitor.x)
return St.Side.RIGHT; return St.Side.RIGHT;
break; break;
case St.Side.RIGHT: case St.Side.RIGHT:
if (sourceAllocation.y1 - boxWidth < monitor.x && if (sourceAllocation.x1 - boxWidth < monitor.x &&
boxWidth < monitor.x + monitor.width - sourceAllocation.x2) boxWidth < monitor.x + monitor.width - sourceAllocation.x2)
return St.Side.LEFT; return St.Side.LEFT;
break; break;

@ -31,7 +31,7 @@ function shouldAutorunMount(mount, forTransient) {
if (!volume || (!volume.allowAutorun && forTransient)) if (!volume || (!volume.allowAutorun && forTransient))
return false; return false;
if (!root.is_native() || isMountRootHidden(root)) if (root.is_native() && isMountRootHidden(root))
return false; return false;
return true; return true;

@ -58,14 +58,10 @@ const CtrlAltTabManager = new Lang.Class({
}, },
focusGroup: function(item, timestamp) { focusGroup: function(item, timestamp) {
if (item.focusCallback) { if (item.focusCallback)
item.focusCallback(timestamp); item.focusCallback(timestamp);
} else { else
if (global.stage_input_mode == Shell.StageInputMode.NORMAL)
global.set_stage_input_mode(Shell.StageInputMode.FOCUSED);
item.root.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); item.root.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
}
}, },
// Sort the items into a consistent order; panel first, tray last, // Sort the items into a consistent order; panel first, tray last,
@ -136,8 +132,6 @@ const CtrlAltTabManager = new Lang.Class({
}, },
_focusWindows: function(timestamp) { _focusWindows: function(timestamp) {
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
global.stage.key_focus = null;
global.screen.focus_default_window(timestamp); global.screen.focus_default_window(timestamp);
} }
}); });

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const St = imports.gi.St; const St = imports.gi.St;
const Lang = imports.lang; const Lang = imports.lang;
@ -358,60 +359,65 @@ const _Draggable = new Lang.Class({
return true; return true;
}, },
_updateDragHover : function () {
let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
this._dragX, this._dragY);
let dragEvent = {
x: this._dragX,
y: this._dragY,
dragActor: this._dragActor,
source: this.actor._delegate,
targetActor: target
};
for (let i = 0; i < dragMonitors.length; i++) {
let motionFunc = dragMonitors[i].dragMotion;
if (motionFunc) {
let result = motionFunc(dragEvent);
if (result != DragMotionResult.CONTINUE) {
global.set_cursor(DRAG_CURSOR_MAP[result]);
return false;
}
}
}
while (target) {
if (target._delegate && target._delegate.handleDragOver) {
let [r, targX, targY] = target.transform_stage_point(this._dragX, this._dragY);
// We currently loop through all parents on drag-over even if one of the children has handled it.
// We can check the return value of the function and break the loop if it's true if we don't want
// to continue checking the parents.
let result = target._delegate.handleDragOver(this.actor._delegate,
this._dragActor,
targX,
targY,
0);
if (result != DragMotionResult.CONTINUE) {
global.set_cursor(DRAG_CURSOR_MAP[result]);
return false;
}
}
target = target.get_parent();
}
global.set_cursor(Shell.Cursor.DND_IN_DRAG);
return false;
},
_queueUpdateDragHover: function() {
if (this._updateHoverId)
GLib.source_remove(this._updateHoverId);
this._updateHoverId = GLib.idle_add(GLib.PRIORITY_DEFAULT,
Lang.bind(this, this._updateDragHover));
},
_updateDragPosition : function (event) { _updateDragPosition : function (event) {
let [stageX, stageY] = event.get_coords(); let [stageX, stageY] = event.get_coords();
this._dragX = stageX; this._dragX = stageX;
this._dragY = stageY; this._dragY = stageY;
this._dragActor.set_position(stageX + this._dragOffsetX,
stageY + this._dragOffsetY);
// If we are dragging, update the position this._queueUpdateDragHover();
if (this._dragActor) {
this._dragActor.set_position(stageX + this._dragOffsetX,
stageY + this._dragOffsetY);
let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
stageX, stageY);
// We call observers only once per motion with the innermost
// target actor. If necessary, the observer can walk the
// parent itself.
let dragEvent = {
x: stageX,
y: stageY,
dragActor: this._dragActor,
source: this.actor._delegate,
targetActor: target
};
for (let i = 0; i < dragMonitors.length; i++) {
let motionFunc = dragMonitors[i].dragMotion;
if (motionFunc) {
let result = motionFunc(dragEvent);
if (result != DragMotionResult.CONTINUE) {
global.set_cursor(DRAG_CURSOR_MAP[result]);
return true;
}
}
}
while (target) {
if (target._delegate && target._delegate.handleDragOver) {
let [r, targX, targY] = target.transform_stage_point(stageX, stageY);
// We currently loop through all parents on drag-over even if one of the children has handled it.
// We can check the return value of the function and break the loop if it's true if we don't want
// to continue checking the parents.
let result = target._delegate.handleDragOver(this.actor._delegate,
this._dragActor,
targX,
targY,
event.get_time());
if (result != DragMotionResult.CONTINUE) {
global.set_cursor(DRAG_CURSOR_MAP[result]);
return true;
}
}
target = target.get_parent();
}
global.set_cursor(Shell.Cursor.DND_IN_DRAG);
}
return true; return true;
}, },
@ -511,6 +517,11 @@ const _Draggable = new Lang.Class({
}, },
_cancelDrag: function(eventTime) { _cancelDrag: function(eventTime) {
if (this._updateHoverId) {
GLib.source_remove(this._updateHoverId);
this._updateHoverId = 0;
}
this.emit('drag-cancelled', eventTime); this.emit('drag-cancelled', eventTime);
this._dragInProgress = false; this._dragInProgress = false;
let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation(); let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation();

@ -32,13 +32,9 @@ const GrabHelper = new Lang.Class({
this._actors = []; this._actors = [];
this._capturedEventId = 0; this._capturedEventId = 0;
this._keyFocusNotifyId = 0;
this._focusWindowChangedId = 0;
this._ignoreRelease = false; this._ignoreRelease = false;
this._isUngrabbingCount = 0;
this._modalCount = 0; this._modalCount = 0;
this._grabFocusCount = 0;
}, },
// addActor: // addActor:
@ -118,38 +114,36 @@ const GrabHelper = new Lang.Class({
// grab: // grab:
// @params: A bunch of parameters, see below // @params: A bunch of parameters, see below
// //
// Grabs the mouse and keyboard, according to the GrabHelper's // The general effect of a "grab" is to ensure that the passed in actor
// parameters. If @newFocus is not %null, then the keyboard focus // and all actors inside the grab get exclusive control of the mouse and
// is moved to the first #StWidget:can-focus widget inside it. // keyboard, with the grab automatically being dropped if the user tries
// to dismiss it. The actor is passed in through @params.actor.
// //
// The grab will automatically be dropped if: // grab() can be called multiple times, with the scope of the grab being
// - The user clicks outside the grabbed actors // changed to a different actor every time. A nested grab does not have
// - The user types Escape // to have its grabbed actor inside the parent grab actors.
// - The keyboard focus is moved outside the grabbed actors
// - A window is focused
// //
// If @params.actor is not null, then it will be focused as the // Grabs can be automatically dropped if the user tries to dismiss it
// new actor. If you attempt to grab an already focused actor, the // in one of two ways: the user clicking outside the currently grabbed
// request to be focused will be ignored. The actor will not be // actor, or the user typing the Escape key.
// added to the grab stack, so do not call a paired ungrab().
// //
// If @params contains { modal: true }, then grab() will push a modal // If the user clicks outside the grabbed actors, and the clicked on
// on the owner of the GrabHelper. As long as there is at least one // actor is part of a previous grab in the stack, grabs will be popped
// { modal: true } actor on the grab stack, the grab will be kept. // until that grab is active. However, the click event will not be
// When the last { modal: true } actor is ungrabbed, then the modal // replayed to the actor.
// will be dropped. A modal grab can fail if there is already a grab
// in effect from aother application; in this case the function returns
// false and nothing happens. Non-modal grabs can never fail.
// //
// If @params contains { grabFocus: true }, then if you call grab() // If the user types the Escape key, one grab from the grab stack will
// while the shell is outside the overview, it will set the stage // be popped.
// input mode to %Shell.StageInputMode.FOCUSED, and ungrab() will //
// revert it back, and re-focus the previously-focused window (if // When a grab is popped by user interacting as described above, if you
// another window hasn't been explicitly focused before then). // pass a callback as @params.onUngrab, it will be called with %true.
//
// If @params.focus is not null, we'll set the key focus directly
// to that actor instead of navigating in @params.actor. This is for
// use cases like menus, where we want to grab the menu actor, but keep
// focus on the clicked on menu item.
grab: function(params) { grab: function(params) {
params = Params.parse(params, { actor: null, params = Params.parse(params, { actor: null,
modal: false,
grabFocus: false,
focus: null, focus: null,
onUngrab: null }); onUngrab: null });
@ -162,24 +156,18 @@ const GrabHelper = new Lang.Class({
params.savedFocus = focus; params.savedFocus = focus;
if (params.modal && !this._takeModalGrab()) if (!this._takeModalGrab())
return false;
if (params.grabFocus && !this._takeFocusGrab(hadFocus))
return false; return false;
this._grabStack.push(params); this._grabStack.push(params);
if (params.focus) { if (params.focus) {
params.focus.grab_key_focus(); params.focus.grab_key_focus();
} else if (newFocus && (hadFocus || params.grabFocus)) { } else if (newFocus && hadFocus) {
if (!newFocus.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false)) if (!newFocus.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false))
newFocus.grab_key_focus(); newFocus.grab_key_focus();
} }
if ((params.grabFocus || params.modal) && !this._capturedEventId)
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
return true; return true;
}, },
@ -188,6 +176,8 @@ const GrabHelper = new Lang.Class({
if (firstGrab) { if (firstGrab) {
if (!Main.pushModal(this._owner, this._modalParams)) if (!Main.pushModal(this._owner, this._modalParams))
return false; return false;
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
} }
this._modalCount++; this._modalCount++;
@ -199,56 +189,15 @@ const GrabHelper = new Lang.Class({
if (this._modalCount > 0) if (this._modalCount > 0)
return; return;
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
this._ignoreRelease = false;
Main.popModal(this._owner); Main.popModal(this._owner);
global.sync_pointer(); global.sync_pointer();
}, },
_takeFocusGrab: function(hadFocus) {
let firstGrab = (this._grabFocusCount == 0);
if (firstGrab) {
let metaDisplay = global.screen.get_display();
this._grabbedFromKeynav = hadFocus;
this._preGrabInputMode = global.stage_input_mode;
if (this._preGrabInputMode == Shell.StageInputMode.NORMAL)
global.set_stage_input_mode(Shell.StageInputMode.FOCUSED);
this._keyFocusNotifyId = global.stage.connect('notify::key-focus', Lang.bind(this, this._onKeyFocusChanged));
this._focusWindowChangedId = metaDisplay.connect('notify::focus-window', Lang.bind(this, this._focusWindowChanged));
}
this._grabFocusCount++;
return true;
},
_releaseFocusGrab: function() {
this._grabFocusCount--;
if (this._grabFocusCount > 0)
return;
if (this._keyFocusNotifyId > 0) {
global.stage.disconnect(this._keyFocusNotifyId);
this._keyFocusNotifyId = 0;
}
if (this._focusWindowChangedId > 0) {
let metaDisplay = global.screen.get_display();
metaDisplay.disconnect(this._focusWindowChangedId);
this._focusWindowChangedId = 0;
}
let prePopInputMode = global.stage_input_mode;
if (this._grabbedFromKeynav) {
if (this._preGrabInputMode == Shell.StageInputMode.FOCUSED &&
prePopInputMode != Shell.StageInputMode.FULLSCREEN)
global.set_stage_input_mode(Shell.StageInputMode.FOCUSED);
}
global.screen.focus_default_window(global.display.get_current_time_roundtrip());
},
// ignoreRelease: // ignoreRelease:
// //
// Make sure that the next button release event evaluated by the // Make sure that the next button release event evaluated by the
@ -262,10 +211,14 @@ const GrabHelper = new Lang.Class({
// ungrab: // ungrab:
// @params: The parameters for the grab; see below. // @params: The parameters for the grab; see below.
// //
// Pops an actor from the grab stack, potentially dropping the grab. // Pops @params.actor from the grab stack, potentially dropping
// the grab. If the actor is not on the grab stack, this call is
// ignored with no ill effects.
// //
// If the actor that was popped from the grab stack was not the actor // If the actor is not at the top of the grab stack, grabs are
// That was passed in, this call is ignored. // popped until the grabbed actor is at the top of the grab stack.
// The onUngrab callback for every grab is called for every popped
// grab with the parameter %false.
ungrab: function(params) { ungrab: function(params) {
params = Params.parse(params, { actor: this.currentGrab.actor, params = Params.parse(params, { actor: this.currentGrab.actor,
isUser: false }); isUser: false });
@ -274,14 +227,6 @@ const GrabHelper = new Lang.Class({
if (grabStackIndex < 0) if (grabStackIndex < 0)
return; return;
// We may get key focus changes when calling onUngrab, which
// would cause an extra ungrab() on the next actor in the
// stack, which is wrong. Ignore key focus changes during the
// ungrab, and restore the saved key focus ourselves afterwards.
// We use a count as ungrab() may be re-entrant, as onUngrab()
// may ungrab additional actors.
this._isUngrabbingCount++;
let focus = global.stage.key_focus; let focus = global.stage.key_focus;
let hadFocus = focus && this._isWithinGrabbedActor(focus); let hadFocus = focus && this._isWithinGrabbedActor(focus);
@ -296,18 +241,7 @@ const GrabHelper = new Lang.Class({
if (poppedGrab.onUngrab) if (poppedGrab.onUngrab)
poppedGrab.onUngrab(params.isUser); poppedGrab.onUngrab(params.isUser);
if (poppedGrab.modal) this._releaseModalGrab();
this._releaseModalGrab();
if (poppedGrab.grabFocus)
this._releaseFocusGrab();
}
if (!this.grabbed && this._capturedEventId > 0) {
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
this._ignoreRelease = false;
} }
if (hadFocus) { if (hadFocus) {
@ -315,8 +249,6 @@ const GrabHelper = new Lang.Class({
if (poppedGrab.savedFocus) if (poppedGrab.savedFocus)
poppedGrab.savedFocus.grab_key_focus(); poppedGrab.savedFocus.grab_key_focus();
} }
this._isUngrabbingCount--;
}, },
_onCapturedEvent: function(actor, event) { _onCapturedEvent: function(actor, event) {
@ -337,9 +269,6 @@ const GrabHelper = new Lang.Class({
return true; return true;
} }
if (!button && this._modalCount == 0)
return false;
if (this._isWithinGrabbedActor(event.get_source())) if (this._isWithinGrabbedActor(event.get_source()))
return false; return false;
@ -356,21 +285,6 @@ const GrabHelper = new Lang.Class({
return true; return true;
} }
return this._modalCount > 0; return true;
}, },
_onKeyFocusChanged: function() {
if (this._isUngrabbingCount > 0)
return;
let focus = global.stage.key_focus;
if (!focus || !this._isWithinGrabbedActor(focus))
this.ungrab({ isUser: true });
},
_focusWindowChanged: function() {
let metaDisplay = global.screen.get_display();
if (metaDisplay.focus_window != null)
this.ungrab({ isUser: true });
}
}); });

@ -528,17 +528,10 @@ const LayoutManager = new Lang.Class({
get focusIndex() { get focusIndex() {
let i = Main.layoutManager.primaryIndex; let i = Main.layoutManager.primaryIndex;
if (global.stage_input_mode == Shell.StageInputMode.FOCUSED || if (global.stage.key_focus != null)
global.stage_input_mode == Shell.StageInputMode.FULLSCREEN) { i = this.findIndexForActor(global.stage.key_focus);
let focusActor = global.stage.key_focus; else if (global.display.focus_window != null)
if (focusActor) i = global.display.focus_window.get_monitor();
i = this.findIndexForActor(focusActor);
} else {
let focusWindow = global.display.focus_window;
if (focusWindow)
i = focusWindow.get_monitor();
}
return i; return i;
}, },
@ -596,9 +589,13 @@ const LayoutManager = new Lang.Class({
// screen. So, we set no_clear_hint at the end of the animation. // screen. So, we set no_clear_hint at the end of the animation.
_prepareStartupAnimation: function() { _prepareStartupAnimation: function() {
// Set ourselves to FULLSCREEN input mode while the animation is running // During the initial transition, add a simple actor to block all events,
// so events don't get delivered to X11 windows (which are distorted by the animation) // so they don't get delivered to X11 windows that have been transformed.
global.stage_input_mode = Shell.StageInputMode.FULLSCREEN; this._coverPane = new Clutter.Actor({ opacity: 0,
width: global.screen_width,
height: global.screen_height,
reactive: true });
this.addChrome(this._coverPane);
if (Main.sessionMode.isGreeter) { if (Main.sessionMode.isGreeter) {
this.panelBox.translation_y = -this.panelBox.height; this.panelBox.translation_y = -this.panelBox.height;
@ -668,7 +665,8 @@ const LayoutManager = new Lang.Class({
// we no longer need to clear the stage // we no longer need to clear the stage
global.stage.no_clear_hint = true; global.stage.no_clear_hint = true;
global.stage_input_mode = Shell.StageInputMode.NORMAL; this._coverPane.destroy();
this._coverPane = null;
this._systemBackground.actor.destroy(); this._systemBackground.actor.destroy();
this._systemBackground = null; this._systemBackground = null;

@ -849,8 +849,9 @@ const LookingGlass = new Lang.Class({
this._updateFont(); this._updateFont();
// We want it to appear to slide out from underneath the panel // We want it to appear to slide out from underneath the panel
Main.layoutManager.panelBox.add_actor(this.actor); Main.uiGroup.add_actor(this.actor);
this.actor.lower_bottom(); Main.uiGroup.set_child_below_sibling(this.actor,
Main.layoutManager.panelBox);
Main.layoutManager.panelBox.connect('allocation-changed', Main.layoutManager.panelBox.connect('allocation-changed',
Lang.bind(this, this._queueResize)); Lang.bind(this, this._queueResize));
Main.layoutManager.keyboardBox.connect('allocation-changed', Main.layoutManager.keyboardBox.connect('allocation-changed',
@ -1072,7 +1073,7 @@ const LookingGlass = new Lang.Class({
let availableHeight = primary.height - Main.layoutManager.keyboardBox.height; let availableHeight = primary.height - Main.layoutManager.keyboardBox.height;
let myHeight = Math.min(primary.height * 0.7, availableHeight * 0.9); let myHeight = Math.min(primary.height * 0.7, availableHeight * 0.9);
this.actor.x = (primary.width - myWidth) / 2; this.actor.x = (primary.width - myWidth) / 2;
this._hiddenY = this.actor.get_parent().height - myHeight - 4; // -4 to hide the top corners this._hiddenY = Main.layoutManager.panelBox.height - myHeight - 4; // -4 to hide the top corners
this._targetY = this._hiddenY + myHeight; this._targetY = this._hiddenY + myHeight;
this.actor.y = this._hiddenY; this.actor.y = this._hiddenY;
this.actor.width = myWidth; this.actor.width = myWidth;

@ -356,8 +356,6 @@ function pushModal(actor, params) {
Meta.disable_unredirect_for_screen(global.screen); Meta.disable_unredirect_for_screen(global.screen);
} }
global.set_stage_input_mode(Shell.StageInputMode.FULLSCREEN);
modalCount += 1; modalCount += 1;
let actorDestroyId = actor.connect('destroy', function() { let actorDestroyId = actor.connect('destroy', function() {
let index = _findModal(actor); let index = _findModal(actor);
@ -406,7 +404,6 @@ function popModal(actor, timestamp) {
if (focusIndex < 0) { if (focusIndex < 0) {
global.stage.set_key_focus(null); global.stage.set_key_focus(null);
global.end_modal(timestamp); global.end_modal(timestamp);
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
keybindingMode = Shell.KeyBindingMode.NORMAL; keybindingMode = Shell.KeyBindingMode.NORMAL;
throw new Error('incorrect pop'); throw new Error('incorrect pop');
@ -454,7 +451,6 @@ function popModal(actor, timestamp) {
return; return;
global.end_modal(timestamp); global.end_modal(timestamp);
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
Meta.enable_unredirect_for_screen(global.screen); Meta.enable_unredirect_for_screen(global.screen);
keybindingMode = Shell.KeyBindingMode.NORMAL; keybindingMode = Shell.KeyBindingMode.NORMAL;
} }

@ -97,6 +97,65 @@ function _fixMarkup(text, allowMarkup) {
return GLib.markup_escape_text(text, -1); return GLib.markup_escape_text(text, -1);
} }
const FocusGrabber = new Lang.Class({
Name: 'FocusGrabber',
_init: function(actor) {
this._actor = actor;
this._prevKeyFocusActor = null;
this._focusActorChangedId = 0;
this._focused = false;
},
grabFocus: function() {
if (this._focused)
return;
this._prevFocusedWindow = global.display.focus_window;
this._prevKeyFocusActor = global.stage.get_key_focus();
this._focusActorChangedId = global.stage.connect('notify::key-focus', Lang.bind(this, this._focusActorChanged));
if (!this._actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false))
this._actor.grab_key_focus();
this._focused = true;
},
_focusUngrabbed: function() {
if (!this._focused)
return false;
if (this._focusActorChangedId > 0) {
global.stage.disconnect(this._focusActorChangedId);
this._focusActorChangedId = 0;
}
this._focused = false;
return true;
},
_focusActorChanged: function() {
let focusedActor = global.stage.get_key_focus();
if (!focusedActor || !this._actor.contains(focusedActor))
this._focusUngrabbed();
},
ungrabFocus: function() {
if (!this._focusUngrabbed())
return;
if (this._prevKeyFocusActor) {
global.stage.set_key_focus(this._prevKeyFocusActor);
this._prevKeyFocusActor = null;
} else {
let focusedActor = global.stage.get_key_focus();
if (focusedActor && this._actor.contains(focusedActor))
global.stage.set_key_focus(null);
}
}
});
const URLHighlighter = new Lang.Class({ const URLHighlighter = new Lang.Class({
Name: 'URLHighlighter', Name: 'URLHighlighter',
@ -1574,6 +1633,7 @@ const MessageTray = new Lang.Class({
this._notificationBin.set_y_align(Clutter.ActorAlign.START); this._notificationBin.set_y_align(Clutter.ActorAlign.START);
this._notificationWidget.add_actor(this._notificationBin); this._notificationWidget.add_actor(this._notificationBin);
this._notificationWidget.hide(); this._notificationWidget.hide();
this._notificationFocusGrabber = new FocusGrabber(this._notificationWidget);
this._notificationQueue = []; this._notificationQueue = [];
this._notification = null; this._notification = null;
this._notificationClickedId = 0; this._notificationClickedId = 0;
@ -1623,7 +1683,6 @@ const MessageTray = new Lang.Class({
{ keybindingMode: Shell.KeyBindingMode.MESSAGE_TRAY }); { keybindingMode: Shell.KeyBindingMode.MESSAGE_TRAY });
this._grabHelper.addActor(this._summaryBoxPointer.actor); this._grabHelper.addActor(this._summaryBoxPointer.actor);
this._grabHelper.addActor(this.actor); this._grabHelper.addActor(this.actor);
this._grabHelper.addActor(this._notificationWidget);
Main.layoutManager.connect('keyboard-visible-changed', Lang.bind(this, this._onKeyboardVisibleChanged)); Main.layoutManager.connect('keyboard-visible-changed', Lang.bind(this, this._onKeyboardVisibleChanged));
@ -1749,7 +1808,6 @@ const MessageTray = new Lang.Class({
let [x, y, mask] = global.get_pointer(); let [x, y, mask] = global.get_pointer();
this._contextMenu.setPosition(Math.round(x), Math.round(y)); this._contextMenu.setPosition(Math.round(x), Math.round(y));
this._grabHelper.grab({ actor: this._contextMenu.actor, this._grabHelper.grab({ actor: this._contextMenu.actor,
modal: true,
onUngrab: Lang.bind(this, function () { onUngrab: Lang.bind(this, function () {
this._contextMenu.close(BoxPointer.PopupAnimation.FULL); this._contextMenu.close(BoxPointer.PopupAnimation.FULL);
}) })
@ -2316,7 +2374,6 @@ const MessageTray = new Lang.Class({
_showTray: function() { _showTray: function() {
if (!this._grabHelper.grab({ actor: this.actor, if (!this._grabHelper.grab({ actor: this.actor,
modal: true,
onUngrab: Lang.bind(this, this._escapeTray) })) { onUngrab: Lang.bind(this, this._escapeTray) })) {
this._traySummoned = false; this._traySummoned = false;
return false; return false;
@ -2520,19 +2577,7 @@ const MessageTray = new Lang.Class({
}, },
_hideNotification: function() { _hideNotification: function() {
// HACK! this._notificationFocusGrabber.ungrabFocus();
// There seems to be a reentrancy issue in calling .ungrab() here,
// which causes _updateState to be called before _notificationState
// becomes HIDING. That hides the notification again, nullifying the
// object but not setting _notificationState (and that's the weird part)
// As then _notificationState is stuck into SHOWN but _notification
// is null, every new _updateState fails and the message tray is
// lost forever.
//
// See more at https://bugzilla.gnome.org/show_bug.cgi?id=683986
this._notificationState = State.HIDING;
this._grabHelper.ungrab({ actor: this._notification.actor });
if (this._notificationExpandedId) { if (this._notificationExpandedId) {
this._notification.disconnect(this._notificationExpandedId); this._notification.disconnect(this._notificationExpandedId);
@ -2630,8 +2675,7 @@ const MessageTray = new Lang.Class({
}, },
_ensureNotificationFocused: function() { _ensureNotificationFocused: function() {
this._grabHelper.grab({ actor: this._notification.actor, this._notificationFocusGrabber.grabFocus();
grabFocus: true });
}, },
_onSourceDoneDisplayingContent: function(source, closeTray) { _onSourceDoneDisplayingContent: function(source, closeTray) {
@ -2674,7 +2718,6 @@ const MessageTray = new Lang.Class({
this._summaryBoxPointer.bin.child = child; this._summaryBoxPointer.bin.child = child;
this._grabHelper.grab({ actor: this._summaryBoxPointer.bin.child, this._grabHelper.grab({ actor: this._summaryBoxPointer.bin.child,
modal: true,
onUngrab: Lang.bind(this, this._onSummaryBoxPointerUngrabbed) }); onUngrab: Lang.bind(this, this._onSummaryBoxPointerUngrabbed) });
this._summaryBoxPointer.actor.opacity = 0; this._summaryBoxPointer.actor.opacity = 0;

@ -79,9 +79,8 @@ const ModalDialog = new Lang.Class({
this.dialogLayout = new St.BoxLayout({ style_class: 'modal-dialog', this.dialogLayout = new St.BoxLayout({ style_class: 'modal-dialog',
vertical: true }); vertical: true });
if (params.styleClass != null) { if (params.styleClass != null)
this.dialogLayout.add_style_class_name(params.styleClass); this.dialogLayout.add_style_class_name(params.styleClass);
}
if (!this._shellReactive) { if (!this._shellReactive) {
this._lightbox = new Lightbox.Lightbox(this._group, this._lightbox = new Lightbox.Lightbox(this._group,
@ -357,8 +356,9 @@ const ModalDialog = new Lang.Class({
if (this._savedKeyFocus) { if (this._savedKeyFocus) {
this._savedKeyFocus.grab_key_focus(); this._savedKeyFocus.grab_key_focus();
this._savedKeyFocus = null; this._savedKeyFocus = null;
} else } else {
this._initialKeyFocus.grab_key_focus(); this._initialKeyFocus.grab_key_focus();
}
if (!this._shellReactive) if (!this._shellReactive)
this._eventBlocker.lower_bottom(); this._eventBlocker.lower_bottom();

@ -148,7 +148,7 @@ const Overview = new Lang.Class({
// Dash elements, or mouseover handlers in the workspaces. // Dash elements, or mouseover handlers in the workspaces.
this._coverPane = new Clutter.Actor({ opacity: 0, this._coverPane = new Clutter.Actor({ opacity: 0,
reactive: true }); reactive: true });
this._overview.add_actor(this._coverPane); this._stack.add_actor(this._coverPane);
this._coverPane.connect('event', Lang.bind(this, function (actor, event) { return true; })); this._coverPane.connect('event', Lang.bind(this, function (actor, event) { return true; }));
this._stack.add_actor(this._overview); this._stack.add_actor(this._overview);

@ -449,7 +449,7 @@ const AppMenuButton = new Lang.Class({
// If the app has just lost focus to the panel, pretend // If the app has just lost focus to the panel, pretend
// nothing happened; otherwise you can't keynav to the // nothing happened; otherwise you can't keynav to the
// app menu. // app menu.
if (global.stage_input_mode == Shell.StageInputMode.FOCUSED) if (global.stage.key_focus != null)
return; return;
} }
this._sync(); this._sync();

@ -1701,7 +1701,7 @@ const PopupMenuManager = new Lang.Class({
if (open) { if (open) {
if (this.activeMenu && !this.activeMenu.isChildMenu(menu)) if (this.activeMenu && !this.activeMenu.isChildMenu(menu))
this.activeMenu.close(BoxPointer.PopupAnimation.FADE); this.activeMenu.close(BoxPointer.PopupAnimation.FADE);
this._grabHelper.grab({ actor: menu.actor, modal: true, focus: menu.sourceActor, this._grabHelper.grab({ actor: menu.actor, focus: menu.sourceActor,
onUngrab: Lang.bind(this, this._closeMenu, menu) }); onUngrab: Lang.bind(this, this._closeMenu, menu) });
} else { } else {
this._grabHelper.ungrab({ actor: menu.actor }); this._grabHelper.ungrab({ actor: menu.actor });

@ -720,6 +720,8 @@ const ScreenShield = new Lang.Class({
}, },
_onDragEnd: function(action, actor, eventX, eventY, modifiers) { _onDragEnd: function(action, actor, eventX, eventY, modifiers) {
if (this._lockScreenState != MessageTray.State.HIDING)
return;
if (this._lockScreenGroup.y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) { if (this._lockScreenGroup.y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) {
// Complete motion automatically // Complete motion automatically
let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0); let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0);
@ -762,19 +764,6 @@ const ScreenShield = new Lang.Class({
} }
} }
if (!this._becomeModal()) {
// We could not become modal, so we can't activate the
// screenshield. The user is probably very upset at this
// point, but any application using global grabs is broken
// Just tell him to stop using this app
//
// XXX: another option is to kick the user into the gdm login
// screen, where we're not affected by grabs
Main.notifyError(_("Unable to lock"),
_("Lock was blocked by an application"));
return;
}
if (this._lightbox.actor.visible || if (this._lightbox.actor.visible ||
this._isActive) { this._isActive) {
// We're either shown and active, or in the process of // We're either shown and active, or in the process of
@ -788,6 +777,19 @@ const ScreenShield = new Lang.Class({
return; return;
} }
if (!this._becomeModal()) {
// We could not become modal, so we can't activate the
// screenshield. The user is probably very upset at this
// point, but any application using global grabs is broken
// Just tell him to stop using this app
//
// XXX: another option is to kick the user into the gdm login
// screen, where we're not affected by grabs
Main.notifyError(_("Unable to lock"),
_("Lock was blocked by an application"));
return;
}
this._lightbox.show(); this._lightbox.show();
if (this._activationTime == 0) if (this._activationTime == 0)

@ -1528,7 +1528,7 @@ const NMApplet = new Lang.Class({
this._client.connect('notify::manager-running', Lang.bind(this, this._syncNMState)); this._client.connect('notify::manager-running', Lang.bind(this, this._syncNMState));
this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState)); this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState));
this._client.connect('notify::state', Lang.bind(this, this._syncNMState)); this._client.connect('notify::state', Lang.bind(this, this._syncNMState));
this._client.connect('notify::active-connections', Lang.bind(this, this._updateIcon)); this._client.connect('notify::active-connections', Lang.bind(this, this._syncActiveConnections));
this._client.connect('device-added', Lang.bind(this, this._deviceAdded)); this._client.connect('device-added', Lang.bind(this, this._deviceAdded));
this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved)); this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
this._settings.connect('new-connection', Lang.bind(this, this._newConnection)); this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
@ -1761,8 +1761,8 @@ const NMApplet = new Lang.Class({
let a = this._activeConnections[i]; let a = this._activeConnections[i];
if (!a._inited) { if (!a._inited) {
a._notifyDefaultId = a.connect('notify::default', Lang.bind(this, this._updateIcon)); a._notifyDefaultId = a.connect('notify::default', Lang.bind(this, this._syncActiveConnections));
a._notifyDefault6Id = a.connect('notify::default6', Lang.bind(this, this._updateIcon)); a._notifyDefault6Id = a.connect('notify::default6', Lang.bind(this, this._syncActiveConnections));
a._notifyStateId = a.connect('notify::state', Lang.bind(this, this._notifyActivated)); a._notifyStateId = a.connect('notify::state', Lang.bind(this, this._notifyActivated));
a._inited = true; a._inited = true;
@ -1814,6 +1814,7 @@ const NMApplet = new Lang.Class({
if (this._mainConnection) { if (this._mainConnection) {
let dev = this._mainConnection._primaryDevice; let dev = this._mainConnection._primaryDevice;
this._mainConnectionIconChangedId = dev.connect('icon-changed', Lang.bind(this, this._updateIcon)); this._mainConnectionIconChangedId = dev.connect('icon-changed', Lang.bind(this, this._updateIcon));
this._updateIcon();
} }
}, },
@ -1824,7 +1825,7 @@ const NMApplet = new Lang.Class({
activeConnection._primaryDevice._notification = null; activeConnection._primaryDevice._notification = null;
} }
this._updateIcon(); this._syncActiveConnections();
}, },
_ignoreConnection: function(connection) { _ignoreConnection: function(connection) {
@ -1861,7 +1862,7 @@ const NMApplet = new Lang.Class({
_newConnection: function(settings, connection) { _newConnection: function(settings, connection) {
this._addConnection(connection); this._addConnection(connection);
this._updateIcon(); this._syncActiveConnections();
}, },
_connectionRemoved: function(connection) { _connectionRemoved: function(connection) {
@ -1940,11 +1941,10 @@ const NMApplet = new Lang.Class({
} }
this._showNormal(); this._showNormal();
this._updateIcon(); this._syncActiveConnections();
}, },
_updateIcon: function() { _updateIcon: function() {
this._syncActiveConnections();
let hasApIcon = false; let hasApIcon = false;
let hasMobileIcon = false; let hasMobileIcon = false;

@ -479,6 +479,10 @@ const WindowManager = new Lang.Class({
false, -1, 1); false, -1, 1);
}, },
keepWorkspaceAlive: function(workspace, duration) {
this._workspaceTracker.keepWorkspaceAlive(workspace, duration);
},
setCustomKeybindingHandler: function(name, modes, handler) { setCustomKeybindingHandler: function(name, modes, handler) {
if (Meta.keybindings_set_custom_handler(name, handler)) if (Meta.keybindings_set_custom_handler(name, handler))
this.allowKeybinding(name, modes); this.allowKeybinding(name, modes);

@ -127,7 +127,7 @@ const WindowClone = new Lang.Class({
if (this._stackAbove == null) if (this._stackAbove == null)
return null; return null;
if (this.inDrag || this._zooming) { if (this.inDrag) {
if (this._stackAbove._delegate) if (this._stackAbove._delegate)
return this._stackAbove._delegate.getActualStackAbove(); return this._stackAbove._delegate.getActualStackAbove();
else else
@ -997,7 +997,7 @@ const Workspace = new Lang.Class({
this._dropRect.set_position(geom.x, geom.y); this._dropRect.set_position(geom.x, geom.y);
this._dropRect.set_size(geom.width, geom.height); this._dropRect.set_size(geom.width, geom.height);
this._updateWindowPositions(WindowPositionFlags.NONE); this._updateWindowPositions(Main.overview.animationInProgress ? WindowPositionFlags.ANIMATE : WindowPositionFlags.NONE);
this._actualGeometryLater = 0; this._actualGeometryLater = 0;
return false; return false;

@ -764,8 +764,8 @@ const ThumbnailsBox = new Lang.Class({
// to open its first window within some time, as tracked by Shell.WindowTracker. // to open its first window within some time, as tracked by Shell.WindowTracker.
// Here, we only add a very brief timeout to avoid the _immediate_ removal of the // Here, we only add a very brief timeout to avoid the _immediate_ removal of the
// workspace while we wait for the startup sequence to load. // workspace while we wait for the startup sequence to load.
Main.keepWorkspaceAlive(global.screen.get_workspace_by_index(newWorkspaceIndex), Main.wm.keepWorkspaceAlive(global.screen.get_workspace_by_index(newWorkspaceIndex),
WORKSPACE_KEEP_ALIVE_TIME); WORKSPACE_KEEP_ALIVE_TIME);
} }
// Start the animation on the workspace (which is actually // Start the animation on the workspace (which is actually

@ -446,7 +446,7 @@ const WorkspacesDisplay = new Lang.Class({
_init: function() { _init: function() {
this.actor = new St.Widget({ clip_to_allocation: true }); this.actor = new St.Widget({ clip_to_allocation: true });
this.actor.connect('notify::allocation', Lang.bind(this, this._allocationChanged)); this.actor.connect('notify::allocation', Lang.bind(this, this._updateWorkspacesActualGeometry));
this.actor.connect('parent-set', Lang.bind(this, this._parentSet)); this.actor.connect('parent-set', Lang.bind(this, this._parentSet));
let clickAction = new Clutter.ClickAction() let clickAction = new Clutter.ClickAction()
@ -676,12 +676,6 @@ const WorkspacesDisplay = new Lang.Class({
} }
}, },
_allocationChanged: function() {
if (Main.overview.animationInProgress)
return;
this._updateWorkspacesActualGeometry();
},
_updateWorkspacesActualGeometry: function() { _updateWorkspacesActualGeometry: function() {
if (!this._workspacesViews.length) if (!this._workspacesViews.length)
return; return;

378
po/cs.po

@ -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-05-28 07:17+0000\n" "POT-Creation-Date: 2013-06-27 11:02+0000\n"
"PO-Revision-Date: 2013-05-29 12:26+0200\n" "PO-Revision-Date: 2013-06-28 18:32+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"
@ -333,7 +333,8 @@ 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."
msgstr "" msgstr ""
"Když běží GNOME Shell, tento klíč přepíše klíč v org.gnome.desktop.wm.preferences" "Když běží GNOME Shell, tento klíč přepíše klíč v org.gnome.desktop.wm."
"preferences"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46 #: ../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"
@ -362,37 +363,41 @@ 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:371 #: ../js/gdm/loginDialog.js:308
msgid "Session" msgid "Choose Session"
msgstr "Sezení" msgstr "Vybrat sezení"
#: ../js/gdm/loginDialog.js:326
msgid "Session"
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:601 #: ../js/gdm/loginDialog.js:528
msgid "Not listed?" msgid "Not listed?"
msgstr "Nejste na seznamu?" msgstr "Nejste na seznamu?"
#: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:810 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376 #: ../js/ui/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:96 #: ../js/ui/status/bluetooth.js:449 ../js/ui/unlockDialog.js:95
#: ../js/ui/userMenu.js:938 #: ../js/ui/userMenu.js:884
msgid "Cancel" msgid "Cancel"
msgstr "Zrušit" msgstr "Zrušit"
#: ../js/gdm/loginDialog.js:791 #: ../js/gdm/loginDialog.js:833
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Přihlásit se" msgstr "Přihlásit se"
#: ../js/gdm/loginDialog.js:791 #: ../js/gdm/loginDialog.js:833
msgid "Next" msgid "Next"
msgstr "Následující" msgstr "Následující"
#. Translators: this message is shown below the username entry field #. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm #. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:888 #: ../js/gdm/loginDialog.js:934
#, c-format #, c-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(např. uživatel nebo %s)" msgstr "(např. uživatel nebo %s)"
@ -400,12 +405,12 @@ 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:892 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:938 ../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:1158 #: ../js/gdm/loginDialog.js:1205
msgid "Login Window" msgid "Login Window"
msgstr "Přihlašovací okno" msgstr "Přihlašovací okno"
@ -414,8 +419,8 @@ msgstr "Přihlašovací okno"
msgid "Power" msgid "Power"
msgstr "Vypnout" msgstr "Vypnout"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:651 ../js/ui/userMenu.js:655
#: ../js/ui/userMenu.js:816 #: ../js/ui/userMenu.js:768
msgid "Suspend" msgid "Suspend"
msgstr "Uspat do paměti" msgstr "Uspat do paměti"
@ -423,18 +428,18 @@ msgstr "Uspat do paměti"
msgid "Restart" msgid "Restart"
msgstr "Restartovat" msgstr "Restartovat"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:653
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942 #: ../js/ui/userMenu.js:655 ../js/ui/userMenu.js:767 ../js/ui/userMenu.js:888
msgid "Power Off" msgid "Power Off"
msgstr "Vypnout" msgstr "Vypnout"
#: ../js/gdm/util.js:247 #: ../js/gdm/util.js:248
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:364 #: ../js/gdm/util.js:365
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(nebo otiskněte prst)" msgstr "(nebo otiskněte prst)"
@ -453,23 +458,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:361 #: ../js/ui/appDisplay.js:397
msgid "Frequent" msgid "Frequent"
msgstr "Časté" msgstr "Časté"
#: ../js/ui/appDisplay.js:368 #: ../js/ui/appDisplay.js:404
msgid "All" msgid "All"
msgstr "Všechny" msgstr "Všechny"
#: ../js/ui/appDisplay.js:960 #: ../js/ui/appDisplay.js:996
msgid "New Window" msgid "New Window"
msgstr "Nové okno" msgstr "Nové okno"
#: ../js/ui/appDisplay.js:963 ../js/ui/dash.js:284 #: ../js/ui/appDisplay.js:999 ../js/ui/dash.js:284
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Odstranit z oblíbených" msgstr "Odstranit z oblíbených"
#: ../js/ui/appDisplay.js:964 #: ../js/ui/appDisplay.js:1000
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Přidat mezi oblíbené" msgstr "Přidat mezi oblíbené"
@ -483,7 +488,7 @@ msgstr "%s byl přidán mezi oblíbené."
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s byl odstraněn z oblíbených." msgstr "%s byl odstraněn z oblíbených."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789 #: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:744
msgid "Settings" msgid "Settings"
msgstr "Nastavení" msgstr "Nastavení"
@ -608,35 +613,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:735 #: ../js/ui/calendar.js:750
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:751 #: ../js/ui/calendar.js:768
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:754 #: ../js/ui/calendar.js:771
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:764 #: ../js/ui/calendar.js:782
msgid "Today" msgid "Today"
msgstr "Dnes" msgstr "Dnes"
#: ../js/ui/calendar.js:768 #: ../js/ui/calendar.js:786
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Zítra" msgstr "Zítra"
#: ../js/ui/calendar.js:779 #: ../js/ui/calendar.js:797
msgid "This week" msgid "This week"
msgstr "Tento týden" msgstr "Tento týden"
#: ../js/ui/calendar.js:787 #: ../js/ui/calendar.js:805
msgid "Next week" msgid "Next week"
msgstr "Následující týden" msgstr "Následující týden"
@ -825,14 +830,14 @@ msgstr "<b>%d.</b> <b>%B</b> <b>%Y</b>, <b>%H:%M</b> "
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
#: ../js/ui/components/telepathyClient.js:985 #: ../js/ui/components/telepathyClient.js:986
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s je teď znám jako %s" msgstr "%s je teď znám jako %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1088 #: ../js/ui/components/telepathyClient.js:1089
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Pozvánka na připojení k %s" msgstr "Pozvánka na připojení k %s"
@ -840,38 +845,38 @@ msgstr "Pozvánka na připojení k %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. #. * for example.
#: ../js/ui/components/telepathyClient.js:1096 #: ../js/ui/components/telepathyClient.js:1097
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s vás zve do %s" msgstr "%s vás zve do %s"
#: ../js/ui/components/telepathyClient.js:1098 #: ../js/ui/components/telepathyClient.js:1099
#: ../js/ui/components/telepathyClient.js:1137 #: ../js/ui/components/telepathyClient.js:1138
#: ../js/ui/components/telepathyClient.js:1177 #: ../js/ui/components/telepathyClient.js:1178
#: ../js/ui/components/telepathyClient.js:1240 #: ../js/ui/components/telepathyClient.js:1241
msgid "Decline" msgid "Decline"
msgstr "Odmítnout" msgstr "Odmítnout"
#: ../js/ui/components/telepathyClient.js:1099 #: ../js/ui/components/telepathyClient.js:1100
#: ../js/ui/components/telepathyClient.js:1178 #: ../js/ui/components/telepathyClient.js:1179
#: ../js/ui/components/telepathyClient.js:1241 #: ../js/ui/components/telepathyClient.js:1242
msgid "Accept" msgid "Accept"
msgstr "Přijmout" msgstr "Přijmout"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1129 #: ../js/ui/components/telepathyClient.js:1130
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Videohovor od %s" msgstr "Videohovor od %s"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1132 #: ../js/ui/components/telepathyClient.js:1133
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Hovor od %s" msgstr "Hovor od %s"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
#: ../js/ui/components/telepathyClient.js:1139 #: ../js/ui/components/telepathyClient.js:1140
msgid "Answer" msgid "Answer"
msgstr "Zvednout" msgstr "Zvednout"
@ -880,110 +885,110 @@ msgstr "Zvednout"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/components/telepathyClient.js:1171 #: ../js/ui/components/telepathyClient.js:1172
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s vám posílá %s" msgstr "%s vám posílá %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1206 #: ../js/ui/components/telepathyClient.js:1207
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s vás žádá o oprávnění vidět, že jste dostupní" msgstr "%s vás žádá o oprávnění vidět, že jste dostupní"
#: ../js/ui/components/telepathyClient.js:1298 #: ../js/ui/components/telepathyClient.js:1299
msgid "Network error" msgid "Network error"
msgstr "Chyba sítě" msgstr "Chyba sítě"
#: ../js/ui/components/telepathyClient.js:1300 #: ../js/ui/components/telepathyClient.js:1301
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Ověření selhalo" msgstr "Ověření selhalo"
#: ../js/ui/components/telepathyClient.js:1302 #: ../js/ui/components/telepathyClient.js:1303
msgid "Encryption error" msgid "Encryption error"
msgstr "Chyba šifrování" msgstr "Chyba šifrování"
#: ../js/ui/components/telepathyClient.js:1304 #: ../js/ui/components/telepathyClient.js:1305
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Certifikát neposkytnut" msgstr "Certifikát neposkytnut"
#: ../js/ui/components/telepathyClient.js:1306 #: ../js/ui/components/telepathyClient.js:1307
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Nedůvěryhodný certifikát" msgstr "Nedůvěryhodný certifikát"
#: ../js/ui/components/telepathyClient.js:1308 #: ../js/ui/components/telepathyClient.js:1309
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Platnost certifikátu vypršela" msgstr "Platnost certifikátu vypršela"
#: ../js/ui/components/telepathyClient.js:1310 #: ../js/ui/components/telepathyClient.js:1311
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Certifikát není aktivován" msgstr "Certifikát není aktivován"
#: ../js/ui/components/telepathyClient.js:1312 #: ../js/ui/components/telepathyClient.js:1313
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Název počítače certifikátu nesouhlasí" msgstr "Název počítače certifikátu nesouhlasí"
#: ../js/ui/components/telepathyClient.js:1314 #: ../js/ui/components/telepathyClient.js:1315
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Otisk prstu certifikátu nesouhlasí" msgstr "Otisk prstu certifikátu nesouhlasí"
#: ../js/ui/components/telepathyClient.js:1316 #: ../js/ui/components/telepathyClient.js:1317
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Certifikát je podepsán sám sebou" msgstr "Certifikát je podepsán sám sebou"
#: ../js/ui/components/telepathyClient.js:1318 #: ../js/ui/components/telepathyClient.js:1319
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "Stav nastaven na „Odhlášen“" msgstr "Stav nastaven na „Odhlášen“"
#: ../js/ui/components/telepathyClient.js:1320 #: ../js/ui/components/telepathyClient.js:1321
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Šifrování není dostupné" msgstr "Šifrování není dostupné"
#: ../js/ui/components/telepathyClient.js:1322 #: ../js/ui/components/telepathyClient.js:1323
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "Certifikát je neplatný" msgstr "Certifikát je neplatný"
#: ../js/ui/components/telepathyClient.js:1324 #: ../js/ui/components/telepathyClient.js:1325
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Spojení bylo odmítnuto" msgstr "Spojení bylo odmítnuto"
#: ../js/ui/components/telepathyClient.js:1326 #: ../js/ui/components/telepathyClient.js:1327
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "Spojení nemohlo bát navázáno" msgstr "Spojení nemohlo bát navázáno"
#: ../js/ui/components/telepathyClient.js:1328 #: ../js/ui/components/telepathyClient.js:1329
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Spojení bylo ztraceno" msgstr "Spojení bylo ztraceno"
#: ../js/ui/components/telepathyClient.js:1330 #: ../js/ui/components/telepathyClient.js:1331
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "Tento účet je již připojen k serveru" msgstr "Tento účet je již připojen k serveru"
#: ../js/ui/components/telepathyClient.js:1332 #: ../js/ui/components/telepathyClient.js:1333
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "Spojení bylo nahrazeno novým spojením, které používá stejný zdroj" msgstr "Spojení bylo nahrazeno novým spojením, které používá stejný zdroj"
#: ../js/ui/components/telepathyClient.js:1334 #: ../js/ui/components/telepathyClient.js:1335
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "Takový účet již na serveru existuje" msgstr "Takový účet již na serveru existuje"
#: ../js/ui/components/telepathyClient.js:1336 #: ../js/ui/components/telepathyClient.js:1337
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "Server je právě příliš zaneprázdněn na to, aby obsloužil spojení" msgstr "Server je právě příliš zaneprázdněn na to, aby obsloužil spojení"
#: ../js/ui/components/telepathyClient.js:1338 #: ../js/ui/components/telepathyClient.js:1339
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Certifikát byl odvolán" msgstr "Certifikát byl odvolán"
#: ../js/ui/components/telepathyClient.js:1340 #: ../js/ui/components/telepathyClient.js:1341
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"Certifikát používá nepříliš bezpečný šifrovací algoritmus nebo je z " "Certifikát používá nepříliš bezpečný šifrovací algoritmus nebo je z "
"kryptografického hlediska slabý" "kryptografického hlediska slabý"
#: ../js/ui/components/telepathyClient.js:1342 #: ../js/ui/components/telepathyClient.js:1343
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
@ -991,22 +996,22 @@ msgstr ""
"Délka certifikátu serveru nebo délka zřetězených certifikátů serveru " "Délka certifikátu serveru nebo délka zřetězených certifikátů serveru "
"přesáhla omezení dané kryptografickou knihovnou" "přesáhla omezení dané kryptografickou knihovnou"
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1345
msgid "Internal error" msgid "Internal error"
msgstr "Vnitřní chyba" msgstr "Vnitřní chyba"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1354 #: ../js/ui/components/telepathyClient.js:1355
#, c-format #, c-format
msgid "Unable to connect to %s" msgid "Unable to connect to %s"
msgstr "Nelze se připojit k „%s“" msgstr "Nelze se připojit k „%s“"
#: ../js/ui/components/telepathyClient.js:1359 #: ../js/ui/components/telepathyClient.js:1360
msgid "View account" msgid "View account"
msgstr "Zobrazit účet" msgstr "Zobrazit účet"
#: ../js/ui/components/telepathyClient.js:1398 #: ../js/ui/components/telepathyClient.js:1399
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Neznámý důvod" msgstr "Neznámý důvod"
@ -1020,19 +1025,19 @@ msgstr "Zobrazit aplikace"
#. Translators: this is the name of the dock/favorites area on #. Translators: this is the name of the dock/favorites area on
#. the left of the overview #. the left of the overview
#: ../js/ui/dash.js:435 #: ../js/ui/dash.js:439
msgid "Dash" msgid "Dash"
msgstr "Oblíbené" msgstr "Oblíbené"
#: ../js/ui/dateMenu.js:86 #: ../js/ui/dateMenu.js:85
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Otevřít kalendář" msgstr "Otevřít kalendář"
#: ../js/ui/dateMenu.js:90 #: ../js/ui/dateMenu.js:89
msgid "Open Clocks" msgid "Open Clocks"
msgstr "Otevřít Hodiny" msgstr "Otevřít Hodiny"
#: ../js/ui/dateMenu.js:97 #: ../js/ui/dateMenu.js:96
msgid "Date & Time Settings" msgid "Date & Time Settings"
msgstr "Nastavení data a času" msgstr "Nastavení data a času"
@ -1040,7 +1045,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:208 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e. %B, %Y" msgstr "%A, %e. %B, %Y"
@ -1215,15 +1220,15 @@ msgstr "Vymazat zprávy"
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Nastavení upozornění" msgstr "Nastavení upozornění"
#: ../js/ui/messageTray.js:1707 #: ../js/ui/messageTray.js:1711
msgid "No Messages" msgid "No Messages"
msgstr "Žádné zprávy" msgstr "Žádné zprávy"
#: ../js/ui/messageTray.js:1780 #: ../js/ui/messageTray.js:1784
msgid "Message Tray" msgid "Message Tray"
msgstr "Lišta zpráv" msgstr "Lišta zpráv"
#: ../js/ui/messageTray.js:2805 #: ../js/ui/messageTray.js:2811
msgid "System Information" msgid "System Information"
msgstr "Informace o systému" msgstr "Informace o systému"
@ -1232,7 +1237,7 @@ msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Neznámé" msgstr "Neznámé"
#: ../js/ui/overviewControls.js:472 ../js/ui/screenShield.js:150 #: ../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"
@ -1256,17 +1261,17 @@ msgstr "Přehled"
msgid "Type to search…" msgid "Type to search…"
msgstr "Vyhledávejte psaním…" msgstr "Vyhledávejte psaním…"
#: ../js/ui/panel.js:642 #: ../js/ui/panel.js:567
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:693 #: ../js/ui/panel.js:618
msgid "Activities" msgid "Activities"
msgstr "Činnosti" msgstr "Činnosti"
#: ../js/ui/panel.js:989 #: ../js/ui/panel.js:914
msgid "Top Bar" msgid "Top Bar"
msgstr "Horní lišta" msgstr "Horní lišta"
@ -1275,7 +1280,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:738 #: ../js/ui/popupMenu.js:549
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1301,7 +1306,7 @@ 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:449 ../js/ui/userMenu.js:807 #: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:759
msgid "Lock" msgid "Lock"
msgstr "Uzamknout" msgstr "Uzamknout"
@ -1316,19 +1321,19 @@ 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:773 ../js/ui/screenShield.js:1213 #: ../js/ui/screenShield.js:775 ../js/ui/screenShield.js:1215
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Nelze uzamknout obrazovku" msgstr "Nelze uzamknout obrazovku"
#: ../js/ui/screenShield.js:774 ../js/ui/screenShield.js:1214 #: ../js/ui/screenShield.js:776 ../js/ui/screenShield.js:1216
msgid "Lock was blocked by an application" 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í"
#: ../js/ui/searchDisplay.js:453 #: ../js/ui/searchDisplay.js:445
msgid "Searching…" msgid "Searching…"
msgstr "Hledá se…" msgstr "Hledá se…"
#: ../js/ui/searchDisplay.js:497 #: ../js/ui/searchDisplay.js:489
msgid "No results." msgid "No results."
msgstr "Žádné výsledky." msgstr "Žádné výsledky."
@ -1356,7 +1361,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:109 #: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:108
msgid "Unlock" msgid "Unlock"
msgstr "Odemknout" msgstr "Odemknout"
@ -1409,9 +1414,9 @@ msgid "Large Text"
msgstr "Styl velkého textu" 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:290 ../js/ui/status/bluetooth.js:327
#: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388 #: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:391
#: ../js/ui/status/network.js:739 #: ../js/ui/status/bluetooth.js:422 ../js/ui/status/network.js:713
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@ -1432,97 +1437,106 @@ 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:142 #: ../js/ui/status/bluetooth.js:105 ../js/ui/status/network.js:140
msgid "hardware disabled" msgid "hardware disabled"
msgstr "zařízení zakázáno" msgstr "zařízení zakázáno"
#: ../js/ui/status/bluetooth.js:197 #: ../js/ui/status/bluetooth.js:198
msgid "Connection" msgid "Connection"
msgstr "Připojení" msgstr "Připojení"
#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:404 #: ../js/ui/status/bluetooth.js:209 ../js/ui/status/network.js:399
msgid "disconnecting..." msgid "disconnecting..."
msgstr "odpojování…" msgstr "odpojování…"
#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:410 #: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:405
#: ../js/ui/status/network.js:1343 #: ../js/ui/status/network.js:1298
msgid "connecting..." msgid "connecting..."
msgstr "připojování…" msgstr "připojování…"
#: ../js/ui/status/bluetooth.js:239 #: ../js/ui/status/bluetooth.js:240
msgid "Send Files…" msgid "Send Files…"
msgstr "Odeslat soubory…" msgstr "Odeslat soubory…"
#: ../js/ui/status/bluetooth.js:246 #: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings" msgid "Keyboard Settings"
msgstr "Nastavení klávesnice" msgstr "Nastavení klávesnice"
#: ../js/ui/status/bluetooth.js:249 #: ../js/ui/status/bluetooth.js:250
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Nastavení myši" msgstr "Nastavení myši"
#: ../js/ui/status/bluetooth.js:254 ../js/ui/status/volume.js:316 #: ../js/ui/status/bluetooth.js:255 ../js/ui/status/volume.js:313
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Nastavení zvuku" msgstr "Nastavení zvuku"
#: ../js/ui/status/bluetooth.js:322 #: ../js/ui/status/bluetooth.js:328 ../js/ui/status/bluetooth.js:356
#, c-format #, c-format
msgid "Authorization request from %s" msgid "Authorization request from %s"
msgstr "Požadavek na autorizaci od %s" msgstr "Požadavek na autorizaci od %s"
#: ../js/ui/status/bluetooth.js:328 #: ../js/ui/status/bluetooth.js:334 ../js/ui/status/bluetooth.js:399
#, c-format #: ../js/ui/status/bluetooth.js:430
msgid "Device %s wants access to the service '%s'"
msgstr "Zařízení %s požaduje přístup ke službě „%s“"
#: ../js/ui/status/bluetooth.js:330
msgid "Always grant access"
msgstr "Vždy udělovat přístup"
#: ../js/ui/status/bluetooth.js:331
msgid "Grant this time only"
msgstr "Udělit pouze tentokrát"
#: ../js/ui/status/bluetooth.js:332
msgid "Reject"
msgstr "Odmítnout"
#. Translators: argument is the device short name
#: ../js/ui/status/bluetooth.js:359
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Potvrzení spárování pro %s"
#: ../js/ui/status/bluetooth.js:365 ../js/ui/status/bluetooth.js:396
#, c-format #, c-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "Zařízení %s se chce spárovat s tímto počítačem" msgstr "Zařízení %s se chce spárovat s tímto počítačem"
#: ../js/ui/status/bluetooth.js:336
msgid "Allow"
msgstr "Povolit"
#: ../js/ui/status/bluetooth.js:337
msgid "Deny"
msgstr "Zamítnout"
#: ../js/ui/status/bluetooth.js:362
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Zařízení %s požaduje přístup ke službě „%s“"
#: ../js/ui/status/bluetooth.js:364
msgid "Always grant access"
msgstr "Vždy udělovat přístup"
#: ../js/ui/status/bluetooth.js:365
msgid "Grant this time only"
msgstr "Udělit pouze tentokrát"
#: ../js/ui/status/bluetooth.js:366 #: ../js/ui/status/bluetooth.js:366
msgid "Reject"
msgstr "Odmítnout"
#. Translators: argument is the device short name
#: ../js/ui/status/bluetooth.js:393
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Potvrzení spárování pro %s"
#: ../js/ui/status/bluetooth.js:400
#, c-format #, c-format
msgid "" msgid ""
"Please confirm whether the Passkey '%06d' matches the one on the device." "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í." 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:403
msgid "Matches" msgid "Matches"
msgstr "Souhlasí" msgstr "Souhlasí"
#: ../js/ui/status/bluetooth.js:370 #: ../js/ui/status/bluetooth.js:404
msgid "Does not match" msgid "Does not match"
msgstr "Nesouhlasí" msgstr "Nesouhlasí"
#: ../js/ui/status/bluetooth.js:389 #: ../js/ui/status/bluetooth.js:423
#, c-format #, c-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "Požadavek na spárování pro %s" msgstr "Požadavek na spárování pro %s"
#: ../js/ui/status/bluetooth.js:397 #: ../js/ui/status/bluetooth.js:431
msgid "Please enter the PIN mentioned on the device." msgid "Please enter the PIN mentioned on the device."
msgstr "Zadejte prosím PIN, který je uveden na zařízení." msgstr "Zadejte prosím PIN, který je uveden na zařízení."
#: ../js/ui/status/bluetooth.js:414 #: ../js/ui/status/bluetooth.js:448
msgid "OK" msgid "OK"
msgstr "Budiž" msgstr "Budiž"
@ -1542,87 +1556,81 @@ msgstr "Hlasitost, síť, baterie"
msgid "<unknown>" msgid "<unknown>"
msgstr "<neznámé>" msgstr "<neznámé>"
#: ../js/ui/status/network.js:127 #: ../js/ui/status/network.js:125
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:164 #: ../js/ui/status/network.js:162
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:402 #: ../js/ui/status/network.js:397
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:413 ../js/ui/status/network.js:1346 #: ../js/ui/status/network.js:408 ../js/ui/status/network.js:1301
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:423 #: ../js/ui/status/network.js:419
msgid "firmware missing" msgid "firmware missing"
msgstr "nedostupný firmware" msgstr "nedostupný firmware"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:430
msgid "cable unplugged"
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:435 #: ../js/ui/status/network.js:423
msgid "unavailable" msgid "unavailable"
msgstr "nedostupné" msgstr "nedostupné"
#: ../js/ui/status/network.js:437 ../js/ui/status/network.js:1348 #: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1303
msgid "connection failed" msgid "connection failed"
msgstr "připojení selhalo" msgstr "připojení selhalo"
#: ../js/ui/status/network.js:490 ../js/ui/status/network.js:1236 #: ../js/ui/status/network.js:478 ../js/ui/status/network.js:1190
#: ../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:518 ../js/ui/status/network.js:1191 #: ../js/ui/status/network.js:506 ../js/ui/status/network.js:1142
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Připojení (soukromé)" msgstr "Připojení (soukromé)"
#: ../js/ui/status/network.js:597 #: ../js/ui/status/network.js:572
msgid "Wired" msgid "Wired"
msgstr "Drátová" msgstr "Drátová"
#: ../js/ui/status/network.js:611 #: ../js/ui/status/network.js:592
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "Mobilní širokopásmová" msgstr "Mobilní širokopásmová"
#: ../js/ui/status/network.js:1522 #: ../js/ui/status/network.js:1474
msgid "Enable networking" msgid "Enable networking"
msgstr "Povolit síť" msgstr "Povolit síť"
#: ../js/ui/status/network.js:1583 #: ../js/ui/status/network.js:1522
msgid "Network Settings" msgid "Network Settings"
msgstr "Nastavení sítě" msgstr "Nastavení sítě"
#: ../js/ui/status/network.js:1600 #: ../js/ui/status/network.js:1539
msgid "Network Manager" msgid "Network Manager"
msgstr "Network Manager" msgstr "Network Manager"
#: ../js/ui/status/network.js:1690 #: ../js/ui/status/network.js:1623
msgid "Connection failed" msgid "Connection failed"
msgstr "Připojení selhalo" msgstr "Připojení selhalo"
#: ../js/ui/status/network.js:1691 #: ../js/ui/status/network.js:1624
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:2047 #: ../js/ui/status/network.js:1937
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Síť je zakázána" msgstr "Síť je zakázána"
@ -1727,72 +1735,72 @@ msgctxt "device"
msgid "Unknown" msgid "Unknown"
msgstr "Neznámé" msgstr "Neznámé"
#: ../js/ui/status/volume.js:124 #: ../js/ui/status/volume.js:121
msgid "Volume changed" msgid "Volume changed"
msgstr "Hlasitost změněna" msgstr "Hlasitost změněna"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:249 ../js/ui/status/volume.js:297 #: ../js/ui/status/volume.js:246 ../js/ui/status/volume.js:294
msgid "Volume" msgid "Volume"
msgstr "Hlasitost" msgstr "Hlasitost"
#: ../js/ui/status/volume.js:258 #: ../js/ui/status/volume.js:255
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:120 #: ../js/ui/unlockDialog.js:119
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:141 #: ../js/ui/unlockDialog.js:140
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Odemykací okno" msgstr "Odemykací okno"
#: ../js/ui/userMenu.js:193 #: ../js/ui/userMenu.js:149
msgid "Available" msgid "Available"
msgstr "Přítomen" msgstr "Přítomen"
#: ../js/ui/userMenu.js:196 #: ../js/ui/userMenu.js:152
msgid "Busy" msgid "Busy"
msgstr "Zaneprázdněn" msgstr "Zaneprázdněn"
#: ../js/ui/userMenu.js:199 #: ../js/ui/userMenu.js:155
msgid "Invisible" msgid "Invisible"
msgstr "Neviditelný" msgstr "Neviditelný"
#: ../js/ui/userMenu.js:202 #: ../js/ui/userMenu.js:158
msgid "Away" msgid "Away"
msgstr "Nepřítomen" msgstr "Nepřítomen"
#: ../js/ui/userMenu.js:205 #: ../js/ui/userMenu.js:161
msgid "Idle" msgid "Idle"
msgstr "Nečinný" msgstr "Nečinný"
#: ../js/ui/userMenu.js:208 #: ../js/ui/userMenu.js:164
msgid "Offline" msgid "Offline"
msgstr "Odpojen" msgstr "Odpojen"
#: ../js/ui/userMenu.js:781 #: ../js/ui/userMenu.js:736
msgid "Notifications" msgid "Notifications"
msgstr "Upozornění" msgstr "Upozornění"
#: ../js/ui/userMenu.js:797 #: ../js/ui/userMenu.js:749
msgid "Switch User" msgid "Switch User"
msgstr "Přepnout uživatele" msgstr "Přepnout uživatele"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:754
msgid "Log Out" msgid "Log Out"
msgstr "Odhlásit se" msgstr "Odhlásit se"
#: ../js/ui/userMenu.js:822 #: ../js/ui/userMenu.js:774
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Nainstalovat aktualizace a restartovat" msgstr "Nainstalovat aktualizace a restartovat"
#: ../js/ui/userMenu.js:840 #: ../js/ui/userMenu.js:792
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Váš stav v konverzacích byl nastaven na „Zaneprázdněn“" msgstr "Váš stav v konverzacích byl nastaven na „Zaneprázdněn“"
#: ../js/ui/userMenu.js:841 #: ../js/ui/userMenu.js:793
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1800,22 +1808,22 @@ msgstr ""
"Upozornění jsou nyní vypnuta, včetně zpráv v konverzacích. Váš stav on-line " "Upozornění jsou nyní vypnuta, včetně zpráv v konverzacích. Váš stav on-line "
"byl změněn tak, aby ostatní věděli, že si jejich zprávy nemusíte přečíst." "byl změněn tak, aby ostatní věděli, že si jejich zprávy nemusíte přečíst."
#: ../js/ui/userMenu.js:888 #: ../js/ui/userMenu.js:834
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "Jsou přihlášeni jiní uživatelé." msgstr "Jsou přihlášeni jiní uživatelé."
#: ../js/ui/userMenu.js:893 #: ../js/ui/userMenu.js:839
msgid "Shutting down might cause them to lose unsaved work." msgid "Shutting down might cause them to lose unsaved work."
msgstr "Vypnutí by mohlo způsobit ztrátu jejich neuložené práce." msgstr "Vypnutí by mohlo způsobit ztrátu jejich neuložené práce."
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/userMenu.js:921 #: ../js/ui/userMenu.js:867
#, c-format #, c-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (vzdálený)" msgstr "%s (vzdálený)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: ../js/ui/userMenu.js:924 #: ../js/ui/userMenu.js:870
#, c-format #, c-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (konzole)" msgstr "%s (konzole)"
@ -1875,19 +1883,19 @@ msgstr[2] "%u vstupů"
msgid "System Sounds" msgid "System Sounds"
msgstr "Systémové zvuky" msgstr "Systémové zvuky"
#: ../src/main.c:372 #: ../src/main.c:353
msgid "Print version" msgid "Print version"
msgstr "Vypsat verzi" msgstr "Vypsat verzi"
#: ../src/main.c:378 #: ../src/main.c:359
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:384 #: ../src/main.c:365
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:390 #: ../src/main.c:371
msgid "List possible modes" msgid "List possible modes"
msgstr "Vypsat možné režimy" msgstr "Vypsat možné režimy"

370
po/de.po

@ -19,16 +19,16 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\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-05-31 22:35+0000\n" "POT-Creation-Date: 2013-07-04 13:18+0000\n"
"PO-Revision-Date: 2013-06-02 09:48+0100\n" "PO-Revision-Date: 2013-07-02 06:35+0100\n"
"Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n" "Last-Translator: Benjamin Steinwender <b@stbe.at>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n" "Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: de_DE\n" "Language: de_DE\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 1.5.4\n" "X-Generator: Poedit 1.5.5\n"
#: ../data/50-gnome-shell-screenshot.xml.in.h:1 #: ../data/50-gnome-shell-screenshot.xml.in.h:1
msgid "Screenshots" msgid "Screenshots"
@ -387,37 +387,41 @@ msgstr "Erweiterung"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Wählen Sie oben eine Erweiterung aus, die Sie konfigurieren wollen." msgstr "Wählen Sie oben eine Erweiterung aus, die Sie konfigurieren wollen."
#: ../js/gdm/loginDialog.js:371 #: ../js/gdm/loginDialog.js:308
msgid "Session" msgid "Choose Session"
msgstr "Sitzung " msgstr "Sitzung wählen"
#: ../js/gdm/loginDialog.js:326
msgid "Session"
msgstr "Sitzung"
#. 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:601 #: ../js/gdm/loginDialog.js:528
msgid "Not listed?" msgid "Not listed?"
msgstr "Nicht aufgeführt?" msgstr "Nicht aufgeführt?"
#: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:810 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376 #: ../js/ui/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:96 #: ../js/ui/status/bluetooth.js:449 ../js/ui/unlockDialog.js:95
#: ../js/ui/userMenu.js:938 #: ../js/ui/userMenu.js:884
msgid "Cancel" msgid "Cancel"
msgstr "Abbrechen" msgstr "Abbrechen"
#: ../js/gdm/loginDialog.js:791 #: ../js/gdm/loginDialog.js:833
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Anmelden" msgstr "Anmelden"
#: ../js/gdm/loginDialog.js:791 #: ../js/gdm/loginDialog.js:833
msgid "Next" msgid "Next"
msgstr "Nächstes" msgstr "Nächstes"
#. Translators: this message is shown below the username entry field #. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm #. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:888 #: ../js/gdm/loginDialog.js:934
#, c-format #, c-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(z.B. Benutzer oder %s)" msgstr "(z.B. Benutzer oder %s)"
@ -425,12 +429,12 @@ msgstr "(z.B. Benutzer oder %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:892 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:938 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Benutzername:" msgstr "Benutzername:"
#: ../js/gdm/loginDialog.js:1158 #: ../js/gdm/loginDialog.js:1205
msgid "Login Window" msgid "Login Window"
msgstr "Anmeldefenster" msgstr "Anmeldefenster"
@ -439,8 +443,8 @@ msgstr "Anmeldefenster"
msgid "Power" msgid "Power"
msgstr "Ausschalten" msgstr "Ausschalten"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:651 ../js/ui/userMenu.js:655
#: ../js/ui/userMenu.js:816 #: ../js/ui/userMenu.js:768
msgid "Suspend" msgid "Suspend"
msgstr "Bereitschaft" msgstr "Bereitschaft"
@ -448,18 +452,18 @@ msgstr "Bereitschaft"
msgid "Restart" msgid "Restart"
msgstr "Neu starten" msgstr "Neu starten"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:653
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942 #: ../js/ui/userMenu.js:655 ../js/ui/userMenu.js:767 ../js/ui/userMenu.js:888
msgid "Power Off" msgid "Power Off"
msgstr "Ausschalten" msgstr "Ausschalten"
#: ../js/gdm/util.js:247 #: ../js/gdm/util.js:248
msgid "Authentication error" msgid "Authentication error"
msgstr "Legitimationsfehler" msgstr "Legitimationsfehler"
#. 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:364 #: ../js/gdm/util.js:365
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(oder benutzen Sie den Fingerabdruckleser)" msgstr "(oder benutzen Sie den Fingerabdruckleser)"
@ -478,23 +482,23 @@ msgstr "Befehl konnte nicht verarbeitet werden:"
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Ausführung von »%s« ist gescheitert:" msgstr "Ausführung von »%s« ist gescheitert:"
#: ../js/ui/appDisplay.js:361 #: ../js/ui/appDisplay.js:397
msgid "Frequent" msgid "Frequent"
msgstr "Häufig" msgstr "Häufig"
#: ../js/ui/appDisplay.js:368 #: ../js/ui/appDisplay.js:404
msgid "All" msgid "All"
msgstr "Alle" msgstr "Alle"
#: ../js/ui/appDisplay.js:960 #: ../js/ui/appDisplay.js:996
msgid "New Window" msgid "New Window"
msgstr "Neues Fenster" msgstr "Neues Fenster"
#: ../js/ui/appDisplay.js:963 ../js/ui/dash.js:284 #: ../js/ui/appDisplay.js:999 ../js/ui/dash.js:284
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Aus Favoriten entfernen" msgstr "Aus Favoriten entfernen"
#: ../js/ui/appDisplay.js:964 #: ../js/ui/appDisplay.js:1000
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Zu Favoriten hinzufügen" msgstr "Zu Favoriten hinzufügen"
@ -508,7 +512,7 @@ msgstr "%s wurde zu Ihren Favoriten hinzugefügt"
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s wurde aus Ihren Favoriten entfernt" msgstr "%s wurde aus Ihren Favoriten entfernt"
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789 #: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:744
msgid "Settings" msgid "Settings"
msgstr "Einstellungen" msgstr "Einstellungen"
@ -636,35 +640,35 @@ msgid "S"
msgstr "Sa" msgstr "Sa"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:735 #: ../js/ui/calendar.js:750
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Nichts geplant" msgstr "Nichts geplant"
#. 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:751 #: ../js/ui/calendar.js:768
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d. %B" msgstr "%A, %d. %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:754 #: ../js/ui/calendar.js:771
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%a, %d. %B %Y" msgstr "%a, %d. %B %Y"
#: ../js/ui/calendar.js:764 #: ../js/ui/calendar.js:782
msgid "Today" msgid "Today"
msgstr "Heute" msgstr "Heute"
#: ../js/ui/calendar.js:768 #: ../js/ui/calendar.js:786
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Morgen" msgstr "Morgen"
#: ../js/ui/calendar.js:779 #: ../js/ui/calendar.js:797
msgid "This week" msgid "This week"
msgstr "Diese Woche" msgstr "Diese Woche"
#: ../js/ui/calendar.js:787 #: ../js/ui/calendar.js:805
msgid "Next week" msgid "Next week"
msgstr "Nächste Woche" msgstr "Nächste Woche"
@ -853,14 +857,14 @@ msgstr "<b>%d</b>. <b>%B</b> <b>%Y</b>, <b>%H:%M</b> "
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
#: ../js/ui/components/telepathyClient.js:985 #: ../js/ui/components/telepathyClient.js:986
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s heißt jetzt %s" msgstr "%s heißt jetzt %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1088 #: ../js/ui/components/telepathyClient.js:1089
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Einladung zum Betreten von %s" msgstr "Einladung zum Betreten von %s"
@ -868,38 +872,38 @@ msgstr "Einladung zum Betreten von %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. #. * for example.
#: ../js/ui/components/telepathyClient.js:1096 #: ../js/ui/components/telepathyClient.js:1097
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s lädt Sie ein, %s beizutreten" msgstr "%s lädt Sie ein, %s beizutreten"
#: ../js/ui/components/telepathyClient.js:1098 #: ../js/ui/components/telepathyClient.js:1099
#: ../js/ui/components/telepathyClient.js:1137 #: ../js/ui/components/telepathyClient.js:1138
#: ../js/ui/components/telepathyClient.js:1177 #: ../js/ui/components/telepathyClient.js:1178
#: ../js/ui/components/telepathyClient.js:1240 #: ../js/ui/components/telepathyClient.js:1241
msgid "Decline" msgid "Decline"
msgstr "Ablehnen" msgstr "Ablehnen"
#: ../js/ui/components/telepathyClient.js:1099 #: ../js/ui/components/telepathyClient.js:1100
#: ../js/ui/components/telepathyClient.js:1178 #: ../js/ui/components/telepathyClient.js:1179
#: ../js/ui/components/telepathyClient.js:1241 #: ../js/ui/components/telepathyClient.js:1242
msgid "Accept" msgid "Accept"
msgstr "Annehmen" msgstr "Annehmen"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1129 #: ../js/ui/components/telepathyClient.js:1130
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Video-Anruf von %s" msgstr "Video-Anruf von %s"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1132 #: ../js/ui/components/telepathyClient.js:1133
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Anruf von %s" msgstr "Anruf von %s"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
#: ../js/ui/components/telepathyClient.js:1139 #: ../js/ui/components/telepathyClient.js:1140
msgid "Answer" msgid "Answer"
msgstr "Antworten" msgstr "Antworten"
@ -908,113 +912,113 @@ msgstr "Antworten"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/components/telepathyClient.js:1171 #: ../js/ui/components/telepathyClient.js:1172
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s sendet Ihnen %s" msgstr "%s sendet Ihnen %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1206 #: ../js/ui/components/telepathyClient.js:1207
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s bittet um das Recht, Ihre Online-Verfügbarkeit sehen zu dürfen" msgstr "%s bittet um das Recht, Ihre Online-Verfügbarkeit sehen zu dürfen"
#: ../js/ui/components/telepathyClient.js:1298 #: ../js/ui/components/telepathyClient.js:1299
msgid "Network error" msgid "Network error"
msgstr "Netzwerkfehler" msgstr "Netzwerkfehler"
#: ../js/ui/components/telepathyClient.js:1300 #: ../js/ui/components/telepathyClient.js:1301
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Legitimierung fehlgeschlagen" msgstr "Legitimierung fehlgeschlagen"
#: ../js/ui/components/telepathyClient.js:1302 #: ../js/ui/components/telepathyClient.js:1303
msgid "Encryption error" msgid "Encryption error"
msgstr "Verschlüsselungsfehler" msgstr "Verschlüsselungsfehler"
#: ../js/ui/components/telepathyClient.js:1304 #: ../js/ui/components/telepathyClient.js:1305
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Zertifikat wurde nicht bereitgestellt" msgstr "Zertifikat wurde nicht bereitgestellt"
#: ../js/ui/components/telepathyClient.js:1306 #: ../js/ui/components/telepathyClient.js:1307
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Zertifikat nicht vertrauenswürdig" msgstr "Zertifikat nicht vertrauenswürdig"
#: ../js/ui/components/telepathyClient.js:1308 #: ../js/ui/components/telepathyClient.js:1309
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Zertifikat abgelaufen" msgstr "Zertifikat abgelaufen"
#: ../js/ui/components/telepathyClient.js:1310 #: ../js/ui/components/telepathyClient.js:1311
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Zertifikat nicht aktiviert" msgstr "Zertifikat nicht aktiviert"
#: ../js/ui/components/telepathyClient.js:1312 #: ../js/ui/components/telepathyClient.js:1313
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Rechnername des Zertifikats stimmt nicht überein" msgstr "Rechnername des Zertifikats stimmt nicht überein"
#: ../js/ui/components/telepathyClient.js:1314 #: ../js/ui/components/telepathyClient.js:1315
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Fingerabdruck des Zertifikats stimmt nicht überein" msgstr "Fingerabdruck des Zertifikats stimmt nicht überein"
#: ../js/ui/components/telepathyClient.js:1316 #: ../js/ui/components/telepathyClient.js:1317
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Selbstsigniertes Zertifikat" msgstr "Selbstsigniertes Zertifikat"
#: ../js/ui/components/telepathyClient.js:1318 #: ../js/ui/components/telepathyClient.js:1319
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "Der Status ist auf »Abgemeldet« gesetzt" msgstr "Der Status ist auf »Abgemeldet« gesetzt"
#: ../js/ui/components/telepathyClient.js:1320 #: ../js/ui/components/telepathyClient.js:1321
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Verschlüsselung ist nicht verfügbar" msgstr "Verschlüsselung ist nicht verfügbar"
#: ../js/ui/components/telepathyClient.js:1322 #: ../js/ui/components/telepathyClient.js:1323
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "Zertifikat ist ungültig" msgstr "Zertifikat ist ungültig"
#: ../js/ui/components/telepathyClient.js:1324 #: ../js/ui/components/telepathyClient.js:1325
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Verbindungsaufbau wurde verweigert" msgstr "Verbindungsaufbau wurde verweigert"
#: ../js/ui/components/telepathyClient.js:1326 #: ../js/ui/components/telepathyClient.js:1327
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "Verbindung kann nicht hergestellt werden" msgstr "Verbindung kann nicht hergestellt werden"
#: ../js/ui/components/telepathyClient.js:1328 #: ../js/ui/components/telepathyClient.js:1329
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Verbindung wurde unterbrochen" msgstr "Verbindung wurde unterbrochen"
#: ../js/ui/components/telepathyClient.js:1330 #: ../js/ui/components/telepathyClient.js:1331
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "Dieses Konto ist bereits mit dem Server verbunden" msgstr "Dieses Konto ist bereits mit dem Server verbunden"
#: ../js/ui/components/telepathyClient.js:1332 #: ../js/ui/components/telepathyClient.js:1333
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "" msgstr ""
"Die Verbindung wurde durch eine neue Verbindung mit der gleichen Ressource " "Die Verbindung wurde durch eine neue Verbindung mit der gleichen Ressource "
"ersetzt" "ersetzt"
#: ../js/ui/components/telepathyClient.js:1334 #: ../js/ui/components/telepathyClient.js:1335
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "Dieses Konto ist bereits auf dem Server vorhanden" msgstr "Dieses Konto ist bereits auf dem Server vorhanden"
#: ../js/ui/components/telepathyClient.js:1336 #: ../js/ui/components/telepathyClient.js:1337
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "" msgstr ""
"Der Server ist derzeit überlastet und kann die Verbindung nicht annehmen" "Der Server ist derzeit überlastet und kann die Verbindung nicht annehmen"
#: ../js/ui/components/telepathyClient.js:1338 #: ../js/ui/components/telepathyClient.js:1339
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Zertifikat wurde zurückgezogen" msgstr "Zertifikat wurde zurückgezogen"
#: ../js/ui/components/telepathyClient.js:1340 #: ../js/ui/components/telepathyClient.js:1341
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"Das Zertifikat verwendet einen unsicheren Chiffrier-Algorithmus oder ist " "Das Zertifikat verwendet einen unsicheren Chiffrier-Algorithmus oder ist "
"kryptografisch schwach" "kryptografisch schwach"
#: ../js/ui/components/telepathyClient.js:1342 #: ../js/ui/components/telepathyClient.js:1343
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
@ -1023,22 +1027,22 @@ msgstr ""
"überschreiten die durch die kryptografische Bibliothek gegebenen " "überschreiten die durch die kryptografische Bibliothek gegebenen "
"Beschränkungen" "Beschränkungen"
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1345
msgid "Internal error" msgid "Internal error"
msgstr "Interner Fehler" msgstr "Interner Fehler"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1354 #: ../js/ui/components/telepathyClient.js:1355
#, c-format #, c-format
msgid "Unable to connect to %s" msgid "Unable to connect to %s"
msgstr "Verbindung zu %s fehlgeschlagen" msgstr "Verbindung zu %s fehlgeschlagen"
#: ../js/ui/components/telepathyClient.js:1359 #: ../js/ui/components/telepathyClient.js:1360
msgid "View account" msgid "View account"
msgstr "Konto anzeigen" msgstr "Konto anzeigen"
#: ../js/ui/components/telepathyClient.js:1398 #: ../js/ui/components/telepathyClient.js:1399
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Unbekannter Grund" msgstr "Unbekannter Grund"
@ -1053,26 +1057,26 @@ msgstr "Anwendungen anzeigen"
# Würde ich so übernehmen, oder evtl. »Dock«. # Würde ich so übernehmen, oder evtl. »Dock«.
#. Translators: this is the name of the dock/favorites area on #. Translators: this is the name of the dock/favorites area on
#. the left of the overview #. the left of the overview
#: ../js/ui/dash.js:429 #: ../js/ui/dash.js:439
msgid "Dash" msgid "Dash"
msgstr "Dash" msgstr "Dash"
#: ../js/ui/dateMenu.js:86 #: ../js/ui/dateMenu.js:85
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Kalender öffnen" msgstr "Kalender öffnen"
#: ../js/ui/dateMenu.js:90 #: ../js/ui/dateMenu.js:89
msgid "Open Clocks" msgid "Open Clocks"
msgstr "Uhren öffnen" msgstr "Uhren öffnen"
#: ../js/ui/dateMenu.js:97 #: ../js/ui/dateMenu.js:96
msgid "Date & Time Settings" msgid "Date & Time Settings"
msgstr "Einstellungen für Datum und Uhrzeit" msgstr "Einstellungen für Datum und Uhrzeit"
#. 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:208 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e. %B %Y" msgstr "%A, %e. %B %Y"
@ -1288,17 +1292,17 @@ msgstr "Übersicht"
msgid "Type to search…" msgid "Type to search…"
msgstr "Suchbegriff eingeben …" msgstr "Suchbegriff eingeben …"
#: ../js/ui/panel.js:642 #: ../js/ui/panel.js:567
msgid "Quit" msgid "Quit"
msgstr "Beenden" msgstr "Beenden"
#. 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:693 #: ../js/ui/panel.js:618
msgid "Activities" msgid "Activities"
msgstr "Aktivitäten" msgstr "Aktivitäten"
#: ../js/ui/panel.js:989 #: ../js/ui/panel.js:914
msgid "Top Bar" msgid "Top Bar"
msgstr "Oberes Panel" msgstr "Oberes Panel"
@ -1307,7 +1311,7 @@ msgstr "Oberes Panel"
#. "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:738 #: ../js/ui/popupMenu.js:549
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1335,7 +1339,7 @@ msgid_plural "%d new notifications"
msgstr[0] "%d neue Benachrichtigung" msgstr[0] "%d neue Benachrichtigung"
msgstr[1] "%d neue Benachrichtigungen" msgstr[1] "%d neue Benachrichtigungen"
#: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:807 #: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:759
msgid "Lock" msgid "Lock"
msgstr "Sperren" msgstr "Sperren"
@ -1350,11 +1354,11 @@ msgstr "GNOME muss den Bildschirm sperren"
#. #.
#. 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:773 ../js/ui/screenShield.js:1213 #: ../js/ui/screenShield.js:788 ../js/ui/screenShield.js:1215
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Sperrung fehlgeschlagen" msgstr "Sperrung fehlgeschlagen"
#: ../js/ui/screenShield.js:774 ../js/ui/screenShield.js:1214 #: ../js/ui/screenShield.js:789 ../js/ui/screenShield.js:1216
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Sperrung wurde von einer Anwendung blockiert" msgstr "Sperrung wurde von einer Anwendung blockiert"
@ -1390,7 +1394,7 @@ msgstr "Passwort"
msgid "Remember Password" msgid "Remember Password"
msgstr "An Passwort erinnern" msgstr "An Passwort erinnern"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:109 #: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:108
msgid "Unlock" msgid "Unlock"
msgstr "Entsperren" msgstr "Entsperren"
@ -1443,9 +1447,9 @@ msgid "Large Text"
msgstr "Große Schrift" msgstr "Große Schrift"
#: ../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:290 ../js/ui/status/bluetooth.js:327
#: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388 #: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:391
#: ../js/ui/status/network.js:739 #: ../js/ui/status/bluetooth.js:422 ../js/ui/status/network.js:713
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@ -1466,73 +1470,82 @@ msgid "Bluetooth Settings"
msgstr "Bluetooth-Einstellungen" msgstr "Bluetooth-Einstellungen"
#. 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:142 #: ../js/ui/status/bluetooth.js:105 ../js/ui/status/network.js:140
msgid "hardware disabled" msgid "hardware disabled"
msgstr "Hardware deaktiviert" msgstr "Hardware deaktiviert"
#: ../js/ui/status/bluetooth.js:197 #: ../js/ui/status/bluetooth.js:198
msgid "Connection" msgid "Connection"
msgstr "Verbindung" msgstr "Verbindung"
#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:404 #: ../js/ui/status/bluetooth.js:209 ../js/ui/status/network.js:399
msgid "disconnecting..." msgid "disconnecting..."
msgstr "Verbindungsabbau …" msgstr "Verbindungsabbau …"
#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:410 #: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:405
#: ../js/ui/status/network.js:1343 #: ../js/ui/status/network.js:1298
msgid "connecting..." msgid "connecting..."
msgstr "Verbindungsaufbau …" msgstr "Verbindungsaufbau …"
#: ../js/ui/status/bluetooth.js:239 #: ../js/ui/status/bluetooth.js:240
msgid "Send Files…" msgid "Send Files…"
msgstr "Dateien senden …" msgstr "Dateien senden …"
#: ../js/ui/status/bluetooth.js:246 #: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings" msgid "Keyboard Settings"
msgstr "Tastatureinstellungen" msgstr "Tastatureinstellungen"
#: ../js/ui/status/bluetooth.js:249 #: ../js/ui/status/bluetooth.js:250
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Maus-Einstellungen" msgstr "Maus-Einstellungen"
#: ../js/ui/status/bluetooth.js:254 ../js/ui/status/volume.js:316 #: ../js/ui/status/bluetooth.js:255 ../js/ui/status/volume.js:313
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Klangeinstellungen" msgstr "Klangeinstellungen"
#: ../js/ui/status/bluetooth.js:322 #: ../js/ui/status/bluetooth.js:328 ../js/ui/status/bluetooth.js:356
#, c-format #, c-format
msgid "Authorization request from %s" msgid "Authorization request from %s"
msgstr "Legitimierungsanfrage von %s" msgstr "Legitimierungsanfrage von %s"
#: ../js/ui/status/bluetooth.js:328 #: ../js/ui/status/bluetooth.js:334 ../js/ui/status/bluetooth.js:399
#, c-format #: ../js/ui/status/bluetooth.js:430
msgid "Device %s wants access to the service '%s'"
msgstr "Gerät »%s« bittet um Zugriff auf den Dienst »%s«"
#: ../js/ui/status/bluetooth.js:330
msgid "Always grant access"
msgstr "Immer Zugriff gewähren"
#: ../js/ui/status/bluetooth.js:331
msgid "Grant this time only"
msgstr "Nur dieses Mal gewähren"
#: ../js/ui/status/bluetooth.js:332
msgid "Reject"
msgstr "Abweisen"
#. Translators: argument is the device short name
#: ../js/ui/status/bluetooth.js:359
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Koppelungsbestätigung für %s"
#: ../js/ui/status/bluetooth.js:365 ../js/ui/status/bluetooth.js:396
#, c-format #, c-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "Gerät »%s« möchte mit diesem Rechner gekoppelt werden" msgstr "Gerät »%s« möchte mit diesem Rechner gekoppelt werden"
#: ../js/ui/status/bluetooth.js:336
msgid "Allow"
msgstr "Erlauben"
#: ../js/ui/status/bluetooth.js:337
msgid "Deny"
msgstr "Verweigern"
#: ../js/ui/status/bluetooth.js:362
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Gerät »%s« bittet um Zugriff auf den Dienst »%s«"
#: ../js/ui/status/bluetooth.js:364
msgid "Always grant access"
msgstr "Immer Zugriff gewähren"
#: ../js/ui/status/bluetooth.js:365
msgid "Grant this time only"
msgstr "Nur dieses Mal gewähren"
#: ../js/ui/status/bluetooth.js:366 #: ../js/ui/status/bluetooth.js:366
msgid "Reject"
msgstr "Abweisen"
#. Translators: argument is the device short name
#: ../js/ui/status/bluetooth.js:393
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Koppelungsbestätigung für %s"
#: ../js/ui/status/bluetooth.js:400
#, c-format #, c-format
msgid "" msgid ""
"Please confirm whether the Passkey '%06d' matches the one on the device." "Please confirm whether the Passkey '%06d' matches the one on the device."
@ -1540,24 +1553,24 @@ msgstr ""
"Bitte bestätigen Sie, ob die PIN »%06d« mit der des Gerätes übereinstimmt." "Bitte bestätigen Sie, ob die PIN »%06d« mit der des Gerätes übereinstimmt."
#. 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:403
msgid "Matches" msgid "Matches"
msgstr "Stimmt überein" msgstr "Stimmt überein"
#: ../js/ui/status/bluetooth.js:370 #: ../js/ui/status/bluetooth.js:404
msgid "Does not match" msgid "Does not match"
msgstr "Stimmt nicht überein" msgstr "Stimmt nicht überein"
#: ../js/ui/status/bluetooth.js:389 #: ../js/ui/status/bluetooth.js:423
#, c-format #, c-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "Koppelungsanfrage für %s" msgstr "Koppelungsanfrage für %s"
#: ../js/ui/status/bluetooth.js:397 #: ../js/ui/status/bluetooth.js:431
msgid "Please enter the PIN mentioned on the device." msgid "Please enter the PIN mentioned on the device."
msgstr "Bitte geben Sie die auf dem Gerät angezeigte PIN ein." msgstr "Bitte geben Sie die auf dem Gerät angezeigte PIN ein."
#: ../js/ui/status/bluetooth.js:414 #: ../js/ui/status/bluetooth.js:448
msgid "OK" msgid "OK"
msgstr "OK" msgstr "OK"
@ -1577,87 +1590,81 @@ msgstr "Lautstärke, Netzwerk, Batterie"
msgid "<unknown>" msgid "<unknown>"
msgstr "<Unbekannt>" msgstr "<Unbekannt>"
#: ../js/ui/status/network.js:127 #: ../js/ui/status/network.js:125
msgid "Wi-Fi" msgid "Wi-Fi"
msgstr "WLAN" msgstr "WLAN"
#. 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:164 #: ../js/ui/status/network.js:162
msgid "disabled" msgid "disabled"
msgstr "Deaktiviert" msgstr "Deaktiviert"
#. 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:402 #: ../js/ui/status/network.js:397
msgid "unmanaged" msgid "unmanaged"
msgstr "nicht verwaltet" msgstr "nicht verwaltet"
#. 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:413 ../js/ui/status/network.js:1346 #: ../js/ui/status/network.js:408 ../js/ui/status/network.js:1301
msgid "authentication required" msgid "authentication required"
msgstr "Legitimierung erforderlich" msgstr "Legitimierung erforderlich"
#. 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:423 #: ../js/ui/status/network.js:419
msgid "firmware missing" msgid "firmware missing"
msgstr "Firmware fehlt" msgstr "Firmware fehlt"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:430
msgid "cable unplugged"
msgstr "Kabel nicht angeschlossen"
#. 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:435 #: ../js/ui/status/network.js:423
msgid "unavailable" msgid "unavailable"
msgstr "nicht verfügbar" msgstr "nicht verfügbar"
#: ../js/ui/status/network.js:437 ../js/ui/status/network.js:1348 #: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1303
msgid "connection failed" msgid "connection failed"
msgstr "Verbindung gescheitert" msgstr "Verbindung gescheitert"
#: ../js/ui/status/network.js:490 ../js/ui/status/network.js:1236 #: ../js/ui/status/network.js:478 ../js/ui/status/network.js:1190
#: ../js/ui/status/network.js:1424
msgid "More…" msgid "More…"
msgstr "Mehr …" msgstr "Mehr …"
#. 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:518 ../js/ui/status/network.js:1191 #: ../js/ui/status/network.js:506 ../js/ui/status/network.js:1142
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Verbunden (privat)" msgstr "Verbunden (privat)"
#: ../js/ui/status/network.js:597 #: ../js/ui/status/network.js:572
msgid "Wired" msgid "Wired"
msgstr "Kabelgebunden" msgstr "Kabelgebunden"
#: ../js/ui/status/network.js:611 #: ../js/ui/status/network.js:592
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "Mobiles Breitband" msgstr "Mobiles Breitband"
#: ../js/ui/status/network.js:1522 #: ../js/ui/status/network.js:1474
msgid "Enable networking" msgid "Enable networking"
msgstr "Netzwerk aktivieren" msgstr "Netzwerk aktivieren"
#: ../js/ui/status/network.js:1583 #: ../js/ui/status/network.js:1522
msgid "Network Settings" msgid "Network Settings"
msgstr "Netzwerkeinstellungen" msgstr "Netzwerkeinstellungen"
#: ../js/ui/status/network.js:1600 #: ../js/ui/status/network.js:1539
msgid "Network Manager" msgid "Network Manager"
msgstr "Netzwerk-Verwaltung" msgstr "Netzwerk-Verwaltung"
#: ../js/ui/status/network.js:1690 #: ../js/ui/status/network.js:1623
msgid "Connection failed" msgid "Connection failed"
msgstr "Verbindung gescheitert" msgstr "Verbindung gescheitert"
#: ../js/ui/status/network.js:1691 #: ../js/ui/status/network.js:1624
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktivierung der Netzwerkverbindung ist gescheitert" msgstr "Aktivierung der Netzwerkverbindung ist gescheitert"
#: ../js/ui/status/network.js:2047 #: ../js/ui/status/network.js:1938
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Netzwerk ist deaktiviert" msgstr "Netzwerk ist deaktiviert"
@ -1758,72 +1765,72 @@ msgctxt "device"
msgid "Unknown" msgid "Unknown"
msgstr "Unbekannt" msgstr "Unbekannt"
#: ../js/ui/status/volume.js:124 #: ../js/ui/status/volume.js:121
msgid "Volume changed" msgid "Volume changed"
msgstr "Lautstärke geändert" msgstr "Lautstärke geändert"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:249 ../js/ui/status/volume.js:297 #: ../js/ui/status/volume.js:246 ../js/ui/status/volume.js:294
msgid "Volume" msgid "Volume"
msgstr "Lautstärke" msgstr "Lautstärke"
#: ../js/ui/status/volume.js:258 #: ../js/ui/status/volume.js:255
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:120 #: ../js/ui/unlockDialog.js:119
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Als anderer Benutzer anmelden" msgstr "Als anderer Benutzer anmelden"
#: ../js/ui/unlockDialog.js:141 #: ../js/ui/unlockDialog.js:140
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Fenster entsperren" msgstr "Fenster entsperren"
#: ../js/ui/userMenu.js:193 #: ../js/ui/userMenu.js:149
msgid "Available" msgid "Available"
msgstr "Verfügbar" msgstr "Verfügbar"
#: ../js/ui/userMenu.js:196 #: ../js/ui/userMenu.js:152
msgid "Busy" msgid "Busy"
msgstr "Beschäftigt" msgstr "Beschäftigt"
#: ../js/ui/userMenu.js:199 #: ../js/ui/userMenu.js:155
msgid "Invisible" msgid "Invisible"
msgstr "Unsichtbar" msgstr "Unsichtbar"
#: ../js/ui/userMenu.js:202 #: ../js/ui/userMenu.js:158
msgid "Away" msgid "Away"
msgstr "Abwesend" msgstr "Abwesend"
#: ../js/ui/userMenu.js:205 #: ../js/ui/userMenu.js:161
msgid "Idle" msgid "Idle"
msgstr "Untätig" msgstr "Untätig"
#: ../js/ui/userMenu.js:208 #: ../js/ui/userMenu.js:164
msgid "Offline" msgid "Offline"
msgstr "Abgemeldet" msgstr "Abgemeldet"
#: ../js/ui/userMenu.js:781 #: ../js/ui/userMenu.js:736
msgid "Notifications" msgid "Notifications"
msgstr "Benachrichtigungen" msgstr "Benachrichtigungen"
#: ../js/ui/userMenu.js:797 #: ../js/ui/userMenu.js:749
msgid "Switch User" msgid "Switch User"
msgstr "Benutzer wechseln" msgstr "Benutzer wechseln"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:754
msgid "Log Out" msgid "Log Out"
msgstr "Abmelden" msgstr "Abmelden"
#: ../js/ui/userMenu.js:822 #: ../js/ui/userMenu.js:774
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Aktualisierungen installieren und neustarten" msgstr "Aktualisierungen installieren und neustarten"
#: ../js/ui/userMenu.js:840 #: ../js/ui/userMenu.js:792
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Ihr Anwesenheitsstatus wird auf »Beschäftigt« gesetzt" msgstr "Ihr Anwesenheitsstatus wird auf »Beschäftigt« gesetzt"
#: ../js/ui/userMenu.js:841 #: ../js/ui/userMenu.js:793
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1832,22 +1839,22 @@ msgstr ""
"Ihr Anwesenheitsstatus wurde nun dahingehend geändert, dass andere darüber " "Ihr Anwesenheitsstatus wurde nun dahingehend geändert, dass andere darüber "
"informiert werden, dass Sie deren Nachrichten nicht sehen könnten." "informiert werden, dass Sie deren Nachrichten nicht sehen könnten."
#: ../js/ui/userMenu.js:888 #: ../js/ui/userMenu.js:834
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "Andere Benutzer sind angemeldet." msgstr "Andere Benutzer sind angemeldet."
#: ../js/ui/userMenu.js:893 #: ../js/ui/userMenu.js:839
msgid "Shutting down might cause them to lose unsaved work." msgid "Shutting down might cause them to lose unsaved work."
msgstr "Herunterfahren könnte Datenverlust herbeiführen." msgstr "Herunterfahren könnte Datenverlust herbeiführen."
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/userMenu.js:921 #: ../js/ui/userMenu.js:867
#, c-format #, c-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (Entfernt)" msgstr "%s (Entfernt)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: ../js/ui/userMenu.js:924 #: ../js/ui/userMenu.js:870
#, c-format #, c-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (Konsole)" msgstr "%s (Konsole)"
@ -1905,20 +1912,20 @@ msgstr[1] "%u Eingänge"
msgid "System Sounds" msgid "System Sounds"
msgstr "Systemklänge" msgstr "Systemklänge"
#: ../src/main.c:372 #: ../src/main.c:353
msgid "Print version" msgid "Print version"
msgstr "Version ausgeben" msgstr "Version ausgeben"
#: ../src/main.c:378 #: ../src/main.c:359
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Der durch GDM im Anmeldefenster verwendete Modus" msgstr "Der durch GDM im Anmeldefenster verwendete Modus"
#: ../src/main.c:384 #: ../src/main.c:365
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "" msgstr ""
"Einen spezifischen Modus nutzen, wie z.B. »gdm« für den Anmeldebildschirm" "Einen spezifischen Modus nutzen, wie z.B. »gdm« für den Anmeldebildschirm"
#: ../src/main.c:390 #: ../src/main.c:371
msgid "List possible modes" msgid "List possible modes"
msgstr "Die möglichen Modi auflisten" msgstr "Die möglichen Modi auflisten"
@ -1939,6 +1946,9 @@ msgstr "Das Passwort darf nicht leer sein"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Der Dialog zur Legitimierung wurde vom Benutzer geschlossen" msgstr "Der Dialog zur Legitimierung wurde vom Benutzer geschlossen"
#~ msgid "cable unplugged"
#~ msgstr "Kabel nicht angeschlossen"
#~ msgid "Whether to collect stats about applications usage" #~ msgid "Whether to collect stats about applications usage"
#~ msgstr "" #~ msgstr ""
#~ "Legt fest, ob Statistiken über Anwendungsnutzung erfasst werden sollen" #~ "Legt fest, ob Statistiken über Anwendungsnutzung erfasst werden sollen"

133
po/es.po

@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: gnome-shell.master\n" "Project-Id-Version: gnome-shell.master\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-06-14 18:16+0000\n" "POT-Creation-Date: 2013-06-26 18:42+0000\n"
"PO-Revision-Date: 2013-06-17 17:26+0200\n" "PO-Revision-Date: 2013-06-27 12:33+0200\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n" "Language-Team: Español <gnome-es-list@gnome.org>\n"
"Language: \n" "Language: \n"
@ -369,18 +369,24 @@ msgid "Select an extension to configure using the combobox above."
msgstr "" msgstr ""
"Seleccione una extensión que configurar usando la caja combinada de arriba." "Seleccione una extensión que configurar usando la caja combinada de arriba."
#: ../js/gdm/loginDialog.js:370 #: ../js/gdm/loginDialog.js:302
msgid "Session" #| msgid "Switch Session"
msgstr "Sesión…" msgid "Choose Session"
msgstr "Elegir sesión"
#: ../js/gdm/loginDialog.js:320
#| msgid "Session…"
msgid "Session"
msgstr "Sesión"
#. 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:600 #: ../js/gdm/loginDialog.js:522
msgid "Not listed?" msgid "Not listed?"
msgstr "¿No está en la lista?" msgstr "¿No está en la lista?"
#: ../js/gdm/loginDialog.js:775 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:739 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:161 ../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:449 ../js/ui/unlockDialog.js:95 #: ../js/ui/status/bluetooth.js:449 ../js/ui/unlockDialog.js:95
@ -388,18 +394,18 @@ msgstr "¿No está en la lista?"
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
#: ../js/gdm/loginDialog.js:790 #: ../js/gdm/loginDialog.js:768
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Iniciar sesión" msgstr "Iniciar sesión"
#: ../js/gdm/loginDialog.js:790 #: ../js/gdm/loginDialog.js:768
msgid "Next" msgid "Next"
msgstr "Siguiente" msgstr "Siguiente"
#. Translators: this message is shown below the username entry field #. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm #. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:887 #: ../js/gdm/loginDialog.js:869
#, c-format #, c-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(ej., usuario o %s)" msgstr "(ej., usuario o %s)"
@ -407,12 +413,12 @@ msgstr "(ej., usuario o %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:891 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:873 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Nombre de usuario:" msgstr "Nombre de usuario:"
#: ../js/gdm/loginDialog.js:1157 #: ../js/gdm/loginDialog.js:1140
msgid "Login Window" msgid "Login Window"
msgstr "Ventana de inicio de sesión" msgstr "Ventana de inicio de sesión"
@ -435,13 +441,13 @@ msgstr "Reiniciar"
msgid "Power Off" msgid "Power Off"
msgstr "Apagar" msgstr "Apagar"
#: ../js/gdm/util.js:247 #: ../js/gdm/util.js:248
msgid "Authentication error" msgid "Authentication error"
msgstr "Error de autenticación" msgstr "Error de autenticación"
#. 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:364 #: ../js/gdm/util.js:365
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(o pase el dedo)" msgstr "(o pase el dedo)"
@ -832,14 +838,14 @@ msgstr "<b>%d</b> de <b>%B</b> <b>%Y</b>, <b>%H:%M</b> "
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
#: ../js/ui/components/telepathyClient.js:985 #: ../js/ui/components/telepathyClient.js:986
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "Ahora %s se llama %s" msgstr "Ahora %s se llama %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1088 #: ../js/ui/components/telepathyClient.js:1089
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Invitación a %s" msgstr "Invitación a %s"
@ -847,38 +853,38 @@ msgstr "Invitación a %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. #. * for example.
#: ../js/ui/components/telepathyClient.js:1096 #: ../js/ui/components/telepathyClient.js:1097
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s le está invitando a unirse a %s" msgstr "%s le está invitando a unirse a %s"
#: ../js/ui/components/telepathyClient.js:1098 #: ../js/ui/components/telepathyClient.js:1099
#: ../js/ui/components/telepathyClient.js:1137 #: ../js/ui/components/telepathyClient.js:1138
#: ../js/ui/components/telepathyClient.js:1177 #: ../js/ui/components/telepathyClient.js:1178
#: ../js/ui/components/telepathyClient.js:1240 #: ../js/ui/components/telepathyClient.js:1241
msgid "Decline" msgid "Decline"
msgstr "Rechazar" msgstr "Rechazar"
#: ../js/ui/components/telepathyClient.js:1099 #: ../js/ui/components/telepathyClient.js:1100
#: ../js/ui/components/telepathyClient.js:1178 #: ../js/ui/components/telepathyClient.js:1179
#: ../js/ui/components/telepathyClient.js:1241 #: ../js/ui/components/telepathyClient.js:1242
msgid "Accept" msgid "Accept"
msgstr "Aceptar" msgstr "Aceptar"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1129 #: ../js/ui/components/telepathyClient.js:1130
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Videollamada de %s" msgstr "Videollamada de %s"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1132 #: ../js/ui/components/telepathyClient.js:1133
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Llamada de %s" msgstr "Llamada de %s"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
#: ../js/ui/components/telepathyClient.js:1139 #: ../js/ui/components/telepathyClient.js:1140
msgid "Answer" msgid "Answer"
msgstr "Responder" msgstr "Responder"
@ -887,112 +893,112 @@ msgstr "Responder"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/components/telepathyClient.js:1171 #: ../js/ui/components/telepathyClient.js:1172
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s le está enviando %s" msgstr "%s le está enviando %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1206 #: ../js/ui/components/telepathyClient.js:1207
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s solicita permiso para ver cuándo está en línea" msgstr "%s solicita permiso para ver cuándo está en línea"
#: ../js/ui/components/telepathyClient.js:1298 #: ../js/ui/components/telepathyClient.js:1299
msgid "Network error" msgid "Network error"
msgstr "Error de la red" msgstr "Error de la red"
#: ../js/ui/components/telepathyClient.js:1300 #: ../js/ui/components/telepathyClient.js:1301
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Falló la autenticación" msgstr "Falló la autenticación"
#: ../js/ui/components/telepathyClient.js:1302 #: ../js/ui/components/telepathyClient.js:1303
msgid "Encryption error" msgid "Encryption error"
msgstr "Error de cifrado" msgstr "Error de cifrado"
#: ../js/ui/components/telepathyClient.js:1304 #: ../js/ui/components/telepathyClient.js:1305
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Certificado no proporcionado" msgstr "Certificado no proporcionado"
#: ../js/ui/components/telepathyClient.js:1306 #: ../js/ui/components/telepathyClient.js:1307
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "No se confía en el certificado" msgstr "No se confía en el certificado"
#: ../js/ui/components/telepathyClient.js:1308 #: ../js/ui/components/telepathyClient.js:1309
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Certificado caducado" msgstr "Certificado caducado"
#: ../js/ui/components/telepathyClient.js:1310 #: ../js/ui/components/telepathyClient.js:1311
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Certificado no activado" msgstr "Certificado no activado"
#: ../js/ui/components/telepathyClient.js:1312 #: ../js/ui/components/telepathyClient.js:1313
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "El nombre del servidor dle certificado no coincide" msgstr "El nombre del servidor dle certificado no coincide"
#: ../js/ui/components/telepathyClient.js:1314 #: ../js/ui/components/telepathyClient.js:1315
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "La huella del certificado no coincide" msgstr "La huella del certificado no coincide"
#: ../js/ui/components/telepathyClient.js:1316 #: ../js/ui/components/telepathyClient.js:1317
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Certificado autofirmado" msgstr "Certificado autofirmado"
#: ../js/ui/components/telepathyClient.js:1318 #: ../js/ui/components/telepathyClient.js:1319
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "El estado está establecido a «desconectado»" msgstr "El estado está establecido a «desconectado»"
#: ../js/ui/components/telepathyClient.js:1320 #: ../js/ui/components/telepathyClient.js:1321
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "El cifrado no está disponible" msgstr "El cifrado no está disponible"
#: ../js/ui/components/telepathyClient.js:1322 #: ../js/ui/components/telepathyClient.js:1323
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "El certificado no es válido" msgstr "El certificado no es válido"
#: ../js/ui/components/telepathyClient.js:1324 #: ../js/ui/components/telepathyClient.js:1325
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Se ha rechazado la conexión" msgstr "Se ha rechazado la conexión"
#: ../js/ui/components/telepathyClient.js:1326 #: ../js/ui/components/telepathyClient.js:1327
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "No se puede establecer la conexión" msgstr "No se puede establecer la conexión"
#: ../js/ui/components/telepathyClient.js:1328 #: ../js/ui/components/telepathyClient.js:1329
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Se ha perdido la conexión" msgstr "Se ha perdido la conexión"
#: ../js/ui/components/telepathyClient.js:1330 #: ../js/ui/components/telepathyClient.js:1331
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "Esta cuenta ya está conectada al servidor" msgstr "Esta cuenta ya está conectada al servidor"
#: ../js/ui/components/telepathyClient.js:1332 #: ../js/ui/components/telepathyClient.js:1333
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "" msgstr ""
"Se ha sustituido la conexión por una nueva conexión usando el mismo recurso" "Se ha sustituido la conexión por una nueva conexión usando el mismo recurso"
#: ../js/ui/components/telepathyClient.js:1334 #: ../js/ui/components/telepathyClient.js:1335
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "La cuenta ya existe en el servidor" msgstr "La cuenta ya existe en el servidor"
#: ../js/ui/components/telepathyClient.js:1336 #: ../js/ui/components/telepathyClient.js:1337
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "" msgstr ""
"Actualmente el servidor está muy ocupado intentando gestionar la conexión" "Actualmente el servidor está muy ocupado intentando gestionar la conexión"
#: ../js/ui/components/telepathyClient.js:1338 #: ../js/ui/components/telepathyClient.js:1339
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Se ha revocado el certificado" msgstr "Se ha revocado el certificado"
#: ../js/ui/components/telepathyClient.js:1340 #: ../js/ui/components/telepathyClient.js:1341
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"El certificado usa un algoritmo de cifrado inseguro o es criptográficamente " "El certificado usa un algoritmo de cifrado inseguro o es criptográficamente "
"débil" "débil"
#: ../js/ui/components/telepathyClient.js:1342 #: ../js/ui/components/telepathyClient.js:1343
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
@ -1001,22 +1007,22 @@ msgstr ""
"certificado del servidor exceden los límites impuestos por la biblioteca de " "certificado del servidor exceden los límites impuestos por la biblioteca de "
"criptografía" "criptografía"
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1345
msgid "Internal error" msgid "Internal error"
msgstr "Error interno" msgstr "Error interno"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1354 #: ../js/ui/components/telepathyClient.js:1355
#, c-format #, c-format
msgid "Unable to connect to %s" msgid "Unable to connect to %s"
msgstr "No se pudo conectar a %s" msgstr "No se pudo conectar a %s"
#: ../js/ui/components/telepathyClient.js:1359 #: ../js/ui/components/telepathyClient.js:1360
msgid "View account" msgid "View account"
msgstr "Ver cuenta" msgstr "Ver cuenta"
#: ../js/ui/components/telepathyClient.js:1398 #: ../js/ui/components/telepathyClient.js:1399
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Razón desconocida" msgstr "Razón desconocida"
@ -1049,7 +1055,7 @@ msgstr "Configuración de hora y fecha"
#. 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:202 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e de %B de %Y" msgstr "%A, %e de %B de %Y"
@ -1262,17 +1268,17 @@ msgstr "Vista general"
msgid "Type to search…" msgid "Type to search…"
msgstr "Escribir para buscar…" msgstr "Escribir para buscar…"
#: ../js/ui/panel.js:642 #: ../js/ui/panel.js:567
msgid "Quit" msgid "Quit"
msgstr "Salir" msgstr "Salir"
#. 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:693 #: ../js/ui/panel.js:618
msgid "Activities" msgid "Activities"
msgstr "Actividades" msgstr "Actividades"
#: ../js/ui/panel.js:989 #: ../js/ui/panel.js:914
msgid "Top Bar" msgid "Top Bar"
msgstr "Barra superior" msgstr "Barra superior"
@ -1281,7 +1287,7 @@ msgstr "Barra superior"
#. "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:545 #: ../js/ui/popupMenu.js:549
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1631,7 +1637,7 @@ msgstr "Falló la conexión"
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Falló la activación de la conexión de red" msgstr "Falló la activación de la conexión de red"
#: ../js/ui/status/network.js:1933 #: ../js/ui/status/network.js:1937
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "La red está desactivada" msgstr "La red está desactivada"
@ -2033,9 +2039,6 @@ msgstr "El usuario rechazó el diálogo de autenticación"
#~ msgid "System Settings" #~ msgid "System Settings"
#~ msgstr "Configuración del sistema" #~ msgstr "Configuración del sistema"
#~ msgid "Switch Session"
#~ msgstr "Cambiar de sesión"
#~ msgid "disabled OpenSearch providers" #~ msgid "disabled OpenSearch providers"
#~ msgstr "proveedores OpenSearch desactivados" #~ msgstr "proveedores OpenSearch desactivados"

369
po/gl.po

@ -11,8 +11,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-05-31 01:03+0200\n" "POT-Creation-Date: 2013-06-28 01:33+0200\n"
"PO-Revision-Date: 2013-05-31 01:04+0200\n" "PO-Revision-Date: 2013-06-28 01:35+0200\n"
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n" "Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
"Language-Team: gnome-l10n-gl@gnome.org\n" "Language-Team: gnome-l10n-gl@gnome.org\n"
"Language: gl\n" "Language: gl\n"
@ -369,37 +369,41 @@ msgid "Select an extension to configure using the combobox above."
msgstr "" msgstr ""
"Seleccione unha extensión que configurar usando a caixa combinada de arriba." "Seleccione unha extensión que configurar usando a caixa combinada de arriba."
#: ../js/gdm/loginDialog.js:371 #: ../js/gdm/loginDialog.js:308
msgid "Session" msgid "Choose Session"
msgstr "Sesión" msgstr "Escolla unha sesión"
#: ../js/gdm/loginDialog.js:326
msgid "Session"
msgstr "Sesión"
#. 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:601 #: ../js/gdm/loginDialog.js:528
msgid "Not listed?" msgid "Not listed?"
msgstr "Non está na lista?" msgstr "Non está na lista?"
#: ../js/gdm/loginDialog.js:776 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:810 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376 #: ../js/ui/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:96 #: ../js/ui/status/bluetooth.js:449 ../js/ui/unlockDialog.js:95
#: ../js/ui/userMenu.js:938 #: ../js/ui/userMenu.js:884
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
#: ../js/gdm/loginDialog.js:791 #: ../js/gdm/loginDialog.js:833
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Iniciar sesión" msgstr "Iniciar sesión"
#: ../js/gdm/loginDialog.js:791 #: ../js/gdm/loginDialog.js:833
msgid "Next" msgid "Next"
msgstr "Seguinte" msgstr "Seguinte"
#. Translators: this message is shown below the username entry field #. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm #. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:888 #: ../js/gdm/loginDialog.js:934
#, c-format #, c-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(p.ex., usuario ou %s)" msgstr "(p.ex., usuario ou %s)"
@ -407,12 +411,12 @@ msgstr "(p.ex., usuario ou %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:892 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:938 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Nome de usuario: " msgstr "Nome de usuario: "
#: ../js/gdm/loginDialog.js:1158 #: ../js/gdm/loginDialog.js:1205
msgid "Login Window" msgid "Login Window"
msgstr "Xanela de inicio de sesión" msgstr "Xanela de inicio de sesión"
@ -421,8 +425,8 @@ msgstr "Xanela de inicio de sesión"
msgid "Power" msgid "Power"
msgstr "Apagar" msgstr "Apagar"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:696 ../js/ui/userMenu.js:700 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:651 ../js/ui/userMenu.js:655
#: ../js/ui/userMenu.js:816 #: ../js/ui/userMenu.js:768
msgid "Suspend" msgid "Suspend"
msgstr "Suspender" msgstr "Suspender"
@ -430,18 +434,18 @@ msgstr "Suspender"
msgid "Restart" msgid "Restart"
msgstr "Reiniciar" msgstr "Reiniciar"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:698 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:653
#: ../js/ui/userMenu.js:700 ../js/ui/userMenu.js:815 ../js/ui/userMenu.js:942 #: ../js/ui/userMenu.js:655 ../js/ui/userMenu.js:767 ../js/ui/userMenu.js:888
msgid "Power Off" msgid "Power Off"
msgstr "Apagar" msgstr "Apagar"
#: ../js/gdm/util.js:247 #: ../js/gdm/util.js:248
msgid "Authentication error" msgid "Authentication error"
msgstr "Erro de autenticación" msgstr "Erro de autenticación"
#. 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:364 #: ../js/gdm/util.js:365
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(ou pase o dedo)" msgstr "(ou pase o dedo)"
@ -460,23 +464,23 @@ msgstr "Non foi posíbel analizar a orde:"
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Produciuse un fallo na execución de «%s»:" msgstr "Produciuse un fallo na execución de «%s»:"
#: ../js/ui/appDisplay.js:361 #: ../js/ui/appDisplay.js:397
msgid "Frequent" msgid "Frequent"
msgstr "Frecuentes" msgstr "Frecuentes"
#: ../js/ui/appDisplay.js:368 #: ../js/ui/appDisplay.js:404
msgid "All" msgid "All"
msgstr "Todos" msgstr "Todos"
#: ../js/ui/appDisplay.js:960 #: ../js/ui/appDisplay.js:996
msgid "New Window" msgid "New Window"
msgstr "Xanela nova" msgstr "Xanela nova"
#: ../js/ui/appDisplay.js:963 ../js/ui/dash.js:284 #: ../js/ui/appDisplay.js:999 ../js/ui/dash.js:284
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Retirar dos marcadores" msgstr "Retirar dos marcadores"
#: ../js/ui/appDisplay.js:964 #: ../js/ui/appDisplay.js:1000
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Engadir aos favoritos" msgstr "Engadir aos favoritos"
@ -490,7 +494,7 @@ msgstr "%s foi engadido aos seus favoritos."
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s retirouse dos seus marcadores." msgstr "%s retirouse dos seus marcadores."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:789 #: ../js/ui/backgroundMenu.js:19 ../js/ui/userMenu.js:744
msgid "Settings" msgid "Settings"
msgstr "Preferencias" msgstr "Preferencias"
@ -615,35 +619,35 @@ msgid "S"
msgstr "S" msgstr "S"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:735 #: ../js/ui/calendar.js:750
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Nada programado" msgstr "Nada programado"
#. 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:751 #: ../js/ui/calendar.js:768
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d de %B" msgstr "%A, %d de %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:754 #: ../js/ui/calendar.js:771
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %d de %B de %Y" msgstr "%A, %d de %B de %Y"
#: ../js/ui/calendar.js:764 #: ../js/ui/calendar.js:782
msgid "Today" msgid "Today"
msgstr "Hoxe" msgstr "Hoxe"
#: ../js/ui/calendar.js:768 #: ../js/ui/calendar.js:786
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Mañá" msgstr "Mañá"
#: ../js/ui/calendar.js:779 #: ../js/ui/calendar.js:797
msgid "This week" msgid "This week"
msgstr "Esta semana" msgstr "Esta semana"
#: ../js/ui/calendar.js:787 #: ../js/ui/calendar.js:805
msgid "Next week" msgid "Next week"
msgstr "A vindeira semana" msgstr "A vindeira semana"
@ -832,14 +836,14 @@ msgstr "<b>%d</b> de <b>%B</b> de <b>%Y</b>, <b>%H:%M</b> "
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
#: ../js/ui/components/telepathyClient.js:985 #: ../js/ui/components/telepathyClient.js:986
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "Agora %s chámase %s" msgstr "Agora %s chámase %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1088 #: ../js/ui/components/telepathyClient.js:1089
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Convite a %s" msgstr "Convite a %s"
@ -847,38 +851,38 @@ msgstr "Convite a %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. #. * for example.
#: ../js/ui/components/telepathyClient.js:1096 #: ../js/ui/components/telepathyClient.js:1097
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s estalle convidando a unirse a %s" msgstr "%s estalle convidando a unirse a %s"
#: ../js/ui/components/telepathyClient.js:1098 #: ../js/ui/components/telepathyClient.js:1099
#: ../js/ui/components/telepathyClient.js:1137 #: ../js/ui/components/telepathyClient.js:1138
#: ../js/ui/components/telepathyClient.js:1177 #: ../js/ui/components/telepathyClient.js:1178
#: ../js/ui/components/telepathyClient.js:1240 #: ../js/ui/components/telepathyClient.js:1241
msgid "Decline" msgid "Decline"
msgstr "Rexeitar" msgstr "Rexeitar"
#: ../js/ui/components/telepathyClient.js:1099 #: ../js/ui/components/telepathyClient.js:1100
#: ../js/ui/components/telepathyClient.js:1178 #: ../js/ui/components/telepathyClient.js:1179
#: ../js/ui/components/telepathyClient.js:1241 #: ../js/ui/components/telepathyClient.js:1242
msgid "Accept" msgid "Accept"
msgstr "Aceptar" msgstr "Aceptar"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1129 #: ../js/ui/components/telepathyClient.js:1130
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Videochamada de %s" msgstr "Videochamada de %s"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1132 #: ../js/ui/components/telepathyClient.js:1133
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Chamada de %s" msgstr "Chamada de %s"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
#: ../js/ui/components/telepathyClient.js:1139 #: ../js/ui/components/telepathyClient.js:1140
msgid "Answer" msgid "Answer"
msgstr "Responder" msgstr "Responder"
@ -887,112 +891,112 @@ msgstr "Responder"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/components/telepathyClient.js:1171 #: ../js/ui/components/telepathyClient.js:1172
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s esta enviándolle %s" msgstr "%s esta enviándolle %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1206 #: ../js/ui/components/telepathyClient.js:1207
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s solicítalle permiso para ver cando está en liña" msgstr "%s solicítalle permiso para ver cando está en liña"
#: ../js/ui/components/telepathyClient.js:1298 #: ../js/ui/components/telepathyClient.js:1299
msgid "Network error" msgid "Network error"
msgstr "Erro da rede" msgstr "Erro da rede"
#: ../js/ui/components/telepathyClient.js:1300 #: ../js/ui/components/telepathyClient.js:1301
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Fallou a autenticación" msgstr "Fallou a autenticación"
#: ../js/ui/components/telepathyClient.js:1302 #: ../js/ui/components/telepathyClient.js:1303
msgid "Encryption error" msgid "Encryption error"
msgstr "Erro de cifrado" msgstr "Erro de cifrado"
#: ../js/ui/components/telepathyClient.js:1304 #: ../js/ui/components/telepathyClient.js:1305
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Certificado non fornecido" msgstr "Certificado non fornecido"
#: ../js/ui/components/telepathyClient.js:1306 #: ../js/ui/components/telepathyClient.js:1307
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Non se confía no certificado" msgstr "Non se confía no certificado"
#: ../js/ui/components/telepathyClient.js:1308 #: ../js/ui/components/telepathyClient.js:1309
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Certificado caducado" msgstr "Certificado caducado"
#: ../js/ui/components/telepathyClient.js:1310 #: ../js/ui/components/telepathyClient.js:1311
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Certificado non activado" msgstr "Certificado non activado"
#: ../js/ui/components/telepathyClient.js:1312 #: ../js/ui/components/telepathyClient.js:1313
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "O nome do servidor do certificado non coincide" msgstr "O nome do servidor do certificado non coincide"
#: ../js/ui/components/telepathyClient.js:1314 #: ../js/ui/components/telepathyClient.js:1315
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "A pegada do certificado non coincide" msgstr "A pegada do certificado non coincide"
#: ../js/ui/components/telepathyClient.js:1316 #: ../js/ui/components/telepathyClient.js:1317
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Certificado autoasinado" msgstr "Certificado autoasinado"
#: ../js/ui/components/telepathyClient.js:1318 #: ../js/ui/components/telepathyClient.js:1319
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "O estado está definido a «desconectado»" msgstr "O estado está definido a «desconectado»"
#: ../js/ui/components/telepathyClient.js:1320 #: ../js/ui/components/telepathyClient.js:1321
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "O cifrado non está dispoñíbel" msgstr "O cifrado non está dispoñíbel"
#: ../js/ui/components/telepathyClient.js:1322 #: ../js/ui/components/telepathyClient.js:1323
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "O certificado non é válido" msgstr "O certificado non é válido"
#: ../js/ui/components/telepathyClient.js:1324 #: ../js/ui/components/telepathyClient.js:1325
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Rexeitouse a conexión" msgstr "Rexeitouse a conexión"
#: ../js/ui/components/telepathyClient.js:1326 #: ../js/ui/components/telepathyClient.js:1327
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "Non é posíbel estabelecer a conexión" msgstr "Non é posíbel estabelecer a conexión"
#: ../js/ui/components/telepathyClient.js:1328 #: ../js/ui/components/telepathyClient.js:1329
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Perdeuse a conexión" msgstr "Perdeuse a conexión"
#: ../js/ui/components/telepathyClient.js:1330 #: ../js/ui/components/telepathyClient.js:1331
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "Esta cuenta xa está conectada ao servidor" msgstr "Esta cuenta xa está conectada ao servidor"
#: ../js/ui/components/telepathyClient.js:1332 #: ../js/ui/components/telepathyClient.js:1333
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "" msgstr ""
"Substituíuse a conexión por unha nova conexión empregando o mesmo recurso" "Substituíuse a conexión por unha nova conexión empregando o mesmo recurso"
#: ../js/ui/components/telepathyClient.js:1334 #: ../js/ui/components/telepathyClient.js:1335
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "Esta conta xa existe no servidor" msgstr "Esta conta xa existe no servidor"
#: ../js/ui/components/telepathyClient.js:1336 #: ../js/ui/components/telepathyClient.js:1337
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "" msgstr ""
"Nestes intres o servidor está moi ocupado tentando xestionar a conexión" "Nestes intres o servidor está moi ocupado tentando xestionar a conexión"
#: ../js/ui/components/telepathyClient.js:1338 #: ../js/ui/components/telepathyClient.js:1339
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Revogouse o certificado" msgstr "Revogouse o certificado"
#: ../js/ui/components/telepathyClient.js:1340 #: ../js/ui/components/telepathyClient.js:1341
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"O certificado usa un algoritmo de cifrado inseguro ou é criptográficamente " "O certificado usa un algoritmo de cifrado inseguro ou é criptográficamente "
"débil" "débil"
#: ../js/ui/components/telepathyClient.js:1342 #: ../js/ui/components/telepathyClient.js:1343
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
@ -1001,22 +1005,22 @@ msgstr ""
"certificado do servidor excede os límites impostos pola biblioteca de " "certificado do servidor excede os límites impostos pola biblioteca de "
"criptografía." "criptografía."
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1345
msgid "Internal error" msgid "Internal error"
msgstr "Erro interno" msgstr "Erro interno"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1354 #: ../js/ui/components/telepathyClient.js:1355
#, c-format #, c-format
msgid "Unable to connect to %s" msgid "Unable to connect to %s"
msgstr "Non foi posíbel conectarse a %s" msgstr "Non foi posíbel conectarse a %s"
#: ../js/ui/components/telepathyClient.js:1359 #: ../js/ui/components/telepathyClient.js:1360
msgid "View account" msgid "View account"
msgstr "Ver conta" msgstr "Ver conta"
#: ../js/ui/components/telepathyClient.js:1398 #: ../js/ui/components/telepathyClient.js:1399
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Razón descoñecida" msgstr "Razón descoñecida"
@ -1030,26 +1034,26 @@ msgstr "Mostrar aplicativos"
#. Translators: this is the name of the dock/favorites area on #. Translators: this is the name of the dock/favorites area on
#. the left of the overview #. the left of the overview
#: ../js/ui/dash.js:435 #: ../js/ui/dash.js:439
msgid "Dash" msgid "Dash"
msgstr "Taboleiro" msgstr "Taboleiro"
#: ../js/ui/dateMenu.js:86 #: ../js/ui/dateMenu.js:85
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Abrir Calendario" msgstr "Abrir Calendario"
#: ../js/ui/dateMenu.js:90 #: ../js/ui/dateMenu.js:89
msgid "Open Clocks" msgid "Open Clocks"
msgstr "Abrir Reloxos" msgstr "Abrir Reloxos"
#: ../js/ui/dateMenu.js:97 #: ../js/ui/dateMenu.js:96
msgid "Date & Time Settings" msgid "Date & Time Settings"
msgstr "Preferencias de data e hora" msgstr "Preferencias de data e hora"
#. 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:208 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%a, %e de %B, %Y" msgstr "%a, %e de %B, %Y"
@ -1261,17 +1265,17 @@ msgstr "Vista xeral"
msgid "Type to search…" msgid "Type to search…"
msgstr "Escriba para buscar…" msgstr "Escriba para buscar…"
#: ../js/ui/panel.js:642 #: ../js/ui/panel.js:567
msgid "Quit" msgid "Quit"
msgstr "Saír" msgstr "Saír"
#. 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:693 #: ../js/ui/panel.js:618
msgid "Activities" msgid "Activities"
msgstr "Actividades" msgstr "Actividades"
#: ../js/ui/panel.js:989 #: ../js/ui/panel.js:914
msgid "Top Bar" msgid "Top Bar"
msgstr "Barra superior" msgstr "Barra superior"
@ -1280,7 +1284,7 @@ msgstr "Barra superior"
#. "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:738 #: ../js/ui/popupMenu.js:549
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1305,7 +1309,7 @@ msgid_plural "%d new notifications"
msgstr[0] "%d notificación nova" msgstr[0] "%d notificación nova"
msgstr[1] "%d notificacións novas" msgstr[1] "%d notificacións novas"
#: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:807 #: ../js/ui/screenShield.js:449 ../js/ui/userMenu.js:759
msgid "Lock" msgid "Lock"
msgstr "Bloquear" msgstr "Bloquear"
@ -1320,11 +1324,11 @@ msgstr "GNOME precisa bloquear a pantalla"
#. #.
#. 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:773 ../js/ui/screenShield.js:1213 #: ../js/ui/screenShield.js:775 ../js/ui/screenShield.js:1215
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Non foi posíbel bloquear" msgstr "Non foi posíbel bloquear"
#: ../js/ui/screenShield.js:774 ../js/ui/screenShield.js:1214 #: ../js/ui/screenShield.js:776 ../js/ui/screenShield.js:1216
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Un aplicativo impediu o bloqueo" msgstr "Un aplicativo impediu o bloqueo"
@ -1360,7 +1364,7 @@ msgstr "Contrasinal"
msgid "Remember Password" msgid "Remember Password"
msgstr "Lembrar contrasinal" msgstr "Lembrar contrasinal"
#: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:109 #: ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:108
msgid "Unlock" msgid "Unlock"
msgstr "Desbloquear" msgstr "Desbloquear"
@ -1413,9 +1417,9 @@ msgid "Large Text"
msgstr "Texto grande" msgstr "Texto grande"
#: ../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:290 ../js/ui/status/bluetooth.js:327
#: ../js/ui/status/bluetooth.js:357 ../js/ui/status/bluetooth.js:388 #: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:391
#: ../js/ui/status/network.js:739 #: ../js/ui/status/bluetooth.js:422 ../js/ui/status/network.js:713
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@ -1436,73 +1440,82 @@ msgid "Bluetooth Settings"
msgstr "Preferencias do Bluetooth" msgstr "Preferencias do 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:142 #: ../js/ui/status/bluetooth.js:105 ../js/ui/status/network.js:140
msgid "hardware disabled" msgid "hardware disabled"
msgstr "hardware desactivado" msgstr "hardware desactivado"
#: ../js/ui/status/bluetooth.js:197 #: ../js/ui/status/bluetooth.js:198
msgid "Connection" msgid "Connection"
msgstr "Conexión" msgstr "Conexión"
#: ../js/ui/status/bluetooth.js:208 ../js/ui/status/network.js:404 #: ../js/ui/status/bluetooth.js:209 ../js/ui/status/network.js:399
msgid "disconnecting..." msgid "disconnecting..."
msgstr "desconectando…" msgstr "desconectando…"
#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:410 #: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:405
#: ../js/ui/status/network.js:1343 #: ../js/ui/status/network.js:1298
msgid "connecting..." msgid "connecting..."
msgstr "conectando…" msgstr "conectando…"
#: ../js/ui/status/bluetooth.js:239 #: ../js/ui/status/bluetooth.js:240
msgid "Send Files…" msgid "Send Files…"
msgstr "Enviar ficheiros…" msgstr "Enviar ficheiros…"
#: ../js/ui/status/bluetooth.js:246 #: ../js/ui/status/bluetooth.js:247
msgid "Keyboard Settings" msgid "Keyboard Settings"
msgstr "Preferencias do teclado" msgstr "Preferencias do teclado"
#: ../js/ui/status/bluetooth.js:249 #: ../js/ui/status/bluetooth.js:250
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Preferencias do rato" msgstr "Preferencias do rato"
#: ../js/ui/status/bluetooth.js:254 ../js/ui/status/volume.js:316 #: ../js/ui/status/bluetooth.js:255 ../js/ui/status/volume.js:313
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Preferencias do son" msgstr "Preferencias do son"
#: ../js/ui/status/bluetooth.js:322 #: ../js/ui/status/bluetooth.js:328 ../js/ui/status/bluetooth.js:356
#, c-format #, c-format
msgid "Authorization request from %s" msgid "Authorization request from %s"
msgstr "Solicitude de autorización de %s" msgstr "Solicitude de autorización de %s"
#: ../js/ui/status/bluetooth.js:328 #: ../js/ui/status/bluetooth.js:334 ../js/ui/status/bluetooth.js:399
#, c-format #: ../js/ui/status/bluetooth.js:430
msgid "Device %s wants access to the service '%s'"
msgstr "O dispositivo %s quere acceder ao servizo «%s»"
#: ../js/ui/status/bluetooth.js:330
msgid "Always grant access"
msgstr "Conceder acceso sempre"
#: ../js/ui/status/bluetooth.js:331
msgid "Grant this time only"
msgstr "Conceder só esta vez"
#: ../js/ui/status/bluetooth.js:332
msgid "Reject"
msgstr "Rexeitar"
#. Translators: argument is the device short name
#: ../js/ui/status/bluetooth.js:359
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Confirmación de emparellado para «%s»"
#: ../js/ui/status/bluetooth.js:365 ../js/ui/status/bluetooth.js:396
#, c-format #, c-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "O dispositivo «%s» quere emparellarse con este equipo" msgstr "O dispositivo «%s» quere emparellarse con este equipo"
#: ../js/ui/status/bluetooth.js:336
msgid "Allow"
msgstr "Permitir"
#: ../js/ui/status/bluetooth.js:337
msgid "Deny"
msgstr "Denegar"
#: ../js/ui/status/bluetooth.js:362
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "O dispositivo %s quere acceder ao servizo «%s»"
#: ../js/ui/status/bluetooth.js:364
msgid "Always grant access"
msgstr "Conceder acceso sempre"
#: ../js/ui/status/bluetooth.js:365
msgid "Grant this time only"
msgstr "Conceder só esta vez"
#: ../js/ui/status/bluetooth.js:366 #: ../js/ui/status/bluetooth.js:366
msgid "Reject"
msgstr "Rexeitar"
#. Translators: argument is the device short name
#: ../js/ui/status/bluetooth.js:393
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Confirmación de emparellado para «%s»"
#: ../js/ui/status/bluetooth.js:400
#, c-format #, c-format
msgid "" msgid ""
"Please confirm whether the Passkey '%06d' matches the one on the device." "Please confirm whether the Passkey '%06d' matches the one on the device."
@ -1510,24 +1523,24 @@ msgstr ""
"Confirme que a frase de paso «%06d» coincide coa mostrada no dispositivo." "Confirme que a frase de paso «%06d» coincide coa mostrada no dispositivo."
#. 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:403
msgid "Matches" msgid "Matches"
msgstr "Coincide" msgstr "Coincide"
#: ../js/ui/status/bluetooth.js:370 #: ../js/ui/status/bluetooth.js:404
msgid "Does not match" msgid "Does not match"
msgstr "Non coincide" msgstr "Non coincide"
#: ../js/ui/status/bluetooth.js:389 #: ../js/ui/status/bluetooth.js:423
#, c-format #, c-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "Solicitude de emparellamento para «%s»" msgstr "Solicitude de emparellamento para «%s»"
#: ../js/ui/status/bluetooth.js:397 #: ../js/ui/status/bluetooth.js:431
msgid "Please enter the PIN mentioned on the device." msgid "Please enter the PIN mentioned on the device."
msgstr "Escriba o PIN mencionado no dispositivo." msgstr "Escriba o PIN mencionado no dispositivo."
#: ../js/ui/status/bluetooth.js:414 #: ../js/ui/status/bluetooth.js:448
msgid "OK" msgid "OK"
msgstr "Aceptar" msgstr "Aceptar"
@ -1547,87 +1560,81 @@ msgstr "Volume, rede, batería"
msgid "<unknown>" msgid "<unknown>"
msgstr "<descoñecido>" msgstr "<descoñecido>"
#: ../js/ui/status/network.js:127 #: ../js/ui/status/network.js:125
msgid "Wi-Fi" msgid "Wi-Fi"
msgstr "Wifi" msgstr "Wifi"
#. 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:164 #: ../js/ui/status/network.js:162
msgid "disabled" msgid "disabled"
msgstr "desactivada" msgstr "desactivada"
#. 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:402 #: ../js/ui/status/network.js:397
msgid "unmanaged" msgid "unmanaged"
msgstr "non xestionada" msgstr "non xestionada"
#. 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:413 ../js/ui/status/network.js:1346 #: ../js/ui/status/network.js:408 ../js/ui/status/network.js:1301
msgid "authentication required" msgid "authentication required"
msgstr "requírese autenticación" msgstr "requírese autenticación"
#. 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:423 #: ../js/ui/status/network.js:419
msgid "firmware missing" msgid "firmware missing"
msgstr "falta o «firmware»" msgstr "falta o «firmware»"
#. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:430
msgid "cable unplugged"
msgstr "cable desconectado"
#. 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:435 #: ../js/ui/status/network.js:423
msgid "unavailable" msgid "unavailable"
msgstr "non dispoñíbel" msgstr "non dispoñíbel"
#: ../js/ui/status/network.js:437 ../js/ui/status/network.js:1348 #: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1303
msgid "connection failed" msgid "connection failed"
msgstr "conexión fallada" msgstr "conexión fallada"
#: ../js/ui/status/network.js:490 ../js/ui/status/network.js:1236 #: ../js/ui/status/network.js:478 ../js/ui/status/network.js:1190
#: ../js/ui/status/network.js:1424
msgid "More…" msgid "More…"
msgstr "Máis…" msgstr "Máis…"
#. 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:518 ../js/ui/status/network.js:1191 #: ../js/ui/status/network.js:506 ../js/ui/status/network.js:1142
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Conectada (privada)" msgstr "Conectada (privada)"
#: ../js/ui/status/network.js:597 #: ../js/ui/status/network.js:572
msgid "Wired" msgid "Wired"
msgstr "Con fíos" msgstr "Con fíos"
#: ../js/ui/status/network.js:611 #: ../js/ui/status/network.js:592
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "Banda larga móbil" msgstr "Banda larga móbil"
#: ../js/ui/status/network.js:1522 #: ../js/ui/status/network.js:1474
msgid "Enable networking" msgid "Enable networking"
msgstr "Activar rede" msgstr "Activar rede"
#: ../js/ui/status/network.js:1583 #: ../js/ui/status/network.js:1522
msgid "Network Settings" msgid "Network Settings"
msgstr "Preferencias da rede" msgstr "Preferencias da rede"
#: ../js/ui/status/network.js:1600 #: ../js/ui/status/network.js:1539
msgid "Network Manager" msgid "Network Manager"
msgstr "Xestor da rede" msgstr "Xestor da rede"
#: ../js/ui/status/network.js:1690 #: ../js/ui/status/network.js:1623
msgid "Connection failed" msgid "Connection failed"
msgstr "Produciuse un fallo na conexión" msgstr "Produciuse un fallo na conexión"
#: ../js/ui/status/network.js:1691 #: ../js/ui/status/network.js:1624
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Produciuse un fallo na activación da conexión de rede" msgstr "Produciuse un fallo na activación da conexión de rede"
#: ../js/ui/status/network.js:2047 #: ../js/ui/status/network.js:1937
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "A rede está desactivada" msgstr "A rede está desactivada"
@ -1728,72 +1735,72 @@ msgctxt "device"
msgid "Unknown" msgid "Unknown"
msgstr "Descoñecido" msgstr "Descoñecido"
#: ../js/ui/status/volume.js:124 #: ../js/ui/status/volume.js:121
msgid "Volume changed" msgid "Volume changed"
msgstr "Volume cambiado" msgstr "Volume cambiado"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:249 ../js/ui/status/volume.js:297 #: ../js/ui/status/volume.js:246 ../js/ui/status/volume.js:294
msgid "Volume" msgid "Volume"
msgstr "Volume" msgstr "Volume"
#: ../js/ui/status/volume.js:258 #: ../js/ui/status/volume.js:255
msgid "Microphone" msgid "Microphone"
msgstr "Micrófono" msgstr "Micrófono"
#: ../js/ui/unlockDialog.js:120 #: ../js/ui/unlockDialog.js:119
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Iniciar sesión como outro usuario" msgstr "Iniciar sesión como outro usuario"
#: ../js/ui/unlockDialog.js:141 #: ../js/ui/unlockDialog.js:140
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Desbloquear xanela" msgstr "Desbloquear xanela"
#: ../js/ui/userMenu.js:193 #: ../js/ui/userMenu.js:149
msgid "Available" msgid "Available"
msgstr "Dispoñíbel" msgstr "Dispoñíbel"
#: ../js/ui/userMenu.js:196 #: ../js/ui/userMenu.js:152
msgid "Busy" msgid "Busy"
msgstr "Ocupado" msgstr "Ocupado"
#: ../js/ui/userMenu.js:199 #: ../js/ui/userMenu.js:155
msgid "Invisible" msgid "Invisible"
msgstr "Invisíbel" msgstr "Invisíbel"
#: ../js/ui/userMenu.js:202 #: ../js/ui/userMenu.js:158
msgid "Away" msgid "Away"
msgstr "Ausente" msgstr "Ausente"
#: ../js/ui/userMenu.js:205 #: ../js/ui/userMenu.js:161
msgid "Idle" msgid "Idle"
msgstr "Inactivo" msgstr "Inactivo"
#: ../js/ui/userMenu.js:208 #: ../js/ui/userMenu.js:164
msgid "Offline" msgid "Offline"
msgstr "Desconectado" msgstr "Desconectado"
#: ../js/ui/userMenu.js:781 #: ../js/ui/userMenu.js:736
msgid "Notifications" msgid "Notifications"
msgstr "Notificacións" msgstr "Notificacións"
#: ../js/ui/userMenu.js:797 #: ../js/ui/userMenu.js:749
msgid "Switch User" msgid "Switch User"
msgstr "Cambiar de usuario" msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:754
msgid "Log Out" msgid "Log Out"
msgstr "Saír da sesión" msgstr "Saír da sesión"
#: ../js/ui/userMenu.js:822 #: ../js/ui/userMenu.js:774
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Instalar actualizacións e reiniciar" msgstr "Instalar actualizacións e reiniciar"
#: ../js/ui/userMenu.js:840 #: ../js/ui/userMenu.js:792
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "O seu estado de conversa estabelecerase a «ocupado»" msgstr "O seu estado de conversa estabelecerase a «ocupado»"
#: ../js/ui/userMenu.js:841 #: ../js/ui/userMenu.js:793
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1802,22 +1809,22 @@ msgstr ""
"conversa. O seu estado de conexión axustouse para que outros saiban que non " "conversa. O seu estado de conexión axustouse para que outros saiban que non "
"quere ver as súas mensaxes." "quere ver as súas mensaxes."
#: ../js/ui/userMenu.js:888 #: ../js/ui/userMenu.js:834
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "Hai outros usuarios conectados." msgstr "Hai outros usuarios conectados."
#: ../js/ui/userMenu.js:893 #: ../js/ui/userMenu.js:839
msgid "Shutting down might cause them to lose unsaved work." msgid "Shutting down might cause them to lose unsaved work."
msgstr "Se apaga o computador pode perder o traballo que non gardou." msgstr "Se apaga o computador pode perder o traballo que non gardou."
#. Translators: Remote here refers to a remote session, like a ssh login #. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/userMenu.js:921 #: ../js/ui/userMenu.js:867
#, c-format #, c-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (remoto)" msgstr "%s (remoto)"
#. Translators: Console here refers to a tty like a VT console #. Translators: Console here refers to a tty like a VT console
#: ../js/ui/userMenu.js:924 #: ../js/ui/userMenu.js:870
#, c-format #, c-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (consola)" msgstr "%s (consola)"
@ -1875,21 +1882,21 @@ msgstr[1] "%u entradas"
msgid "System Sounds" msgid "System Sounds"
msgstr "Sons do sistema" msgstr "Sons do sistema"
#: ../src/main.c:372 #: ../src/main.c:353
msgid "Print version" msgid "Print version"
msgstr "Imprimir versión" msgstr "Imprimir versión"
#: ../src/main.c:378 #: ../src/main.c:359
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Modo usado por GDM para a pantalla de inicio" msgstr "Modo usado por GDM para a pantalla de inicio"
#: ../src/main.c:384 #: ../src/main.c:365
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "" msgstr ""
"Usar un modo específico, por exemplo, «gdm» para a pantalla de inicio de " "Usar un modo específico, por exemplo, «gdm» para a pantalla de inicio de "
"sesión" "sesión"
#: ../src/main.c:390 #: ../src/main.c:371
msgid "List possible modes" msgid "List possible modes"
msgstr "Listar os modos posíbeis" msgstr "Listar os modos posíbeis"
@ -1910,6 +1917,9 @@ msgstr "O contrasinal non pode estar baleiro"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "O usuario rexeitou o diálogo de autenticación" msgstr "O usuario rexeitou o diálogo de autenticación"
#~ msgid "cable unplugged"
#~ msgstr "cable desconectado"
#~ msgid "Whether to collect stats about applications usage" #~ msgid "Whether to collect stats about applications usage"
#~ msgstr "" #~ msgstr ""
#~ "Indica se se deben recolectar estatísticas sobre o uso dos aplicativos" #~ "Indica se se deben recolectar estatísticas sobre o uso dos aplicativos"
@ -2027,9 +2037,6 @@ msgstr "O usuario rexeitou o diálogo de autenticación"
#~ msgid "System Settings" #~ msgid "System Settings"
#~ msgstr "Preferencias do sistema" #~ msgstr "Preferencias do sistema"
#~ msgid "Switch Session"
#~ msgstr "Cambiar de sesión"
#~ msgid "disabled OpenSearch providers" #~ msgid "disabled OpenSearch providers"
#~ msgstr "fornecedores OpenSearch desactivados" #~ msgstr "fornecedores OpenSearch desactivados"

616
po/id.po

File diff suppressed because it is too large Load Diff

132
po/nb.po

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell 3.9.x\n" "Project-Id-Version: gnome-shell 3.9.x\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-06-17 12:28+0200\n" "POT-Creation-Date: 2013-07-04 11:09+0200\n"
"PO-Revision-Date: 2013-06-17 12:29+0200\n" "PO-Revision-Date: 2013-07-04 11:09+0200\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n" "Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n" "Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
"Language: \n" "Language: \n"
@ -331,18 +331,22 @@ msgstr "Utvidelse"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Velg en utvidelse som skal konfigureres med komboboksen over." msgstr "Velg en utvidelse som skal konfigureres med komboboksen over."
#: ../js/gdm/loginDialog.js:370 #: ../js/gdm/loginDialog.js:308
msgid "Session" msgid "Choose Session"
msgstr "Økt …" msgstr "Velg økt"
#: ../js/gdm/loginDialog.js:326
msgid "Session"
msgstr "Økt"
#. 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:600 #: ../js/gdm/loginDialog.js:528
msgid "Not listed?" msgid "Not listed?"
msgstr "Ikke listet?" msgstr "Ikke listet?"
#: ../js/gdm/loginDialog.js:775 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:810 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:376 #: ../js/ui/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:449 ../js/ui/unlockDialog.js:95 #: ../js/ui/status/bluetooth.js:449 ../js/ui/unlockDialog.js:95
@ -350,18 +354,18 @@ msgstr "Ikke listet?"
msgid "Cancel" msgid "Cancel"
msgstr "Avbryt" msgstr "Avbryt"
#: ../js/gdm/loginDialog.js:790 #: ../js/gdm/loginDialog.js:833
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Logg inn" msgstr "Logg inn"
#: ../js/gdm/loginDialog.js:790 #: ../js/gdm/loginDialog.js:833
msgid "Next" msgid "Next"
msgstr "Neste" msgstr "Neste"
#. Translators: this message is shown below the username entry field #. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm #. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:887 #: ../js/gdm/loginDialog.js:934
#, c-format #, c-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(f.eks. bruker eller %s)" msgstr "(f.eks. bruker eller %s)"
@ -369,12 +373,12 @@ msgstr "(f.eks. bruker eller %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:891 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:938 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Brukernavn: " msgstr "Brukernavn: "
#: ../js/gdm/loginDialog.js:1157 #: ../js/gdm/loginDialog.js:1205
msgid "Login Window" msgid "Login Window"
msgstr "Innloggingsvindu" msgstr "Innloggingsvindu"
@ -397,13 +401,13 @@ msgstr "Start på nytt"
msgid "Power Off" msgid "Power Off"
msgstr "Slå av" msgstr "Slå av"
#: ../js/gdm/util.js:247 #: ../js/gdm/util.js:248
msgid "Authentication error" msgid "Authentication error"
msgstr "Autentiseringsfeil" msgstr "Autentiseringsfeil"
#. 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:364 #: ../js/gdm/util.js:365
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(eller dra finger)" msgstr "(eller dra finger)"
@ -794,14 +798,14 @@ msgstr "<b>%d</b> <b>%B</b> <b>%Y</b>, <b>%H.%M</b> "
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
#: ../js/ui/components/telepathyClient.js:985 #: ../js/ui/components/telepathyClient.js:986
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s er nå kjent som %s" msgstr "%s er nå kjent som %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1088 #: ../js/ui/components/telepathyClient.js:1089
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Invitasjon til %s" msgstr "Invitasjon til %s"
@ -809,38 +813,38 @@ msgstr "Invitasjon til %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. #. * for example.
#: ../js/ui/components/telepathyClient.js:1096 #: ../js/ui/components/telepathyClient.js:1097
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s inviterer deg til å bli med i %s" msgstr "%s inviterer deg til å bli med i %s"
#: ../js/ui/components/telepathyClient.js:1098 #: ../js/ui/components/telepathyClient.js:1099
#: ../js/ui/components/telepathyClient.js:1137 #: ../js/ui/components/telepathyClient.js:1138
#: ../js/ui/components/telepathyClient.js:1177 #: ../js/ui/components/telepathyClient.js:1178
#: ../js/ui/components/telepathyClient.js:1240 #: ../js/ui/components/telepathyClient.js:1241
msgid "Decline" msgid "Decline"
msgstr "Avslå" msgstr "Avslå"
#: ../js/ui/components/telepathyClient.js:1099 #: ../js/ui/components/telepathyClient.js:1100
#: ../js/ui/components/telepathyClient.js:1178 #: ../js/ui/components/telepathyClient.js:1179
#: ../js/ui/components/telepathyClient.js:1241 #: ../js/ui/components/telepathyClient.js:1242
msgid "Accept" msgid "Accept"
msgstr "Godta" msgstr "Godta"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1129 #: ../js/ui/components/telepathyClient.js:1130
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Videosamtale fra %s" msgstr "Videosamtale fra %s"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1132 #: ../js/ui/components/telepathyClient.js:1133
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Samtale fra %s" msgstr "Samtale fra %s"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
#: ../js/ui/components/telepathyClient.js:1139 #: ../js/ui/components/telepathyClient.js:1140
msgid "Answer" msgid "Answer"
msgstr "Svar" msgstr "Svar"
@ -849,110 +853,110 @@ msgstr "Svar"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/components/telepathyClient.js:1171 #: ../js/ui/components/telepathyClient.js:1172
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s sender deg %s" msgstr "%s sender deg %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1206 #: ../js/ui/components/telepathyClient.js:1207
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s vil ha rettigheter til å se når du er tilkoblet" msgstr "%s vil ha rettigheter til å se når du er tilkoblet"
#: ../js/ui/components/telepathyClient.js:1298 #: ../js/ui/components/telepathyClient.js:1299
msgid "Network error" msgid "Network error"
msgstr "Nettverksfeil" msgstr "Nettverksfeil"
#: ../js/ui/components/telepathyClient.js:1300 #: ../js/ui/components/telepathyClient.js:1301
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Autentisering feilet" msgstr "Autentisering feilet"
#: ../js/ui/components/telepathyClient.js:1302 #: ../js/ui/components/telepathyClient.js:1303
msgid "Encryption error" msgid "Encryption error"
msgstr "Feil ved kryptering" msgstr "Feil ved kryptering"
#: ../js/ui/components/telepathyClient.js:1304 #: ../js/ui/components/telepathyClient.js:1305
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Sertifikat ikke oppgitt" msgstr "Sertifikat ikke oppgitt"
#: ../js/ui/components/telepathyClient.js:1306 #: ../js/ui/components/telepathyClient.js:1307
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Stoler ikke på sertifikatet" msgstr "Stoler ikke på sertifikatet"
#: ../js/ui/components/telepathyClient.js:1308 #: ../js/ui/components/telepathyClient.js:1309
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Sertifikatet er utløpt" msgstr "Sertifikatet er utløpt"
#: ../js/ui/components/telepathyClient.js:1310 #: ../js/ui/components/telepathyClient.js:1311
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Sertifikatet er ikke aktivert" msgstr "Sertifikatet er ikke aktivert"
#: ../js/ui/components/telepathyClient.js:1312 #: ../js/ui/components/telepathyClient.js:1313
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Feil vertsnavn for sertifikat" msgstr "Feil vertsnavn for sertifikat"
#: ../js/ui/components/telepathyClient.js:1314 #: ../js/ui/components/telepathyClient.js:1315
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Feil fingeravtrykk for sertifikat" msgstr "Feil fingeravtrykk for sertifikat"
#: ../js/ui/components/telepathyClient.js:1316 #: ../js/ui/components/telepathyClient.js:1317
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Sertifikatet er selvsignert" msgstr "Sertifikatet er selvsignert"
#: ../js/ui/components/telepathyClient.js:1318 #: ../js/ui/components/telepathyClient.js:1319
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "Status er satt til frakoblet" msgstr "Status er satt til frakoblet"
#: ../js/ui/components/telepathyClient.js:1320 #: ../js/ui/components/telepathyClient.js:1321
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Kryptering er ikke tilgjengelig" msgstr "Kryptering er ikke tilgjengelig"
#: ../js/ui/components/telepathyClient.js:1322 #: ../js/ui/components/telepathyClient.js:1323
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "Sertifikatet er ugyldig" msgstr "Sertifikatet er ugyldig"
#: ../js/ui/components/telepathyClient.js:1324 #: ../js/ui/components/telepathyClient.js:1325
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Tilkobling ble nektet" msgstr "Tilkobling ble nektet"
#: ../js/ui/components/telepathyClient.js:1326 #: ../js/ui/components/telepathyClient.js:1327
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "Tilkobling kan ikke etableres" msgstr "Tilkobling kan ikke etableres"
#: ../js/ui/components/telepathyClient.js:1328 #: ../js/ui/components/telepathyClient.js:1329
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Tilkobling tapt" msgstr "Tilkobling tapt"
#: ../js/ui/components/telepathyClient.js:1330 #: ../js/ui/components/telepathyClient.js:1331
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "Denne kontoen er allerede koblet til tjeneren" msgstr "Denne kontoen er allerede koblet til tjeneren"
#: ../js/ui/components/telepathyClient.js:1332 #: ../js/ui/components/telepathyClient.js:1333
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "" msgstr ""
"Tilkoblingen har blitt erstattet av en ny tilkobling som bruker samme ressurs" "Tilkoblingen har blitt erstattet av en ny tilkobling som bruker samme ressurs"
#: ../js/ui/components/telepathyClient.js:1334 #: ../js/ui/components/telepathyClient.js:1335
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "Kontoen eksisterer allerede på tjeneren" msgstr "Kontoen eksisterer allerede på tjeneren"
#: ../js/ui/components/telepathyClient.js:1336 #: ../js/ui/components/telepathyClient.js:1337
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "Tjener er for opptatt til å håndtere tilkoblingen" msgstr "Tjener er for opptatt til å håndtere tilkoblingen"
#: ../js/ui/components/telepathyClient.js:1338 #: ../js/ui/components/telepathyClient.js:1339
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Sertifikatet er tilbaketrukket" msgstr "Sertifikatet er tilbaketrukket"
#: ../js/ui/components/telepathyClient.js:1340 #: ../js/ui/components/telepathyClient.js:1341
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"Sertifikatet bruker en usikker sifferalgoritme eller er krytografisk svakt" "Sertifikatet bruker en usikker sifferalgoritme eller er krytografisk svakt"
#: ../js/ui/components/telepathyClient.js:1342 #: ../js/ui/components/telepathyClient.js:1343
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
@ -960,22 +964,22 @@ msgstr ""
"Lengden eller dybden på tjenersertifikatet oversteg grensen som er satt i " "Lengden eller dybden på tjenersertifikatet oversteg grensen som er satt i "
"kryptografibiblioteket" "kryptografibiblioteket"
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1345
msgid "Internal error" msgid "Internal error"
msgstr "Intern feil" msgstr "Intern feil"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1354 #: ../js/ui/components/telepathyClient.js:1355
#, c-format #, c-format
msgid "Unable to connect to %s" msgid "Unable to connect to %s"
msgstr "Kan ikke koble til %s" msgstr "Kan ikke koble til %s"
#: ../js/ui/components/telepathyClient.js:1359 #: ../js/ui/components/telepathyClient.js:1360
msgid "View account" msgid "View account"
msgstr "Vis konto" msgstr "Vis konto"
#: ../js/ui/components/telepathyClient.js:1398 #: ../js/ui/components/telepathyClient.js:1399
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Ukjent årsak" msgstr "Ukjent årsak"
@ -1008,7 +1012,7 @@ msgstr "Innstillinger for dato og klokkeslett"
#. 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:202 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%a %e %B, %Y" msgstr "%a %e %B, %Y"
@ -1222,17 +1226,17 @@ msgstr "Oversikt"
msgid "Type to search…" msgid "Type to search…"
msgstr "Skriv for å søke …" msgstr "Skriv for å søke …"
#: ../js/ui/panel.js:642 #: ../js/ui/panel.js:567
msgid "Quit" msgid "Quit"
msgstr "Avslutt" msgstr "Avslutt"
#. 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:693 #: ../js/ui/panel.js:618
msgid "Activities" msgid "Activities"
msgstr "Aktiviteter" msgstr "Aktiviteter"
#: ../js/ui/panel.js:989 #: ../js/ui/panel.js:914
msgid "Top Bar" msgid "Top Bar"
msgstr "Topp-panel" msgstr "Topp-panel"
@ -1241,7 +1245,7 @@ msgstr "Topp-panel"
#. "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:545 #: ../js/ui/popupMenu.js:549
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1281,11 +1285,11 @@ msgstr "GNOME må låse skjermen"
#. #.
#. 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:773 ../js/ui/screenShield.js:1213 #: ../js/ui/screenShield.js:775 ../js/ui/screenShield.js:1215
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Kan ikke låse" msgstr "Kan ikke låse"
#: ../js/ui/screenShield.js:774 ../js/ui/screenShield.js:1214 #: ../js/ui/screenShield.js:776 ../js/ui/screenShield.js:1216
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Låsing ble stoppet av et program" msgstr "Låsing ble stoppet av et program"
@ -1590,7 +1594,7 @@ msgstr "Tilkobling feilet"
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktivering av nettverkstilkobling feilet" msgstr "Aktivering av nettverkstilkobling feilet"
#: ../js/ui/status/network.js:1937 #: ../js/ui/status/network.js:1938
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Nettverk er slått av" msgstr "Nettverk er slått av"

720
po/vi.po

File diff suppressed because it is too large Load Diff

@ -70,7 +70,6 @@ struct _ShellGlobal {
GtkWindow *grab_notifier; GtkWindow *grab_notifier;
gboolean gtk_grab_active; gboolean gtk_grab_active;
ShellStageInputMode input_mode;
XserverRegion input_region; XserverRegion input_region;
GjsContext *js_context; GjsContext *js_context;
@ -94,6 +93,8 @@ struct _ShellGlobal {
guint32 xdnd_timestamp; guint32 xdnd_timestamp;
gint64 last_gc_end_time; gint64 last_gc_end_time;
gboolean has_modal;
}; };
enum { enum {
@ -106,7 +107,6 @@ enum {
PROP_SCREEN_WIDTH, PROP_SCREEN_WIDTH,
PROP_SCREEN_HEIGHT, PROP_SCREEN_HEIGHT,
PROP_STAGE, PROP_STAGE,
PROP_STAGE_INPUT_MODE,
PROP_WINDOW_GROUP, PROP_WINDOW_GROUP,
PROP_TOP_WINDOW_GROUP, PROP_TOP_WINDOW_GROUP,
PROP_WINDOW_MANAGER, PROP_WINDOW_MANAGER,
@ -141,9 +141,6 @@ shell_global_set_property(GObject *object,
switch (prop_id) switch (prop_id)
{ {
case PROP_STAGE_INPUT_MODE:
shell_global_set_stage_input_mode (global, g_value_get_enum (value));
break;
case PROP_SESSION_MODE: case PROP_SESSION_MODE:
g_clear_pointer (&global->session_mode, g_free); g_clear_pointer (&global->session_mode, g_free);
global->session_mode = g_ascii_strdown (g_value_get_string (value), -1); global->session_mode = g_ascii_strdown (g_value_get_string (value), -1);
@ -195,9 +192,6 @@ shell_global_get_property(GObject *object,
case PROP_STAGE: case PROP_STAGE:
g_value_set_object (value, global->stage); g_value_set_object (value, global->stage);
break; break;
case PROP_STAGE_INPUT_MODE:
g_value_set_enum (value, global->input_mode);
break;
case PROP_WINDOW_GROUP: case PROP_WINDOW_GROUP:
g_value_set_object (value, meta_get_window_group_for_screen (global->meta_screen)); g_value_set_object (value, meta_get_window_group_for_screen (global->meta_screen));
break; break;
@ -278,8 +272,6 @@ shell_global_init (ShellGlobal *global)
g_signal_connect (global->grab_notifier, "grab-notify", G_CALLBACK (grab_notify), global); g_signal_connect (global->grab_notifier, "grab-notify", G_CALLBACK (grab_notify), global);
global->gtk_grab_active = FALSE; global->gtk_grab_active = FALSE;
global->input_mode = SHELL_STAGE_INPUT_MODE_NORMAL;
global->sound_context = ca_gtk_context_get (); global->sound_context = ca_gtk_context_get ();
ca_context_change_props (global->sound_context, ca_context_change_props (global->sound_context,
CA_PROP_APPLICATION_NAME, "GNOME Shell", CA_PROP_APPLICATION_NAME, "GNOME Shell",
@ -417,14 +409,6 @@ shell_global_class_init (ShellGlobalClass *klass)
"Stage holding the desktop scene graph", "Stage holding the desktop scene graph",
CLUTTER_TYPE_ACTOR, CLUTTER_TYPE_ACTOR,
G_PARAM_READABLE)); G_PARAM_READABLE));
g_object_class_install_property (gobject_class,
PROP_STAGE_INPUT_MODE,
g_param_spec_enum ("stage-input-mode",
"Stage input mode",
"The stage input mode",
SHELL_TYPE_STAGE_INPUT_MODE,
SHELL_STAGE_INPUT_MODE_NORMAL,
G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_WINDOW_GROUP, PROP_WINDOW_GROUP,
g_param_spec_object ("window-group", g_param_spec_object ("window-group",
@ -529,6 +513,18 @@ shell_global_get (void)
return the_object; return the_object;
} }
static guint32
get_current_time_maybe_roundtrip (ShellGlobal *global)
{
guint32 time;
time = shell_global_get_current_time (global);
if (time != CurrentTime)
return time;
return meta_display_get_current_time_roundtrip (global->meta_display);
}
static void static void
focus_window_changed (MetaDisplay *display, focus_window_changed (MetaDisplay *display,
GParamSpec *param, GParamSpec *param,
@ -536,58 +532,71 @@ focus_window_changed (MetaDisplay *display,
{ {
ShellGlobal *global = user_data; ShellGlobal *global = user_data;
if (global->input_mode == SHELL_STAGE_INPUT_MODE_FOCUSED && if (global->has_modal)
meta_display_get_focus_window (display) != NULL) return;
shell_global_set_stage_input_mode (global, SHELL_STAGE_INPUT_MODE_NORMAL);
/* If the stage window became unfocused, drop the key focus
* on Clutter's side. */
if (!meta_stage_is_focused (global->meta_screen))
clutter_stage_set_key_focus (global->stage, NULL);
} }
/** static ClutterActor *
* shell_global_set_stage_input_mode: get_key_focused_actor (ShellGlobal *global)
* @global: the #ShellGlobal
* @mode: the stage input mode
*
* Sets the input mode of the stage; when @mode is
* %SHELL_STAGE_INPUT_MODE_NORMAL, then the stage accepts clicks in
* the region defined by shell_global_set_stage_input_region() but
* passes through clicks outside that region. When it is
* %SHELL_STAGE_INPUT_MODE_FULLSCREEN, the stage absorbs all input.
*
* When the input mode is %SHELL_STAGE_INPUT_MODE_FOCUSED, the pointer
* is handled as with %SHELL_STAGE_INPUT_MODE_NORMAL, but additionally
* the stage window has the keyboard focus. If the stage loses the
* focus (eg, because the user clicked into a window) the input mode
* will revert to %SHELL_STAGE_INPUT_MODE_NORMAL.
*
* Note that whenever a mutter-internal Gtk widget has a pointer grab,
* the shell goes unresponsive and passes things to the underlying GTK+
* widget to ensure that the widget gets any clicks it is expecting.
*/
void
shell_global_set_stage_input_mode (ShellGlobal *global,
ShellStageInputMode mode)
{ {
MetaScreen *screen; ClutterActor *actor;
g_return_if_fail (SHELL_IS_GLOBAL (global)); actor = clutter_stage_get_key_focus (global->stage);
screen = meta_plugin_get_screen (global->plugin); /* If there's no explicit key focus, clutter_stage_get_key_focus()
* returns the stage. This is a terrible API. */
if (actor == CLUTTER_ACTOR (global->stage))
actor = NULL;
return actor;
}
static void
sync_stage_window_focus (ShellGlobal *global)
{
ClutterActor *actor;
if (global->has_modal)
return;
actor = get_key_focused_actor (global);
/* An actor got key focus and the stage needs to be focused. */
if (actor != NULL && !meta_stage_is_focused (global->meta_screen))
meta_focus_stage_window (global->meta_screen,
get_current_time_maybe_roundtrip (global));
/* An actor dropped key focus. Focus the default window. */
else if (actor == NULL && meta_stage_is_focused (global->meta_screen))
meta_screen_focus_default_window (global->meta_screen,
get_current_time_maybe_roundtrip (global));
}
static void
focus_actor_changed (ClutterStage *stage,
GParamSpec *param,
gpointer user_data)
{
ShellGlobal *global = user_data;
sync_stage_window_focus (global);
}
static void
sync_input_region (ShellGlobal *global)
{
MetaScreen *screen = global->meta_screen;
if (global->gtk_grab_active) if (global->gtk_grab_active)
meta_empty_stage_input_region (screen); meta_empty_stage_input_region (screen);
else if (mode == SHELL_STAGE_INPUT_MODE_FULLSCREEN || !global->input_region) else if (global->has_modal)
meta_set_stage_input_region (screen, None); meta_set_stage_input_region (screen, None);
else else
meta_set_stage_input_region (screen, global->input_region); meta_set_stage_input_region (screen, global->input_region);
if (mode == SHELL_STAGE_INPUT_MODE_FOCUSED)
meta_focus_stage_window (global->meta_screen,
shell_global_get_current_time (global));
if (mode != global->input_mode)
{
global->input_mode = mode;
g_object_notify (G_OBJECT (global), "stage-input-mode");
}
} }
/** /**
@ -682,8 +691,7 @@ shell_global_unset_cursor (ShellGlobal *global)
* describing the input region. * describing the input region.
* *
* Sets the area of the stage that is responsive to mouse clicks when * Sets the area of the stage that is responsive to mouse clicks when
* the stage mode is %SHELL_STAGE_INPUT_MODE_NORMAL (but does not change the * we don't have a modal or grab.
* current stage mode).
*/ */
void void
shell_global_set_stage_input_region (ShellGlobal *global, shell_global_set_stage_input_region (ShellGlobal *global,
@ -713,10 +721,7 @@ shell_global_set_stage_input_region (ShellGlobal *global,
global->input_region = XFixesCreateRegion (global->xdisplay, rects, nrects); global->input_region = XFixesCreateRegion (global->xdisplay, rects, nrects);
g_free (rects); g_free (rects);
/* set_stage_input_mode() will figure out whether or not we sync_input_region (global);
* should actually change the input region right now.
*/
shell_global_set_stage_input_mode (global, global->input_mode);
} }
/** /**
@ -956,6 +961,8 @@ _shell_global_set_plugin (ShellGlobal *global,
"End of stage page repaint", "End of stage page repaint",
""); "");
g_signal_connect (global->stage, "notify::key-focus",
G_CALLBACK (focus_actor_changed), global);
g_signal_connect (global->meta_display, "notify::focus-window", g_signal_connect (global->meta_display, "notify::focus-window",
G_CALLBACK (focus_window_changed), global); G_CALLBACK (focus_window_changed), global);
@ -991,7 +998,14 @@ shell_global_begin_modal (ShellGlobal *global,
guint32 timestamp, guint32 timestamp,
MetaModalOptions options) MetaModalOptions options)
{ {
return meta_plugin_begin_modal (global->plugin, global->stage_xwindow, None, options, timestamp); /* Make it an error to call begin_modal while we already
* have a modal active. */
if (global->has_modal)
return FALSE;
global->has_modal = meta_plugin_begin_modal (global->plugin, global->stage_xwindow, None, options, timestamp);
sync_input_region (global);
return global->has_modal;
} }
/** /**
@ -1004,7 +1018,25 @@ void
shell_global_end_modal (ShellGlobal *global, shell_global_end_modal (ShellGlobal *global,
guint32 timestamp) guint32 timestamp)
{ {
ClutterActor *actor;
if (!global->has_modal)
return;
meta_plugin_end_modal (global->plugin, timestamp); meta_plugin_end_modal (global->plugin, timestamp);
global->has_modal = FALSE;
/* If the stage window is unfocused, ensure that there's no
* actor focused on Clutter's side. */
if (!meta_stage_is_focused (global->meta_screen))
clutter_stage_set_key_focus (global->stage, NULL);
/* An actor dropped key focus. Focus the default window. */
else if (get_key_focused_actor (global) && meta_stage_is_focused (global->meta_screen))
meta_screen_focus_default_window (global->meta_screen,
get_current_time_maybe_roundtrip (global));
sync_input_region (global);
} }
void void
@ -1222,7 +1254,7 @@ grab_notify (GtkWidget *widget, gboolean was_grabbed, gpointer user_data)
global->gtk_grab_active = !was_grabbed; global->gtk_grab_active = !was_grabbed;
/* Update for the new setting of gtk_grab_active */ /* Update for the new setting of gtk_grab_active */
shell_global_set_stage_input_mode (global, global->input_mode); sync_input_region (global);
} }
/** /**
@ -1314,10 +1346,6 @@ shell_global_sync_pointer (ShellGlobal *global)
event.type = CLUTTER_MOTION; event.type = CLUTTER_MOTION;
event.time = shell_global_get_current_time (global); event.time = shell_global_get_current_time (global);
event.flags = 0; event.flags = 0;
/* This is wrong: we should be setting event.stage to NULL if the
* pointer is not inside the bounds of the stage given the current
* stage_input_mode. For our current purposes however, this works.
*/
event.stage = global->stage; event.stage = global->stage;
event.x = x; event.x = x;
event.y = y; event.y = y;

@ -47,14 +47,6 @@ void shell_global_end_modal (ShellGlobal *global,
void shell_global_freeze_keyboard (ShellGlobal *global, void shell_global_freeze_keyboard (ShellGlobal *global,
guint32 timestamp); guint32 timestamp);
typedef enum {
SHELL_STAGE_INPUT_MODE_NORMAL,
SHELL_STAGE_INPUT_MODE_FOCUSED,
SHELL_STAGE_INPUT_MODE_FULLSCREEN
} ShellStageInputMode;
void shell_global_set_stage_input_mode (ShellGlobal *global,
ShellStageInputMode mode);
void shell_global_set_stage_input_region (ShellGlobal *global, void shell_global_set_stage_input_region (ShellGlobal *global,
GSList *rectangles); GSList *rectangles);

@ -43,8 +43,6 @@ struct _ShellNetworkAgentClass
/* used by SHELL_TYPE_NETWORK_AGENT */ /* used by SHELL_TYPE_NETWORK_AGENT */
GType shell_network_agent_get_type (void); GType shell_network_agent_get_type (void);
ShellNetworkAgent *shell_network_agent_new (void);
void shell_network_agent_set_password (ShellNetworkAgent *self, void shell_network_agent_set_password (ShellNetworkAgent *self,
gchar *request_id, gchar *request_id,
gchar *setting_key, gchar *setting_key,

@ -285,7 +285,6 @@ get_content_preferred_width (StBoxLayout *self,
{ {
StBoxLayoutPrivate *priv = self->priv; StBoxLayoutPrivate *priv = self->priv;
gint n_children = 0; gint n_children = 0;
gint n_fixed = 0;
gfloat min_width, natural_width; gfloat min_width, natural_width;
ClutterActor *child; ClutterActor *child;
@ -304,12 +303,6 @@ get_content_preferred_width (StBoxLayout *self,
n_children++; n_children++;
if (clutter_actor_get_fixed_position_set (child))
{
n_fixed++;
continue;
}
if (priv->is_vertical) if (priv->is_vertical)
{ {
_st_actor_get_preferred_width (child, -1, FALSE, _st_actor_get_preferred_width (child, -1, FALSE,
@ -329,10 +322,10 @@ get_content_preferred_width (StBoxLayout *self,
} }
} }
if (!priv->is_vertical && (n_children - n_fixed) > 1) if (!priv->is_vertical && n_children > 1)
{ {
min_width += priv->spacing * (n_children - n_fixed - 1); min_width += priv->spacing * (n_children - 1);
natural_width += priv->spacing * (n_children - n_fixed - 1); natural_width += priv->spacing * (n_children - 1);
} }
if (min_width_p) if (min_width_p)
@ -367,7 +360,6 @@ get_content_preferred_height (StBoxLayout *self,
{ {
StBoxLayoutPrivate *priv = self->priv; StBoxLayoutPrivate *priv = self->priv;
gint n_children = 0; gint n_children = 0;
gint n_fixed = 0;
gfloat min_height, natural_height; gfloat min_height, natural_height;
ClutterActor *child; ClutterActor *child;
@ -386,12 +378,6 @@ get_content_preferred_height (StBoxLayout *self,
n_children++; n_children++;
if (clutter_actor_get_fixed_position_set (child))
{
n_fixed++;
continue;
}
if (priv->is_vertical) if (priv->is_vertical)
{ {
clutter_container_child_get ((ClutterContainer*) self, child, clutter_container_child_get ((ClutterContainer*) self, child,
@ -416,10 +402,10 @@ get_content_preferred_height (StBoxLayout *self,
} }
} }
if (priv->is_vertical && (n_children - n_fixed) > 1) if (priv->is_vertical && n_children > 1)
{ {
min_height += priv->spacing * (n_children - n_fixed - 1); min_height += priv->spacing * (n_children - 1);
natural_height += priv->spacing * (n_children - n_fixed - 1); natural_height += priv->spacing * (n_children - 1);
} }
if (min_height_p) if (min_height_p)
@ -511,12 +497,9 @@ compute_shrinks (StBoxLayout *self,
{ {
gfloat child_min, child_nat; gfloat child_min, child_nat;
gboolean child_fill; gboolean child_fill;
gboolean fixed;
fixed = clutter_actor_get_fixed_position_set (child);
shrinks[i].child_index = i; shrinks[i].child_index = i;
if (CLUTTER_ACTOR_IS_VISIBLE (child) && !fixed) if (CLUTTER_ACTOR_IS_VISIBLE (child))
{ {
if (priv->is_vertical) if (priv->is_vertical)
{ {
@ -738,20 +721,13 @@ st_box_layout_allocate (ClutterActor *actor,
{ {
ClutterActorBox child_box; ClutterActorBox child_box;
gfloat child_min, child_nat, child_allocated; gfloat child_min, child_nat, child_allocated;
gboolean xfill, yfill, expand, fixed; gboolean xfill, yfill, expand;
StAlign xalign, yalign; StAlign xalign, yalign;
gdouble xalign_f, yalign_f; gdouble xalign_f, yalign_f;
if (!CLUTTER_ACTOR_IS_VISIBLE (child)) if (!CLUTTER_ACTOR_IS_VISIBLE (child))
goto next_child; goto next_child;
fixed = clutter_actor_get_fixed_position_set (child);
if (fixed)
{
clutter_actor_allocate_preferred_size (child, flags);
goto next_child;
}
clutter_container_child_get ((ClutterContainer*) actor, child, clutter_container_child_get ((ClutterContainer*) actor, child,
"x-fill", &xfill, "x-fill", &xfill,
"y-fill", &yfill, "y-fill", &yfill,

@ -1268,8 +1268,7 @@ st_theme_node_prerender_background (StThemeNode *node,
return texture; return texture;
} }
static void st_theme_node_paint_borders (StThemeNode *node, static void st_theme_node_paint_borders (StThemeNodePaintState *state,
StThemeNodePaintState *state,
const ClutterActorBox *box, const ClutterActorBox *box,
guint8 paint_opacity); guint8 paint_opacity);
@ -1370,9 +1369,11 @@ st_theme_node_load_background_image (StThemeNode *node)
return node->background_texture != COGL_INVALID_HANDLE; return node->background_texture != COGL_INVALID_HANDLE;
} }
static void st_theme_node_prerender_shadow (StThemeNodePaintState *state);
static void static void
st_theme_node_render_resources (StThemeNode *node, st_theme_node_render_resources (StThemeNodePaintState *state,
StThemeNodePaintState *state, StThemeNode *node,
float width, float width,
float height) float height)
{ {
@ -1390,6 +1391,7 @@ st_theme_node_render_resources (StThemeNode *node,
*/ */
st_theme_node_paint_state_free (state); st_theme_node_paint_state_free (state);
state->node = node;
state->alloc_width = width; state->alloc_width = width;
state->alloc_height = height; state->alloc_height = height;
@ -1474,40 +1476,82 @@ st_theme_node_render_resources (StThemeNode *node,
state->box_shadow_material = _st_create_shadow_material (box_shadow_spec, state->box_shadow_material = _st_create_shadow_material (box_shadow_spec,
state->prerendered_texture); state->prerendered_texture);
else if (node->background_color.alpha > 0 || has_border) else if (node->background_color.alpha > 0 || has_border)
st_theme_node_prerender_shadow (state);
}
/* If we don't have cached textures yet, check whether we can cache
them. */
if (!node->cached_textures)
{
if (state->prerendered_material == COGL_INVALID_HANDLE &&
width >= node->box_shadow_min_width &&
height >= node->box_shadow_min_height)
{ {
CoglHandle buffer, offscreen; st_theme_node_paint_state_copy (&node->cached_state, state);
int texture_width = ceil (width); node->cached_textures = TRUE;
int texture_height = ceil (height);
buffer = cogl_texture_new_with_size (texture_width,
texture_height,
COGL_TEXTURE_NO_SLICING,
COGL_PIXEL_FORMAT_ANY);
offscreen = cogl_offscreen_new_to_texture (buffer);
if (offscreen != COGL_INVALID_HANDLE)
{
ClutterActorBox box = { 0, 0, width, height };
CoglColor clear_color;
cogl_push_framebuffer (offscreen);
cogl_ortho (0, width, height, 0, 0, 1.0);
cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0);
cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR);
st_theme_node_paint_borders (node, state, &box, 0xFF);
cogl_pop_framebuffer ();
cogl_handle_unref (offscreen);
state->box_shadow_material = _st_create_shadow_material (box_shadow_spec,
buffer);
}
cogl_handle_unref (buffer);
} }
} }
} }
static void
st_theme_node_update_resources (StThemeNodePaintState *state,
StThemeNode *node,
float width,
float height)
{
gboolean had_prerendered_texture = FALSE;
gboolean had_box_shadow = FALSE;
StShadow *box_shadow_spec;
g_return_if_fail (width > 0 && height > 0);
/* Free handles we can't reuse */
if (state->prerendered_texture != COGL_INVALID_HANDLE)
{
cogl_handle_unref (state->prerendered_texture);
state->prerendered_texture = COGL_INVALID_HANDLE;
had_prerendered_texture = TRUE;
}
if (state->prerendered_material != COGL_INVALID_HANDLE)
{
cogl_handle_unref (state->prerendered_material);
state->prerendered_material = COGL_INVALID_HANDLE;
if (node->border_slices_texture == COGL_INVALID_HANDLE &&
state->box_shadow_material != COGL_INVALID_HANDLE)
{
cogl_handle_unref (state->box_shadow_material);
state->box_shadow_material = COGL_INVALID_HANDLE;
had_box_shadow = TRUE;
}
}
state->node = node;
state->alloc_width = width;
state->alloc_height = height;
box_shadow_spec = st_theme_node_get_box_shadow (node);
if (had_prerendered_texture)
{
state->prerendered_texture = st_theme_node_prerender_background (node, width, height);
state->prerendered_material = _st_create_texture_material (state->prerendered_texture);
}
else
{
int corner_id;
for (corner_id = 0; corner_id < 4; corner_id++)
if (state->corner_material[corner_id] == COGL_INVALID_HANDLE)
state->corner_material[corner_id] =
st_theme_node_lookup_corner (node, width, height, corner_id);
}
if (had_box_shadow)
state->box_shadow_material = _st_create_shadow_material (box_shadow_spec,
state->prerendered_texture);
}
static void static void
paint_material_with_opacity (CoglHandle material, paint_material_with_opacity (CoglHandle material,
ClutterActorBox *box, ClutterActorBox *box,
@ -1527,11 +1571,11 @@ paint_material_with_opacity (CoglHandle material,
} }
static void static void
st_theme_node_paint_borders (StThemeNode *node, st_theme_node_paint_borders (StThemeNodePaintState *state,
StThemeNodePaintState *state,
const ClutterActorBox *box, const ClutterActorBox *box,
guint8 paint_opacity) guint8 paint_opacity)
{ {
StThemeNode *node = state->node;
float width, height; float width, height;
int border_width[4]; int border_width[4];
guint border_radius[4]; guint border_radius[4];
@ -1792,6 +1836,353 @@ st_theme_node_paint_borders (StThemeNode *node,
} }
} }
static void
st_theme_node_paint_sliced_shadow (StThemeNodePaintState *state,
const ClutterActorBox *box,
guint8 paint_opacity)
{
StThemeNode *node = state->node;
guint border_radius[4];
CoglColor color;
StShadow *box_shadow_spec;
gfloat xoffset, yoffset;
gfloat width, height;
gfloat shadow_width, shadow_height;
gfloat xend, yend, top, bottom, left, right;
gfloat s_top, s_bottom, s_left, s_right;
gfloat shadow_blur_radius, x_spread_factor, y_spread_factor;
float rectangles[8 * 9];
gint idx;
if (paint_opacity == 0)
return;
st_theme_node_reduce_border_radius (node, box->x2 - box->x1, box->y2 - box->y1, border_radius);
box_shadow_spec = st_theme_node_get_box_shadow (node);
/* Compute input & output areas :
*
* yoffset ----------------------------
* | | | |
* | | | |
* | | | |
* top ----------------------------
* | | | |
* | | | |
* | | | |
* bottom ----------------------------
* | | | |
* | | | |
* | | | |
* yend ----------------------------
* xoffset left right xend
*
* s_top = top in offscreen's coordinates (0.0 - 1.0)
* s_bottom = bottom in offscreen's coordinates (0.0 - 1.0)
* s_left = left in offscreen's coordinates (0.0 - 1.0)
* s_right = right in offscreen's coordinates (0.0 - 1.0)
*/
if (box_shadow_spec->blur == 0)
shadow_blur_radius = 0;
else
shadow_blur_radius = (5 * (box_shadow_spec->blur / 2.0)) / 2;
shadow_width = state->box_shadow_width + 2 * shadow_blur_radius;
shadow_height = state->box_shadow_height + 2 * shadow_blur_radius;
/* Compute input regions parameters */
s_top = shadow_blur_radius + box_shadow_spec->blur +
MAX (node->border_radius[ST_CORNER_TOPLEFT],
node->border_radius[ST_CORNER_TOPRIGHT]);
s_bottom = shadow_blur_radius + box_shadow_spec->blur +
MAX (node->border_radius[ST_CORNER_BOTTOMLEFT],
node->border_radius[ST_CORNER_BOTTOMRIGHT]);
s_left = shadow_blur_radius + box_shadow_spec->blur +
MAX (node->border_radius[ST_CORNER_TOPLEFT],
node->border_radius[ST_CORNER_BOTTOMLEFT]);
s_right = shadow_blur_radius + box_shadow_spec->blur +
MAX (node->border_radius[ST_CORNER_TOPRIGHT],
node->border_radius[ST_CORNER_BOTTOMRIGHT]);
/* Compute output regions parameters */
xoffset = box->x1 + box_shadow_spec->xoffset - shadow_blur_radius - box_shadow_spec->spread;
yoffset = box->y1 + box_shadow_spec->yoffset - shadow_blur_radius - box_shadow_spec->spread;
width = box->x2 - box->x1 + 2 * shadow_blur_radius;
height = box->y2 - box->y1 + 2 * shadow_blur_radius;
x_spread_factor = (width + 2 * box_shadow_spec->spread) / width;
y_spread_factor = (height + 2 * box_shadow_spec->spread) / height;
width += 2 * box_shadow_spec->spread;
height += 2 * box_shadow_spec->spread;
xend = xoffset + width;
yend = yoffset + height;
top = s_top * y_spread_factor;
bottom = s_bottom * y_spread_factor;
left = s_left * x_spread_factor;
right = s_right * x_spread_factor;
bottom = height - bottom;
right = width - right;
/* Final adjustments */
s_top /= shadow_height;
s_bottom /= shadow_height;
s_left /= shadow_width;
s_right /= shadow_width;
s_bottom = 1.0 - s_bottom;
s_right = 1.0 - s_right;
top += yoffset;
bottom += yoffset;
left += xoffset;
right += xoffset;
/* Setup pipeline */
cogl_color_set_from_4ub (&color,
box_shadow_spec->color.red * paint_opacity / 255,
box_shadow_spec->color.green * paint_opacity / 255,
box_shadow_spec->color.blue * paint_opacity / 255,
box_shadow_spec->color.alpha * paint_opacity / 255);
cogl_color_premultiply (&color);
cogl_material_set_layer_combine_constant (state->box_shadow_material, 0, &color);
cogl_set_source (state->box_shadow_material);
idx = 0;
if (top > 0)
{
if (left > 0)
{
/* Top left corner */
rectangles[idx++] = xoffset;
rectangles[idx++] = yoffset;
rectangles[idx++] = left;
rectangles[idx++] = top;
rectangles[idx++] = 0;
rectangles[idx++] = 0;
rectangles[idx++] = s_left;
rectangles[idx++] = s_top;
}
/* Top middle */
rectangles[idx++] = left;
rectangles[idx++] = yoffset;
rectangles[idx++] = right;
rectangles[idx++] = top;
rectangles[idx++] = s_left;
rectangles[idx++] = 0;
rectangles[idx++] = s_right;
rectangles[idx++] = s_top;
if (right > 0)
{
/* Top right corner */
rectangles[idx++] = right;
rectangles[idx++] = yoffset;
rectangles[idx++] = xend;
rectangles[idx++] = top;
rectangles[idx++] = s_right;
rectangles[idx++] = 0;
rectangles[idx++] = 1;
rectangles[idx++] = s_top;
}
}
if (left > 0)
{
/* Left middle */
rectangles[idx++] = xoffset;
rectangles[idx++] = top;
rectangles[idx++] = left;
rectangles[idx++] = bottom;
rectangles[idx++] = 0;
rectangles[idx++] = s_top;
rectangles[idx++] = s_left;
rectangles[idx++] = s_bottom;
}
/* Center middle */
rectangles[idx++] = left;
rectangles[idx++] = top;
rectangles[idx++] = right;
rectangles[idx++] = bottom;
rectangles[idx++] = s_left;
rectangles[idx++] = s_top;
rectangles[idx++] = s_right;
rectangles[idx++] = s_bottom;
if (right > 0)
{
/* Right middle */
rectangles[idx++] = right;
rectangles[idx++] = top;
rectangles[idx++] = xend;
rectangles[idx++] = bottom;
rectangles[idx++] = s_right;
rectangles[idx++] = s_top;
rectangles[idx++] = 1;
rectangles[idx++] = s_bottom;
}
if (bottom > 0)
{
if (left > 0)
{
/* Bottom left corner */
rectangles[idx++] = xoffset;
rectangles[idx++] = bottom;
rectangles[idx++] = left;
rectangles[idx++] = yend;
rectangles[idx++] = 0;
rectangles[idx++] = s_bottom;
rectangles[idx++] = s_left;
rectangles[idx++] = 1;
}
/* Bottom middle */
rectangles[idx++] = left;
rectangles[idx++] = bottom;
rectangles[idx++] = right;
rectangles[idx++] = yend;
rectangles[idx++] = s_left;
rectangles[idx++] = s_bottom;
rectangles[idx++] = s_right;
rectangles[idx++] = 1;
if (right > 0)
{
/* Bottom right corner */
rectangles[idx++] = right;
rectangles[idx++] = bottom;
rectangles[idx++] = xend;
rectangles[idx++] = yend;
rectangles[idx++] = s_right;
rectangles[idx++] = s_bottom;
rectangles[idx++] = 1;
rectangles[idx++] = 1;
}
}
cogl_rectangles_with_texture_coords (rectangles, idx / 8);
#if 0
/* Visual feedback on shadow's 9-slice and orignal offscreen buffer,
for debug purposes */
cogl_rectangle (xend, yoffset, xend + shadow_width, yoffset + shadow_height);
cogl_set_source_color4ub (0xff, 0x0, 0x0, 0xff);
cogl_rectangle (xoffset, top, xend, top + 1);
cogl_rectangle (xoffset, bottom, xend, bottom + 1);
cogl_rectangle (left, yoffset, left + 1, yend);
cogl_rectangle (right, yoffset, right + 1, yend);
cogl_rectangle (xend, yoffset, xend + shadow_width, yoffset + 1);
cogl_rectangle (xend, yoffset + shadow_height, xend + shadow_width, yoffset + shadow_height + 1);
cogl_rectangle (xend, yoffset, xend + 1, yoffset + shadow_height);
cogl_rectangle (xend + shadow_width, yoffset, xend + shadow_width + 1, yoffset + shadow_height);
s_top *= shadow_height;
s_bottom *= shadow_height;
s_left *= shadow_width;
s_right *= shadow_width;
cogl_rectangle (xend, yoffset + s_top, xend + shadow_width, yoffset + s_top + 1);
cogl_rectangle (xend, yoffset + s_bottom, xend + shadow_width, yoffset + s_bottom + 1);
cogl_rectangle (xend + s_left, yoffset, xend + s_left + 1, yoffset + shadow_height);
cogl_rectangle (xend + s_right, yoffset, xend + s_right + 1, yoffset + shadow_height);
#endif
}
static void
st_theme_node_prerender_shadow (StThemeNodePaintState *state)
{
StThemeNode *node = state->node;
guint border_radius[4];
int max_borders[4];
int center_radius, corner_id;
CoglHandle buffer, offscreen;
/* Get infos from the node */
if (state->alloc_width < node->box_shadow_min_width ||
state->alloc_height < node->box_shadow_min_height)
st_theme_node_reduce_border_radius (node, state->alloc_width, state->alloc_height, border_radius);
else
for (corner_id = 0; corner_id < 4; corner_id++)
border_radius[corner_id] = node->border_radius[corner_id];
/* Compute maximum borders sizes */
max_borders[ST_SIDE_TOP] = MAX (node->border_radius[ST_CORNER_TOPLEFT],
node->border_radius[ST_CORNER_TOPRIGHT]);
max_borders[ST_SIDE_BOTTOM] = MAX (node->border_radius[ST_CORNER_BOTTOMLEFT],
node->border_radius[ST_CORNER_BOTTOMRIGHT]);
max_borders[ST_SIDE_LEFT] = MAX (node->border_radius[ST_CORNER_TOPLEFT],
node->border_radius[ST_CORNER_BOTTOMLEFT]);
max_borders[ST_SIDE_RIGHT] = MAX (node->border_radius[ST_CORNER_TOPRIGHT],
node->border_radius[ST_CORNER_BOTTOMRIGHT]);
center_radius = (node->box_shadow->blur > 0) ? (2 * node->box_shadow->blur + 1) : 1;
node->box_shadow_min_width = max_borders[ST_SIDE_LEFT] + max_borders[ST_SIDE_RIGHT] + center_radius;
node->box_shadow_min_height = max_borders[ST_SIDE_TOP] + max_borders[ST_SIDE_BOTTOM] + center_radius;
if (state->alloc_width < node->box_shadow_min_width ||
state->alloc_height < node->box_shadow_min_height)
{
state->box_shadow_width = state->alloc_width;
state->box_shadow_height = state->alloc_height;
}
else
{
state->box_shadow_width = node->box_shadow_min_width;
state->box_shadow_height = node->box_shadow_min_height;
}
/* Render offscreen */
buffer = cogl_texture_new_with_size (state->box_shadow_width,
state->box_shadow_height,
COGL_TEXTURE_NO_SLICING,
COGL_PIXEL_FORMAT_ANY);
offscreen = cogl_offscreen_new_to_texture (buffer);
if (offscreen != COGL_INVALID_HANDLE)
{
ClutterActorBox box = { 0, 0, state->box_shadow_width, state->box_shadow_height};
CoglColor clear_color;
cogl_push_framebuffer (offscreen);
cogl_ortho (0, state->box_shadow_width, state->box_shadow_height, 0, 0, 1.0);
cogl_color_set_from_4ub (&clear_color, 0, 0, 0, 0);
cogl_clear (&clear_color, COGL_BUFFER_BIT_COLOR);
st_theme_node_paint_borders (state, &box, 0xFF);
cogl_pop_framebuffer ();
cogl_handle_unref (offscreen);
state->box_shadow_material = _st_create_shadow_material (st_theme_node_get_box_shadow (node),
buffer);
}
cogl_handle_unref (buffer);
}
static void static void
st_theme_node_paint_sliced_border_image (StThemeNode *node, st_theme_node_paint_sliced_border_image (StThemeNode *node,
float width, float width,
@ -1945,6 +2336,43 @@ st_theme_node_paint_outline (StThemeNode *node,
cogl_rectangles (rects, 4); cogl_rectangles (rects, 4);
} }
static gboolean
st_theme_node_needs_new_box_shadow_for_size (StThemeNodePaintState *state,
StThemeNode *node,
float width,
float height)
{
if (!node->rendered_once)
return TRUE;
/* The allocation hasn't changed, no need to recompute a new
box-shadow. */
if (state->alloc_width == width ||
state->alloc_height == height)
return FALSE;
/* If there is no shadow, no need to recompute a new box-shadow. */
if (node->box_shadow_min_width == 0 ||
node->box_shadow_min_height == 0)
return FALSE;
/* If the new size is inferior to the box-shadow minimum size (we
already know the size has changed), we need to recompute the
box-shadow. */
if (width < node->box_shadow_min_width ||
height < node->box_shadow_min_height)
return TRUE;
/* Now checking whether the size of the node has crossed the minimum
box-shadow size boundary, from below to above the minimum size .
If that's the case, we need to recompute the box-shadow */
if (state->alloc_width < node->box_shadow_min_width ||
state->alloc_height < node->box_shadow_min_height)
return TRUE;
return FALSE;
}
void void
st_theme_node_paint (StThemeNode *node, st_theme_node_paint (StThemeNode *node,
StThemeNodePaintState *state, StThemeNodePaintState *state,
@ -1964,11 +2392,22 @@ st_theme_node_paint (StThemeNode *node,
if (width <= 0 || height <= 0) if (width <= 0 || height <= 0)
return; return;
if (state->alloc_width != width || state->alloc_height != height) if (st_theme_node_needs_new_box_shadow_for_size (state, node, width, height))
{ {
state->node = node; /* If we had the ability to cache textures on the node, then we
st_theme_node_render_resources (node, state, width, height); can just copy them over to the paint state and avoid all
rendering. We end up sharing textures a cross different
widgets. */
if (node->rendered_once && node->cached_textures &&
width >= node->box_shadow_min_width && height >= node->box_shadow_min_height)
st_theme_node_paint_state_copy (state, &node->cached_state);
else
st_theme_node_render_resources (state, node, width, height);
node->rendered_once = TRUE;
} }
else if (state->alloc_width != width || state->alloc_height != height)
st_theme_node_update_resources (state, node, width, height);
/* Rough notes about the relationship of borders and backgrounds in CSS3; /* Rough notes about the relationship of borders and backgrounds in CSS3;
* see http://www.w3.org/TR/css3-background/ for more accurate details. * see http://www.w3.org/TR/css3-background/ for more accurate details.
@ -1997,10 +2436,18 @@ st_theme_node_paint (StThemeNode *node,
*/ */
if (state->box_shadow_material) if (state->box_shadow_material)
_st_paint_shadow_with_opacity (node->box_shadow, {
state->box_shadow_material, if (state->alloc_width < node->box_shadow_min_width ||
&allocation, state->alloc_height < node->box_shadow_min_height)
paint_opacity); _st_paint_shadow_with_opacity (node->box_shadow,
state->box_shadow_material,
&allocation,
paint_opacity);
else
st_theme_node_paint_sliced_shadow (state,
&allocation,
paint_opacity);
}
if (state->prerendered_material != COGL_INVALID_HANDLE || if (state->prerendered_material != COGL_INVALID_HANDLE ||
st_theme_node_load_border_image (node)) st_theme_node_load_border_image (node))
@ -2024,7 +2471,7 @@ st_theme_node_paint (StThemeNode *node,
} }
else else
{ {
st_theme_node_paint_borders (node, state, box, paint_opacity); st_theme_node_paint_borders (state, box, paint_opacity);
} }
st_theme_node_paint_outline (node, box, paint_opacity); st_theme_node_paint_outline (node, box, paint_opacity);
@ -2124,6 +2571,8 @@ st_theme_node_paint_state_copy (StThemeNodePaintState *state,
state->alloc_width = other->alloc_width; state->alloc_width = other->alloc_width;
state->alloc_height = other->alloc_height; state->alloc_height = other->alloc_height;
state->box_shadow_width = other->box_shadow_width;
state->box_shadow_height = other->box_shadow_height;
if (other->box_shadow_material) if (other->box_shadow_material)
state->box_shadow_material = cogl_handle_ref (other->box_shadow_material); state->box_shadow_material = cogl_handle_ref (other->box_shadow_material);

@ -99,12 +99,19 @@ struct _StThemeNode {
guint background_image_shadow_computed : 1; guint background_image_shadow_computed : 1;
guint text_shadow_computed : 1; guint text_shadow_computed : 1;
guint link_type : 2; guint link_type : 2;
guint rendered_once : 1;
guint cached_textures : 1;
int box_shadow_min_width;
int box_shadow_min_height;
CoglHandle border_slices_texture; CoglHandle border_slices_texture;
CoglHandle border_slices_material; CoglHandle border_slices_material;
CoglHandle background_texture; CoglHandle background_texture;
CoglHandle background_material; CoglHandle background_material;
CoglHandle background_shadow_material; CoglHandle background_shadow_material;
StThemeNodePaintState cached_state;
}; };
struct _StThemeNodeClass { struct _StThemeNodeClass {

@ -54,6 +54,8 @@ st_theme_node_init (StThemeNode *node)
node->background_shadow_material = COGL_INVALID_HANDLE; node->background_shadow_material = COGL_INVALID_HANDLE;
node->border_slices_texture = COGL_INVALID_HANDLE; node->border_slices_texture = COGL_INVALID_HANDLE;
node->border_slices_material = COGL_INVALID_HANDLE; node->border_slices_material = COGL_INVALID_HANDLE;
st_theme_node_paint_state_init (&node->cached_state);
} }
static void static void
@ -101,6 +103,8 @@ st_theme_node_dispose (GObject *gobject)
g_signal_handlers_disconnect_by_func (node->theme, g_signal_handlers_disconnect_by_func (node->theme,
on_custom_stylesheets_changed, node); on_custom_stylesheets_changed, node);
st_theme_node_paint_state_free (&node->cached_state);
g_clear_object (&node->theme); g_clear_object (&node->theme);
G_OBJECT_CLASS (st_theme_node_parent_class)->dispose (gobject); G_OBJECT_CLASS (st_theme_node_parent_class)->dispose (gobject);

@ -102,6 +102,9 @@ struct _StThemeNodePaintState {
float alloc_width; float alloc_width;
float alloc_height; float alloc_height;
float box_shadow_width;
float box_shadow_height;
CoglHandle box_shadow_material; CoglHandle box_shadow_material;
CoglHandle prerendered_texture; CoglHandle prerendered_texture;
CoglHandle prerendered_material; CoglHandle prerendered_material;

@ -385,7 +385,7 @@ st_widget_finalize (GObject *gobject)
g_free (priv->inline_style); g_free (priv->inline_style);
for (i = 0; i < G_N_ELEMENTS (priv->paint_states); i++) for (i = 0; i < G_N_ELEMENTS (priv->paint_states); i++)
st_theme_node_paint_state_init (&priv->paint_states[i]); st_theme_node_paint_state_free (&priv->paint_states[i]);
G_OBJECT_CLASS (st_widget_parent_class)->finalize (gobject); G_OBJECT_CLASS (st_widget_parent_class)->finalize (gobject);
} }

@ -8,6 +8,7 @@ TEST_JS = \
interactive/border-radius.js \ interactive/border-radius.js \
interactive/border-width.js \ interactive/border-width.js \
interactive/box-layout.js \ interactive/box-layout.js \
interactive/box-shadow-animated.js \
interactive/box-shadows.js \ interactive/box-shadows.js \
interactive/calendar.js \ interactive/calendar.js \
interactive/css-fonts.js \ interactive/css-fonts.js \

@ -45,12 +45,6 @@ function test() {
style: 'border: 1px solid #aaaaaa; ' style: 'border: 1px solid #aaaaaa; '
+ 'background: #cceeff' })); + 'background: #cceeff' }));
b2.add(new St.Label({ x: 50,
y: 50,
text: "Fixed",
style: 'border: 1px solid #aaaaaa;'
+ 'background: #ffffcc' }));
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
function createCollapsableBox(width) { function createCollapsableBox(width) {

@ -0,0 +1,84 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const St = imports.gi.St;
const Mainloop = imports.mainloop;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const UI = imports.testcommon.ui;
const DELAY = 2000;
function resize_animated(label) {
if (label.width == 100) {
label.save_easing_state();
label.set_easing_mode(Clutter.AnimationMode.EASE_OUT_QUAD);
label.set_easing_duration(DELAY - 50);
label.set_size(500, 500);
label.restore_easing_state();
} else {
label.save_easing_state();
label.set_easing_mode(Clutter.AnimationMode.EASE_OUT_QUAD);
label.set_easing_duration(DELAY - 50);
label.set_size(100, 100);
label.restore_easing_state();
}
}
function get_css_style(shadow_style)
{
return 'border: 20px solid black;' +
'border-radius: 20px;' +
'background-color: white; ' +
'padding: 5px;' + shadow_style;
}
function test() {
let stage = new Clutter.Stage({ width: 1000, height: 600 });
UI.init(stage);
let iter = 0;
let shadowStyles = [ 'box-shadow: 3px 50px 0px 4px rgba(0,0,0,0.5);',
'box-shadow: 3px 4px 10px 4px rgba(0,0,0,0.5);',
'box-shadow: 0px 50px 0px 0px rgba(0,0,0,0.5);',
'box-shadow: 100px 100px 20px 4px rgba(0,0,0,0.5);'];
let label1 = new St.Label({ style: get_css_style(shadowStyles[iter]),
text: shadowStyles[iter],
x: 20,
y: 20,
width: 100,
height: 100
});
stage.add_actor(label1);
let label2 = new St.Label({ style: get_css_style(shadowStyles[iter]),
text: shadowStyles[iter],
x: 500,
y: 20,
width: 100,
height: 100
});
stage.add_actor(label2);
resize_animated(label1);
resize_animated(label2);
Mainloop.timeout_add(DELAY, Lang.bind(this, function() {
log(label1 + label1.get_size());
resize_animated(label1);
resize_animated(label2);
return true;
}));
Mainloop.timeout_add(2 * DELAY, Lang.bind(this, function() {
iter += 1;
iter %= shadowStyles.length;
label1.set_style(get_css_style(shadowStyles[iter]));
label1.set_text(shadowStyles[iter]);
label2.set_style(get_css_style(shadowStyles[iter]));
label2.set_text(shadowStyles[iter]);
return true;
}));
UI.main(stage);
}
test();