Compare commits

...

154 Commits

Author SHA1 Message Date
b45b241ce8 Bump version to 3.7.2.1
Update NEWS.
2012-11-23 17:59:07 +01:00
4233ca2983 Revert "NetworkMenu: rework multiple NIC support"
This reverts commit 490206b5b2.
2012-11-23 17:49:11 +01:00
5200da6eec Bump version to 3.7.2
Update NEWS
2012-11-20 00:01:40 +01:00
b0523860d9 build: Actually remove shell-screen-grabber.[ch]
Commit 7f8bfcc939 removed the code, but not the actual files,
breaking make distcheck.
2012-11-20 00:01:39 +01:00
1a1215527f messageTray: restore toggle tray in normal mode (non overview)
https://bugzilla.gnome.org/show_bug.cgi?id=688507
2012-11-20 00:01:39 +01:00
360c018c9e calendar-server: Remove useless g_type_init 2012-11-20 00:03:13 +01:00
7bed964ab2 ScreenShield: unbreak blurring the background
It was missing a uniform, so it had no effect besides desaturation.

https://bugzilla.gnome.org/show_bug.cgi?id=682536
2012-11-19 20:13:36 +01:00
989d0a5682 bluetooth: add translation hints
A couple of translations were hard to translate.

https://bugzilla.gnome.org/show_bug.cgi?id=638351
2012-11-19 19:56:08 +01:00
b121c25184 MessageTray: restore opacity when expanding a notification
MessageTray tweens both opacity and y to hide or show _notificationWidget,
but only y when expanding it. This means that an existing tween to hide
the notification will continue running, clearing the notification state.
If the hiding one completes before the showing one, the onComplete handler
will throw an exception (because the notification was nullified) and
therefore break the state tracking.

https://bugzilla.gnome.org/show_bug.cgi?id=683986
2012-11-19 19:20:31 +01:00
e0d127b3e4 shell-recorder-src: Set frame duration
We where not setting a duration for the frames, which caused the resulting videos to
have a broken header.

Fix that by making the source a live source and setting the correct frame duration.

https://bugzilla.gnome.org/show_bug.cgi?id=688487
2012-11-19 19:17:31 +01:00
a0c56c74e1 test-recoder: Use webm file extension
This matches our default pipeline.

https://bugzilla.gnome.org/show_bug.cgi?id=688487
2012-11-19 19:17:23 +01:00
f4b61a7f24 recorder: Show icon and indicator on the primary monitor
https://bugzilla.gnome.org/show_bug.cgi?id=688470
2012-11-19 19:16:24 +01:00
b2400fb883 build: require gsettings-desktop-schemas 3.7.2
For shell search provider settings schema.
2012-11-19 12:01:13 -05:00
f25832d1b6 view-selector: add support for disable-external search setting
https://bugzilla.gnome.org/show_bug.cgi?id=687491
2012-11-19 11:45:21 -05:00
cf363171aa remote-search: apply sort-order from GSettings
Sort providers according to the GSettings state, and make sure to reload
them as soon as the sort order changes.

https://bugzilla.gnome.org/show_bug.cgi?id=687491
2012-11-19 11:45:21 -05:00
38c8569d16 remote-search: restructure remote search provider loading process
Instead of adding search providers to the system as we find them, wait
until we loaded information from all the directories, and then add all
providers at once.
This will be useful when we will sort the providers information
according to the sort order saved in GSettings.

https://bugzilla.gnome.org/show_bug.cgi?id=687491
2012-11-19 11:45:21 -05:00
9791d15f39 view-selector: filter out disabled search providers
If the added search provider has an appId in the list of the disabled
search providers settings, ignore it.

https://bugzilla.gnome.org/show_bug.cgi?id=687491
2012-11-19 11:45:21 -05:00
80e7f5832b search: add API to get a list of remote providers
This will be used to reload them in case the configuration changes.

https://bugzilla.gnome.org/show_bug.cgi?id=687491
2012-11-19 11:45:21 -05:00
6e46ddaad3 search: propagate GAppInfo to SearchProvider
Save the GAppInfo in the provider object; this will be used when
filtering.

https://bugzilla.gnome.org/show_bug.cgi?id=687491
2012-11-19 11:45:21 -05:00
8499e4aab2 [l10n] Updated Estonian translation 2012-11-19 16:41:52 +02:00
5eae1851a1 Login dialog - tweak the user name text shadow
The shadow under the user name should suggest that the light source
is directly above.

https://bugzilla.gnome.org/show_bug.cgi?id=688557
2012-11-17 23:54:35 +00:00
c48a246ccb panel: programmatic anim. control of AnimatedIcon
The AnimatedIcon does not have an API for controlling the animation but
relies on the :visible property changes to start and stop a timeout used
to update the frame.

This has the inconvenient of having a side effect when visible is set to
true multiple times, and is not really the API expected from such
component. Also, there is a race if it is displayed before the images
are loaded: there is no child yet and thus we get this._frame = NaN
which leads to a crash.

Switch to a play/stop API instead, and add a load event callback to the
TextureCache.load_slice_image to exactly know when we can start using
the images.

https://bugzilla.gnome.org/show_bug.cgi?id=687583
2012-11-17 22:26:55 +01:00
f084011a61 viewSelector: Make toggle-application-view binding available in overview
https://bugzilla.gnome.org/show_bug.cgi?id=688202
2012-11-17 01:52:52 +01:00
bd40cf194c recorder: Make toggle-recorder action available in the overview
There's not really a good reason to not allow starting a recording
in the overview ...

https://bugzilla.gnome.org/show_bug.cgi?id=688202
2012-11-17 01:52:51 +01:00
2434af7e8a messageTray: Make toggle-message-tray available when up
It makes so much sense that the setting even has 'toggle' in its name.

https://bugzilla.gnome.org/show_bug.cgi?id=688202
2012-11-17 01:52:51 +01:00
ced7fa9f01 Add screenshield and unlock dialog to ctrl-alt-tab
As we now allow the ctrl-alt-tab popup on the lock screen, it should
be possible to navigate back from the top bar, so add the corresponding
elements to the switcher.

https://bugzilla.gnome.org/show_bug.cgi?id=688202
2012-11-17 01:52:51 +01:00
28b559e812 windowManager: Replace sessionMode.allowKeybindingsWhenModal
The original condition the property was based on was added to make
the a11y switcher available in the login screen, though it did never
work properly - after popping up the switcher, additional tab key
presses were ignored. As we are now able to filter bindings much more
selectively, we can simplify the check and drop the sessionMode property.

https://bugzilla.gnome.org/show_bug.cgi?id=688202
2012-11-17 01:52:51 +01:00
76d776245b windowManager: Use generic filter mechanism for all keybindings
With the new flexible system in place, there's no point explicitly
hardcoding some built-in keybindings; just use the generic mechanism
for everything.

https://bugzilla.gnome.org/show_bug.cgi?id=688202
2012-11-17 01:52:51 +01:00
0d9f70492e windowManager: Add a generic mechanism for filtering keybindings
Currently we hardcode the set of keybindings that are available in the
overview; add a generic mechanism to specify in which KeybindingModes
a keybinding should be available.

https://bugzilla.gnome.org/show_bug.cgi?id=688202
2012-11-17 01:52:51 +01:00
b58f502dd6 main: Add optional keybindingMode parameter to pushModal()
For now we just use it to assign an identifier to modal modes in
which we want to allow some keybindings, but we don't use it for
any actual filtering; we'll start doing this shortly.

https://bugzilla.gnome.org/show_bug.cgi?id=688202
2012-11-17 01:44:22 +01:00
5f367248c5 grabHelper: Support optional parameters to pushModal()
https://bugzilla.gnome.org/show_bug.cgi?id=688202
2012-11-17 01:44:22 +01:00
c2065cc3e2 main: Use Params for optional parameters to pushModal()
As the number of optional parameters grows, it gets more convenient
to use Params instead of passing in a lot of undefined/null/0 values.

https://bugzilla.gnome.org/show_bug.cgi?id=688202
2012-11-17 01:44:22 +01:00
034408971d windowManager: Implement keybinding_filter hook
We are currently using a hack to allow a select set of keybindings
in the overview. Implement the new MetaPlugin keybinding_filter
hook, which provides a cleaner way to achieve the same.

https://bugzilla.gnome.org/show_bug.cgi?id=688202
2012-11-17 01:44:22 +01:00
490206b5b2 NetworkMenu: rework multiple NIC support
Remove section titles for ethernet and mobile broadband, and replace
them with device status items that recognize if multiple devices are
installed in the same section, and if so automatically disambiguate.

https://bugzilla.gnome.org/show_bug.cgi?id=677142
2012-11-16 13:52:52 -05:00
d8540819af st-theme-node-drawing: Group multiple cogl_rectangle calls
Calling cogl_rectangles is more efficent then using multiple cogl_rectangle calls.

https://bugzilla.gnome.org/show_bug.cgi?id=688475
2012-11-16 19:28:47 +01:00
d1a9aec526 recorder: Remove dead code
This calls are nops (already called a few lines above) so just remove them.
2012-11-16 19:28:23 +01:00
e4b681a5a5 Updated Galician translations 2012-11-16 18:44:18 +01:00
52036871d1 StThemeNode: add a trivial-case short cut to all comparisons for equality
Bug: https://bugzilla.gnome.org/show_bug.cgi?id=687465
Reviewed-by: Jasper St. Pierre <jstpierre@mecheye.net>
2012-11-15 17:08:33 +00:00
4fc6a804f5 st_widget_recompute_style: short-circuit if the theme node is the same
It appears to be somewhat common for st_widget_style_changed() to be
called when no style-relevant attributes have, in fact, changed. Now that
we cache theme nodes, we're likely to get the same theme node back from
the cache. If we do, we don't need to waste time asking whether its
geometry and painting are equal to itself: we can just note that nothing
really changed and get on with our lives.

Bug: https://bugzilla.gnome.org/show_bug.cgi?id=687465
Reviewed-by: Jasper St. Pierre <jstpierre@mecheye.net>
2012-11-15 17:08:31 +00:00
08d2ca300a st_theme_node_copy_cached_paint_state: allow self-assignment
If you copy a theme node's paint state into itself, it should be an
inexpensive no-op. What actually happened was that we destroyed the
old paint state, re-initialized to blank, then copied the blank state
back into itself. In the process, we lost (for instance) the textures
for rounded corners.

Until I introduced the texture cache, this never actually happened,
because when st_widget_recompute_style() calls st_widget_get_theme_node(),
we'd always get a fresh theme node. Now, we get a theme node T back
from the cache, notice that paint_equal(T, T) is true, short-circuit
slightly by copying its drawing state into itself, and destroy drawing
state that we still needed.

I'm going to fix this in recompute_style() too, but as a general
principle, self-assignment ought to be harmless.

Bug: https://bugzilla.gnome.org/show_bug.cgi?id=687465
Reviewed-by: Jasper St. Pierre <jstpierre@mecheye.net>
2012-11-15 17:07:42 +00:00
dc2ec0a8f9 Keep similar theme nodes so we don't have to recompute CSS so often
Because we calculate and cache CSS properties once per StThemeNode,
and only a certain set of attributes can affect the CSS properties,
it's advantageous for as many widgets as possible to share a single
StThemeNode. Similarly, if a widget changes state and then changes back
(e.g. gaining and losing the :hover pseudo-class), it should ideally
get its original StThemeNode back again when it returns to the old
state.

Here, I'm using the StThemeContext as the location for a cache.
StThemeNodes are currently never freed: this seems OK for Shell's usage
(a finite number of IDs, classes, pseudo-classes and types).

Bug: https://bugzilla.gnome.org/show_bug.cgi?id=687465
Reviewed-by: Jasper St. Pierre <jstpierre@mecheye.net>
2012-11-14 19:24:42 +00:00
2cfed952bb Remove unsplit element classes and pseudo-classes
Bug: https://bugzilla.gnome.org/show_bug.cgi?id=687465
Reviewed-by: Jasper St. Pierre <jstpierre@mecheye.net>
2012-11-14 19:24:31 +00:00
a7da137778 st_theme_node_equal: use split (pseudo-)classes
This is a prerequisite for getting rid of the unsplit versions.

Bug: https://bugzilla.gnome.org/show_bug.cgi?id=687465
Reviewed-by: Jasper St. Pierre <jstpierre@mecheye.net>
2012-11-14 19:24:30 +00:00
5ae2f87ce9 Use pre-split element classes and pseudo-classes to optimize matching
In my testing this cuts the longest time to dispatch(), when showing the
calendar menu for the first time, from 604 to 442 milliseconds,
while reducing additional_selector_matches_style() from 32% to 13% of
CPU time used.

Bug: https://bugzilla.gnome.org/show_bug.cgi?id=687465
Reviewed-by: Jasper St. Pierre <jstpierre@mecheye.net>
2012-11-14 19:24:26 +00:00
c4f6619fbd Store CSS classes and pseudo-classes pre-split in the StThemeNode
Tokenizing every time we want to evaluate CSS seems a poor plan.

Bug: https://bugzilla.gnome.org/show_bug.cgi?id=687465
Reviewed-by: Jasper St. Pierre <jstpierre@mecheye.net>
2012-11-14 19:23:40 +00:00
65edbc1424 a11y: also set the WM HighContrast theme when switch is flipped
Now that we have a HighContrast-specific WM theme.

https://bugzilla.gnome.org/show_bug.cgi?id=688256
2012-11-13 11:24:18 -05:00
1f2d7fa28f Bluetooth: Remove ObexFTP functionality
ObexFTP browsing in gvfs is completely broken, and unmaintained.
http://www.hadess.net/2011/11/obexftp-in-gnome-non-update.html

Remove the UI for it. The more adventurous can go and use it
(as long as I don't get the bug reports).

https://bugzilla.gnome.org/show_bug.cgi?id=688160
2012-11-13 17:03:21 +01:00
2407a0c4e2 main: Stop using Metacity's keybinding files
The descriptions for keybindings shared with Metacity are now
duplicated in Mutter, so only use the latter to avoid duplicate
entries in System Settings.

https://bugzilla.gnome.org/show_bug.cgi?id=687672
2012-11-12 21:18:06 +01:00
7f8bfcc939 Remove shell-screen-grabber
The screen grabber was a workaround for an extremely slow path in Mesa
when reading back pixel data from the frame buffer. It was using pixel
buffer objects by directly calling into GL to hit a fast blit path in
Intel's driver. This should no longer be necessary with the latest
Mesa because the normal read pixels path now has a fast path to just
memcpy the data. Using PBOs in that case just adds an extra
indirection because the data is read into an intermediate buffer and
then copied back out again.

We want to be able to remove the dependency on linking against libGL
directly from Gnome Shell because that will not work if Cogl is
actually using GLES. Also libGL includes GLX which means gnome-shell
ends up with a hard dependency on Xlib which hinders the goal of
getting Gnome Shell to be a Wayland compositor.

https://bugs.freedesktop.org/show_bug.cgi?id=46631

https://bugzilla.gnome.org/show_bug.cgi?id=685915
2012-11-12 19:07:57 +01:00
fae4cb9e56 loginDialog: Fix yet another StIconType removal fallout
https://bugzilla.gnome.org/show_bug.cgi?id=688181
2012-11-12 18:45:10 +01:00
063bbb02f2 loginDialog: Remove the correct focus root from ctrl-alt-tab
Commit 3abfcda8b5 fixed the focus root passed to addGroup(),
but left the one in removeGroup() unchanged.

https://bugzilla.gnome.org/show_bug.cgi?id=688181
2012-11-12 18:45:10 +01:00
15e1470c50 polkitAgent: Expand password entry to the full width
Due to an oversight, the width of the password entry is currently
determined by the length of the message description. Fix the flags
so that the entry spans the entire width of the dialog.

https://bugzilla.gnome.org/show_bug.cgi?id=684810
2012-11-12 16:59:12 +01:00
f602993aa9 dash: Disable animations during overview transitions
When updating the dash, we already avoid all animations while the
overview is hidden. However, as we are using Main.queueDeferredWork(),
updates may be deferred up to ~20 seconds while the overview is hidden.
If the overview is entered before a queued update has taken place, it
will be run immediately on map - as the overview is visible by then,
this means animating any outstanding changes.
Work around this by skipping animations during overview transitions as
well.

https://bugzilla.gnome.org/show_bug.cgi?id=686530
2012-11-12 16:59:12 +01:00
271508c0a8 ScreenShield: fix code to detect missing unlock dialog
If the session mode has no locking support, screenshield had code to
unlock automatically, but it did so by checking the return value of
the constructor, instead of checking if the constructor was actually
callable, so it would get a TypeError before reaching the check.

https://bugzilla.gnome.org/show_bug.cgi?id=687708
2012-11-11 19:17:58 +01:00
50f96d1c9c Stop using clutter alpha
It is deprecated.

https://bugzilla.gnome.org/show_bug.cgi?id=688089
2012-11-11 17:13:38 +01:00
809544800b MessageTray: fix reentrancy when calling out to the grab helper
Similar to 683546. I'm not sure where this bug lives, but let's make
the code robust.

https://bugzilla.gnome.org/show_bug.cgi?id=683986
2012-11-10 17:36:00 +01:00
e757b06987 power: indicate 1 hour remaining correctly
Before 60 minutes remaining were displayed
as "0 minutes" now it is "1 hour".

https://bugzilla.gnome.org/show_bug.cgi?id=687958
2012-11-09 17:19:05 +01:00
6f2da1baf1 Updated Hebrew translation. 2012-11-09 11:36:39 +02:00
f30dcad8a7 messageTray: Close the notification on Escape
Now that the notifications can be focused with the keyboard, it's
important we can close the active one also this way.

https://bugzilla.gnome.org/show_bug.cgi?id=652082
2012-11-08 21:19:52 +01:00
7dc235511e messageTray: Add a notification focus keybinding
At the moment, only the mouse can be used to focus and answer a chat
notification.

This adds a new keybinding (defaults to <Super>+n) to focus and expand
the active notification.

https://bugzilla.gnome.org/show_bug.cgi?id=652082
2012-11-08 15:46:16 +01:00
644c210fe2 Rename "System Settings" to "Settings"
"System Settings" has been renamed to "Settings" in gnome-control-center.
See bug https://bugzilla.gnome.org/show_bug.cgi?id=681543

This patch does the same rename in the shell itself, as per

https://bugzilla.gnome.org/show_bug.cgi?id=687738
2012-11-07 16:05:23 +00:00
68e8f98671 .gitignore: Update to ignore the generated manpage 2012-11-07 14:39:28 +01:00
1228db6ac1 unlockDialog: better confirmation button label
If I click on "Not listed?" in the login screen, I come to a username
field with two buttons: "Cancel" and "Sign In".

Clicking on "Sign In" doesn't actually sign me in though - it takes me
to the login entry. It would be better to rename "Sign In" to "Next" for
the username stage, therefore.

Gdm emit a signal to ask a question or a secret, but we can not know if
this is the last authentication question, hence we only use "Sign In"
for secret questions which improve the situation a lot.

https://bugzilla.gnome.org/show_bug.cgi?id=687656
2012-11-07 01:26:35 +01:00
86596749fa Revert "overview: highlight windows on launcher hover"
This reverts commit 76229a3601.

Pushed by accident.
2012-11-07 00:33:32 +01:00
76229a3601 overview: highlight windows on launcher hover
When in the overview, if you move the mouse cursor over one of the
application launchers in the dash, all the unrelated windows are dimmed
both both in the window view and in the workspace view.

It helps to easily understand whether or not there are already opened
windows for this application, and where they are. It can also help in
differentiating the windows in the overview (sometimes the thumbnails
aren't precise enough to easily know which thumbnail belongs to which
application).

https://bugzilla.gnome.org/show_bug.cgi?id=657315
2012-11-07 00:27:31 +01:00
95abdeb919 dash: simplify app retrieval from AppWellIcon
This has also the benefit of getting the application even if it can not
be retrieved through AppSystem, which can happen if the runtime WMClass
does not match the one of the desktop file.

This especially looked wrong with the following commits related to the
bug.

https://bugzilla.gnome.org/show_bug.cgi?id=657315
2012-11-07 00:27:31 +01:00
df0151d338 dash: rename a local variable for clarity
createAppIcon creates an appIcon, not a 'display', which made things
unnecessarily more difficult to understand.

https://bugzilla.gnome.org/show_bug.cgi?id=657315
2012-11-07 00:26:50 +01:00
ee2f12fe81 dash: properly restore item label on popup close
We simply hide the label when the popup is opened instead of relying
on the popup state when the hover state change.

To do this we replace the flag isMenuUp by a 'menu-state-changed' signal
on the AppWellIcon. This simplifies the dash label visibility handling
code that need additional changes for the bug.

https://bugzilla.gnome.org/show_bug.cgi?id=657315
2012-11-07 00:26:11 +01:00
10c104529f remote-search: initialize the DBus proxy asynchronously
Initializing this synchronously means that we will possibly wait for the
process to be auto-activated and answering to our call.
If the process is already running it also might not answer immediately
our request, as it might be doing sync I/O.
The right thing to do is to initialize the proxy asynchronously; there
are try/catch blocks in place for when the object is not available, or
not properly initialized.

https://bugzilla.gnome.org/show_bug.cgi?id=687491
2012-11-06 18:11:56 -05:00
cbc8ec6508 remote-search: don't use g_file_query_exists()
This is called in the main thread, which we should never block for
synchronous I/O.
Since the operation we're wrapping is async already, just use
g_file_query_info_async() instead.

https://bugzilla.gnome.org/show_bug.cgi?id=687491
2012-11-06 17:47:48 -05:00
8e7758e280 remote-search: require a DesktopId field in search providers
Remote search providers install an auxiliary keyfile to specify
static information, such as the object path/bus name needed to activate
the binary. Such keyfiles also specify the application the providers
pushes results for; currently, we support two formats for application
information
- two fields, "Title" and "Icon" that specify a (translatable) title and
  an icon name for display
- one field "DesktopId" that specifies the desktop file name of the
  application backing the provider, which obsoletes the previous
  Title/Icon syntax

Since all providers in GNOME use DesktopId now, and we need to ensure a
remote search providers is always backed by an application for future
development, this commit drops the support for the older syntax.

https://bugzilla.gnome.org/show_bug.cgi?id=687491
2012-11-06 17:47:48 -05:00
9aefbd189c view-selector: add missing semicolon
https://bugzilla.gnome.org/show_bug.cgi?id=687491
2012-11-06 17:47:47 -05:00
b9d50584d8 screenshield: use the correct actor for the background
Commit 4fd690333a added the GLSL snippet to
the background actor, but then discarded the newly created actor.
2012-11-06 17:47:13 -05:00
e5f7390c09 ScreenShield: hide the cursor while the lock screen is on
While the screen is locked and the cursor is not moved, the mouse
cursor should be hidden, to indicate the machine is idle.

https://bugzilla.gnome.org/show_bug.cgi?id=682535
2012-11-06 23:10:01 +01:00
797b1ff8bb ScreenShield: account for motion velocity when hiding the lock screen
Switch from a ClutterDragAction to a ClutterGestureAction, that gives
us the velocity of mouse motion at each step, and use it to compute the
animation time for completing the hide gesture.

https://bugzilla.gnome.org/show_bug.cgi?id=682537
2012-11-06 23:04:15 +01:00
09b738045c MessageTray: change height in chat notification to have more context.
https://bugzilla.gnome.org/show_bug.cgi?id=665255
2012-11-06 21:53:28 +00:00
4fd690333a ScreenShield: blur and desaturate the screenshield background
The background is the same as the normal desktop, so we blur and
desaturate it to clearly show that it's not the normal system state.
To do so, we don't use standard ClutterEffects, to avoid the FBO
indirection. Instead, we take advantage of MetaBackgroundActor support
for GLSL code and paint the shaded background texture directly.

https://bugzilla.gnome.org/show_bug.cgi?id=682536
2012-11-06 22:50:10 +01:00
5ef5e25a7f Use "Decline" instead of "Reject" for incoming calls
This makes GNOME Shell more polite
Fixes bug #661194
2012-11-06 20:52:53 +00:00
87e8770cbc loginDialog: support disable-user-list key
In some deployments showing a user list at the login
screen is undesirable.

GDM's fallback login screen has a configuration key:

org.gnome.login-screen disable-user-list false

that causes the user-list to get hidden.

This commit adds similar functionality to the normal,
shell-based login screen.

Based on a series of patches by Marius Rieder.

https://bugzilla.gnome.org/show_bug.cgi?id=660660
2012-11-06 15:05:15 -05:00
cac9d120be loginDialog: hide session list until username is entered
Right now when a user clicks "Not Listed?" they end up
seeing a session list that gets reset after they enter their
username.

This commit hides the session list until the username has
been entered.

https://bugzilla.gnome.org/show_bug.cgi?id=660660
2012-11-06 15:02:36 -05:00
1ae0fadbf4 loginDialog: don't rely on PAM to ask for a username
For the "Not Listed?" case we will need to be able
to identify when the user has entered their username.

Once we have a way of tracking when the username is
entered, we can then defer showing the session list
too early, before the user can reliably pick a
session.

This username tracking will also be important for
implementing a disable-user-list configuration key.
If the config key gets toggled off at runtime, we'll
need to know if we're at a disruptive part of
the authentication process or not, so we know whether
we can can expose the user list right away, or wait
until the authentication conversation finishes.

Right now, we pass null in for an initial username,
and let the PAM machinery ask the user, which means we
have no good way of knowing when the username is entered.

This commit changes the "Not Listed?" code to ask the
user their username up front, before starting the PAM
conversation in much the same way we do if the user
picks a user from the user list.

https://bugzilla.gnome.org/show_bug.cgi?id=660660
2012-11-06 15:02:36 -05:00
65497e089a [l10n] Updated German translation 2012-11-06 20:15:34 +01:00
2d763bd033 st-entry: Change the pointer cursor on enter/leave events
Change the pointer cursor to an i-beam when it is inside the ClutterText.

https://bugzilla.gnome.org/show_bug.cgi?id=687130
2012-11-06 11:47:49 +00:00
4ebf396cf5 a11y: fixing a regression with the accessible name at dash items
After some changes, the tooltip label at the dash is not available
until it is visually shown. As this is not anymore a reliable
source of accessible name, we just set the accessible name
with the string used on that label.

https://bugzilla.gnome.org/show_bug.cgi?id=686583
2012-11-06 10:05:18 +01:00
6faa50d496 Add a --disable-man configure option
OSTree doesn't have DocBook stylesheets, so generating
man pages from xml causes build failures there.
2012-11-05 23:43:03 -05:00
6fcd6298c8 Use the same xsltproc parameters as other modules
Using the same parameters makes sure that the generated man
pages look more or less uniform.
2012-11-05 23:42:52 -05:00
5c16be5dbb Some updates to the man page
Mention relevant files, and how gnome-shell gets started
in the session.

https://bugzilla.gnome.org/show_bug.cgi?id=680601
2012-11-05 19:32:01 -05:00
e3abb6f178 Convert man page to Docbook
This make it easier to update the content and to transform
the man page into other output formats, like HTML.

https://bugzilla.gnome.org/show_bug.cgi?id=680601
2012-11-05 19:31:54 -05:00
70736be4eb mobile-providers: new country-specific type to gather providers
shell_mobile_providers_parse() was returning the country information split
into a hash table with providers and a hash table with country names. This
patch merges both outputs into a single per-country object, so the parse()
method now returns a GHashTable with the following element-type:
   (element-type utf8 ShellCountryMobileProvider>)
This also avoids more complex setups like returning lists inside of hash tables,
which was actually breaking either g-i or gtk-doc.

shell_mobile_providers_parse() was also modified to allow inputting the paths
of the country codes and provider list files to use. If paths are not given, the
default ones will be used. This helps us to provide test files during unit
tests.

Both the findProviderForMCCMNC() and findProviderForSid() methods are exported
out of the GSM and CDMA specific classes, and new unit tests for them are
implemented. Tests can be run manually with:
    $> ./tests/run-test.sh tests/unit/mobileProviders.js

https://bugzilla.gnome.org/show_bug.cgi?id=687356.
2012-11-05 22:20:08 +01:00
1c3e7330f3 ScreenShield: don't rely on gnome-session to hide the lightbox
If we lock before the user becomes active again, gnome-session will never
change presence from IDLE, and thus we'll never hide the lightbox.
Instead, install our own idle monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=687020
2012-11-05 22:04:09 +01:00
6e4c89b310 main: hide the overview on key release
Entering the overview with the overlay key is done on key release but
exiting the overview on key press, which is inconsistent.

This change makes the overview hidden also on key release.

https://bugzilla.gnome.org/show_bug.cgi?id=683024
2012-11-05 21:14:28 +01:00
73b4a0ef5f st-theme: Optimize string_in_list
Rather than using a complicated set of function calls across
library boundaries and our own scanning logic, use strtok(),
which glibc already provides, and is probably much more optimized.

https://bugzilla.gnome.org/show_bug.cgi?id=687465
2012-11-05 15:10:31 -05:00
d88002c4ed Revert "panel: programmatic anim. control of AnimatedIcon"
This reverts commit e04a4c3923.

This commit exposed an already-existing race condition in the panel
animation code that caused the shell to crash for some people.

https://bugzilla.gnome.org/show_bug.cgi?id=687112
2012-11-05 14:31:04 -05:00
025c63c045 Implement non-linear overview shade for background
Adding a radial gradent to the dimming effect gives more depth to
the background.
Shading is computed in a GLSL fragment shader, and uses distance to
center of the screen to interpolate the darkening value to use.

Based on a patch by Pierre-Eric Pelloux-Prayer <pelloux@gmail.com>

https://bugzilla.gnome.org/show_bug.cgi?id=669798
2012-11-05 19:16:53 +01:00
b189cbd46e Updated Norwegian bokmål translation 2012-11-05 19:10:48 +01:00
a21ddb5914 gnome-shell-perf-tool: Fix various problems
* Fix wrong parameter name to on_name_appeared callbacks
* optparse doesn't just leave extra command line arguments, it
  errors out, so don't try to pass through extra arguments -
  instead add explicit passthrough for '--replace'
* Fix usage of Gio.DBusProxy
* Add a default value for --perf so that if it's not supplied
  things don't die with a mysterious error message. (This wasn't
  needed when --perf enabled perf-mode)

https://bugzilla.gnome.org/show_bug.cgi?id=687287
2012-11-05 13:08:25 -05:00
e04a4c3923 panel: programmatic anim. control of AnimatedIcon
The AnimatedIcon does not have an API for controlling the animation but
relies on the :visible property changes to start and stop a timeout used
to update the frame.

This has the inconvenient of having a side effect when visible is set to
true multiple times, and is not really the API expected from such
component.

Switch to a start/stop API instead. Also, update to the first frame at
startup while we are at it, since this is the expected behavior.

https://bugzilla.gnome.org/show_bug.cgi?id=687583
2012-11-05 15:05:14 +01:00
ae0821e07b Disable the login button when there is no input
You can't login until something has been entered in the password field.
We should therefore make the login button insensitive until you have
entered some text.

https://bugzilla.gnome.org/show_bug.cgi?id=687112
2012-11-05 10:17:46 +00:00
a508bece36 Updated Czech translation 2012-11-04 20:00:52 +01:00
2c9969a8f4 Updated Russian translation 2012-11-04 20:49:26 +04:00
dd9fc91f6f keyboard: simplify using Caribou.KeyModel.label
https://bugzilla.gnome.org/show_bug.cgi?id=687242
2012-11-03 08:57:23 +09:00
39d9838cc1 Show feedback notifications when the user is busy
Notifications that are created in response to direct user actions like
"is ready" or "'foo' has been removed from favorites" should always be
displayed even though the user has marked him/herself busy.

https://bugzilla.gnome.org/show_bug.cgi?id=662900
2012-11-02 19:25:26 +01:00
1397c7c624 build: Add missing file
Fix distcheck breakage from commit 687e1eabed.
2012-11-02 16:56:42 +01:00
c09fcba94f layout: Remove message tray pointer barrier
The barrier was introduced to make the message tray hot corner
usable in multiple monitor setups. With the hot corner gone in
3.6, the pointer barrier doesn't make much sense anymore, so
remove it.

https://bugzilla.gnome.org/show_bug.cgi?id=687457
2012-11-02 16:29:37 +01:00
c77b38fc4f telepathyClient: Fix auto-scroll to bottom
Instead of keeping track of the old adjustment.upper keep track of the
old adjustment.value that corresponded to the bottom scroll position.

This fixes the integrated chatview not always scrolling to the bottom
by removing the assumption that page_size is constant between updates,
which is not the case as the view is presented in various different ways.

https://bugzilla.gnome.org/show_bug.cgi?id=686571
2012-11-02 12:06:52 +01:00
aef9b733e5 loginDialog: drop spurious parameter
_onNotListed had an unusued, incorrect parameter.

This commit drops it.

https://bugzilla.gnome.org/show_bug.cgi?id=660660
2012-11-01 14:24:45 -04:00
348208617b Use the correct icon in the restart dialog
It currently uses system-shutdown-symbolic. view-refresh-symbolic
is a better fit in this case.

https://bugzilla.gnome.org/show_bug.cgi?id=670687
2012-11-01 16:21:52 +00:00
2c34c8e20f Overview search box is too subtle
When it isn't focused, the search box can be quite hard to see.

The text/icon/border color is changed to be brighter in order to increase
contrast with the dark background and this works well with various
wallpapers.

https://bugzilla.gnome.org/show_bug.cgi?id=686479
2012-11-01 11:32:40 +00:00
d19fa731d6 Updated Polish translation 2012-10-31 19:15:34 +01:00
59bb1cc387 Add a setting to force the 'Log out' menuitem
I've heard quite a bit of feedback from people who want to log out,
even if they are the sole user on their system. It doesn't seem worth
alienating them over this; so add a setting to make the 'Log out' item
always show up.
https://bugzilla.gnome.org/show_bug.cgi?id=686057
2012-10-31 12:46:49 -04:00
56909d0646 Show 'Log out' in more situations
When the current user is a remote account, or a we are logged in
as root, we should always show 'Log out'.

https://bugzilla.gnome.org/show_bug.cgi?id=686736
2012-10-31 12:45:08 -04:00
04da29c939 appMenu: Update on icon theme changes
While we recreate icons on style changes elsewhere, the faded
icon in the application menu will stick around after icon theme
changes until another application is focused.

https://bugzilla.gnome.org/show_bug.cgi?id=687224
2012-10-31 00:06:46 +01:00
307f7a3024 IM status menu: adjust the combo popup background
The transparent background for available/unavailable IM status menu
makes the text difficult to read.

Simplifies that by using the default combo-popup background instead of a
custom one.

https://bugzilla.gnome.org/show_bug.cgi?id=658091
2012-10-30 22:51:50 +00:00
e80bfa39f5 userMenu: Use "offline" instead of "unavailable"
https://bugzilla.gnome.org/show_bug.cgi?id=687226
2012-10-30 23:01:22 +01:00
29714922ea calendar: Drop unnecessary libedataserverui dependency
The libedataserverui dependency is a relic of the old E-D-S API.
As of 3.6.0, E-D-S now centralizes authentication prompts so clients
don't have to display their own.  This also allows trading the GTK+
main loop for a plain GMainLoop in gnome-shell-calendar-server.c.

https://bugzilla.gnome.org/show_bug.cgi?id=687189
2012-10-30 14:18:39 -04:00
88192114ac NetworkAgent: cancel requests when disabling component
When the NetworkAgent is disabled (for example because the lock screen
is being activated), cancel all modal dialogs.

https://bugzilla.gnome.org/show_bug.cgi?id=685239
2012-10-30 16:34:13 +01:00
9d78208b76 NetworkMenu: don't use a global switch for all VPN connections
Stop pretending that VPN is a NMDevice, and split the useful bits into
a NMConnectionBased interface.
Make each connection have its own switch menu item and handle its own
status, and remove the VPN section title, which is no longer needed.

https://bugzilla.gnome.org/show_bug.cgi?id=682929
2012-10-30 16:08:33 +01:00
d817bf0395 theme: standardize the run dialog text styles a bit
Use the standard color for dialog headings, and use the standard
text style for the entry field. These tweaks make the dialog easier
to read.

https://bugzilla.gnome.org/show_bug.cgi?id=687127
2012-10-30 15:50:05 +01:00
4d51056226 runDialog: Remove "Run" button again
While not in the mockups, it was introduced during review of commit
0c807bddaf after discussion on IRC, but the designers disagree;
remove it again.

https://bugzilla.gnome.org/show_bug.cgi?id=687127
2012-10-30 15:50:05 +01:00
a607174a25 runDialog: Add entry to focus chain
Currently the entry takes the intial key focus, but is not actually
part of the focus chain. Fix that, even though keynav does not work
too well for the dialog anyway, due to the entry consuming tab for
command completion.

https://bugzilla.gnome.org/show_bug.cgi?id=687127
2012-10-30 15:50:05 +01:00
37d6a624b7 Improve the button insensitive style
The current insensitive style for buttons needs to be improved. Right
now we just change the text color: this doesn't make it clear that the
button is actually insensitive.

Instead of just changing the text color, we make the button background
almost transparent. We also make the text color the same as the border
color, use a thinner border.

This patch also simplifies some border rule overwrites to emphasis
only the border width is changed on focus, and makes the button look
closer to the mockups.

https://bugzilla.gnome.org/show_bug.cgi?id=687110
2012-10-30 12:35:48 +00:00
0c807bddaf runDialog: Better match style of other modal dialogs
Update the run dialog to
 - use a proper title
 - use dialog buttons
 - use the standard entry style

https://bugzilla.gnome.org/show_bug.cgi?id=687127
2012-10-29 19:12:12 +01:00
a0470bfc66 UnlockDialog: clear the password on failure
It is wrong, and the user can't correct it because it's obfuscated.
Just let him type it again.

https://bugzilla.gnome.org/show_bug.cgi?id=687132
2012-10-29 17:54:12 +01:00
b9463d23e8 ShellUserVerifier: fix fail counter
If it is updated after checking, it counts the number of failures
not including the current one, so it allows one extra attempt. Instead,
by updating it before checking, we get the expected result of dropping the
curtain at the third password.

https://bugzilla.gnome.org/show_bug.cgi?id=687132
2012-10-29 17:54:12 +01:00
04debd1623 LoginDialog: clear previous auth failed messages when trying again
When the user has the entered the password for the second time
and clicked OK, clear messages from the previous attempt, so any
new failure is shown clearly.

https://bugzilla.gnome.org/show_bug.cgi?id=687132
2012-10-29 17:54:11 +01:00
9d31576cf5 App search: Match GenericName too
This is making shell search results more useful in many cases,
such as 'web', 'browser', spreadsheet'.
https://bugzilla.gnome.org/show_bug.cgi?id=687121
2012-10-29 11:24:36 -04:00
8daca28a90 Updated Slovak translation 2012-10-28 19:50:05 +00:00
9899604261 Updated Slovak translation 2012-10-28 18:27:51 +00:00
687e1eabed Overview: Resize the window title labels on content change
Reposition the window overlay when the title changes, using the current
transformed size of the window clone.
Includes a test that changes title to a string of random length every 3 seconds.

Based on a patch by Alex Hultman <alexhultman@gmail.com>

https://bugzilla.gnome.org/show_bug.cgi?id=620874
2012-10-27 18:18:48 +02:00
eb09f34114 recorder: save recorded video as recent item
Often the first thing a user wants to do after making a recording
is post it somewhere.

This commit adds the video to recently used items, so that it shows
up prominently in open file choosers.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
fbeb446ed7 recorder: rename "filename" property to "file-template"
The filename property is actually a template string with
substitution variables, not a filename.

This commit renames for clarity.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
92033ce0f5 recorder: keep test-recorder alive until done recording
Recording continues for some time after the recorder object
is closed, since closing isn't a synchronous operation.

This commit defers quiting the test-recorder application until
the recording is finished.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
9171bab5e5 recorder: keep recorder object alive until pipeline finishes
We want to make sure the recorder isn't finalized until the
saved recording hits disk.  This means the pipeline object needs
a hard reference on the recorder.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
f9819eb7b0 recorder: Clean up stage lifetime handling
The stage is a floating object. We don't own a reference
to it, so we shouldn't unref it.

This commit removes the erroneous unref call and makes sure
we call clutter_actor_destroy on the stage when we're done
with it.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
85728f0d15 layout: Use a MetaBackgroundActor, not a custom ClutterX11TexturePixmap
While looking at how the plymouth implementation was built, I was so
short-sighted and focused on the string "_XROOTPMAP_ID" that I didn't
realize it was the name of the standard background on the root window.
Remove our own implementation, and switch to using a standard mutter
MetaBackgroundActor.

https://bugzilla.gnome.org/show_bug.cgi?id=682428
2012-10-26 11:54:25 -04:00
9396849d56 message-tray: Restore Fittsability of summary items
The reactive area of tray items should extend to the screen edge. This
regressed when implementing the new tray design, make it work again.

https://bugzilla.gnome.org/show_bug.cgi?id=686474
2012-10-26 16:32:07 +02:00
6f5e5672bb panelMenu: Fix exception when destroying menuless button
There's explicit API to create PanelMenu.Buttons with no menu, so
guard against this case in destroy().

https://bugzilla.gnome.org/show_bug.cgi?id=686763
2012-10-26 15:49:26 +02:00
b936e60876 screenShield: Tweak curtain animation timings
Rationale:
 - Getting something out of the way should be quick;

 - Very few things in the real world move linearly so, linear
   animations, especially for something as big and visible as this,
   felt too artificial;

 - Moving the curtain out should start slower to make it feel like
   having weight (it fills the whole screen after all) but quickly
   accelerate towards the end to make it snappy too.

https://bugzilla.gnome.org/show_bug.cgi?id=686745
2012-10-26 12:56:17 +02:00
fa4bd91213 build: Stop linking gnome-desktop
Since commit 80eac7370e removed the last build-time dependency ages
ago, we only use GnomeDesktop via introspection.
2012-10-26 12:37:33 +02:00
81eeef7d3c messageTray: Hide summary notification immediately when closing the tray
When the summary notification is open when the tray is closed, we end
up with two concurrent animations: the notification fading out, and the
tray moving away from underneath it. Sliding out the tray should be the
primary transition here, so hide the notification immediately to not
draw the user's attention away from it.

https://bugzilla.gnome.org/show_bug.cgi?id=686888
2012-10-25 22:45:36 +02:00
a7b5134820 messageTray: Hide notification close button immediately on click
Having the close button move away from under the pointer after
clicking it is confusing and distracts from the main transition,
which is hiding the notification. Just hide it immediately.

https://bugzilla.gnome.org/show_bug.cgi?id=682237
2012-10-25 22:41:32 +02:00
92a01c67ba messageTray: Don't destroy the notification when clicking on the close button
Clicking on the close button should simply hide the notification.

https://bugzilla.gnome.org/show_bug.cgi?id=682237
2012-10-25 22:41:32 +02:00
71c23613b5 messageTray: Only hide the notification stack on clicking close
Rather than destroying the entire source, which is unintuitive, simply
close the notification. Removing the entire source is still possible
by right-clicking on the summary item and choosing "Remove".

https://bugzilla.gnome.org/show_bug.cgi?id=682237
2012-10-25 22:41:05 +02:00
4f876995de messageTray: make SummaryItem._closeButton public
Use this to show/hide the close button instead of closeButtonVisible.

https://bugzilla.gnome.org/show_bug.cgi?id=682237
2012-10-25 21:45:18 +02:00
9cf4a76196 po: Enforce RTL in fa/ug for messages that might end up as LTR
See commit 8b796d80a7.

https://bugzilla.gnome.org/show_bug.cgi?id=686630
2012-10-25 20:12:25 +02:00
9efe5287e4 gdm: Move logo into the panel
GDM has a 'logo' key in its schema to allow distributors to add
some branding. It is currently placed above the user list, which
no longer works too well since the login screen lost its dialog
window. Display the logo in the top-left corner instead of the
Activities button instead.

https://bugzilla.gnome.org/show_bug.cgi?id=685852
2012-10-25 18:31:16 +02:00
8c4b34de4e messageTray: Fix close button position in RTL locales 2012-10-25 18:31:16 +02:00
93e3559dc3 style: Adjust close button overlap
After changing the button size, we need to adjust the x-offset by
1px (apparently the y-offset already assumed the correct size).
2012-10-25 18:31:16 +02:00
caa0f63e1f style: Fix close button size
The image is actually 32px, so we end up with a slightly fuzzy
button when scaling up to 34px. Don't do that.

Spotted by lamefun.xOr<at>gmail.com

https://bugzilla.gnome.org/show_bug.cgi?id=686574
2012-10-25 18:27:59 +02:00
a4e29e1244 calendar: Handle calendar-server errors
The current code assumes that the GetEvents call will always
receive, causing an exception in the error case.

https://bugzilla.gnome.org/show_bug.cgi?id=686805
2012-10-24 18:26:03 +02:00
599f2f43e3 Revert "screenShield: Connect to the actor's show signal instead of using BEFORE_REDRAW"
This reverts commit bdeb7d86b6.

git bz PEBKAC
2012-10-24 10:17:43 -04:00
3a453c5f73 messageTray: Fix lightbox
Commit 448517032e accidentally reverted the condition for showing
the lightbox. Fix that.

https://bugzilla.gnome.org/show_bug.cgi?id=686728
2012-10-24 09:03:12 +02:00
98b313c75f popupMenu: Overwrite ongoing animations when calling close repeatedly
Currently close() is a no-op when the menu has already been closed.
However, repeated calls could pass different animation parameters.
For instance in the user menu, we try to hide the menu immediately
before locking the screen, to avoid the popup jumping across the
screen while fading out - as we do this from the corresponding
item's activate handler, the closing is still animated if the menu's
own handler (which requests a full animation) is run first.
Fix this by changing close() to overwrite ongoing animations before
bailing out early.

https://bugzilla.gnome.org/show_bug.cgi?id=686484
2012-10-23 22:21:45 +02:00
8b796d80a7 po: Enforce RTL in he for messages that might end up as LTR
As the messages start with a string placeholder that might be
untranslated, we need an explicit mark to ensure that the string
does not end up as LTR.

https://bugzilla.gnome.org/show_bug.cgi?id=686630
2012-10-23 22:21:45 +02:00
98 changed files with 4450 additions and 3067 deletions

1
.gitignore vendored
View File

@ -45,6 +45,7 @@ intltool-merge.in
intltool-update.in intltool-update.in
libtool libtool
m4/ m4/
man/gnome-shell.1
omf.make omf.make
po/*.gmo po/*.gmo
po/gnome-shell.pot po/gnome-shell.pot

View File

@ -1,7 +1,11 @@
# Point to our macro directory and pick up user flags from the environment # Point to our macro directory and pick up user flags from the environment
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
SUBDIRS = data js src browser-plugin tests po man docs SUBDIRS = data js src browser-plugin tests po docs
if ENABLE_MAN
SUBDIRS += man
endif
EXTRA_DIST = \ EXTRA_DIST = \
.project \ .project \
@ -21,4 +25,4 @@ distcheck-hook:
@echo "Checking disted files against files in git" @echo "Checking disted files against files in git"
@$(srcdir)/tools/check-for-missing.py $(srcdir) $(distdir) $(DIST_EXCLUDE) @$(srcdir)/tools/check-for-missing.py $(srcdir) $(distdir) $(DIST_EXCLUDE)
DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-man

67
NEWS
View File

@ -1,3 +1,70 @@
3.7.2.1
=======
* Revert 490206b to not depend on NMGTK-0.9.7, which hasn't been released yet
3.7.2
=====
* Enforce RTL in he for messages that might end up as LTR [Florian; #686630]
* gdm: Move logo into the panel [Florian; #685852]
* Hide notifications when closed button is clicked [Jasper, Florian; #682237]
* Tweak screenShield animations [Rui; #686745]
* Restore Fittsability of summary items in message tray [Florian; #686474]
* Save screencasts as recent item [Ray; #680647]
* overview: Resize window captions on content change [Giovanni, Alex; #620874]
* App search: Match GenericName too [Matthias; #687121]
* runDialog: Better match style of other modal dialogs [Florian, Allan; #687127]
* Improve the button insensitive style [Stéphane; #687110]
* network: Don't use a global switch for all VPN connections [Giovanni; #682929]
* appMenu: Update on icon theme changes [Florian; #687224]
* Show 'Log out' in more situations [Matthias; #686736]
* Add a setting to force the 'Log out' menuitem [Matthias; #686057]
* overview: Improve styling of search box [Stéphane; #686479]
* Implement 'disable-user-list' in login screen [Ray; #660660]
* Fix auto-scroll to bottom in chat notifications [Sjoerd; #686571]
* Show feedback notifications when user is busy [Stéphane; #662900]
* Disable login button when there is no input [Stéphane; #687112]
* Use non-linear overview shade for background [Giovanni, Pierre-Eric; #669798]
* Reduce blocking in compositor thread [Simon, Jasper; #687465]
* network: new country-specific type to gather providers [Aleksander; #687356]
* Update man page [Matthias; #680601]
* st-entry: Change the pointer cursor on enter/leave events [Thomas; #687130]
* screenShield: Blur and desaturate the background [Giovanni, Cosimo; #682536]
* Change height of chat notifications to have more context [Carlos; #665255]
* screenShield: Account for motion velocity when hiding [Giovanni; #682537]
* screenShield: hide the cursor while the lock screen is on [Giovanni; #682535]
* Support remote search provider settings [Cosimo; #687491]
* unlockDialog: Improve label of confirmation button [Stéphane; #687656]
* userMenu: Rename "System Settings" item to "Settings" [Elad; #687738]
* messageTray: Add keybinding to focus current notification [Stéphane; #652082]
* Remove shell-screen-grabber [Neil; #685915]
* main: Stop using Metacity's keybinding files [Florian; #687672]
* Bluetooth: Remove ObexFTP functionality [Bastien; #688160]
* a11y: Also set WM theme when HighContrast is switched on [Cosimo; #688256]
* network: Rework multiple NIC support [Giovanni; #677142]
* Rework keybindings to allow selective blocking/processing [Florian; #688202]
* recorder: Show indicator on primary monitor [Adel; #688470]
* recorder: Set frame duration to fix broken video headers [Adel; #688487]
* Misc. bugfixes and cleanups [Florian, Jasper, Giovanni, Matthew, Stéphane,
Allan, Daiki, Owen, Alejandro, Jean-François, Cosimo, Sebastian, Adel, Alban;
#686484, #686728, #686805, #686574, #686763, #682428, #687132, #685239,
#687189, #687226, #658091, #670687, #687457, #687242, #687287, #687020,
#686583, #661194, #687491, #657315, #687958, #683986, #688089, #687708,
#686530, #684810, #688181, #688475, #688557, #688507, #638351]
Contributors:
Elad Alfassa, Matthew Barnes, Alban Browaeys, Giovanni Campagna,
Cosimo Cecchi, Matthias Clasen, Allan Day, Stéphane Démurget,
Jean-François Fortin Tam, Adel Gadllah, Alex Hultman, Sebastian Keller,
Rui Matos, Simon McVittie, Aleksander Morgado, Florian Müllner,
Bastien Nocera, Pierre-Eric Pelloux-Prayer, Alejandro Piñeiro, Neil Roberts,
Sjoerd Simons, Carlos Soriano Sánchez, Jasper St. Pierre, Ray Strode,
Owen Taylor, Daiki Ueno, Thomas Wood
Translations:
Dušan Kazik [sk], Pavol Klačanský [sk], Piotr Drąg [pl], Yuri Myasoedov [ru],
Marek Černocký [cs], Kjartan Maraas [nb], Wolfgang Stöggl [de],
Yaron Shahrabani [he], Fran Diéguez [gl], Mattias Põldaru [et]
3.7.1 3.7.1
===== =====
* Add shortcut to open application view directly [Jeremy; #685738] * Add shortcut to open application view directly [Jeremy; #685738]

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.7.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[3.7.2.1],[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])
@ -36,6 +36,8 @@ AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
PKG_PROG_PKG_CONFIG([0.22]) PKG_PROG_PKG_CONFIG([0.22])
AC_PATH_PROG([XSLTPROC], [xsltproc])
GLIB_GSETTINGS GLIB_GSETTINGS
# Get a value to substitute into gnome-shell.in # Get a value to substitute into gnome-shell.in
@ -52,7 +54,7 @@ AC_MSG_CHECKING([for GStreamer (needed for recording functionality)])
if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
build_recorder=true build_recorder=true
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11" recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11 gtk+-3.0"
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0 xfixes gl) PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0 xfixes gl)
else else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@ -63,7 +65,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.11.11 CLUTTER_MIN_VERSION=1.11.11
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.33.2 GJS_MIN_VERSION=1.33.2
MUTTER_MIN_VERSION=3.7.1 MUTTER_MIN_VERSION=3.7.2
GTK_MIN_VERSION=3.3.9 GTK_MIN_VERSION=3.3.9
GIO_MIN_VERSION=2.35.0 GIO_MIN_VERSION=2.35.0
LIBECAL_MIN_VERSION=3.5.3 LIBECAL_MIN_VERSION=3.5.3
@ -97,8 +99,7 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
libnm-glib libnm-util gnome-keyring-1 libnm-glib libnm-util gnome-keyring-1
gcr-3 >= $GCR_MIN_VERSION gcr-3 >= $GCR_MIN_VERSION)
gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION)
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0) PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
@ -123,7 +124,7 @@ PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11) PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
PKG_CHECK_MODULES(TRAY, gtk+-3.0) PKG_CHECK_MODULES(TRAY, gtk+-3.0)
PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0) PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0)
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.5.4) PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.7.2)
AC_MSG_CHECKING([for bluetooth support]) AC_MSG_CHECKING([for bluetooth support])
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0], PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
@ -139,7 +140,7 @@ PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
AC_SUBST([HAVE_BLUETOOTH],[0]) AC_SUBST([HAVE_BLUETOOTH],[0])
AC_MSG_RESULT([no])]) AC_MSG_RESULT([no])])
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION libedataserverui-3.0 >= $LIBEDATASERVERUI_MIN_VERSION gio-2.0) PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION gio-2.0)
AC_SUBST(CALENDAR_SERVER_CFLAGS) AC_SUBST(CALENDAR_SERVER_CFLAGS)
AC_SUBST(CALENDAR_SERVER_LIBS) AC_SUBST(CALENDAR_SERVER_LIBS)
@ -208,6 +209,18 @@ AC_SUBST(TYPELIBDIR)
GTK_DOC_CHECK([1.15], [--flavour no-tmpl]) GTK_DOC_CHECK([1.15], [--flavour no-tmpl])
AC_ARG_ENABLE(man,
[AS_HELP_STRING([--enable-man],
[generate man pages [default=yes]])],,
enable_man=yes)
if test "$enable_man" != no; then
AC_PATH_PROG([XSLTPROC], [xsltproc])
if test -z "$XSLTPROC"; then
AC_MSG_ERROR([xsltproc is required for --enable-man])
fi
fi
AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no)
# Stay command-line compatible with the gnome-common configure option. Here # Stay command-line compatible with the gnome-common configure option. Here
# minimum/yes/maximum are the same, however. # minimum/yes/maximum are the same, however.
AC_ARG_ENABLE(compile_warnings, AC_ARG_ENABLE(compile_warnings,

View File

@ -8,6 +8,9 @@
<KeyListEntry name="toggle-message-tray" <KeyListEntry name="toggle-message-tray"
_description="Show the message tray"/> _description="Show the message tray"/>
<KeyListEntry name="focus-active-notification"
_description="Focus the active notification"/>
<KeyListEntry name="toggle-application-view" <KeyListEntry name="toggle-application-view"
_description="Show all applications"/> _description="Show all applications"/>

View File

@ -57,6 +57,14 @@ value here is from the TpConnectionPresenceType enumeration.</_summary>
<_summary>Internally used to store the last session presence status for the user. The <_summary>Internally used to store the last session presence status for the user. The
value here is from the GsmPresenceStatus enumeration.</_summary> value here is from the GsmPresenceStatus enumeration.</_summary>
</key> </key>
<key name="always-show-log-out" type="b">
<default>false</default>
<_summary>Always show the 'Log out' menuitem in the user menu.</_summary>
<_description>
This key overrides the automatic hiding of the 'Log out'
menuitem in single-user, single-session situations.
</_description>
</key>
<child name="calendar" schema="org.gnome.shell.calendar"/> <child name="calendar" schema="org.gnome.shell.calendar"/>
<child name="recorder" schema="org.gnome.shell.recorder"/> <child name="recorder" schema="org.gnome.shell.recorder"/>
<child name="keybindings" schema="org.gnome.shell.keybindings"/> <child name="keybindings" schema="org.gnome.shell.keybindings"/>
@ -98,6 +106,13 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
Keybinding to toggle the visibility of the message tray. Keybinding to toggle the visibility of the message tray.
</_description> </_description>
</key> </key>
<key name="focus-active-notification" type="as">
<default>["&lt;Super&gt;n"]</default>
<_summary>Keybinding to focus the active notification</_summary>
<_description>
Keybinding to focus the active notification.
</_description>
</key>
<key name="toggle-recording" type="as"> <key name="toggle-recording" type="as">
<default><![CDATA[['<Control><Shift><Alt>r']]]></default> <default><![CDATA[['<Control><Shift><Alt>r']]]></default>
<_summary>Keybinding to toggle the screen recorder</_summary> <_summary>Keybinding to toggle the screen recorder</_summary>

View File

@ -39,7 +39,6 @@ stage {
/* small */ /* small */
.app-well-menu, .app-well-menu,
.contact-details-status, .contact-details-status,
.run-dialog-label,
.run-dialog-error-label { .run-dialog-error-label {
font-size: 9pt; font-size: 9pt;
} }
@ -311,7 +310,7 @@ StScrollBar StButton#vhandle:active {
.notification-icon-button:focus, .notification-icon-button:focus,
.hotplug-notification-item:focus, .hotplug-notification-item:focus,
.modal-dialog-button:focus { .modal-dialog-button:focus {
border: 2px solid #8b8b8b; border-width: 2px;
} }
.dash-search-button:active, .dash-search-button:active,
@ -326,17 +325,20 @@ StScrollBar StButton#vhandle:active {
background-gradient-end: rgba(255, 255, 255, 0.2); background-gradient-end: rgba(255, 255, 255, 0.2);
} }
.notification-button:insensitive,
.notification-icon-button:insensitive, .notification-icon-button:insensitive,
.notification-button:insensitive { .modal-dialog-button:insensitive {
border-color: #666666;
color: #9f9f9f; color: #9f9f9f;
background-gradient-direction: none;
background-color: rgba(102, 102, 102, 0.15);
} }
/* Entries */ /* Entries */
#searchEntry, #searchEntry,
.notification StEntry, .notification StEntry,
.login-dialog-prompt-entry, .modal-dialog StEntry {
.prompt-dialog-password-entry {
color: rgb(64, 64, 64); color: rgb(64, 64, 64);
caret-color: rgb(64, 64, 64); caret-color: rgb(64, 64, 64);
font-size: 12pt; font-size: 12pt;
@ -346,6 +348,7 @@ StScrollBar StButton#vhandle:active {
} }
#searchEntry, #searchEntry,
.run-dialog-entry,
.notification StEntry { .notification StEntry {
border: 2px solid rgba(245,245,245,0.2); border: 2px solid rgba(245,245,245,0.2);
background-gradient-start: rgba(5,5,6,0.1); background-gradient-start: rgba(5,5,6,0.1);
@ -358,8 +361,7 @@ StScrollBar StButton#vhandle:active {
#searchEntry:focus, #searchEntry:focus,
#searchEntry:hover, #searchEntry:hover,
.notification StEntry:focus, .notification StEntry:focus,
.login-dialog-prompt-entry, .modal-dialog StEntry {
.prompt-dialog-password-entry {
border: 2px solid rgb(136,138,133); border: 2px solid rgb(136,138,133);
background-gradient-start: rgb(200,200,200); background-gradient-start: rgb(200,200,200);
background-gradient-end: white; background-gradient-end: white;
@ -368,12 +370,17 @@ StScrollBar StButton#vhandle:active {
} }
.notification StEntry:focus, .notification StEntry:focus,
.prompt-dialog-password-entry:focus, .modal-dialog StEntry:focus {
.login-dialog-prompt-entry:focus {
border: 2px solid #3465a4; border: 2px solid #3465a4;
} }
#searchEntry { #searchEntry {
border-color: rgba(245,245,245,0.3);
color: rgb(192, 192, 192);
caret-color: rgb(192, 192, 192);
}
#searchEntry:hover {
color: rgb(128, 128, 128); color: rgb(128, 128, 128);
caret-color: rgb(128, 128, 128); caret-color: rgb(128, 128, 128);
} }
@ -386,8 +393,7 @@ StScrollBar StButton#vhandle:active {
} }
.notification StEntry, .notification StEntry,
.prompt-dialog-password-entry, .modal-dialog StEntry {
.login-dialog-prompt-entry {
border-radius: 5px; border-radius: 5px;
padding: 4px 4px; padding: 4px 4px;
} }
@ -551,7 +557,6 @@ StScrollBar StButton#vhandle:active {
} }
.status-chooser-combo.popup-combo-menu { .status-chooser-combo.popup-combo-menu {
background-color: rgba(0,0,0,0.7);
padding: .4em 0em; padding: .4em 0em;
border-radius: 4px; border-radius: 4px;
border: 1px solid #5f5f5f; border: 1px solid #5f5f5f;
@ -614,9 +619,9 @@ StScrollBar StButton#vhandle:active {
.window-close, .notification-close { .window-close, .notification-close {
background-image: url("close-window.svg"); background-image: url("close-window.svg");
background-size: 34px; background-size: 32px;
height: 34px; height: 32px;
width: 34px; width: 32px;
} }
.window-close { .window-close {
@ -627,15 +632,22 @@ StScrollBar StButton#vhandle:active {
/* we start out in the top right of the /* we start out in the top right of the
* notification, inset. * notification, inset.
* *
* center is 32px/2 = 17px * center is 32px/2 = 16px
* *
* adjust left 2px * adjust left 2px
* adjust down 8px */ * adjust down 8px */
-shell-close-overlap-x: 15px; -shell-close-overlap-x: 14px;
-shell-close-overlap-y: -12px; -shell-close-overlap-y: -12px;
} }
.notification-close:rtl {
/* as above, but starting out in the top left of the
* notification. */
-shell-close-overlap-x: -14px;
}
.window-close:rtl { .window-close:rtl {
-st-background-image-shadow: 2px 2px 6px rgba(0,0,0,0.5); -st-background-image-shadow: 2px 2px 6px rgba(0,0,0,0.5);
} }
@ -682,6 +694,11 @@ StScrollBar StButton#vhandle:active {
.search-entry-icon { .search-entry-icon {
icon-size: 1em; icon-size: 1em;
color: #c0c0c0;
}
#searchEntry:hover .search-entry-icon,
#searchEntry:focus .search-entry-icon {
color: #8d8f8a; color: #8d8f8a;
} }
@ -1193,7 +1210,6 @@ StScrollBar StButton#vhandle:active {
background: #2e3436 url(message-tray-background.png); background: #2e3436 url(message-tray-background.png);
background-repeat: repeat; background-repeat: repeat;
transition-duration: 250; transition-duration: 250;
height: 72px;
} }
#message-tray:keyboard { #message-tray:keyboard {
@ -1203,7 +1219,7 @@ StScrollBar StButton#vhandle:active {
#message-tray:overview { #message-tray:overview {
background: rgba(0, 0, 0, 0.1); background: rgba(0, 0, 0, 0.1);
border-top: 1px solid rgba(128, 128, 128, 0.3); outline: 1px solid rgba(128, 128, 128, 0.3);
} }
.notification { .notification {
@ -1416,6 +1432,10 @@ StScrollBar StButton#vhandle:active {
padding-right: 4px; padding-right: 4px;
} }
.chat-notification-scrollview{
max-height: 22em;
}
.subscription-message { .subscription-message {
font-style: italic; font-style: italic;
} }
@ -1425,28 +1445,34 @@ StScrollBar StButton#vhandle:active {
} }
#summary-mode { #summary-mode {
padding: 0px 6px 0px 6px; /* same as the values in .summary-source */ height: 72px;
height: 60px;
spacing: 10px;
} }
.summary-source-button { .summary-source-button {
border-radius: 4px; padding: 6px 3px 6px 3px;
transition-duration: 100;
} }
.summary-source-button:hover { .summary-source-button:last-child:ltr {
padding-right: 6px;
}
.summary-source-button:last-child:rtl {
padding-left: 6px;
}
.summary-source-button:hover .summary-source {
background-color: rgba(255,255,255,0.1); background-color: rgba(255,255,255,0.1);
} }
.summary-source-button:focus, .summary-source-button:focus .summary-source,
.summary-source-button:selected { .summary-source-button:selected .summary-source {
background-color: rgba(255,255,255,0.33); background-color: rgba(255,255,255,0.33);
} }
.summary-source { .summary-source {
padding-right: 6px; border-radius: 4px;
padding-left: 6px; padding: 0 6px 0 6px;
transition-duration: 100;
} }
.summary-source-counter { .summary-source-counter {
@ -1624,35 +1650,26 @@ StScrollBar StButton#vhandle:active {
padding: 4px 32px 5px; padding: 4px 32px 5px;
} }
.modal-dialog-button:insensitive {
color: rgb(60, 60, 60);
}
.modal-dialog-button:focus { .modal-dialog-button:focus {
padding: 3px 31px 4px; padding: 3px 31px 4px;
} }
/* Run Dialog */ /* Run Dialog */
.run-dialog-label {
font-size: 12pt;
font-weight: bold;
color: #999999;
padding-bottom: .4em;
}
.run-dialog-error-box { .run-dialog-error-box {
padding-top: 15px; padding-top: 15px;
spacing: 5px; spacing: 5px;
} }
.run-dialog-entry { .modal-dialog .run-dialog-entry {
font-weight: bold; width: 20em;
width: 23em;
selection-background-color: white;
selected-color: black;
}
.run-dialog {
border-radius: 16px;
padding-right: 21px;
padding-left: 21px;
padding-bottom: 15px;
padding-top: 15px;
} }
.lightbox { .lightbox {
@ -2112,7 +2129,7 @@ StScrollBar StButton#vhandle:active {
font-weight: bold; font-weight: bold;
text-align: left; text-align: left;
padding-left: 15px; padding-left: 15px;
text-shadow: black 4px 4px 3px 0px; text-shadow: black 0px 4px 3px 0px;
} }
.login-dialog-prompt-layout { .login-dialog-prompt-layout {
@ -2178,24 +2195,20 @@ StScrollBar StButton#vhandle:active {
height: .75em; height: .75em;
} }
.login-dialog .modal-dialog-button { .login-dialog .modal-dialog-button {
border: 1px solid #666666;
border-radius: 5px; border-radius: 5px;
padding: 3px 18px; padding: 3px 18px;
} }
.login-dialog .modal-dialog-button:focus { .login-dialog .modal-dialog-button:focus {
padding: 2px 17px; padding: 2px 17px;
border: 2px solid #8b8b8b;
} }
.login-dialog .modal-dialog-button:default { .login-dialog .modal-dialog-button:default {
background-gradient-start: #6793c4; background-gradient-start: #6793c4;
background-gradient-end: #335d8f; background-gradient-end: #335d8f;
background-gradient-direction: vertical; background-gradient-direction: vertical;
padding: 2px 17px; border-color: #16335d;
border: 2px solid #16335d;
} }
.login-dialog .modal-dialog-button:default:focus { .login-dialog .modal-dialog-button:default:focus {
@ -2213,6 +2226,13 @@ StScrollBar StButton#vhandle:active {
background-gradient-end: #74a0d0; background-gradient-end: #74a0d0;
} }
.login-dialog .modal-dialog-button:default:insensitive {
border-color: #666666;
color: #9f9f9f;
background-gradient-direction: none;
background-color: rgba(102, 102, 102, 0.15);
}
.login-dialog-message-warning { .login-dialog-message-warning {
color: orange; color: orange;
} }

View File

@ -39,13 +39,14 @@ const GdmUtil = imports.gdm.util;
const Lightbox = imports.ui.lightbox; const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main; const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const PanelMenu = imports.ui.panelMenu;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const UserMenu = imports.ui.userMenu; const UserMenu = imports.ui.userMenu;
const _RESIZE_ANIMATION_TIME = 0.25; const _RESIZE_ANIMATION_TIME = 0.25;
const _SCROLL_ANIMATION_TIME = 0.5; const _SCROLL_ANIMATION_TIME = 0.5;
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0; const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
const _LOGO_ICON_NAME_SIZE = 48; const _LOGO_ICON_HEIGHT = 16;
let _loginDialog = null; let _loginDialog = null;
@ -82,6 +83,36 @@ function _smoothlyResizeActor(actor, width, height) {
return hold; return hold;
} }
const LogoMenuButton = new Lang.Class({
Name: 'LogoMenuButton',
Extends: PanelMenu.Button,
_init: function() {
this.parent(0.0, null, true);
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
Lang.bind(this, this._updateLogo));
this._iconBin = new St.Bin();
this.actor.add_actor(this._iconBin);
this._updateLogo();
},
_updateLogo: function() {
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
let icon = null;
if (path) {
let file = Gio.file_new_for_path(path);
let cache = St.TextureCache.get_default();
icon = cache.load_uri_async(file.get_uri(), -1, _LOGO_ICON_HEIGHT);
}
this._iconBin.set_child(icon);
}
});
const UserListItem = new Lang.Class({ const UserListItem = new Lang.Class({
Name: 'UserListItem', Name: 'UserListItem',
@ -629,6 +660,7 @@ const LoginDialog = new Lang.Class({
this.parent({ shellReactive: true, this.parent({ shellReactive: true,
styleClass: 'login-dialog', styleClass: 'login-dialog',
parentActor: parentActor, parentActor: parentActor,
keybindingMode: Main.KeybindingMode.LOGIN_SCREEN,
shouldFadeIn: false }); shouldFadeIn: false });
this.connect('destroy', this.connect('destroy',
Lang.bind(this, this._onDestroy)); Lang.bind(this, this._onDestroy));
@ -653,22 +685,19 @@ const LoginDialog = new Lang.Class({
this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient); this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient);
this._userVerifier.connect('ask-question', Lang.bind(this, this._askQuestion)); this._userVerifier.connect('ask-question', Lang.bind(this, this._askQuestion));
this._userVerifier.connect('show-message', Lang.bind(this, this._showMessage)); this._userVerifier.connect('show-message', Lang.bind(this, this._showMessage));
this._userVerifier.connect('reset', Lang.bind(this, this._onReset)); this._userVerifier.connect('reset', Lang.bind(this, this._reset));
this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint)); this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint));
this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint)); this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint));
this._verifyingUser = false;
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA }); this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
Lang.bind(this, this._updateLogo));
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY, this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
Lang.bind(this, this._updateBanner)); Lang.bind(this, this._updateBanner));
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_TEXT_KEY, this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_TEXT_KEY,
Lang.bind(this, this._updateBanner)); Lang.bind(this, this._updateBanner));
this._settings.connect('changed::' + GdmUtil.DISABLE_USER_LIST_KEY,
this._logoBox = new St.Bin({ style_class: 'login-dialog-logo-box' }); Lang.bind(this, this._updateDisableUserList));
this.contentLayout.add(this._logoBox);
this._updateLogo();
this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner', this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner',
text: '' }); text: '' });
@ -676,7 +705,8 @@ const LoginDialog = new Lang.Class({
this._updateBanner(); this._updateBanner();
this._titleLabel = new St.Label({ style_class: 'login-dialog-title', this._titleLabel = new St.Label({ style_class: 'login-dialog-title',
text: C_("title", "Sign In") }); text: C_("title", "Sign In"),
visible: false });
this.contentLayout.add(this._titleLabel, this.contentLayout.add(this._titleLabel,
{ y_fill: false, { y_fill: false,
@ -706,6 +736,7 @@ const LoginDialog = new Lang.Class({
x_align: St.Align.START }); x_align: St.Align.START });
this._promptEntry = new St.Entry({ style_class: 'login-dialog-prompt-entry', this._promptEntry = new St.Entry({ style_class: 'login-dialog-prompt-entry',
can_focus: true }); can_focus: true });
this._promptEntryTextChangedId = 0;
this._promptBox.add(this._promptEntry, this._promptBox.add(this._promptEntry,
{ expand: true, { expand: true,
x_fill: true, x_fill: true,
@ -744,7 +775,7 @@ const LoginDialog = new Lang.Class({
x_align: St.Align.START, x_align: St.Align.START,
x_fill: true }); x_fill: true });
this._notListedButton.connect('clicked', Lang.bind(this, this._onNotListedClicked)); this._notListedButton.connect('clicked', Lang.bind(this, this._hideUserListAndLogIn));
this.contentLayout.add(this._notListedButton, this.contentLayout.add(this._notListedButton,
{ expand: false, { expand: false,
@ -770,18 +801,19 @@ const LoginDialog = new Lang.Class({
}, },
_updateLogo: function() { _updateDisableUserList: function() {
this._logoBox.child = null; let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
if (path) { // If this is the first time around, set initial focus
let file = Gio.file_new_for_path(path); if (this._disableUserList == undefined && disableUserList)
let uri = file.get_uri(); this.setInitialKeyFocus(this._promptEntry);
let textureCache = St.TextureCache.get_default(); if (disableUserList != this._disableUserList) {
this._logoBox.child = textureCache.load_uri_async(uri, -1, _LOGO_ICON_NAME_SIZE); this._disableUserList = disableUserList;
if (!this._verifyingUser)
this._reset();
} }
}, },
_updateBanner: function() { _updateBanner: function() {
@ -796,32 +828,15 @@ const LoginDialog = new Lang.Class({
} }
}, },
_onReset: function(client, serviceName) { _reset: function() {
this._promptMessage.hide(); this._promptMessage.hide();
let tasks = [this._hidePrompt,
new Batch.ConcurrentBatch(this, [this._fadeInTitleLabel,
this._fadeInNotListedButton,
this._fadeInLogo]),
function() {
this._sessionList.close();
this._promptLoginHint.hide();
this._userList.actor.show();
this._userList.actor.opacity = 255;
return this._userList.showItems();
},
function() {
this._userList.actor.reactive = true;
this._userList.actor.grab_key_focus();
}];
this._user = null; this._user = null;
this._verifyingUser = false;
let batch = new Batch.ConsecutiveBatch(this, tasks); if (this._disableUserList)
batch.run(); this._hideUserListAndLogIn();
else
this._showUserList();
}, },
_onDefaultSessionChanged: function(client, sessionId) { _onDefaultSessionChanged: function(client, sessionId) {
@ -829,9 +844,13 @@ const LoginDialog = new Lang.Class({
}, },
_showMessage: function(userVerifier, message, styleClass) { _showMessage: function(userVerifier, message, styleClass) {
this._promptMessage.text = message; if (message) {
this._promptMessage.styleClass = styleClass; this._promptMessage.text = message;
GdmUtil.fadeInActor(this._promptMessage); this._promptMessage.styleClass = styleClass;
GdmUtil.fadeInActor(this._promptMessage);
} else {
GdmUtil.fadeOutActor(this._promptMessage);
}
}, },
_showLoginHint: function(verifier, message) { _showLoginHint: function(verifier, message) {
@ -872,6 +891,9 @@ const LoginDialog = new Lang.Class({
if (this._user && this._user.is_logged_in()) if (this._user && this._user.is_logged_in())
return null; return null;
if (!this._verifyingUser)
return null;
return GdmUtil.fadeInActor(this._sessionList.actor); return GdmUtil.fadeInActor(this._sessionList.actor);
}, },
@ -884,17 +906,21 @@ const LoginDialog = new Lang.Class({
return batch.run(); return batch.run();
}, },
_showPrompt: function() { _showPrompt: function(forSecret) {
let hold = new Batch.Hold(); let hold = new Batch.Hold();
let buttons = [{ action: Lang.bind(this, this.cancel), let cancelButtonInfo = { action: Lang.bind(this, this.cancel),
label: _("Cancel"), label: _("Cancel"),
key: Clutter.Escape }, key: Clutter.Escape };
{ action: Lang.bind(this, function() { let okButtonInfo = { action: Lang.bind(this, function() {
hold.release(); hold.release();
}), }),
label: C_("button", "Sign In"), label: forSecret ? C_("button", "Sign In") : _("Next"),
default: true }]; default: true };
let buttons = [];
if (!this._disableUserList || this._verifyingUser)
buttons.push(cancelButtonInfo);
buttons.push(okButtonInfo);
let tasks = [function() { let tasks = [function() {
return this._fadeInPrompt(); return this._fadeInPrompt();
@ -902,6 +928,16 @@ const LoginDialog = new Lang.Class({
function() { function() {
this.setButtons(buttons); this.setButtons(buttons);
let updateOkButtonEnabled = Lang.bind(this, function() {
let sensitive = this._promptEntry.text.length > 0;
okButtonInfo.button.reactive = sensitive;
okButtonInfo.button.can_focus = sensitive;
});
updateOkButtonEnabled();
this._promptEntryTextChangedId = this._promptEntry.clutter_text.connect('text-changed', updateOkButtonEnabled);
}, },
hold]; hold];
@ -914,6 +950,11 @@ const LoginDialog = new Lang.Class({
_hidePrompt: function() { _hidePrompt: function() {
this.setButtons([]); this.setButtons([]);
if (this._promptEntryTextChangedId > 0) {
this._promptEntry.clutter_text.disconnect(this._promptEntryTextChangedId);
this._promptEntryTextChangedId = 0;
}
let tasks = [function() { let tasks = [function() {
return GdmUtil.fadeOutActor(this._promptBox); return GdmUtil.fadeOutActor(this._promptBox);
}, },
@ -935,7 +976,9 @@ const LoginDialog = new Lang.Class({
this._promptEntry.set_text(''); this._promptEntry.set_text('');
this._promptEntry.clutter_text.set_password_char(passwordChar); this._promptEntry.clutter_text.set_password_char(passwordChar);
let tasks = [this._showPrompt, let tasks = [function() {
return this._showPrompt(!!passwordChar);
},
function() { function() {
let _text = this._promptEntry.get_text(); let _text = this._promptEntry.get_text();
@ -947,6 +990,23 @@ const LoginDialog = new Lang.Class({
return batch.run(); return batch.run();
}, },
_askForUsernameAndLogIn: function() {
this._promptLabel.set_text(_("Username: "));
this._promptEntry.set_text('');
this._promptEntry.clutter_text.set_password_char('');
let tasks = [this._showPrompt,
function() {
let userName = this._promptEntry.get_text();
this._promptEntry.reactive = false;
return this._beginVerificationForUser(userName);
}];
let batch = new Batch.ConsecutiveBatch(this, tasks);
return batch.run();
},
_onSessionOpened: function(client, serviceName) { _onSessionOpened: function(client, serviceName) {
this._greeter.call_start_session_when_ready_sync(serviceName, true, null); this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
}, },
@ -1075,7 +1135,7 @@ const LoginDialog = new Lang.Class({
})); }));
}, },
_onNotListedClicked: function(user) { _hideUserListAndLogIn: function() {
let tasks = [function() { let tasks = [function() {
return this._userList.hideItems(); return this._userList.hideItems();
}, },
@ -1089,26 +1149,37 @@ const LoginDialog = new Lang.Class({
}, },
new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel, new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel,
this._fadeOutNotListedButton, this._fadeOutNotListedButton]),
this._fadeOutLogo]),
function() { function() {
let hold = new Batch.Hold(); return this._askForUsernameAndLogIn();
this._userVerifier.begin(null, hold);
return hold;
}]; }];
let batch = new Batch.ConsecutiveBatch(this, tasks); let batch = new Batch.ConsecutiveBatch(this, tasks);
batch.run(); batch.run();
}, },
_fadeInLogo: function() { _showUserList: function() {
return GdmUtil.fadeInActor(this._logoBox); let tasks = [this._hidePrompt,
},
_fadeOutLogo: function() { new Batch.ConcurrentBatch(this, [this._fadeInTitleLabel,
return GdmUtil.fadeOutActor(this._logoBox); this._fadeInNotListedButton]),
function() {
this._sessionList.close();
this._promptLoginHint.hide();
this._userList.actor.show();
this._userList.actor.opacity = 255;
return this._userList.showItems();
},
function() {
this._userList.actor.reactive = true;
this._userList.actor.grab_key_focus();
}];
let batch = new Batch.ConsecutiveBatch(this, tasks);
batch.run();
}, },
_fadeInBanner: function() { _fadeInBanner: function() {
@ -1139,6 +1210,7 @@ const LoginDialog = new Lang.Class({
let hold = new Batch.Hold(); let hold = new Batch.Hold();
this._userVerifier.begin(userName, hold); this._userVerifier.begin(userName, hold);
this._verifyingUser = true;
return hold; return hold;
}, },
@ -1159,8 +1231,7 @@ const LoginDialog = new Lang.Class({
}, },
new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel, new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel,
this._fadeOutNotListedButton, this._fadeOutNotListedButton]),
this._fadeOutLogo]),
function() { function() {
return this._userList.shrinkToNaturalHeight(); return this._userList.shrinkToNaturalHeight();
@ -1192,6 +1263,8 @@ const LoginDialog = new Lang.Class({
this._userList.addUser(users[i]); this._userList.addUser(users[i]);
} }
this._updateDisableUserList();
this._userManager.connect('user-added', this._userManager.connect('user-added',
Lang.bind(this, function(userManager, user) { Lang.bind(this, function(userManager, user) {
this._userList.addUser(user); this._userList.addUser(user);
@ -1215,7 +1288,7 @@ const LoginDialog = new Lang.Class({
_onOpened: function() { _onOpened: function() {
Main.ctrlAltTabManager.addGroup(this.dialogLayout, Main.ctrlAltTabManager.addGroup(this.dialogLayout,
_("Login Window"), _("Login Window"),
'dialog-password', 'dialog-password-symbolic',
{ sortGroup: CtrlAltTab.SortGroup.MIDDLE }); { sortGroup: CtrlAltTab.SortGroup.MIDDLE });
}, },
@ -1223,6 +1296,6 @@ const LoginDialog = new Lang.Class({
close: function() { close: function() {
this.parent(); this.parent();
Main.ctrlAltTabManager.removeGroup(this._group); Main.ctrlAltTabManager.removeGroup(this.dialogLayout);
} }
}); });

View File

@ -23,6 +23,7 @@ const BANNER_MESSAGE_TEXT_KEY = 'banner-message-text';
const ALLOWED_FAILURES_KEY = 'allowed-failures'; const ALLOWED_FAILURES_KEY = 'allowed-failures';
const LOGO_KEY = 'logo'; const LOGO_KEY = 'logo';
const DISABLE_USER_LIST_KEY = 'disable-user-list';
function fadeInActor(actor) { function fadeInActor(actor) {
if (actor.opacity == 255 && actor.visible) if (actor.opacity == 255 && actor.visible)
@ -125,6 +126,9 @@ const ShellUserVerifier = new Lang.Class({
}, },
answerQuery: function(serviceName, answer) { answerQuery: function(serviceName, answer) {
// Clear any previous message
this.emit('show-message', null, null);
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null); this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
}, },
@ -330,12 +334,11 @@ const ShellUserVerifier = new Lang.Class({
// Otherwise, we allow ALLOWED_FAILURES attempts. After that, we // Otherwise, we allow ALLOWED_FAILURES attempts. After that, we
// go back to the welcome screen. // go back to the welcome screen.
this._failCounter++;
let canRetry = retry && this._userName && let canRetry = retry && this._userName &&
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY); this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY);
if (canRetry) { if (canRetry) {
this._failCounter++;
this.clear(); this.clear();
this.begin(this._userName, new Batch.Hold()); this.begin(this._userName, new Batch.Hold());
} else { } else {

View File

@ -46,8 +46,70 @@ let _providersTable;
function _getProvidersTable() { function _getProvidersTable() {
if (_providersTable) if (_providersTable)
return _providersTable; return _providersTable;
let [providers, countryCodes] = Shell.mobile_providers_parse(); return _providersTable = Shell.mobile_providers_parse(null,null);
return _providersTable = providers; }
function findProviderForMCCMNC(table, needle) {
let needlemcc = needle.substring(0, 3);
let needlemnc = needle.substring(3, needle.length);
let name2, name3;
for (let iter in table) {
let country = table[iter];
let providers = country.get_providers();
// Search through each country's providers
for (let i = 0; i < providers.length; i++) {
let provider = providers[i];
// Search through MCC/MNC list
let list = provider.get_gsm_mcc_mnc();
for (let j = 0; j < list.length; j++) {
let mccmnc = list[j];
// Match both 2-digit and 3-digit MNC; prefer a
// 3-digit match if found, otherwise a 2-digit one.
if (mccmnc.mcc != needlemcc)
continue; // MCC was wrong
if (!name3 && needle.length == 6 && needlemnc == mccmnc.mnc)
name3 = provider.name;
if (!name2 && needlemnc.substring(0, 2) == mccmnc.mnc.substring(0, 2))
name2 = provider.name;
if (name2 && name3)
break;
}
}
}
return name3 || name2 || null;
}
function findProviderForSid(table, sid) {
if (sid == 0)
return null;
// Search through each country
for (let iter in table) {
let country = table[iter];
let providers = country.get_providers();
// Search through each country's providers
for (let i = 0; i < providers.length; i++) {
let provider = providers[i];
let cdma_sid = provider.get_cdma_sid();
// Search through CDMA SID list
for (let j = 0; j < cdma_sid.length; j++) {
if (cdma_sid[j] == sid)
return provider.name;
}
}
}
return null;
} }
const ModemGsm = new Lang.Class({ const ModemGsm = new Lang.Class({
@ -91,64 +153,29 @@ const ModemGsm = new Lang.Class({
}, },
_findOperatorName: function(name, opCode) { _findOperatorName: function(name, opCode) {
if (name.length != 0 && (name.length > 6 || name.length < 5)) { if (name) {
// this looks like a valid name, i.e. not an MCCMNC (that some if (name && name.length != 0 && (name.length > 6 || name.length < 5)) {
// devices return when not yet connected // this looks like a valid name, i.e. not an MCCMNC (that some
return name; // devices return when not yet connected
} return name;
if (isNaN(parseInt(name))) { }
// name is definitely not a MCCMNC, so it may be a name if (isNaN(parseInt(name))) {
// after all; return that // name is definitely not a MCCMNC, so it may be a name
return name; // after all; return that
return name;
}
} }
let needle; let needle;
if (name.length == 0 && opCode) if ((name == null || name.length == 0) && opCode)
needle = opCode; needle = opCode;
else if (name.length == 6 || name.length == 5) else if (name.length == 6 || name.length == 5)
needle = name; needle = name;
else // nothing to search else // nothing to search
return null; return null;
return this._findProviderForMCCMNC(needle);
},
_findProviderForMCCMNC: function(needle) {
let table = _getProvidersTable(); let table = _getProvidersTable();
let needlemcc = needle.substring(0, 3); return findProviderForMCCMNC(table, needle);
let needlemnc = needle.substring(3, needle.length);
let name2, name3;
for (let iter in table) {
let providers = table[iter];
// Search through each country's providers
for (let i = 0; i < providers.length; i++) {
let provider = providers[i];
// Search through MCC/MNC list
let list = provider.get_gsm_mcc_mnc();
for (let j = 0; j < list.length; j++) {
let mccmnc = list[j];
// Match both 2-digit and 3-digit MNC; prefer a
// 3-digit match if found, otherwise a 2-digit one.
if (mccmnc.mcc != needlemcc)
continue; // MCC was wrong
if (!name3 && needle.length == 6 && needlemnc == mccmnc.mnc)
name3 = provider.name;
if (!name2 && needlemnc.substring(0, 2) == mccmnc.mnc.substring(0, 2))
name2 = provider.name;
if (name2 && name3)
break;
}
}
}
return name3 || name2 || null;
} }
}); });
Signals.addSignalMethods(ModemGsm.prototype); Signals.addSignalMethods(ModemGsm.prototype);
@ -189,39 +216,14 @@ const ModemCdma = new Lang.Class({
this.operator_name = null; this.operator_name = null;
} else { } else {
let [bandClass, band, id] = result; let [bandClass, band, id] = result;
if (name.length > 0) if (name.length > 0) {
this.operator_name = this._findProviderForSid(id); let table = _getProvidersTable();
else this.operator_name = findProviderForSid(table, id);
} else
this.operator_name = null; this.operator_name = null;
} }
this.emit('notify::operator-name'); this.emit('notify::operator-name');
})); }));
},
_findProviderForSid: function(sid) {
if (sid == 0)
return null;
let table = _getProvidersTable();
// Search through each country
for (let iter in table) {
let providers = table[iter];
// Search through each country's providers
for (let i = 0; i < providers.length; i++) {
let provider = providers[i];
let cdma_sid = provider.get_cdma_sid();
// Search through CDMA SID list
for (let j = 0; j < cdma_sid.length; j++) {
if (cdma_sid[j] == sid)
return provider.name;
}
}
}
return null;
} }
}); });
Signals.addSignalMethods(ModemCdma.prototype); Signals.addSignalMethods(ModemCdma.prototype);

View File

@ -172,7 +172,7 @@ const AltTabPopup = new Lang.Class({
if (!Main.pushModal(this.actor)) { if (!Main.pushModal(this.actor)) {
// Probably someone else has a pointer grab, try again with keyboard only // Probably someone else has a pointer grab, try again with keyboard only
if (!Main.pushModal(this.actor, global.get_current_time(), Meta.ModalOptions.POINTER_ALREADY_GRABBED)) { if (!Main.pushModal(this.actor, { options: Meta.ModalOptions.POINTER_ALREADY_GRABBED })) {
return false; return false;
} }
} }

View File

@ -479,7 +479,6 @@ const AppWellIcon = new Lang.Class({
Lang.bind(this, Lang.bind(this,
this._onStateChanged)); this._onStateChanged));
this._onStateChanged(); this._onStateChanged();
this.isMenuUp = false;
}, },
_onDestroy: function() { _onDestroy: function() {
@ -561,7 +560,8 @@ const AppWellIcon = new Lang.Class({
this._menuManager.addMenu(this._menu); this._menuManager.addMenu(this._menu);
} }
this.isMenuUp = true; this.emit('menu-state-changed', true);
this.actor.set_hover(true); this.actor.set_hover(true);
this._menu.popup(); this._menu.popup();
@ -578,7 +578,7 @@ const AppWellIcon = new Lang.Class({
_onMenuPoppedDown: function() { _onMenuPoppedDown: function() {
this.actor.sync_hover(); this.actor.sync_hover();
this.isMenuUp = false; this.emit('menu-state-changed', false);
}, },
_onActivate: function (event) { _onActivate: function (event) {

View File

@ -84,9 +84,12 @@ const AppFavorites = new Lang.Class({
let app = Shell.AppSystem.get_default().lookup_app(appId); let app = Shell.AppSystem.get_default().lookup_app(appId);
Main.overview.setMessage(_("%s has been added to your favorites.").format(app.get_name()), Lang.bind(this, function () { Main.overview.setMessage(_("%s has been added to your favorites.").format(app.get_name()),
this._removeFavorite(appId); { forFeedback: true,
})); undoCallback: Lang.bind(this, function () {
this._removeFavorite(appId);
})
});
}, },
addFavorite: function(appId) { addFavorite: function(appId) {
@ -116,9 +119,11 @@ const AppFavorites = new Lang.Class({
return; return;
Main.overview.setMessage(_("%s has been removed from your favorites.").format(app.get_name()), Main.overview.setMessage(_("%s has been removed from your favorites.").format(app.get_name()),
Lang.bind(this, function () { { forFeedback: true,
this._addFavorite(appId, pos); undoCallback: Lang.bind(this, function () {
})); this._addFavorite(appId, pos);
})
});
} }
}); });
Signals.addSignalMethods(AppFavorites.prototype); Signals.addSignalMethods(AppFavorites.prototype);

View File

@ -141,6 +141,7 @@ const BoxPointer = new Lang.Class({
this._muteInput(); this._muteInput();
Tweener.removeTweens(this);
Tweener.addTween(this, { opacity: fade ? 0 : 255, Tweener.addTween(this, { opacity: fade ? 0 : 255,
xOffset: xOffset, xOffset: xOffset,
yOffset: yOffset, yOffset: yOffset,

View File

@ -270,8 +270,9 @@ const DBusEventSource = new Lang.Class({
this._loadEvents(false); this._loadEvents(false);
}, },
_onEventsReceived: function([appointments]) { _onEventsReceived: function(results, error) {
let newEvents = []; let newEvents = [];
let appointments = results ? results[0] : null;
if (appointments != null) { if (appointments != null) {
for (let n = 0; n < appointments.length; n++) { for (let n = 0; n < appointments.length; n++) {
let a = appointments[n]; let a = appointments[n];

View File

@ -408,7 +408,10 @@ const VPNRequestHandler = new Lang.Class({
} }
}, },
cancel: function() { cancel: function(respond) {
if (respond)
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED);
if (this._newStylePlugin && this._shellDialog) { if (this._newStylePlugin && this._shellDialog) {
this._shellDialog.close(global.get_current_time()); this._shellDialog.close(global.get_current_time());
this._shellDialog.destroy(); this._shellDialog.destroy();
@ -599,6 +602,16 @@ const NetworkAgent = new Lang.Class({
}, },
disable: function() { disable: function() {
let requestId;
for (requestId in this._dialogs)
this._dialogs[requestId].cancel();
this._dialogs = { };
for (requestId in this._vpnRequests)
this._vpnRequests[requestId].cancel(true);
this._vpnRequests = { };
this._native.unregister(); this._native.unregister();
}, },
@ -622,7 +635,7 @@ const NetworkAgent = new Lang.Class({
this._dialogs[requestId].destroy(); this._dialogs[requestId].destroy();
delete this._dialogs[requestId]; delete this._dialogs[requestId];
} else if (this._vpnRequests[requestId]) { } else if (this._vpnRequests[requestId]) {
this._vpnRequests[requestId].cancel(); this._vpnRequests[requestId].cancel(false);
delete this._vpnRequests[requestId]; delete this._vpnRequests[requestId];
} }
}, },

View File

@ -49,7 +49,7 @@ const AuthenticationDialog = new Lang.Class({
let messageBox = new St.BoxLayout({ style_class: 'prompt-dialog-message-layout', let messageBox = new St.BoxLayout({ style_class: 'prompt-dialog-message-layout',
vertical: true }); vertical: true });
mainContentBox.add(messageBox, mainContentBox.add(messageBox,
{ y_align: St.Align.START }); { expand: true, y_align: St.Align.START });
this._subjectLabel = new St.Label({ style_class: 'prompt-dialog-headline', this._subjectLabel = new St.Label({ style_class: 'prompt-dialog-headline',
text: _("Authentication Required") }); text: _("Authentication Required") });

View File

@ -1,5 +1,6 @@
const Lang = imports.lang; const Lang = imports.lang;
const Main = imports.ui.main;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
@ -16,13 +17,16 @@ const Recorder = new Lang.Class({
}, },
enable: function() { enable: function() {
global.display.add_keybinding('toggle-recording', Main.wm.addKeybinding('toggle-recording',
this._bindingSettings, this._bindingSettings,
Meta.KeyBindingFlags.NONE, Lang.bind(this, this._toggleRecorder)); Meta.KeyBindingFlags.NONE,
Main.KeybindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW,
Lang.bind(this, this._toggleRecorder));
}, },
disable: function() { disable: function() {
global.display.remove_keybinding('toggle-recording'); Main.wm.removeKeybinding('toggle-recording');
}, },
_ensureRecorder: function() { _ensureRecorder: function() {
@ -41,7 +45,7 @@ const Recorder = new Lang.Class({
recorder.set_framerate(this._recorderSettings.get_int('framerate')); recorder.set_framerate(this._recorderSettings.get_int('framerate'));
/* Translators: this is a filename used for screencast recording */ /* Translators: this is a filename used for screencast recording */
// xgettext:no-c-format // xgettext:no-c-format
recorder.set_filename(_("Screencast from %d %t") + '.' + this._recorderSettings.get_string('file-extension')); recorder.set_file_template(_("Screencast from %d %t") + '.' + this._recorderSettings.get_string('file-extension'));
let pipeline = this._recorderSettings.get_string('pipeline'); let pipeline = this._recorderSettings.get_string('pipeline');
if (!pipeline.match(/^\s*$/)) if (!pipeline.match(/^\s*$/))

View File

@ -771,16 +771,19 @@ const ChatNotification = new Lang.Class({
this.emit('unfocused'); this.emit('unfocused');
})); }));
this._oldMaxScrollAdjustment = 0;
this._createScrollArea(); this._createScrollArea();
this._lastGroup = null; this._lastGroup = null;
this._lastGroupActor = null; this._lastGroupActor = null;
// Keep track of the bottom position for the current adjustment and
// force a scroll to the bottom if things change while we were at the
// bottom
this._oldMaxScrollValue = this._scrollArea.vscroll.adjustment.value;
this._scrollArea.add_style_class_name('chat-notification-scrollview');
this._scrollArea.vscroll.adjustment.connect('changed', Lang.bind(this, function(adjustment) { this._scrollArea.vscroll.adjustment.connect('changed', Lang.bind(this, function(adjustment) {
let currentValue = adjustment.value + adjustment.page_size; if (adjustment.value == this._oldMaxScrollValue)
if (currentValue == this._oldMaxScrollAdjustment)
this.scrollTo(St.Side.BOTTOM); this.scrollTo(St.Side.BOTTOM);
this._oldMaxScrollAdjustment = adjustment.upper; this._oldMaxScrollValue = Math.max(adjustment.lower, adjustment.upper - adjustment.page_size);
})); }));
this._inputHistory = new History.HistoryManager({ entry: this._responseEntry.clutter_text }); this._inputHistory = new History.HistoryManager({ entry: this._responseEntry.clutter_text });
@ -1133,7 +1136,7 @@ const AudioVideoNotification = new Lang.Class({
this.parent(source, title, null, { customContent: true }); this.parent(source, title, null, { customContent: true });
this.setResident(true); this.setResident(true);
this.addButton('reject', _("Reject")); this.addButton('reject', _("Decline"));
/* translators: this is a button label (verb), not a noun */ /* translators: this is a button label (verb), not a noun */
this.addButton('answer', _("Answer")); this.addButton('answer', _("Answer"));

View File

@ -23,8 +23,7 @@ const DASH_ITEM_HOVER_TIMEOUT = 300;
function getAppFromSource(source) { function getAppFromSource(source) {
if (source instanceof AppDisplay.AppWellIcon) { if (source instanceof AppDisplay.AppWellIcon) {
let appSystem = Shell.AppSystem.get_default(); return source.app;
return appSystem.lookup_app(source.getId());
} else if (source.metaWindow) { } else if (source.metaWindow) {
let tracker = Shell.WindowTracker.get_default(); let tracker = Shell.WindowTracker.get_default();
return tracker.get_window_app(source.metaWindow); return tracker.get_window_app(source.metaWindow);
@ -142,6 +141,7 @@ const DashItemContainer = new Lang.Class({
setLabelText: function(text) { setLabelText: function(text) {
this._labelText = text; this._labelText = text;
this.child.accessible_name = text;
}, },
hideLabel: function () { hideLabel: function () {
@ -259,7 +259,6 @@ const ShowAppsIcon = new Lang.Class({
this.setChild(this.toggleButton); this.setChild(this.toggleButton);
this.setDragApp(null); this.setDragApp(null);
this.toggleButton.label_actor = this.label;
}, },
_createIcon: function(size) { _createIcon: function(size) {
@ -492,32 +491,51 @@ const Dash = new Lang.Class({
}, },
_createAppItem: function(app) { _createAppItem: function(app) {
let display = new AppDisplay.AppWellIcon(app, let appIcon = new AppDisplay.AppWellIcon(app,
{ setSizeManually: true, { setSizeManually: true,
showLabel: false }); showLabel: false });
display._draggable.connect('drag-begin', appIcon._draggable.connect('drag-begin',
Lang.bind(this, function() { Lang.bind(this, function() {
display.actor.opacity = 50; appIcon.actor.opacity = 50;
})); }));
display._draggable.connect('drag-end', appIcon._draggable.connect('drag-end',
Lang.bind(this, function() { Lang.bind(this, function() {
display.actor.opacity = 255; appIcon.actor.opacity = 255;
})); }));
appIcon.connect('menu-state-changed',
Lang.bind(this, function(appIcon, opened) {
this._itemMenuStateChanged(item, opened);
}));
let item = new DashItemContainer(); let item = new DashItemContainer();
item.setChild(display.actor); item.setChild(appIcon.actor);
// Override default AppWellIcon label_actor, now the
// accessible_name is set at DashItemContainer.setLabelText
appIcon.actor.label_actor = null;
item.setLabelText(app.get_name()); item.setLabelText(app.get_name());
// Override default AppWellIcon label_actor
display.actor.label_actor = item.label; appIcon.icon.setIconSize(this.iconSize);
display.icon.setIconSize(this.iconSize);
this._hookUpLabel(item); this._hookUpLabel(item);
return item; return item;
}, },
_itemMenuStateChanged: function(item, opened) {
// When the menu closes, it calls sync_hover, which means
// that the notify::hover handler does everything we need to.
if (opened) {
if (this._showLabelTimeoutId > 0) {
Mainloop.source_remove(this._showLabelTimeoutId);
this._showLabelTimeoutId = 0;
}
item.hideLabel();
}
},
_onHover: function (item) { _onHover: function (item) {
if (item.child.get_hover() && !item.child._delegate.isMenuUp) { if (item.child.get_hover()) {
if (this._showLabelTimeoutId == 0) { if (this._showLabelTimeoutId == 0) {
let timeout = this._labelShowing ? 0 : DASH_ITEM_HOVER_TIMEOUT; let timeout = this._labelShowing ? 0 : DASH_ITEM_HOVER_TIMEOUT;
this._showLabelTimeoutId = Mainloop.timeout_add(timeout, this._showLabelTimeoutId = Mainloop.timeout_add(timeout,
@ -619,8 +637,10 @@ const Dash = new Lang.Class({
icon.setIconSize(this.iconSize); icon.setIconSize(this.iconSize);
// Don't animate the icon size change when the overview // Don't animate the icon size change when the overview
// is not visible or when initially filling the dash // is transitioning, not visible or when initially filling
if (!Main.overview.visible || !this._shownInitially) // the dash
if (!Main.overview.visible || Main.overview.animationInProgress ||
!this._shownInitially)
continue; continue;
let [targetWidth, targetHeight] = icon.icon.get_size(); let [targetWidth, targetHeight] = icon.icon.get_size();
@ -744,8 +764,9 @@ const Dash = new Lang.Class({
for (let i = 0; i < removedActors.length; i++) { for (let i = 0; i < removedActors.length; i++) {
let item = removedActors[i]._delegate; let item = removedActors[i]._delegate;
// Don't animate item removal when the overview is hidden // Don't animate item removal when the overview is transitioning
if (Main.overview.visible) // or hidden
if (Main.overview.visible && !Main.overview.animationInProgress)
item.animateOutAndDestroy(); item.animateOutAndDestroy();
else else
item.destroy(); item.destroy();
@ -760,8 +781,9 @@ const Dash = new Lang.Class({
return; return;
} }
// Don't animate item addition when the overview is hidden // Don't animate item addition when the overview is transitioning
if (!Main.overview.visible) // or hidden
if (!Main.overview.visible || Main.overview.animationInProgress)
return; return;
for (let i = 0; i < addedItems.length; i++) for (let i = 0; i < addedItems.length; i++)

View File

@ -105,7 +105,7 @@ const restartDialogContent = {
endDescription: _("Restarting the system."), endDescription: _("Restarting the system."),
confirmButtons: [{ signal: 'ConfirmedReboot', confirmButtons: [{ signal: 'ConfirmedReboot',
label: C_("button", "Restart") }], label: C_("button", "Restart") }],
iconName: 'system-shutdown-symbolic', iconName: 'view-refresh-symbolic',
iconStyleClass: 'end-session-dialog-shutdown-icon' iconStyleClass: 'end-session-dialog-shutdown-icon'
}; };

View File

@ -23,6 +23,7 @@ function _navigateActor(actor) {
// GrabHelper: // GrabHelper:
// @owner: the actor that owns the GrabHelper // @owner: the actor that owns the GrabHelper
// @params: optional parameters to pass to Main.pushModal()
// //
// Creates a new GrabHelper object, for dealing with keyboard and pointer grabs // Creates a new GrabHelper object, for dealing with keyboard and pointer grabs
// associated with a set of actors. // associated with a set of actors.
@ -34,8 +35,9 @@ function _navigateActor(actor) {
const GrabHelper = new Lang.Class({ const GrabHelper = new Lang.Class({
Name: 'GrabHelper', Name: 'GrabHelper',
_init: function(owner) { _init: function(owner, params) {
this._owner = owner; this._owner = owner;
this._modalParams = params;
this._grabStack = []; this._grabStack = [];
@ -165,7 +167,7 @@ const GrabHelper = new Lang.Class({
_takeModalGrab: function() { _takeModalGrab: function() {
let firstGrab = (this._modalCount == 0); let firstGrab = (this._modalCount == 0);
if (firstGrab) { if (firstGrab) {
if (!Main.pushModal(this._owner)) if (!Main.pushModal(this._owner, this._modalParams))
return false; return false;
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent)); this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));

View File

@ -20,25 +20,6 @@ const KEYBOARD_TYPE = 'keyboard-type';
const A11Y_APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications'; const A11Y_APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
const SHOW_KEYBOARD = 'screen-keyboard-enabled'; const SHOW_KEYBOARD = 'screen-keyboard-enabled';
// Key constants taken from Antler
// FIXME: ought to be moved into libcaribou
const PRETTY_KEYS = {
'BackSpace': '\u232b',
'space': ' ',
'Return': '\u23ce',
'Caribou_Prefs': '\u2328',
'Caribou_ShiftUp': '\u2b06',
'Caribou_ShiftDown': '\u2b07',
'Caribou_Emoticons': '\u263a',
'Caribou_Symbols': '123',
'Caribou_Symbols_More': '{#*',
'Caribou_Alpha': 'Abc',
'Tab': 'Tab',
'Escape': 'Esc',
'Control_L': 'Ctrl',
'Alt_L': 'Alt'
};
const CaribouKeyboardIface = <interface name='org.gnome.Caribou.Keyboard'> const CaribouKeyboardIface = <interface name='org.gnome.Caribou.Keyboard'>
<method name='Show'> <method name='Show'>
<arg type='u' direction='in' /> <arg type='u' direction='in' />
@ -98,17 +79,7 @@ const Key = new Lang.Class({
}, },
_makeKey: function () { _makeKey: function () {
let label = this._key.name; let label = GLib.markup_escape_text(this._key.label, -1);
if (label.length > 1) {
let pretty = PRETTY_KEYS[label];
if (pretty)
label = pretty;
else
label = this._getUnichar(this._key);
}
label = GLib.markup_escape_text(label, -1);
let button = new St.Button ({ label: label, let button = new St.Button ({ label: label,
style_class: 'keyboard-key' }); style_class: 'keyboard-key' });

View File

@ -104,7 +104,7 @@ const LayoutManager = new Lang.Class({
this.primaryMonitor = null; this.primaryMonitor = null;
this.primaryIndex = -1; this.primaryIndex = -1;
this._hotCorners = []; this._hotCorners = [];
this._rootPixmap = null; this._background = null;
this._leftPanelBarrier = 0; this._leftPanelBarrier = 0;
this._rightPanelBarrier = 0; this._rightPanelBarrier = 0;
this._trayBarrier = 0; this._trayBarrier = 0;
@ -128,8 +128,6 @@ const LayoutManager = new Lang.Class({
this.trayBox = new St.Widget({ name: 'trayBox', this.trayBox = new St.Widget({ name: 'trayBox',
layout_manager: new Clutter.BinLayout() }); layout_manager: new Clutter.BinLayout() });
this.addChrome(this.trayBox); this.addChrome(this.trayBox);
this.trayBox.connect('allocation-changed',
Lang.bind(this, this._updateTrayBarrier));
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox', this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
reactive: true, reactive: true,
@ -280,22 +278,6 @@ const LayoutManager = new Lang.Class({
} }
}, },
_updateTrayBarrier: function() {
let monitor = this.bottomMonitor;
if (this._trayBarrier)
global.destroy_pointer_barrier(this._trayBarrier);
if (Main.messageTray) {
this._trayBarrier =
global.create_pointer_barrier(monitor.x + monitor.width, monitor.y + monitor.height - Main.messageTray.actor.height,
monitor.x + monitor.width, monitor.y + monitor.height,
4 /* BarrierNegativeX */);
} else {
this._trayBarrier = 0;
}
},
_monitorsChanged: function() { _monitorsChanged: function() {
this._updateMonitors(); this._updateMonitors();
this._updateBoxes(); this._updateBoxes();
@ -333,30 +315,30 @@ const LayoutManager = new Lang.Class({
// to the greeter. Otherwise, we'll just animate the panel, // to the greeter. Otherwise, we'll just animate the panel,
// as usual. // as usual.
if (Main.sessionMode.isGreeter) { if (Main.sessionMode.isGreeter) {
this._rootPixmap = global.create_xrootpmap_texture(); this._background = Meta.BackgroundActor.new_for_screen(global.screen);
if (this._rootPixmap != null) { if (this._background != null) {
Main.uiGroup.add_actor(this._rootPixmap); Main.uiGroup.add_actor(this._background);
Tweener.addTween(this._rootPixmap, Tweener.addTween(this._background,
{ opacity: 0, { opacity: 0,
time: PLYMOUTH_TRANSITION_TIME, time: PLYMOUTH_TRANSITION_TIME,
transition: 'linear', transition: 'linear',
onComplete: this._fadeRootpmapComplete, onComplete: this._fadeBackgroundComplete,
onCompleteScope: this }); onCompleteScope: this });
plymouthTransitionRunning = true; plymouthTransitionRunning = true;
} }
} }
if (!plymouthTransitionRunning) if (!plymouthTransitionRunning)
this._fadeRootpmapComplete(); this._fadeBackgroundComplete();
}, },
_fadeRootpmapComplete: function() { _fadeBackgroundComplete: function() {
// Don't animate the strut // Don't animate the strut
this._chrome.freezeUpdateRegions(); this._chrome.freezeUpdateRegions();
if (this._rootPixmap != null) { if (this._background != null) {
this._rootPixmap.destroy(); this._background.destroy();
this._rootPixmap = null; this._background = null;
} }
Tweener.addTween(this.panelBox, Tweener.addTween(this.panelBox,

View File

@ -1129,7 +1129,7 @@ const LookingGlass = new Lang.Class({
if (this._open) if (this._open)
return; return;
if (!Main.pushModal(this._entry)) if (!Main.pushModal(this._entry, { keybindingMode: Main.KeybindingMode.LOOKING_GLASS }))
return; return;
this._notebook.selectIndex(0); this._notebook.selectIndex(0);

View File

@ -20,6 +20,7 @@ const Keyboard = imports.ui.keyboard;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const Overview = imports.ui.overview; const Overview = imports.ui.overview;
const Panel = imports.ui.panel; const Panel = imports.ui.panel;
const Params = imports.misc.params;
const RunDialog = imports.ui.runDialog; const RunDialog = imports.ui.runDialog;
const Layout = imports.ui.layout; const Layout = imports.ui.layout;
const LookingGlass = imports.ui.lookingGlass; const LookingGlass = imports.ui.lookingGlass;
@ -39,6 +40,18 @@ const Util = imports.misc.util;
const OVERRIDES_SCHEMA = 'org.gnome.shell.overrides'; const OVERRIDES_SCHEMA = 'org.gnome.shell.overrides';
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff); const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
const KeybindingMode = {
NONE: 0, // block all keybindings
NORMAL: 1 << 0, // window mode
OVERVIEW: 1 << 1,
LOCK_SCREEN: 1 << 2,
UNLOCK_SCREEN: 1 << 3,
LOGIN_SCREEN: 1 << 4,
MESSAGE_TRAY: 1 << 5,
SYSTEM_MODAL: 1 << 6,
LOOKING_GLASS: 1 << 7
};
let componentManager = null; let componentManager = null;
let panel = null; let panel = null;
let overview = null; let overview = null;
@ -55,6 +68,7 @@ let shellDBusService = null;
let shellMountOpDBusService = null; let shellMountOpDBusService = null;
let screenSaverDBus = null; let screenSaverDBus = null;
let modalCount = 0; let modalCount = 0;
let keybindingMode = KeybindingMode.NORMAL;
let modalActorFocusStack = []; let modalActorFocusStack = [];
let uiGroup = null; let uiGroup = null;
let magnifier = null; let magnifier = null;
@ -69,7 +83,17 @@ let _overridesSettings = null;
let background = null; let background = null;
function _sessionUpdated() { function _sessionUpdated() {
Meta.keybindings_set_custom_handler('panel-run-dialog', sessionMode.hasRunDialog ? openRunDialog : null); wm.setCustomKeybindingHandler('panel-main-menu',
KeybindingMode.NORMAL |
KeybindingMode.OVERVIEW,
sessionMode.hasOverview ? Lang.bind(overview, overview.toggle) : null);
wm.allowKeybinding('overlay-key', KeybindingMode.NORMAL |
KeybindingMode.OVERVIEW);
wm.setCustomKeybindingHandler('panel-run-dialog',
KeybindingMode.NORMAL |
KeybindingMode.OVERVIEW,
sessionMode.hasRunDialog ? openRunDialog : null);
if (sessionMode.isGreeter) if (sessionMode.isGreeter)
screenShield.showDialog(); screenShield.showDialog();
} }
@ -155,9 +179,7 @@ function start() {
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT, global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
false, -1, 1); false, -1, 1);
Meta.keybindings_set_custom_handler('panel-main-menu', Lang.bind(overview, overview.toggle));
global.display.connect('overlay-key', Lang.bind(overview, overview.toggle)); global.display.connect('overlay-key', Lang.bind(overview, overview.toggle));
sessionMode.connect('update', _sessionUpdated); sessionMode.connect('update', _sessionUpdated);
_sessionUpdated(); _sessionUpdated();
@ -167,8 +189,6 @@ function start() {
_startDate = new Date(); _startDate = new Date();
global.stage.connect('captured-event', _globalKeyPressHandler);
log('GNOME Shell started at ' + _startDate); log('GNOME Shell started at ' + _startDate);
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE"); let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
@ -465,80 +485,6 @@ function getWindowActorsForWorkspace(workspaceIndex) {
}); });
} }
// This function encapsulates hacks to make certain global keybindings
// work even when we are in one of our modes where global keybindings
// are disabled with a global grab. (When there is a global grab, then
// all key events will be delivered to the stage, so ::captured-event
// on the stage can be used for global keybindings.)
function _globalKeyPressHandler(actor, event) {
if (modalCount == 0)
return false;
if (event.type() != Clutter.EventType.KEY_PRESS)
return false;
if (!sessionMode.allowKeybindingsWhenModal) {
if (modalCount > (overview.visible ? 1 : 0))
return false;
}
let symbol = event.get_key_symbol();
let keyCode = event.get_key_code();
let ignoredModifiers = global.display.get_ignored_modifier_mask();
let modifierState = event.get_state() & ~ignoredModifiers;
// This relies on the fact that Clutter.ModifierType is the same as Gdk.ModifierType
let action = global.display.get_keybinding_action(keyCode, modifierState);
if (action == Meta.KeyBindingAction.SWITCH_PANELS) {
ctrlAltTabManager.popup(modifierState & Clutter.ModifierType.SHIFT_MASK,
modifierState);
return true;
}
switch (action) {
// left/right would effectively act as synonyms for up/down if we enabled them;
// but that could be considered confusing; we also disable them in the main view.
//
// case Meta.KeyBindingAction.WORKSPACE_LEFT:
// if (!sessionMode.hasWorkspaces)
// return false;
//
// wm.actionMoveWorkspaceLeft();
// return true;
// case Meta.KeyBindingAction.WORKSPACE_RIGHT:
// if (!sessionMode.hasWorkspaces)
// return false;
//
// wm.actionMoveWorkspaceRight();
// return true;
case Meta.KeyBindingAction.WORKSPACE_UP:
if (!sessionMode.hasWorkspaces)
return false;
wm.actionMoveWorkspace(Meta.MotionDirection.UP);
return true;
case Meta.KeyBindingAction.WORKSPACE_DOWN:
if (!sessionMode.hasWorkspaces)
return false;
wm.actionMoveWorkspace(Meta.MotionDirection.DOWN);
return true;
case Meta.KeyBindingAction.PANEL_RUN_DIALOG:
case Meta.KeyBindingAction.COMMAND_2:
if (!sessionMode.hasRunDialog)
return false;
openRunDialog();
return true;
case Meta.KeyBindingAction.PANEL_MAIN_MENU:
case Meta.KeyBindingAction.OVERLAY_KEY:
overview.hide();
return true;
}
return false;
}
function _findModal(actor) { function _findModal(actor) {
for (let i = 0; i < modalActorFocusStack.length; i++) { for (let i = 0; i < modalActorFocusStack.length; i++) {
if (modalActorFocusStack[i].actor == actor) if (modalActorFocusStack[i].actor == actor)
@ -554,7 +500,7 @@ function isInModalStack(actor) {
/** /**
* pushModal: * pushModal:
* @actor: #ClutterActor which will be given keyboard focus * @actor: #ClutterActor which will be given keyboard focus
* @timestamp: optional timestamp * @params: optional parameters
* *
* Ensure we are in a mode where all keyboard and mouse input goes to * Ensure we are in a mode where all keyboard and mouse input goes to
* the stage, and focus @actor. Multiple calls to this function act in * the stage, and focus @actor. Multiple calls to this function act in
@ -565,21 +511,27 @@ function isInModalStack(actor) {
* modal stack returns to this actor, reset the focus to the actor * modal stack returns to this actor, reset the focus to the actor
* which was focused at the time pushModal() was invoked. * which was focused at the time pushModal() was invoked.
* *
* @timestamp is optionally used to associate the call with a specific user * @params may be used to provide the following parameters:
* initiated event. If not provided then the value of * - timestamp: used to associate the call with a specific user initiated
* global.get_current_time() is assumed. * event. If not provided then the value of
* global.get_current_time() is assumed.
* *
* @options: optional Meta.ModalOptions flags to indicate that the * - options: Meta.ModalOptions flags to indicate that the pointer is
* pointer is alrady grabbed * already grabbed
*
* - keybindingMode: used to set the current Main.KeybindingMode to filter
* global keybindings; the default of NONE will filter
* out all keybindings
* *
* Returns: true iff we successfully acquired a grab or already had one * Returns: true iff we successfully acquired a grab or already had one
*/ */
function pushModal(actor, timestamp, options) { function pushModal(actor, params) {
if (timestamp == undefined) params = Params.parse(params, { timestamp: global.get_current_time(),
timestamp = global.get_current_time(); options: 0,
keybindingMode: KeybindingMode.NONE });
if (modalCount == 0) { if (modalCount == 0) {
if (!global.begin_modal(timestamp, options ? options : 0)) { if (!global.begin_modal(params.timestamp, params.options)) {
log('pushModal: invocation of begin_modal failed'); log('pushModal: invocation of begin_modal failed');
return false; return false;
} }
@ -606,8 +558,10 @@ function pushModal(actor, timestamp, options) {
modalActorFocusStack.push({ actor: actor, modalActorFocusStack.push({ actor: actor,
focus: curFocus, focus: curFocus,
destroyId: actorDestroyId, destroyId: actorDestroyId,
focusDestroyId: curFocusDestroyId }); focusDestroyId: curFocusDestroyId,
keybindingMode: keybindingMode });
keybindingMode = params.keybindingMode;
global.stage.set_key_focus(actor); global.stage.set_key_focus(actor);
return true; return true;
} }
@ -634,6 +588,7 @@ function popModal(actor, timestamp) {
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); global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
keybindingMode = KeybindingMode.NORMAL;
throw new Error('incorrect pop'); throw new Error('incorrect pop');
} }
@ -646,6 +601,7 @@ function popModal(actor, timestamp) {
if (focusIndex == modalActorFocusStack.length - 1) { if (focusIndex == modalActorFocusStack.length - 1) {
if (record.focus) if (record.focus)
record.focus.disconnect(record.focusDestroyId); record.focus.disconnect(record.focusDestroyId);
keybindingMode = record.keybindingMode;
global.stage.set_key_focus(record.focus); global.stage.set_key_focus(record.focus);
} else { } else {
let t = modalActorFocusStack[modalActorFocusStack.length - 1]; let t = modalActorFocusStack[modalActorFocusStack.length - 1];
@ -655,6 +611,7 @@ function popModal(actor, timestamp) {
for (let i = modalActorFocusStack.length - 1; i > focusIndex; i--) { for (let i = modalActorFocusStack.length - 1; i > focusIndex; i--) {
modalActorFocusStack[i].focus = modalActorFocusStack[i - 1].focus; modalActorFocusStack[i].focus = modalActorFocusStack[i - 1].focus;
modalActorFocusStack[i].focusDestroyId = modalActorFocusStack[i - 1].focusDestroyId; modalActorFocusStack[i].focusDestroyId = modalActorFocusStack[i - 1].focusDestroyId;
modalActorFocusStack[i].keybindingMode = modalActorFocusStack[i - 1].keybindingMode;
} }
} }
modalActorFocusStack.splice(focusIndex, 1); modalActorFocusStack.splice(focusIndex, 1);
@ -665,6 +622,7 @@ function popModal(actor, timestamp) {
global.end_modal(timestamp); global.end_modal(timestamp);
global.set_stage_input_mode(Shell.StageInputMode.NORMAL); global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
Meta.enable_unredirect_for_screen(global.screen); Meta.enable_unredirect_for_screen(global.screen);
keybindingMode = KeybindingMode.NORMAL;
} }
function createLookingGlass() { function createLookingGlass() {

View File

@ -314,6 +314,7 @@ const Notification = new Lang.Class({
this.resident = false; this.resident = false;
// 'transient' is a reserved keyword in JS, so we have to use an alternate variable name // 'transient' is a reserved keyword in JS, so we have to use an alternate variable name
this.isTransient = false; this.isTransient = false;
this.forFeedback = false;
this.expanded = false; this.expanded = false;
this.focused = false; this.focused = false;
this.acknowledged = false; this.acknowledged = false;
@ -713,6 +714,10 @@ const Notification = new Lang.Class({
this.isTransient = isTransient; this.isTransient = isTransient;
}, },
setForFeedback: function(forFeedback) {
this.forFeedback = forFeedback;
},
setUseActionIcons: function(useIcons) { setUseActionIcons: function(useIcons) {
this._useActionIcons = useIcons; this._useActionIcons = useIcons;
}, },
@ -1237,12 +1242,6 @@ const SummaryItem = new Lang.Class({
this.notificationStackWidget = new St.Widget({ layout_manager: new Clutter.BinLayout() }); this.notificationStackWidget = new St.Widget({ layout_manager: new Clutter.BinLayout() });
this._closeButton = makeCloseButton();
this._closeButton.connect('clicked', Lang.bind(this, function() {
source.destroy();
source.emit('done-displaying-content');
}));
this.notificationStackView = new St.ScrollView({ style_class: source.isChat ? '' : 'summary-notification-stack-scrollview', this.notificationStackView = new St.ScrollView({ style_class: source.isChat ? '' : 'summary-notification-stack-scrollview',
vscrollbar_policy: source.isChat ? Gtk.PolicyType.NEVER : Gtk.PolicyType.AUTOMATIC, vscrollbar_policy: source.isChat ? Gtk.PolicyType.NEVER : Gtk.PolicyType.AUTOMATIC,
hscrollbar_policy: Gtk.PolicyType.NEVER }); hscrollbar_policy: Gtk.PolicyType.NEVER });
@ -1251,7 +1250,9 @@ const SummaryItem = new Lang.Class({
vertical: true }); vertical: true });
this.notificationStackView.add_actor(this.notificationStack); this.notificationStackView.add_actor(this.notificationStack);
this.notificationStackWidget.add_actor(this.notificationStackView); this.notificationStackWidget.add_actor(this.notificationStackView);
this.notificationStackWidget.add_actor(this._closeButton);
this.closeButton = makeCloseButton();
this.notificationStackWidget.add_actor(this.closeButton);
this._stackedNotifications = []; this._stackedNotifications = [];
this._oldMaxScrollAdjustment = 0; this._oldMaxScrollAdjustment = 0;
@ -1268,14 +1269,6 @@ const SummaryItem = new Lang.Class({
global.focus_manager.add_group(this.rightClickMenu); global.focus_manager.add_group(this.rightClickMenu);
}, },
get closeButtonVisible() {
return this._closeButton.visible;
},
set closeButtonVisible(v) {
this._closeButton.visible = v;
},
_onKeyPress: function(actor, event) { _onKeyPress: function(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Up) { if (event.get_key_symbol() == Clutter.KEY_Up) {
actor.emit('clicked', 1); actor.emit('clicked', 1);
@ -1401,6 +1394,8 @@ const MessageTray = new Lang.Class({
y_expand: true, y_expand: true,
x_expand: true, x_expand: true,
layout_manager: new Clutter.BinLayout() }); layout_manager: new Clutter.BinLayout() });
this._notificationWidget.connect('key-release-event', Lang.bind(this, this._onNotificationKeyRelease));
this.actor.add_actor(this._notificationWidget); this.actor.add_actor(this._notificationWidget);
this._notificationBin = new St.Bin({ y_expand: true }); this._notificationBin = new St.Bin({ y_expand: true });
@ -1450,7 +1445,7 @@ const MessageTray = new Lang.Class({
this._closeButton = makeCloseButton(); this._closeButton = makeCloseButton();
this._closeButton.hide(); this._closeButton.hide();
this._closeButton.connect('clicked', Lang.bind(this, this._onCloseClicked)); this._closeButton.connect('clicked', Lang.bind(this, this._closeNotification));
this._notificationWidget.add_actor(this._closeButton); this._notificationWidget.add_actor(this._closeButton);
this._idleMonitorBecameActiveId = 0; this._idleMonitorBecameActiveId = 0;
@ -1458,7 +1453,8 @@ const MessageTray = new Lang.Class({
this.idleMonitor = new GnomeDesktop.IdleMonitor(); this.idleMonitor = new GnomeDesktop.IdleMonitor();
this._grabHelper = new GrabHelper.GrabHelper(this.actor); this._grabHelper = new GrabHelper.GrabHelper(this.actor,
{ keybindingMode: Main.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);
if (Main.panel.statusArea.activities) if (Main.panel.statusArea.activities)
@ -1522,10 +1518,20 @@ const MessageTray = new Lang.Class({
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated)); Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
global.display.add_keybinding('toggle-message-tray', Main.wm.addKeybinding('toggle-message-tray',
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }), new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Lang.bind(this, this.toggleAndNavigate)); Main.KeybindingMode.NORMAL |
Main.KeybindingMode.MESSAGE_TRAY |
Main.KeybindingMode.OVERVIEW,
Lang.bind(this, this.toggleAndNavigate));
Main.wm.addKeybinding('focus-active-notification',
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Main.KeybindingMode.NORMAL |
Main.KeybindingMode.MESSAGE_TRAY |
Main.KeybindingMode.OVERVIEW,
Lang.bind(this, this._expandActiveNotification));
this._summaryItems = []; this._summaryItems = [];
this._chatSummaryItemsCount = 0; this._chatSummaryItemsCount = 0;
@ -1601,14 +1607,23 @@ const MessageTray = new Lang.Class({
return false; return false;
}, },
_onCloseClicked: function() { _onNotificationKeyRelease: function(actor, event) {
let ignoredModifiers = global.display.get_ignored_modifier_mask();
let modifierState = event.get_state() & ~ignoredModifiers;
if (event.get_key_symbol() == Clutter.KEY_Escape && modifierState == 0) {
this._closeNotification();
return true;
}
return false;
},
_closeNotification: function() {
if (this._notificationState == State.SHOWN) { if (this._notificationState == State.SHOWN) {
this._closeButton.hide();
this._notificationClosed = true; this._notificationClosed = true;
this._notification.emit('done-displaying'); this._updateState();
if (!this._notification.resident)
this._notification.destroy();
this._notificationClosed = false; this._notificationClosed = false;
} }
}, },
@ -1964,8 +1979,9 @@ const MessageTray = new Lang.Class({
// Notifications // Notifications
let notificationQueue = this._notificationQueue; let notificationQueue = this._notificationQueue;
let notificationUrgent = notificationQueue.length > 0 && notificationQueue[0].urgency == Urgency.CRITICAL; let notificationUrgent = notificationQueue.length > 0 && notificationQueue[0].urgency == Urgency.CRITICAL;
let notificationForFeedback = notificationQueue.length > 0 && notificationQueue[0].forFeedback;
let notificationsLimited = this._busy || this._inFullscreen; let notificationsLimited = this._busy || this._inFullscreen;
let notificationsPending = notificationQueue.length > 0 && (!notificationsLimited || notificationUrgent) && Main.sessionMode.hasNotifications; let notificationsPending = notificationQueue.length > 0 && (!notificationsLimited || notificationUrgent || notificationForFeedback) && Main.sessionMode.hasNotifications;
let nextNotification = notificationQueue.length > 0 ? notificationQueue[0] : null; let nextNotification = notificationQueue.length > 0 ? notificationQueue[0] : null;
let notificationPinned = this._pointerInTray && !this._pointerInSummary && !this._notificationRemoved; let notificationPinned = this._pointerInTray && !this._pointerInSummary && !this._notificationRemoved;
let notificationExpanded = this._notification && this._notification.expanded; let notificationExpanded = this._notification && this._notification.expanded;
@ -2101,9 +2117,8 @@ const MessageTray = new Lang.Class({
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
if (this._overviewVisible) { if (!this._overviewVisible)
this._lightbox.show(); this._lightbox.show();
}
return true; return true;
}, },
@ -2141,6 +2156,10 @@ const MessageTray = new Lang.Class({
}, },
_hideTray: function() { _hideTray: function() {
// Having the summary item animate out while sliding down the tray
// is distracting, so hide it immediately in case it was visible.
this._summaryBoxPointer.actor.hide();
this._tween(this.actor, '_trayState', State.HIDDEN, this._tween(this.actor, '_trayState', State.HIDDEN,
{ y: 0, { y: 0,
time: ANIMATION_TIME, time: ANIMATION_TIME,
@ -2298,6 +2317,18 @@ const MessageTray = new Lang.Class({
}, },
_hideNotification: function() { _hideNotification: function() {
// HACK!
// 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 }); this._grabHelper.ungrab({ actor: this._notification.actor });
if (this._idleMonitorBecameActiveId) { if (this._idleMonitorBecameActiveId) {
@ -2344,6 +2375,13 @@ const MessageTray = new Lang.Class({
notification.destroy(NotificationDestroyedReason.EXPIRED); notification.destroy(NotificationDestroyedReason.EXPIRED);
}, },
_expandActiveNotification: function() {
if (!this._notification)
return;
this._expandNotification(false);
},
_expandNotification: function(autoExpanding) { _expandNotification: function(autoExpanding) {
// Don't grab focus in notifications that are auto-expanded. // Don't grab focus in notifications that are auto-expanded.
if (!autoExpanding) if (!autoExpanding)
@ -2367,8 +2405,13 @@ const MessageTray = new Lang.Class({
if (this._notificationWidget.y < expandedY) { if (this._notificationWidget.y < expandedY) {
this._notificationWidget.y = expandedY; this._notificationWidget.y = expandedY;
} else if (this._notification.y != expandedY) { } else if (this._notification.y != expandedY) {
// Tween also opacity here, to override a possible tween that's
// currently hiding the notification. This will ensure that the
// notification is not removed when the onComplete handler for this
// one triggers.
this._tween(this._notificationWidget, '_notificationState', State.SHOWN, this._tween(this._notificationWidget, '_notificationState', State.SHOWN,
{ y: expandedY, { y: expandedY,
opacity: 255,
time: ANIMATION_TIME, time: ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
@ -2420,7 +2463,10 @@ const MessageTray = new Lang.Class({
this._notificationQueue = newQueue; this._notificationQueue = newQueue;
this._summaryBoxPointer.bin.child = this._summaryBoxPointerItem.notificationStackWidget; this._summaryBoxPointer.bin.child = this._summaryBoxPointerItem.notificationStackWidget;
this._summaryBoxPointerItem.closeButtonVisible = true;
let closeButton = this._summaryBoxPointerItem.closeButton;
closeButton.show();
this._summaryBoxPointerCloseClickedId = closeButton.connect('clicked', Lang.bind(this, this._hideSummaryBoxPointer));
this._summaryBoxPointerItem.prepareNotificationStackForShowing(); this._summaryBoxPointerItem.prepareNotificationStackForShowing();
} else if (this._clickedSummaryItemMouseButton == 3) { } else if (this._clickedSummaryItemMouseButton == 3) {
this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu; this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu;
@ -2530,6 +2576,8 @@ const MessageTray = new Lang.Class({
this._summaryBoxPointer.bin.child = null; this._summaryBoxPointer.bin.child = null;
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId); this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId);
this._summaryBoxPointerContentUpdatedId = 0; this._summaryBoxPointerContentUpdatedId = 0;
this._summaryBoxPointerItem.closeButton.disconnect(this._summaryBoxPointerCloseClickedId);
this._summaryBoxPointerCloseClickedId = 0;
this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId); this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId);
this._summaryBoxPointerDoneDisplayingId = 0; this._summaryBoxPointerDoneDisplayingId = 0;

View File

@ -37,10 +37,12 @@ const ModalDialog = new Lang.Class({
params = Params.parse(params, { shellReactive: false, params = Params.parse(params, { shellReactive: false,
styleClass: null, styleClass: null,
parentActor: Main.uiGroup, parentActor: Main.uiGroup,
keybindingMode: Main.KeybindingMode.SYSTEM_MODAL,
shouldFadeIn: true }); shouldFadeIn: true });
this.state = State.CLOSED; this.state = State.CLOSED;
this._hasModal = false; this._hasModal = false;
this._keybindingMode = params.keybindingMode;
this._shellReactive = params.shellReactive; this._shellReactive = params.shellReactive;
this._shouldFadeIn = params.shouldFadeIn; this._shouldFadeIn = params.shouldFadeIn;
@ -226,7 +228,7 @@ const ModalDialog = new Lang.Class({
if (this.state == State.OPENED || this.state == State.OPENING) if (this.state == State.OPENED || this.state == State.OPENING)
return true; return true;
if (!this.pushModal(timestamp)) if (!this.pushModal({ timestamp: timestamp }))
return false; return false;
this._fadeOpen(onPrimary); this._fadeOpen(onPrimary);
@ -276,7 +278,8 @@ const ModalDialog = new Lang.Class({
pushModal: function (timestamp) { pushModal: function (timestamp) {
if (this._hasModal) if (this._hasModal)
return true; return true;
if (!Main.pushModal(this._group, timestamp)) if (!Main.pushModal(this._group, { timestamp: timestamp,
keybindingMode: this._keybindingMode }))
return false; return false;
this._hasModal = true; this._hasModal = true;

View File

@ -28,6 +28,24 @@ const DASH_MAX_WIDTH = 96;
const DND_WINDOW_SWITCH_TIMEOUT = 1250; const DND_WINDOW_SWITCH_TIMEOUT = 1250;
const GLSL_DIM_EFFECT_DECLARATIONS = '';
const GLSL_DIM_EFFECT_CODE = '\
vec2 dist = cogl_tex_coord_in[0].xy - vec2(0.5, 0.5); \
float elipse_radius = 0.5; \
/* from https://bugzilla.gnome.org/show_bug.cgi?id=669798: \
the alpha on the gradient goes from 165 at its darkest to 98 at its most transparent. */ \
float y = 165.0 / 255.0; \
float x = 98.0 / 255.0; \
/* interpolate darkening value, based on distance from screen center */ \
float val = min(length(dist), elipse_radius); \
float a = mix(x, y, val / elipse_radius); \
/* dim_factor varies from [1.0 -> 0.5] when overview is showing \
We use it to smooth value, then we clamp it to valid color interval */ \
a = clamp(a - cogl_color_in.r + 0.5, 0.0, 1.0); \
/* We\'re blending between: color and black color (obviously omitted in the equation) */ \
cogl_color_out.xyz = cogl_color_out.xyz * (1.0 - a); \
cogl_color_out.a = 1.0;';
const SwipeScrollDirection = { const SwipeScrollDirection = {
NONE: 0, NONE: 0,
HORIZONTAL: 1, HORIZONTAL: 1,
@ -57,7 +75,14 @@ const ShellInfo = new Lang.Class({
this._source.destroy(); this._source.destroy();
}, },
setMessage: function(text, undoCallback, undoLabel) { setMessage: function(text, options) {
options = Params.parse(options, { undoCallback: null,
forFeedback: false
});
let undoCallback = options.undoCallback;
let forFeedback = options.forFeedback;
if (this._source == null) { if (this._source == null) {
this._source = new MessageTray.SystemNotificationSource(); this._source = new MessageTray.SystemNotificationSource();
this._source.connect('destroy', Lang.bind(this, this._source.connect('destroy', Lang.bind(this,
@ -71,6 +96,7 @@ const ShellInfo = new Lang.Class({
if (this._source.notifications.length == 0) { if (this._source.notifications.length == 0) {
notification = new MessageTray.Notification(this._source, text, null); notification = new MessageTray.Notification(this._source, text, null);
notification.setTransient(true); notification.setTransient(true);
notification.setForFeedback(forFeedback);
} else { } else {
notification = this._source.notifications[0]; notification = this._source.notifications[0];
notification.update(text, null, { clear: true }); notification.update(text, null, { clear: true });
@ -78,10 +104,8 @@ const ShellInfo = new Lang.Class({
this._undoCallback = undoCallback; this._undoCallback = undoCallback;
if (undoCallback) { if (undoCallback) {
notification.addButton('system-undo', notification.addButton('system-undo', _("Undo"));
undoLabel ? undoLabel : _("Undo")); notification.connect('action-invoked', Lang.bind(this, this._onUndoClicked));
notification.connect('action-invoked',
Lang.bind(this, this._onUndoClicked));
} }
this._source.notify(notification); this._source.notify(notification);
@ -113,6 +137,10 @@ const Overview = new Lang.Class({
// scenes which allows us to show the background with different // scenes which allows us to show the background with different
// rendering options without duplicating the texture data. // rendering options without duplicating the texture data.
this._background = Meta.BackgroundActor.new_for_screen(global.screen); this._background = Meta.BackgroundActor.new_for_screen(global.screen);
this._background.add_glsl_snippet(Meta.SnippetHook.FRAGMENT,
GLSL_DIM_EFFECT_DECLARATIONS,
GLSL_DIM_EFFECT_CODE,
false);
this._background.hide(); this._background.hide();
global.overlay_group.add_actor(this._background); global.overlay_group.add_actor(this._background);
@ -233,11 +261,16 @@ const Overview = new Lang.Class({
this._viewSelector.removeSearchProvider(provider); this._viewSelector.removeSearchProvider(provider);
}, },
setMessage: function(text, undoCallback, undoLabel) { //
// options:
// - undoCallback (function): the callback to be called if undo support is needed
// - forFeedback (boolean): whether the message is for direct feedback of a user action
//
setMessage: function(text, options) {
if (this.isDummy) if (this.isDummy)
return; return;
this._shellInfo.setMessage(text, undoCallback, undoLabel); this._shellInfo.setMessage(text, options);
}, },
_onDragBegin: function() { _onDragBegin: function() {
@ -558,7 +591,7 @@ const Overview = new Lang.Class({
if (this._shown) if (this._shown)
return; return;
// Do this manually instead of using _syncInputMode, to handle failure // Do this manually instead of using _syncInputMode, to handle failure
if (!Main.pushModal(this._group)) if (!Main.pushModal(this._group, { keybindingMode: Main.KeybindingMode.OVERVIEW }))
return; return;
this._modal = true; this._modal = true;
this._animateVisible(); this._animateVisible();
@ -622,7 +655,7 @@ const Overview = new Lang.Class({
}); });
Tweener.addTween(this._background, Tweener.addTween(this._background,
{ dim_factor: 0.4, { dim_factor: 0.8,
time: ANIMATION_TIME, time: ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
@ -709,7 +742,8 @@ const Overview = new Lang.Class({
if (this._shown) { if (this._shown) {
if (!this._modal) { if (!this._modal) {
if (Main.pushModal(this._group)) if (Main.pushModal(this._group,
{ keybindingMode: Main.KeybindingMode.OVERVIEW }))
this._modal = true; this._modal = true;
else else
this.hide(); this.hide();

View File

@ -82,26 +82,34 @@ const AnimatedIcon = new Lang.Class({
_init: function(name, size) { _init: function(name, size) {
this.actor = new St.Bin({ visible: false }); this.actor = new St.Bin({ visible: false });
this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this.actor.connect('notify::visible', Lang.bind(this, this._onVisibleNotify));
this._isLoaded = false;
this._isPlaying = false;
this._timeoutId = 0; this._timeoutId = 0;
this._frame = 0; this._frame = 0;
this._animations = St.TextureCache.get_default().load_sliced_image (global.datadir + '/theme/' + name, size, size); this._animations = St.TextureCache.get_default().load_sliced_image (global.datadir + '/theme/' + name, size, size,
Lang.bind(this, this._animationsLoaded));
this.actor.set_child(this._animations); this.actor.set_child(this._animations);
}, },
_disconnectTimeout: function() { play: function() {
if (this._isLoaded && this._timeoutId == 0) {
if (this._frame == 0)
this._showFrame(0);
this._timeoutId = Mainloop.timeout_add(ANIMATED_ICON_UPDATE_TIMEOUT, Lang.bind(this, this._update));
}
this._isPlaying = true;
},
stop: function() {
if (this._timeoutId > 0) { if (this._timeoutId > 0) {
Mainloop.source_remove(this._timeoutId); Mainloop.source_remove(this._timeoutId);
this._timeoutId = 0; this._timeoutId = 0;
} }
},
_onVisibleNotify: function() { this._isPlaying = false;
if (this.actor.visible)
this._timeoutId = Mainloop.timeout_add(ANIMATED_ICON_UPDATE_TIMEOUT, Lang.bind(this, this._update));
else
this._disconnectTimeout();
}, },
_showFrame: function(frame) { _showFrame: function(frame) {
@ -121,8 +129,17 @@ const AnimatedIcon = new Lang.Class({
return true; return true;
}, },
_animationsLoaded: function() {
this._isLoaded = true;
if (this._isPlaying) {
this._showFrame(0);
this._timeoutId = Mainloop.timeout_add(ANIMATED_ICON_UPDATE_TIMEOUT, Lang.bind(this, this._update));
}
},
_onDestroy: function() { _onDestroy: function() {
this._disconnectTimeout(); this.stop();
} }
}); });
@ -247,6 +264,10 @@ const AppMenuButton = new Lang.Class({
this._container.connect('get-preferred-height', Lang.bind(this, this._getContentPreferredHeight)); this._container.connect('get-preferred-height', Lang.bind(this, this._getContentPreferredHeight));
this._container.connect('allocate', Lang.bind(this, this._contentAllocate)); this._container.connect('allocate', Lang.bind(this, this._contentAllocate));
let textureCache = St.TextureCache.get_default();
textureCache.connect('icon-theme-changed',
Lang.bind(this, this._onIconThemeChanged));
this._iconBox = new Shell.Slicer({ name: 'appMenuIcon' }); this._iconBox = new Shell.Slicer({ name: 'appMenuIcon' });
this._iconBox.connect('style-changed', this._iconBox.connect('style-changed',
Lang.bind(this, this._onIconBoxStyleChanged)); Lang.bind(this, this._onIconBoxStyleChanged));
@ -332,6 +353,15 @@ const AppMenuButton = new Lang.Class({
this._updateIconBoxClip(); this._updateIconBoxClip();
}, },
_onIconThemeChanged: function() {
if (this._iconBox.child == null)
return;
this._iconBox.child.destroy();
let icon = this._targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
this._iconBox.set_child(icon);
},
_updateIconBoxClip: function() { _updateIconBoxClip: function() {
let allocation = this._iconBox.allocation; let allocation = this._iconBox.allocation;
if (this._iconBottomClip > 0) if (this._iconBottomClip > 0)
@ -354,6 +384,7 @@ const AppMenuButton = new Lang.Class({
transition: "easeOutQuad", transition: "easeOutQuad",
onCompleteScope: this, onCompleteScope: this,
onComplete: function() { onComplete: function() {
this._spinner.stop();
this._spinner.actor.opacity = 255; this._spinner.actor.opacity = 255;
this._spinner.actor.hide(); this._spinner.actor.hide();
} }
@ -363,6 +394,7 @@ const AppMenuButton = new Lang.Class({
startAnimation: function() { startAnimation: function() {
this._stop = false; this._stop = false;
this.actor.reactive = false; this.actor.reactive = false;
this._spinner.play();
this._spinner.actor.show(); this._spinner.actor.show();
}, },
@ -901,6 +933,7 @@ const PANEL_ITEM_IMPLEMENTATIONS = {
'volume': imports.ui.status.volume.Indicator, 'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator, 'battery': imports.ui.status.power.Indicator,
'lockScreen': imports.ui.status.lockScreenMenu.Indicator, 'lockScreen': imports.ui.status.lockScreenMenu.Indicator,
'logo': imports.gdm.loginDialog.LogoMenuButton,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator, 'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
'powerMenu': imports.gdm.powerMenu.PowerMenuButton, 'powerMenu': imports.gdm.powerMenu.PowerMenuButton,
'userMenu': imports.ui.userMenu.UserMenuButton 'userMenu': imports.ui.userMenu.UserMenuButton

View File

@ -214,7 +214,8 @@ const Button = new Lang.Class({
destroy: function() { destroy: function() {
this.actor._delegate = null; this.actor._delegate = null;
this.menu.destroy(); if (this.menu)
this.menu.destroy();
this.actor.destroy(); this.actor.destroy();
this.emit('destroy'); this.emit('destroy');

View File

@ -1269,13 +1269,14 @@ const PopupMenu = new Lang.Class({
}, },
close: function(animate) { close: function(animate) {
if (!this.isOpen)
return;
if (this._activeMenuItem) if (this._activeMenuItem)
this._activeMenuItem.setActive(false); this._activeMenuItem.setActive(false);
this._boxPointer.hide(animate); if (this._boxPointer.actor.visible)
this._boxPointer.hide(animate);
if (!this.isOpen)
return;
this.isOpen = false; this.isOpen = false;
this.emit('open-state-changed', false); this.emit('open-state-changed', false);

View File

@ -31,20 +31,37 @@ const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface); var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface);
function loadRemoteSearchProviders(addProviderCallback) { function loadRemoteSearchProviders(addProviderCallback) {
let loadState = { loadedProviders: [],
objectPaths: {},
numLoading: 0,
addProviderCallback: addProviderCallback };
let dataDirs = GLib.get_system_data_dirs(); let dataDirs = GLib.get_system_data_dirs();
let loadedProviders = {};
for (let i = 0; i < dataDirs.length; i++) { for (let i = 0; i < dataDirs.length; i++) {
let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'search-providers']); let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'search-providers']);
let dir = Gio.file_new_for_path(path); let dir = Gio.file_new_for_path(path);
if (!dir.query_exists(null))
continue; dir.query_info_async('standard:type', Gio.FileQueryInfoFlags.NONE,
loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallback); GLib.PRIORITY_DEFAULT, null,
function(object, res) {
let exists = false;
try {
object.query_info_finish(res);
exists = true;
} catch (e) {
}
if (!exists)
return;
loadState.numLoading++;
loadRemoteSearchProvidersFromDir(dir, loadState);
});
} }
}; };
function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallback) { function loadRemoteSearchProvidersFromDir(dir, loadState) {
let dirPath = dir.get_path(); let dirPath = dir.get_path();
FileUtils.listDirAsync(dir, Lang.bind(this, function(files) { FileUtils.listDirAsync(dir, Lang.bind(this, function(files) {
for (let i = 0; i < files.length; i++) { for (let i = 0; i < files.length; i++) {
@ -60,13 +77,13 @@ function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallb
if (!keyfile.has_group(KEY_FILE_GROUP)) if (!keyfile.has_group(KEY_FILE_GROUP))
continue; continue;
let remoteProvider, title; let remoteProvider;
try { try {
let group = KEY_FILE_GROUP; let group = KEY_FILE_GROUP;
let busName = keyfile.get_string(group, 'BusName'); let busName = keyfile.get_string(group, 'BusName');
let objectPath = keyfile.get_string(group, 'ObjectPath'); let objectPath = keyfile.get_string(group, 'ObjectPath');
if (loadedProviders[objectPath]) if (loadState.objectPaths[objectPath])
continue; continue;
let appInfo = null; let appInfo = null;
@ -74,46 +91,93 @@ function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallb
let desktopId = keyfile.get_string(group, 'DesktopId'); let desktopId = keyfile.get_string(group, 'DesktopId');
appInfo = Gio.DesktopAppInfo.new(desktopId); appInfo = Gio.DesktopAppInfo.new(desktopId);
} catch (e) { } catch (e) {
log('Ignoring search provider ' + path + ': missing DesktopId');
continue;
} }
let icon; remoteProvider = new RemoteSearchProvider(appInfo,
if (appInfo) {
icon = appInfo.get_icon();
title = appInfo.get_name();
} else {
let iconName = keyfile.get_string(group, 'Icon');
icon = new Gio.ThemedIcon({ name: iconName });
title = keyfile.get_locale_string(group, 'Title', null);
}
remoteProvider = new RemoteSearchProvider(title,
icon,
busName, busName,
objectPath); objectPath);
loadedProviders[objectPath] = remoteProvider; loadState.objectPaths[objectPath] = remoteProvider;
loadState.loadedProviders.push(remoteProvider);
} catch(e) { } catch(e) {
log('Failed to add search provider "%s": %s'.format(title, e.toString())); log('Failed to add search provider %s: %s'.format(path, e.toString()));
continue; continue;
} }
addProviderCallback(remoteProvider);
} }
remoteProvidersDirLoaded(loadState);
})); }));
}; };
function remoteProvidersDirLoaded(loadState) {
loadState.numLoading--;
if (loadState.numLoading > 0)
return;
let searchSettings = new Gio.Settings({ schema: Search.SEARCH_PROVIDERS_SCHEMA });
let sortOrder = searchSettings.get_strv('sort-order');
let numSorted = sortOrder.length;
loadState.loadedProviders.sort(
function(providerA, providerB) {
let idxA, idxB;
let appIdA, appIdB;
appIdA = providerA.appInfo.get_id();
appIdB = providerB.appInfo.get_id();
idxA = sortOrder.indexOf(appIdA);
idxB = sortOrder.indexOf(appIdB);
// if no provider is found in the order, use alphabetical order
if ((idxA == -1) && (idxB == -1))
return GLib.utf8_collate(providerA.title, providerB.title);
if (numSorted > 1) {
// if providerA is the last, it goes after everything
if ((idxA + 1) == numSorted)
return 1;
// if providerB is the last, it goes after everything
else if ((idxB + 1) == numSorted)
return -1;
}
// if providerA isn't found, it's sorted after providerB
if (idxA == -1)
return 1;
// if providerB isn't found, it's sorted after providerA
if (idxB == -1)
return -1;
// finally, if both providers are found, return their order in the list
return (idxA - idxB);
});
loadState.loadedProviders.forEach(
function(provider) {
loadState.addProviderCallback(provider);
});
}
const RemoteSearchProvider = new Lang.Class({ const RemoteSearchProvider = new Lang.Class({
Name: 'RemoteSearchProvider', Name: 'RemoteSearchProvider',
Extends: Search.SearchProvider, Extends: Search.SearchProvider,
_init: function(title, icon, dbusName, dbusPath) { _init: function(appInfo, dbusName, dbusPath) {
this._proxy = new SearchProviderProxy(Gio.DBus.session, this._proxy = new SearchProviderProxy(Gio.DBus.session,
dbusName, dbusPath); dbusName, dbusPath, Lang.bind(this, this._onProxyConstructed));
this.parent(title.toUpperCase()); this.parent(appInfo.get_name().toUpperCase(), appInfo, true);
this._cancellable = new Gio.Cancellable(); this._cancellable = new Gio.Cancellable();
}, },
_onProxyConstructed: function(proxy) {
// Do nothing
},
createIcon: function(size, meta) { createIcon: function(size, meta) {
if (meta['gicon']) { if (meta['gicon']) {
return new St.Icon({ gicon: Gio.icon_new_for_string(meta['gicon']), return new St.Icon({ gicon: Gio.icon_new_for_string(meta['gicon']),

View File

@ -202,11 +202,12 @@ const RunDialog = new Lang.Class({
let label = new St.Label({ style_class: 'run-dialog-label', let label = new St.Label({ style_class: 'run-dialog-label',
text: _("Please enter a command:") }); text: _("Enter a Command") });
this.contentLayout.add(label, { y_align: St.Align.START }); this.contentLayout.add(label, { y_align: St.Align.START });
let entry = new St.Entry({ style_class: 'run-dialog-entry' }); let entry = new St.Entry({ style_class: 'run-dialog-entry',
can_focus: true });
ShellEntry.addContextMenu(entry); ShellEntry.addContextMenu(entry);
entry.label_actor = label; entry.label_actor = label;
@ -236,6 +237,10 @@ const RunDialog = new Lang.Class({
this._errorBox.hide(); this._errorBox.hide();
this.setButtons([{ action: Lang.bind(this, this.close),
label: _("Close"),
key: Clutter.Escape }]);
this._pathCompleter = new Gio.FilenameCompleter(); this._pathCompleter = new Gio.FilenameCompleter();
this._commandCompleter = new CommandCompleter(); this._commandCompleter = new CommandCompleter();
this._group.connect('notify::visible', Lang.bind(this._commandCompleter, this._commandCompleter.update)); this._group.connect('notify::visible', Lang.bind(this._commandCompleter, this._commandCompleter.update));
@ -246,20 +251,12 @@ const RunDialog = new Lang.Class({
let symbol = e.get_key_symbol(); let symbol = e.get_key_symbol();
if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) { if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
this.popModal(); this.popModal();
if (e.get_state() & Clutter.ModifierType.CONTROL_MASK) this._run(o.get_text(),
this._run(o.get_text(), true); e.get_state() & Clutter.ModifierType.CONTROL_MASK);
else if (!this._commandError ||
this._run(o.get_text(), false); !this.pushModal())
if (!this._commandError)
this.close(); this.close();
else {
if (!this.pushModal())
this.close();
}
return true;
}
if (symbol == Clutter.Escape) {
this.close();
return true; return true;
} }
if (symbol == Clutter.slash) { if (symbol == Clutter.slash) {

View File

@ -26,7 +26,7 @@ const Util = imports.misc.util;
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver'; const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
const LOCK_ENABLED_KEY = 'lock-enabled'; const LOCK_ENABLED_KEY = 'lock-enabled';
const CURTAIN_SLIDE_TIME = 0.5; const CURTAIN_SLIDE_TIME = 0.3;
// fraction of screen height the arrow must reach before completing // fraction of screen height the arrow must reach before completing
// the slide up automatically // the slide up automatically
const ARROW_DRAG_THRESHOLD = 0.1; const ARROW_DRAG_THRESHOLD = 0.1;
@ -47,7 +47,39 @@ const SUMMARY_ICON_SIZE = 48;
// STANDARD_FADE_TIME is used when the session goes idle, while // STANDARD_FADE_TIME is used when the session goes idle, while
// SHORT_FADE_TIME is used when requesting lock explicitly from the user menu // SHORT_FADE_TIME is used when requesting lock explicitly from the user menu
const STANDARD_FADE_TIME = 10; const STANDARD_FADE_TIME = 10;
const SHORT_FADE_TIME = 0.8; const SHORT_FADE_TIME = 0.3;
function sample(offx, offy) {
return 'texel += texture2D (sampler, tex_coord.st + pixel_step * ' +
'vec2 (' + offx + ',' + offy + '));\n'
}
const GLSL_BLUR_EFFECT_DECLARATIONS = ' \
uniform vec2 pixel_step;\n \
uniform float desaturation;\n \
vec4 apply_blur(in sampler2D sampler, in vec2 tex_coord) {\n \
vec4 texel;\n \
texel = texture2D (sampler, tex_coord.st);\n'
+ sample(-1.0, -1.0)
+ sample( 0.0, -1.0)
+ sample(+1.0, -1.0)
+ sample(-1.0, 0.0)
+ sample(+1.0, 0.0)
+ sample(-1.0, +1.0)
+ sample( 0.0, +1.0)
+ sample(+1.0, +1.0) + ' \
texel /= 9.0;\n \
return texel;\n \
}\n \
vec3 desaturate (const vec3 color)\n \
{\n \
const vec3 gray_conv = vec3 (0.299, 0.587, 0.114);\n \
vec3 gray = vec3 (dot (gray_conv, color));\n \
return vec3 (mix (color.rgb, gray, desaturation));\n \
}';
const GLSL_BLUR_EFFECT_CODE = ' \
cogl_texel = apply_blur(cogl_sampler, cogl_tex_coord.st);\n \
cogl_texel.rgb = desaturate(cogl_texel.rgb);\n';
const Clock = new Lang.Class({ const Clock = new Lang.Class({
Name: 'ScreenShieldClock', Name: 'ScreenShieldClock',
@ -186,7 +218,7 @@ const NotificationsBox = new Lang.Class({
if (obj.resident) { if (obj.resident) {
this._residentNotificationBox.add(item.notificationStackWidget); this._residentNotificationBox.add(item.notificationStackWidget);
item.closeButtonVisible = false; item.closeButton.hide();
item.prepareNotificationStackForShowing(); item.prepareNotificationStackForShowing();
} else { } else {
[obj.sourceBox, obj.countLabel] = this._makeNotificationSource(item.source); [obj.sourceBox, obj.countLabel] = this._makeNotificationSource(item.source);
@ -244,7 +276,7 @@ const NotificationsBox = new Lang.Class({
obj.resident = true; obj.resident = true;
this._residentNotificationBox.add(obj.item.notificationStackWidget); this._residentNotificationBox.add(obj.item.notificationStackWidget);
obj.item.closeButtonVisible = false; obj.item.closeButton.hide();
obj.item.prepareNotificationStackForShowing(); obj.item.prepareNotificationStackForShowing();
} else { } else {
// just update the counter // just update the counter
@ -335,6 +367,10 @@ const Arrow = new Lang.Class({
} }
}); });
function clamp(value, min, max) {
return Math.max(min, Math.min(max, value));
}
/** /**
* To test screen shield, make sure to kill gnome-screensaver. * To test screen shield, make sure to kill gnome-screensaver.
* *
@ -362,13 +398,25 @@ const ScreenShield = new Lang.Class({
Lang.bind(this, this._onLockScreenKeyRelease)); Lang.bind(this, this._onLockScreenKeyRelease));
this._lockScreenGroup.connect('scroll-event', this._lockScreenGroup.connect('scroll-event',
Lang.bind(this, this._onLockScreenScroll)); Lang.bind(this, this._onLockScreenScroll));
Main.ctrlAltTabManager.addGroup(this._lockScreenGroup, _("Lock"), 'changes-prevent-symbolic');
this._lockScreenContents = new St.Widget({ layout_manager: new Clutter.BinLayout(), this._lockScreenContents = new St.Widget({ layout_manager: new Clutter.BinLayout(),
name: 'lockScreenContents' }); name: 'lockScreenContents' });
this._lockScreenContents.add_constraint(new Layout.MonitorConstraint({ primary: true })); this._lockScreenContents.add_constraint(new Layout.MonitorConstraint({ primary: true }));
let backgroundActor = Meta.BackgroundActor.new_for_screen(global.screen);
backgroundActor.add_glsl_snippet(Meta.SnippetHook.TEXTURE_LOOKUP,
GLSL_BLUR_EFFECT_DECLARATIONS,
GLSL_BLUR_EFFECT_CODE,
true);
backgroundActor.set_uniform_float('desaturation',
1, 1, [0.6]);
backgroundActor.connect('notify::size', function(actor) {
actor.set_uniform_float('pixel_step', 2, 1, [1/actor.width, 1/actor.height]);
});
this._background = new St.Bin({ style_class: 'screen-shield-background', this._background = new St.Bin({ style_class: 'screen-shield-background',
child: Meta.BackgroundActor.new_for_screen(global.screen) }); child: backgroundActor });
this._lockScreenGroup.add_actor(this._background); this._lockScreenGroup.add_actor(this._background);
this._lockScreenGroup.add_actor(this._lockScreenContents); this._lockScreenGroup.add_actor(this._lockScreenContents);
@ -387,14 +435,11 @@ const ScreenShield = new Lang.Class({
} }
this._lockScreenContents.add_actor(this._arrowContainer); this._lockScreenContents.add_actor(this._arrowContainer);
let dragArea = new Clutter.Rect({ origin: new Clutter.Point({ x: 0, y: -global.screen_height, }), this._dragAction = new Clutter.GestureAction();
size: new Clutter.Size({ width: global.screen_width, this._dragAction.connect('gesture-begin', Lang.bind(this, this._onDragBegin));
height: global.screen_height }) }); this._dragAction.connect('gesture-progress', Lang.bind(this, this._onDragMotion));
let action = new Clutter.DragAction({ drag_axis: Clutter.DragAxis.Y_AXIS, this._dragAction.connect('gesture-end', Lang.bind(this, this._onDragEnd));
drag_area: dragArea }); this._lockScreenGroup.add_action(this._dragAction);
action.connect('drag-begin', Lang.bind(this, this._onDragBegin));
action.connect('drag-end', Lang.bind(this, this._onDragEnd));
this._lockScreenGroup.add_action(action);
this._lockDialogGroup = new St.Widget({ x_expand: true, this._lockDialogGroup = new St.Widget({ x_expand: true,
y_expand: true, y_expand: true,
@ -436,6 +481,8 @@ const ScreenShield = new Lang.Class({
{ inhibitEvents: true, { inhibitEvents: true,
fadeInTime: STANDARD_FADE_TIME, fadeInTime: STANDARD_FADE_TIME,
fadeFactor: 1 }); fadeFactor: 1 });
this.idleMonitor = new GnomeDesktop.IdleMonitor();
}, },
_onLockScreenKeyRelease: function(actor, event) { _onLockScreenKeyRelease: function(actor, event) {
@ -456,7 +503,7 @@ const ScreenShield = new Lang.Class({
symbol == Clutter.KEY_Return || symbol == Clutter.KEY_Return ||
symbol == Clutter.KEY_KP_Enter) { symbol == Clutter.KEY_KP_Enter) {
this._ensureUnlockDialog(true); this._ensureUnlockDialog(true);
this._hideLockScreen(true); this._hideLockScreen(true, 0);
return true; return true;
} }
@ -479,7 +526,7 @@ const ScreenShield = new Lang.Class({
// 7 standard scrolls to lift up // 7 standard scrolls to lift up
if (this._lockScreenScrollCounter > 35) { if (this._lockScreenScrollCounter > 35) {
this._ensureUnlockDialog(false); this._ensureUnlockDialog(false);
this._hideLockScreen(true); this._hideLockScreen(true, 0);
} }
return true; return true;
@ -511,12 +558,27 @@ const ScreenShield = new Lang.Class({
Tweener.removeTweens(this._lockScreenGroup); Tweener.removeTweens(this._lockScreenGroup);
this._lockScreenState = MessageTray.State.HIDING; this._lockScreenState = MessageTray.State.HIDING;
this._ensureUnlockDialog(false); this._ensureUnlockDialog(false);
return true;
},
_onDragMotion: function() {
let [origX, origY] = this._dragAction.get_press_coords(0);
let [currentX, currentY] = this._dragAction.get_motion_coords(0);
let newY = currentY - origY;
newY = clamp(newY, -global.stage.height, 0);
this._lockScreenGroup.y = newY;
return true;
}, },
_onDragEnd: function(action, actor, eventX, eventY, modifiers) { _onDragEnd: function(action, actor, eventX, eventY, modifiers) {
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
this._hideLockScreen(true); let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0);
this._hideLockScreen(true, -velocityY);
} else { } else {
// restore the lock screen to its original place // restore the lock screen to its original place
// try to use the same speed as the normal animation // try to use the same speed as the normal animation
@ -526,7 +588,7 @@ const ScreenShield = new Lang.Class({
Tweener.addTween(this._lockScreenGroup, Tweener.addTween(this._lockScreenGroup,
{ y: 0, { y: 0,
time: time, time: time,
transition: 'linear', transition: 'easeInQuad',
onComplete: function() { onComplete: function() {
this._lockScreenGroup.fixed_position_set = false; this._lockScreenGroup.fixed_position_set = false;
this._lockScreenState = MessageTray.State.SHOWN; this._lockScreenState = MessageTray.State.SHOWN;
@ -545,55 +607,62 @@ const ScreenShield = new Lang.Class({
}, },
_onStatusChanged: function(status) { _onStatusChanged: function(status) {
if (status == GnomeSession.PresenceStatus.IDLE) { if (status != GnomeSession.PresenceStatus.IDLE)
if (this._dialog) { return;
this._dialog.cancel();
if (!this._isGreeter) { if (this._dialog) {
this._dialog = null; this._dialog.cancel();
if (!this._isGreeter) {
this._dialog = null;
}
}
if (!this._isModal) {
Main.pushModal(this.actor, { keybindingMode: Main.KeybindingMode.LOCK_SCREEN });
this._isModal = true;
}
if (!this._isActive) {
this._lightbox.show();
if (this._activationTime == 0)
this._activationTime = GLib.get_monotonic_time();
this._becameActiveId = this.idleMonitor.connect('became-active', Lang.bind(this, function() {
this.idleMonitor.disconnect(this._becameActiveId);
let lightboxWasShown = this._lightbox.shown;
this._lightbox.hide();
let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY);
if (shouldLock || this._isLocked) {
this.lock(false);
} else if (this._isActive) {
this.unlock();
} }
} }));
if (!this._isModal) { this._isActive = true;
Main.pushModal(this.actor); this.emit('lock-status-changed');
this._isModal = true;
}
if (!this._isActive) {
this._lightbox.show();
if (this._activationTime == 0)
this._activationTime = GLib.get_monotonic_time();
}
} else {
let lightboxWasShown = this._lightbox.shown;
this._lightbox.hide();
let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY);
if (shouldLock || this._isActive) {
this.lock(false);
} else if (this._isModal) {
this.unlock();
}
} }
}, },
showDialog: function() { showDialog: function() {
// Ensure that the stage window is mapped, before taking a grab // Ensure that the stage window is mapped, before taking a grab
// otherwise X errors out // otherwise X errors out
let actorShownId = 0; Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
actorShownId = this.actor.connect('show', Lang.bind(this, function() {
if (!this._isModal) { if (!this._isModal) {
Main.pushModal(this.actor); Main.pushModal(this.actor);
this._isModal = true; this._isModal = true;
} }
this.actor.disconnect(actorShownId); return false;
})); }));
this.actor.show(); this.actor.show();
this._isGreeter = Main.sessionMode.isGreeter; this._isGreeter = Main.sessionMode.isGreeter;
this._ensureUnlockDialog(true); this._ensureUnlockDialog(true);
this._hideLockScreen(false); this._hideLockScreen(false, 0);
}, },
_bumpLockScreen: function() { _bumpLockScreen: function() {
@ -611,19 +680,26 @@ const ScreenShield = new Lang.Class({
}); });
}, },
_hideLockScreen: function(animate) { _hideLockScreen: function(animate, velocity) {
this._lockScreenState = MessageTray.State.HIDING; this._lockScreenState = MessageTray.State.HIDING;
if (animate) { if (animate) {
// Tween the lock screen out of screen // Tween the lock screen out of screen
// try to use the same speed regardless of original position // if velocity is not specified (i.e. we come here from pressing ESC),
// use the same speed regardless of original position
// if velocity is specified, it's in pixels per milliseconds
let h = global.stage.height; let h = global.stage.height;
let time = CURTAIN_SLIDE_TIME * (h + this._lockScreenGroup.y) / h; let delta = (h + this._lockScreenGroup.y);
let min_velocity = global.stage.height / (CURTAIN_SLIDE_TIME * 1000);
velocity = Math.max(min_velocity, velocity);
let time = (delta / velocity) / 1000;
Tweener.removeTweens(this._lockScreenGroup); Tweener.removeTweens(this._lockScreenGroup);
Tweener.addTween(this._lockScreenGroup, Tweener.addTween(this._lockScreenGroup,
{ y: -h, { y: -h,
time: time, time: time,
transition: 'linear', transition: 'easeInQuad',
onComplete: function() { onComplete: function() {
this._lockScreenState = MessageTray.State.HIDDEN; this._lockScreenState = MessageTray.State.HIDDEN;
this._lockScreenGroup.hide(); this._lockScreenGroup.hide();
@ -635,6 +711,8 @@ const ScreenShield = new Lang.Class({
this._lockScreenGroup.hide(); this._lockScreenGroup.hide();
} }
global.stage.show_cursor();
if (Main.sessionMode.currentMode == 'lock-screen') if (Main.sessionMode.currentMode == 'lock-screen')
Main.sessionMode.popMode('lock-screen'); Main.sessionMode.popMode('lock-screen');
}, },
@ -642,13 +720,15 @@ const ScreenShield = new Lang.Class({
_ensureUnlockDialog: function(onPrimary) { _ensureUnlockDialog: function(onPrimary) {
if (!this._dialog) { if (!this._dialog) {
let constructor = Main.sessionMode.unlockDialog; let constructor = Main.sessionMode.unlockDialog;
this._dialog = new constructor(this._lockDialogGroup); if (!constructor) {
if (!this._dialog) {
// This session mode has no locking capabilities // This session mode has no locking capabilities
this.unlock(); this.unlock();
return; return;
} }
this._dialog = new constructor(this._lockDialogGroup);
let time = global.get_current_time(); let time = global.get_current_time();
this._dialog.connect('loaded', Lang.bind(this, function() { this._dialog.connect('loaded', Lang.bind(this, function() {
if (!this._dialog.open(time, onPrimary)) { if (!this._dialog.open(time, onPrimary)) {
@ -684,7 +764,7 @@ const ScreenShield = new Lang.Class({
Tweener.addTween(this._lockScreenGroup, Tweener.addTween(this._lockScreenGroup,
{ y: 0, { y: 0,
time: SHORT_FADE_TIME, time: SHORT_FADE_TIME,
transition: 'linear', transition: 'easeOutQuad',
onComplete: function() { onComplete: function() {
this._lockScreenShown(); this._lockScreenShown();
}, },
@ -723,6 +803,16 @@ const ScreenShield = new Lang.Class({
this._arrowAnimationId = Mainloop.timeout_add(6000, Lang.bind(this, this._animateArrows)); this._arrowAnimationId = Mainloop.timeout_add(6000, Lang.bind(this, this._animateArrows));
this._animateArrows(); this._animateArrows();
let motionId = global.stage.connect('captured-event', function(stage, event) {
if (event.type() == Clutter.EventType.MOTION) {
global.stage.show_cursor();
global.stage.disconnect(motionId);
}
return false;
});
global.stage.hide_cursor();
this._lockScreenState = MessageTray.State.SHOWN; this._lockScreenState = MessageTray.State.SHOWN;
this._lockScreenGroup.fixed_position_set = false; this._lockScreenGroup.fixed_position_set = false;
this._lockScreenScrollCounter = 0; this._lockScreenScrollCounter = 0;
@ -831,12 +921,13 @@ const ScreenShield = new Lang.Class({
this._activationTime = 0; this._activationTime = 0;
this._isActive = false; this._isActive = false;
this._isLocked = false;
this.emit('lock-status-changed'); this.emit('lock-status-changed');
}, },
lock: function(animate) { lock: function(animate) {
if (!this._isModal) { if (!this._isModal) {
Main.pushModal(this.actor); Main.pushModal(this.actor, { keybindingMode: Main.KeybindingMode.LOCK_SCREEN });
this._isModal = true; this._isModal = true;
} }
@ -855,6 +946,7 @@ const ScreenShield = new Lang.Class({
this._resetLockScreen(animate, animate); this._resetLockScreen(animate, animate);
this._isActive = true; this._isActive = true;
this._isLocked = true;
this.emit('lock-status-changed'); this.emit('lock-status-changed');
}, },
}); });

View File

@ -10,6 +10,8 @@ const Util = imports.misc.util;
const FileUtils = imports.misc.fileUtils; const FileUtils = imports.misc.fileUtils;
const Main = imports.ui.main; const Main = imports.ui.main;
const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers';
// Not currently referenced by the search API, but // Not currently referenced by the search API, but
// this enumeration can be useful for provider // this enumeration can be useful for provider
// implementations. // implementations.
@ -74,9 +76,11 @@ const SearchResultDisplay = new Lang.Class({
const SearchProvider = new Lang.Class({ const SearchProvider = new Lang.Class({
Name: 'SearchProvider', Name: 'SearchProvider',
_init: function(title) { _init: function(title, appInfo, isRemoteProvider) {
this.title = title; this.title = title;
this.appInfo = appInfo;
this.searchSystem = null; this.searchSystem = null;
this.isRemoteProvider = !!isRemoteProvider;
}, },
/** /**
@ -172,12 +176,16 @@ const SearchSystem = new Lang.Class({
_init: function() { _init: function() {
this._providers = []; this._providers = [];
this._remoteProviders = [];
this.reset(); this.reset();
}, },
registerProvider: function (provider) { registerProvider: function (provider) {
provider.searchSystem = this; provider.searchSystem = this;
this._providers.push(provider); this._providers.push(provider);
if (provider.isRemoteProvider)
this._remoteProviders.push(provider);
}, },
unregisterProvider: function (provider) { unregisterProvider: function (provider) {
@ -186,12 +194,20 @@ const SearchSystem = new Lang.Class({
return; return;
provider.searchSystem = null; provider.searchSystem = null;
this._providers.splice(index, 1); this._providers.splice(index, 1);
let remoteIndex = this._remoteProviders.indexOf(provider);
if (remoteIndex != -1)
this._remoteProviders.splice(index, 1);
}, },
getProviders: function() { getProviders: function() {
return this._providers; return this._providers;
}, },
getRemoteProviders: function() {
return this._remoteProviders;
},
getTerms: function() { getTerms: function() {
return this._previousTerms; return this._previousTerms;
}, },

View File

@ -14,7 +14,6 @@ const _modes = {
showCalendarEvents: false, showCalendarEvents: false,
allowSettings: false, allowSettings: false,
allowExtensions: false, allowExtensions: false,
allowKeybindingsWhenModal: false,
hasRunDialog: false, hasRunDialog: false,
hasWorkspaces: false, hasWorkspaces: false,
hasWindows: false, hasWindows: false,
@ -32,14 +31,13 @@ const _modes = {
}, },
'gdm': { 'gdm': {
allowKeybindingsWhenModal: true,
hasNotifications: true, hasNotifications: true,
isGreeter: true, isGreeter: true,
isPrimary: true, isPrimary: true,
unlockDialog: imports.gdm.loginDialog.LoginDialog, unlockDialog: imports.gdm.loginDialog.LoginDialog,
components: ['polkitAgent'], components: ['polkitAgent'],
panel: { panel: {
left: [], left: ['logo'],
center: ['dateMenu'], center: ['dateMenu'],
right: ['a11y', 'display', 'keyboard', right: ['a11y', 'display', 'keyboard',
'volume', 'battery', 'powerMenu'] 'volume', 'battery', 'powerMenu']

View File

@ -27,6 +27,7 @@ const KEY_VISUAL_BELL = 'visual-bell';
const DESKTOP_INTERFACE_SCHEMA = 'org.gnome.desktop.interface'; const DESKTOP_INTERFACE_SCHEMA = 'org.gnome.desktop.interface';
const KEY_GTK_THEME = 'gtk-theme'; const KEY_GTK_THEME = 'gtk-theme';
const KEY_ICON_THEME = 'icon-theme'; const KEY_ICON_THEME = 'icon-theme';
const KEY_WM_THEME = 'theme';
const KEY_TEXT_SCALING_FACTOR = 'text-scaling-factor'; const KEY_TEXT_SCALING_FACTOR = 'text-scaling-factor';
const HIGH_CONTRAST_THEME = 'HighContrast'; const HIGH_CONTRAST_THEME = 'HighContrast';
@ -101,28 +102,35 @@ const ATIndicator = new Lang.Class({
}, },
_buildHCItem: function() { _buildHCItem: function() {
let settings = new Gio.Settings({ schema: DESKTOP_INTERFACE_SCHEMA }); let interfaceSettings = new Gio.Settings({ schema: DESKTOP_INTERFACE_SCHEMA });
let gtkTheme = settings.get_string(KEY_GTK_THEME); let wmSettings = new Gio.Settings({ schema: WM_SCHEMA });
let iconTheme = settings.get_string(KEY_ICON_THEME); let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME);
let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME);
let wmTheme = wmSettings.get_string(KEY_WM_THEME);
let hasHC = (gtkTheme == HIGH_CONTRAST_THEME); let hasHC = (gtkTheme == HIGH_CONTRAST_THEME);
let highContrast = this._buildItemExtended( let highContrast = this._buildItemExtended(
_("High Contrast"), _("High Contrast"),
hasHC, hasHC,
settings.is_writable(KEY_GTK_THEME) && settings.is_writable(KEY_ICON_THEME), interfaceSettings.is_writable(KEY_GTK_THEME) &&
interfaceSettings.is_writable(KEY_ICON_THEME) &&
wmSettings.is_writable(KEY_WM_THEME),
function (enabled) { function (enabled) {
if (enabled) { if (enabled) {
settings.set_string(KEY_GTK_THEME, HIGH_CONTRAST_THEME); interfaceSettings.set_string(KEY_GTK_THEME, HIGH_CONTRAST_THEME);
settings.set_string(KEY_ICON_THEME, HIGH_CONTRAST_THEME); interfaceSettings.set_string(KEY_ICON_THEME, HIGH_CONTRAST_THEME);
wmSettings.set_string(KEY_WM_THEME, HIGH_CONTRAST_THEME);
} else if(!hasHC) { } else if(!hasHC) {
settings.set_string(KEY_GTK_THEME, gtkTheme); interfaceSettings.set_string(KEY_GTK_THEME, gtkTheme);
settings.set_string(KEY_ICON_THEME, iconTheme); interfaceSettings.set_string(KEY_ICON_THEME, iconTheme);
wmSettings.set_string(KEY_WM_THEME, wmTheme);
} else { } else {
settings.reset(KEY_GTK_THEME); interfaceSettings.reset(KEY_GTK_THEME);
settings.reset(KEY_ICON_THEME); interfaceSettings.reset(KEY_ICON_THEME);
wmSettings.reset(KEY_WM_THEME);
} }
}); });
settings.connect('changed::' + KEY_GTK_THEME, function() { interfaceSettings.connect('changed::' + KEY_GTK_THEME, function() {
let value = settings.get_string(KEY_GTK_THEME); let value = interfaceSettings.get_string(KEY_GTK_THEME);
if (value == HIGH_CONTRAST_THEME) { if (value == HIGH_CONTRAST_THEME) {
highContrast.setToggleState(true); highContrast.setToggleState(true);
} else { } else {
@ -130,11 +138,16 @@ const ATIndicator = new Lang.Class({
gtkTheme = value; gtkTheme = value;
} }
}); });
settings.connect('changed::' + KEY_ICON_THEME, function() { interfaceSettings.connect('changed::' + KEY_ICON_THEME, function() {
let value = settings.get_string(KEY_ICON_THEME); let value = interfaceSettings.get_string(KEY_ICON_THEME);
if (value != HIGH_CONTRAST_THEME) if (value != HIGH_CONTRAST_THEME)
iconTheme = value; iconTheme = value;
}); });
wmSettings.connect('changed::' + KEY_WM_THEME, function() {
let value = wmSettings.get_string(KEY_WM_THEME);
if (value != HIGH_CONTRAST_THEME)
wmTheme = value;
});
return highContrast; return highContrast;
}, },

View File

@ -239,22 +239,6 @@ const Indicator = new Lang.Class({
this._applet.send_to_address(device.bdaddr, device.alias); this._applet.send_to_address(device.bdaddr, device.alias);
})); }));
} }
if (device.capabilities & GnomeBluetoothApplet.Capabilities.OBEX_FILE_TRANSFER) {
item.menu.addAction(_("Browse Files..."), Lang.bind(this, function(event) {
this._applet.browse_address(device.bdaddr, event.get_time(),
Lang.bind(this, function(applet, result) {
try {
applet.browse_address_finish(result);
} catch (e) {
this._ensureSource();
this._source.notify(new MessageTray.Notification(this._source,
_("Bluetooth"),
_("Error browsing device"),
{ body: _("The requested device cannot be browsed, error is '%s'").format(e) }));
}
}));
}));
}
switch (device.type) { switch (device.type) {
case GnomeBluetoothApplet.Type.KEYBOARD: case GnomeBluetoothApplet.Type.KEYBOARD:
@ -369,6 +353,7 @@ const ConfirmNotification = new Lang.Class({
_init: function(source, applet, device_path, name, long_name, pin) { _init: function(source, applet, device_path, name, long_name, pin) {
this.parent(source, this.parent(source,
_("Bluetooth"), _("Bluetooth"),
/* Translators: argument is the device short name */
_("Pairing confirmation for %s").format(name), _("Pairing confirmation for %s").format(name),
{ customContent: true }); { customContent: true });
this.setResident(true); this.setResident(true);
@ -378,6 +363,7 @@ const ConfirmNotification = new Lang.Class({
this.addBody(_("Device %s wants to pair with this computer").format(long_name)); this.addBody(_("Device %s wants to pair with this computer").format(long_name));
this.addBody(_("Please confirm whether the PIN '%06d' matches the one on the device.").format(pin)); this.addBody(_("Please confirm whether the PIN '%06d' matches the one on the device.").format(pin));
/* Translators: this is the verb, not the noun */
this.addButton('matches', _("Matches")); this.addButton('matches', _("Matches"));
this.addButton('does-not-match', _("Does not match")); this.addButton('does-not-match', _("Does not match"));

View File

@ -233,20 +233,11 @@ const NMWirelessSectionTitleMenuItem = new Lang.Class({
} }
}); });
const NMDevice = new Lang.Class({ const NMConnectionBased = new Lang.Class({
Name: 'NMDevice', Name: 'NMConnectionBased',
Abstract: true, Abstract: true,
_init: function(client, device, connections) { _init: function(connections) {
this.device = device;
if (device) {
this.device._delegate = this;
this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
} else
this._stateChangedId = 0;
// protected
this._client = client;
this._connections = [ ]; this._connections = [ ];
for (let i = 0; i < connections.length; i++) { for (let i = 0; i < connections.length; i++) {
if (!connections[i].get_uuid()) if (!connections[i].get_uuid())
@ -264,26 +255,115 @@ const NMDevice = new Lang.Class({
this._connections.push(obj); this._connections.push(obj);
} }
this._connections.sort(this._connectionSortFunction); this._connections.sort(this._connectionSortFunction);
},
checkConnection: function(connection) {
let pos = this._findConnection(connection.get_uuid());
let exists = pos != -1;
let valid = this.connectionValid(connection);
let similar = false;
if (exists) {
let existing = this._connections[pos];
// Check if connection changed name or id
similar = existing.name == connection.get_id() &&
existing.timestamp == connection._timestamp;
}
if (exists && valid && similar) {
// Nothing to do
return;
}
if (exists)
this.removeConnection(connection);
if (valid)
this.addConnection(connection);
},
addConnection: function(connection) {
// record the connection
let obj = {
connection: connection,
name: connection.get_id(),
uuid: connection.get_uuid(),
timestamp: connection._timestamp,
item: null,
};
Util.insertSorted(this._connections, obj, this._connectionSortFunction);
this._queueCreateSection();
},
removeConnection: function(connection) {
let pos = this._findConnection(connection.get_uuid());
if (pos == -1) {
// this connection was never added, nothing to do here
return;
}
let obj = this._connections[pos];
if (obj.item)
obj.item.destroy();
this._connections.splice(pos, 1);
if (this._connections.length <= 1) {
// We need to show the automatic connection again
// (or in the case of NMDeviceWired, we want to hide
// the only explicit connection)
this._queueCreateSection();
}
},
_findConnection: function(uuid) {
for (let i = 0; i < this._connections.length; i++) {
let obj = this._connections[i];
if (obj.uuid == uuid)
return i;
}
return -1;
},
_connectionSortFunction: function(one, two) {
if (one.timestamp == two.timestamp)
return GLib.utf8_collate(one.name, two.name);
return two.timestamp - one.timestamp;
},
});
Signals.addSignalMethods(NMConnectionBased.prototype);
const NMDevice = new Lang.Class({
Name: 'NMDevice',
Abstract: true,
Extends: NMConnectionBased,
_init: function(client, device, connections) {
this.device = device;
this.device._delegate = this;
this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
// protected
this._client = client;
this.parent(connections);
this._activeConnection = null; this._activeConnection = null;
this._activeConnectionItem = null; this._activeConnectionItem = null;
this._autoConnectionItem = null; this._autoConnectionItem = null;
this._overflowItem = null; this._overflowItem = null;
if (this.device) { this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' });
this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' }); this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) { let ok;
let ok; if (state)
if (state) ok = this.activate();
ok = this.activate(); else
else ok = this.deactivate();
ok = this.deactivate();
if (!ok) if (!ok)
item.setToggleState(!state); item.setToggleState(!state);
})); }));
this._updateStatusItem(); this._updateStatusItem();
}
this.section = new PopupMenu.PopupMenuSection(); this.section = new PopupMenu.PopupMenuSection();
this._deferredWorkId = Main.initializeDeferredWork(this.section.actor, Lang.bind(this, this._createSection)); this._deferredWorkId = Main.initializeDeferredWork(this.section.actor, Lang.bind(this, this._createSection));
@ -352,6 +432,10 @@ const NMDevice = new Lang.Class({
return this.device.state == NetworkManager.DeviceState.ACTIVATED; return this.device.state == NetworkManager.DeviceState.ACTIVATED;
}, },
clearActiveConnection: function(activeConnection) {
this.setActiveConnection(null);
},
setActiveConnection: function(activeConnection) { setActiveConnection: function(activeConnection) {
if (activeConnection == this._activeConnection) if (activeConnection == this._activeConnection)
// nothing to do // nothing to do
@ -369,80 +453,13 @@ const NMDevice = new Lang.Class({
this._queueCreateSection(); this._queueCreateSection();
}, },
checkConnection: function(connection) {
let pos = this._findConnection(connection.get_uuid());
let exists = pos != -1;
let valid = this.connectionValid(connection);
let similar = false;
if (exists) {
let existing = this._connections[pos];
// Check if connection changed name or id
similar = existing.name == connection.get_id() &&
existing.timestamp == connection._timestamp;
}
if (exists && valid && similar) {
// Nothing to do
return;
}
if (exists)
this.removeConnection(connection);
if (valid)
this.addConnection(connection);
},
addConnection: function(connection) {
// record the connection
let obj = {
connection: connection,
name: connection.get_id(),
uuid: connection.get_uuid(),
timestamp: connection._timestamp,
item: null,
};
Util.insertSorted(this._connections, obj, this._connectionSortFunction);
this._clearSection();
this._queueCreateSection();
},
removeConnection: function(connection) {
let pos = this._findConnection(connection.get_uuid());
if (pos == -1) {
// this connection was never added, nothing to do here
return;
}
let obj = this._connections[pos];
if (obj.item)
obj.item.destroy();
this._connections.splice(pos, 1);
if (this._connections.length <= 1) {
// We need to show the automatic connection again
// (or in the case of NMDeviceWired, we want to hide
// the only explicit connection)
this._clearSection();
this._queueCreateSection();
}
},
connectionValid: function(connection) { connectionValid: function(connection) {
return this.device.connection_valid(connection); return this.device.connection_valid(connection);
}, },
_connectionSortFunction: function(one, two) {
if (one.timestamp == two.timestamp)
return GLib.utf8_collate(one.name, two.name);
return two.timestamp - one.timestamp;
},
setEnabled: function(enabled) { setEnabled: function(enabled) {
// do nothing by default, we want to keep the conneciton list visible // do nothing by default, we want to keep the conneciton list visible
// in the majority of cases (wired, wwan, vpn) // in the majority of cases (wired, wwan)
}, },
getStatusLabel: function() { getStatusLabel: function() {
@ -500,15 +517,6 @@ const NMDevice = new Lang.Class({
throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection'); throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection');
}, },
_findConnection: function(uuid) {
for (let i = 0; i < this._connections.length; i++) {
let obj = this._connections[i];
if (obj.uuid == uuid)
return i;
}
return -1;
},
_queueCreateSection: function() { _queueCreateSection: function() {
this._clearSection(); this._clearSection();
Main.queueDeferredWork(this._deferredWorkId); Main.queueDeferredWork(this._deferredWorkId);
@ -652,8 +660,6 @@ const NMDevice = new Lang.Class({
return out; return out;
} }
}); });
Signals.addSignalMethods(NMDevice.prototype);
const NMDeviceWired = new Lang.Class({ const NMDeviceWired = new Lang.Class({
Name: 'NMDeviceWired', Name: 'NMDeviceWired',
@ -868,95 +874,6 @@ const NMDeviceBluetooth = new Lang.Class({
} }
}); });
// Not a real device, but I save a lot code this way
const NMDeviceVPN = new Lang.Class({
Name: 'NMDeviceVPN',
Extends: NMDevice,
_init: function(client, device, connections) {
// Disable autoconnections
this._autoConnectionName = null;
this.category = NMConnectionCategory.VPN;
this.parent(client, null, connections);
},
connectionValid: function(connection) {
return connection._type == NetworkManager.SETTING_VPN_SETTING_NAME;
},
get empty() {
return this._connections.length == 0;
},
get connected() {
if (!this._activeConnection)
return false;
return this._activeConnection.vpn_state == NetworkManager.VPNConnectionState.ACTIVATED;
},
setActiveConnection: function(activeConnection) {
if (this._stateChangeId)
this._activeConnection.disconnect(this._stateChangeId);
this._stateChangeId = 0;
this.parent(activeConnection);
if (this._activeConnection)
this._stateChangeId = this._activeConnection.connect('vpn-state-changed',
Lang.bind(this, this._connectionStateChanged));
this.emit('state-changed');
},
_shouldShowConnectionList: function() {
return true;
},
deactivate: function() {
if (this._activeConnection)
this._client.deactivate_connection(this._activeConnection);
},
getStatusLabel: function() {
if (!this._activeConnection) // Same as DISCONNECTED
return null;
switch(this._activeConnection.vpn_state) {
case NetworkManager.VPNConnectionState.DISCONNECTED:
case NetworkManager.VPNConnectionState.ACTIVATED:
return null;
case NetworkManager.VPNConnectionState.PREPARE:
case NetworkManager.VPNConnectionState.CONNECT:
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
return _("connecting...");
case NetworkManager.VPNConnectionState.NEED_AUTH:
/* Translators: this is for network connections that require some kind of key or password */
return _("authentication required");
case NetworkManager.VPNConnectionState.FAILED:
return _("connection failed");
default:
log('VPN connection state invalid, is %d'.format(this.device.state));
return 'invalid';
}
},
_connectionStateChanged: function(connection, newstate, reason) {
if (newstate == NetworkManager.VPNConnectionState.FAILED) {
// FIXME: if we ever want to show something based on reason,
// we need to convert from NetworkManager.VPNConnectionStateReason
// to NetworkManager.DeviceStateReason
this.emit('activation-failed', reason);
}
// Differently from real NMDevices, there is no need to queue
// an update of the menu section, contents wouldn't change anyway
this.emit('state-changed');
}
});
const NMDeviceWireless = new Lang.Class({ const NMDeviceWireless = new Lang.Class({
Name: 'NMDeviceWireless', Name: 'NMDeviceWireless',
Extends: NMDevice, Extends: NMDevice,
@ -1557,6 +1474,151 @@ const NMDeviceWireless = new Lang.Class({
}, },
}); });
const NMVPNSection = new Lang.Class({
Name: 'NMVPNSection',
Extends: NMConnectionBased,
category: NMConnectionCategory.VPN,
_init: function(client, connections) {
this.parent(connections);
this._client = client;
this.section = new PopupMenu.PopupMenuSection();
this._deferredWorkId = Main.initializeDeferredWork(this.section.actor, Lang.bind(this, this._createSection));
},
get empty() {
return this._connections.length == 0;
},
connectionValid: function(connection) {
// filtering is done by NMApplet code
return true;
},
getStatusLabel: function(activeConnection) {
switch(activeConnection.vpn_state) {
case NetworkManager.VPNConnectionState.DISCONNECTED:
case NetworkManager.VPNConnectionState.ACTIVATED:
return null;
case NetworkManager.VPNConnectionState.PREPARE:
case NetworkManager.VPNConnectionState.CONNECT:
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
return _("connecting...");
case NetworkManager.VPNConnectionState.NEED_AUTH:
/* Translators: this is for network connections that require some kind of key or password */
return _("authentication required");
case NetworkManager.VPNConnectionState.FAILED:
return _("connection failed");
default:
log('VPN connection state invalid, is %d'.format(this.device.state));
return 'invalid';
}
},
clearActiveConnection: function(activeConnection) {
let pos = this._findConnection(activeConnection.uuid);
if (pos < 0)
return;
let obj = this._connections[pos];
obj.active.disconnect(obj.stateChangedId);
obj.active = null;
if (obj.item) {
obj.item.setToggleState(false);
obj.item.setStatus(null);
}
},
setActiveConnection: function(activeConnection) {
let pos = this._findConnection(activeConnection.uuid);
if (pos < 0)
return;
let obj = this._connections[pos];
obj.active = activeConnection;
obj.stateChangedId = obj.active.connect('vpn-state-changed',
Lang.bind(this, this._connectionStateChanged));
if (obj.item) {
obj.item.setToggleState(obj.active.vpn_state ==
NetworkManager.VPNConnectionState.ACTIVATED);
obj.item.setStatus(this.getStatusLabel(obj.active));
}
},
_queueCreateSection: function() {
this.section.removeAll();
Main.queueDeferredWork(this._deferredWorkId);
},
_createConnectionItem: function(obj) {
let menuItem = new PopupMenu.PopupSwitchMenuItem(obj.name, false,
{ style_class: 'popup-subtitle-menu-item' });
menuItem.connect('toggled', Lang.bind(this, function(menuItem) {
if (menuItem.state) {
this._client.activate_connection(obj.connection, null, null, null);
// Immediately go back to disconnected, until NM tells us to change
menuItem.setToggleState(false);
} else if (obj.active) {
this._client.deactivate_connection(obj.active);
}
}));
if (obj.active) {
menuItem.setToggleState(obj.active.vpn_state ==
NetworkManager.VPNConnectionState.ACTIVATED);
menuItem.setStatus(this.getStatusLabel(obj.active));
}
return menuItem;
},
_createSection: function() {
if (this._connections.length > 0) {
this.section.actor.show();
for(let j = 0; j < this._connections.length; ++j) {
let obj = this._connections[j];
obj.item = this._createConnectionItem(obj);
if (j >= NUM_VISIBLE_NETWORKS) {
if (!this._overflowItem) {
this._overflowItem = new PopupMenu.PopupSubMenuMenuItem(_("More..."));
this.section.addMenuItem(this._overflowItem);
}
this._overflowItem.menu.addMenuItem(obj.item);
} else
this.section.addMenuItem(obj.item);
}
} else {
this.section.actor.hide()
}
},
_connectionStateChanged: function(vpnConnection, newstate, reason) {
if (newstate == NetworkManager.VPNConnectionState.FAILED) {
// FIXME: if we ever want to show something based on reason,
// we need to convert from NetworkManager.VPNConnectionStateReason
// to NetworkManager.DeviceStateReason
this.emit('activation-failed', reason);
}
let pos = this._findConnection(vpnConnection.uuid);
if (pos >= 0) {
let obj = this._connections[pos];
if (obj.item) {
obj.item.setToggleState(vpnConnection.vpn_state ==
NetworkManager.VPNConnectionState.ACTIVATED);
obj.item.setStatus(this.getStatusLabel(vpnConnection));
}
} else {
log('Could not find connection for vpn-state-changed handler');
}
},
});
const NMApplet = new Lang.Class({ const NMApplet = new Lang.Class({
Name: 'NMApplet', Name: 'NMApplet',
Extends: PanelMenu.SystemStatusButton, Extends: PanelMenu.SystemStatusButton,
@ -1622,15 +1684,9 @@ const NMApplet = new Lang.Class({
this.menu.addMenuItem(this._devices.wwan.section); this.menu.addMenuItem(this._devices.wwan.section);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._devices.vpn = { this._vpnSection = new NMVPNSection(this._client, this._connections);
section: new PopupMenu.PopupMenuSection(), this._vpnSection.connect('activation-failed', Lang.bind(this, this._onActivationFailed));
device: this._makeWrapperDevice(NMDeviceVPN, null), this.menu.addMenuItem(this._vpnSection.section);
item: new NMWiredSectionTitleMenuItem(_("VPN Connections"))
};
this._devices.vpn.section.addMenuItem(this._devices.vpn.item);
this._devices.vpn.section.addMenuItem(this._devices.vpn.device.section);
this._devices.vpn.section.actor.hide();
this.menu.addMenuItem(this._devices.vpn.section);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop'); this.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop');
@ -1699,18 +1755,6 @@ const NMApplet = new Lang.Class({
}, },
_syncSectionTitle: function(category) { _syncSectionTitle: function(category) {
if (category == NMConnectionCategory.VPN) {
// Special case VPN: it's only one device (and a fake one
// actually), and we don't show it if empty
let device = this._devices.vpn.device;
let section = this._devices.vpn.section;
let item = this._devices.vpn.item;
section.actor.visible = !device.empty;
item.updateForDevice(device);
return;
}
let devices = this._devices[category].devices; let devices = this._devices[category].devices;
let item = this._devices[category].item; let item = this._devices[category].item;
let section = this._devices[category].section; let section = this._devices[category].section;
@ -1758,17 +1802,20 @@ const NMApplet = new Lang.Class({
this._source.notify(device._notification); this._source.notify(device._notification);
}, },
_onActivationFailed: function(device, reason) {
// XXX: nm-applet has no special text depending on reason
// but I'm not sure of this generic message
this._notifyForDevice(device, 'network-error-symbolic',
_("Connection failed"),
_("Activation of network connection failed"),
MessageTray.Urgency.HIGH);
},
_makeWrapperDevice: function(wrapperClass, device) { _makeWrapperDevice: function(wrapperClass, device) {
let wrapper = new wrapperClass(this._client, device, this._connections); let wrapper = new wrapperClass(this._client, device, this._connections);
wrapper._activationFailedId = wrapper.connect('activation-failed', Lang.bind(this, function(device, reason) { wrapper._activationFailedId = wrapper.connect('activation-failed',
// XXX: nm-applet has no special text depending on reason Lang.bind(this, this._onActivationFailed));
// but I'm not sure of this generic message
this._notifyForDevice(device, 'network-error-symbolic',
_("Connection failed"),
_("Activation of network connection failed"),
MessageTray.Urgency.HIGH);
}));
wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) { wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) {
this._syncSectionTitle(dev.category); this._syncSectionTitle(dev.category);
})); }));
@ -1851,7 +1898,7 @@ const NMApplet = new Lang.Class({
for (let i = 0; i < closedConnections.length; i++) { for (let i = 0; i < closedConnections.length; i++) {
let active = closedConnections[i]; let active = closedConnections[i];
if (active._primaryDevice) { if (active._primaryDevice) {
active._primaryDevice.setActiveConnection(null); active._primaryDevice.clearActiveConnection(active);
active._primaryDevice = null; active._primaryDevice = null;
} }
if (active._inited) { if (active._inited) {
@ -1918,7 +1965,7 @@ const NMApplet = new Lang.Class({
} }
} }
} else } else
a._primaryDevice = this._devices.vpn.device a._primaryDevice = this._vpnSection;
if (a._primaryDevice) if (a._primaryDevice)
a._primaryDevice.setActiveConnection(a); a._primaryDevice.setActiveConnection(a);
@ -2000,8 +2047,7 @@ const NMApplet = new Lang.Class({
let section = connection._section; let section = connection._section;
if (section == NMConnectionCategory.VPN) { if (section == NMConnectionCategory.VPN) {
this._devices.vpn.device.removeConnection(connection); this._vpnSection.removeConnection(connection);
this._syncSectionTitle(section);
} else if (section != NMConnectionCategory.INVALID) { } else if (section != NMConnectionCategory.INVALID) {
let devices = this._devices[section].devices; let devices = this._devices[section].devices;
for (let i = 0; i < devices.length; i++) for (let i = 0; i < devices.length; i++)
@ -2024,8 +2070,7 @@ const NMApplet = new Lang.Class({
if (section == NMConnectionCategory.INVALID) if (section == NMConnectionCategory.INVALID)
return; return;
if (section == NMConnectionCategory.VPN) { if (section == NMConnectionCategory.VPN) {
this._devices.vpn.device.checkConnection(connection); this._vpnSection.checkConnection(connection);
this._syncSectionTitle(section);
} else { } else {
let devices = this._devices[section].devices; let devices = this._devices[section].devices;
for (let i = 0; i < devices.length; i++) { for (let i = 0; i < devices.length; i++) {
@ -2051,7 +2096,6 @@ const NMApplet = new Lang.Class({
this._syncSectionTitle(NMConnectionCategory.WIRED); this._syncSectionTitle(NMConnectionCategory.WIRED);
this._syncSectionTitle(NMConnectionCategory.WIRELESS); this._syncSectionTitle(NMConnectionCategory.WIRELESS);
this._syncSectionTitle(NMConnectionCategory.WWAN); this._syncSectionTitle(NMConnectionCategory.WWAN);
this._syncSectionTitle(NMConnectionCategory.VPN);
}, },
_syncNMState: function() { _syncNMState: function() {

View File

@ -96,7 +96,7 @@ const Indicator = new Lang.Class({
let minutes = time % 60; let minutes = time % 60;
let hours = Math.floor(time / 60); let hours = Math.floor(time / 60);
let timestring; let timestring;
if (time > 60) { if (time >= 60) {
if (minutes == 0) { if (minutes == 0) {
timestring = ngettext("%d hour remaining", "%d hours remaining", hours).format(hours); timestring = ngettext("%d hour remaining", "%d hours remaining", hours).format(hours);
} else { } else {

View File

@ -113,6 +113,7 @@ const UnlockDialog = new Lang.Class({
_init: function(parentActor) { _init: function(parentActor) {
this.parent({ shellReactive: true, this.parent({ shellReactive: true,
styleClass: 'login-dialog', styleClass: 'login-dialog',
keybindingMode: Main.KeybindingMode.UNLOCK_SCREEN,
parentActor: parentActor parentActor: parentActor
}); });
@ -151,6 +152,9 @@ const UnlockDialog = new Lang.Class({
ShellEntry.addContextMenu(this._promptEntry, { isPassword: true }); ShellEntry.addContextMenu(this._promptEntry, { isPassword: true });
this.setInitialKeyFocus(this._promptEntry); this.setInitialKeyFocus(this._promptEntry);
this._promptEntry.clutter_text.connect('activate', Lang.bind(this, this._doUnlock)); this._promptEntry.clutter_text.connect('activate', Lang.bind(this, this._doUnlock));
this._promptEntry.clutter_text.connect('text-changed', Lang.bind(this, function() {
this._updateOkButtonSensitivity(this._promptEntry.text.length > 0);
}));
this._promptLayout.add(this._promptEntry, this._promptLayout.add(this._promptEntry,
{ expand: true, { expand: true,
@ -196,6 +200,8 @@ const UnlockDialog = new Lang.Class({
return false; return false;
})); }));
Main.ctrlAltTabManager.addGroup(this.dialogLayout, _("Unlock Window"), 'dialog-password-symbolic');
this._idleMonitor = new GnomeDesktop.IdleMonitor(); this._idleMonitor = new GnomeDesktop.IdleMonitor();
this._idleWatchId = this._idleMonitor.add_watch(IDLE_TIMEOUT * 1000, Lang.bind(this, this._escape)); this._idleWatchId = this._idleMonitor.add_watch(IDLE_TIMEOUT * 1000, Lang.bind(this, this._escape));
}, },
@ -203,14 +209,22 @@ const UnlockDialog = 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._updateOkButtonSensitivity(sensitive && this._promptEntry.text.length > 0);
},
_updateOkButtonSensitivity: function(sensitive) {
this._okButton.button.reactive = sensitive; this._okButton.button.reactive = sensitive;
this._okButton.button.can_focus = sensitive; this._okButton.button.can_focus = sensitive;
}, },
_showMessage: function(userVerifier, message, styleClass) { _showMessage: function(userVerifier, message, styleClass) {
this._promptMessage.text = message; if (message) {
this._promptMessage.styleClass = styleClass; this._promptMessage.text = message;
GdmUtil.fadeInActor(this._promptMessage); this._promptMessage.styleClass = styleClass;
GdmUtil.fadeInActor(this._promptMessage);
} else {
GdmUtil.fadeOutActor(this._promptMessage);
}
}, },
_onAskQuestion: function(verifier, serviceName, question, passwordChar) { _onAskQuestion: function(verifier, serviceName, question, passwordChar) {
@ -278,6 +292,7 @@ const UnlockDialog = new Lang.Class({
this._currentQuery = null; this._currentQuery = null;
this._firstQuestion = true; this._firstQuestion = true;
this._promptEntry.text = '';
this._promptEntry.clutter_text.set_password_char('\u25cf'); this._promptEntry.clutter_text.set_password_char('\u25cf');
this._promptEntry.menu.isPassword = true; this._promptEntry.menu.isPassword = true;

View File

@ -26,6 +26,7 @@ const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen'; const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
const DISABLE_LOG_OUT_KEY = 'disable-log-out'; const DISABLE_LOG_OUT_KEY = 'disable-log-out';
const LOCK_ENABLED_KEY = 'lock-enabled'; const LOCK_ENABLED_KEY = 'lock-enabled';
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
const DIALOG_ICON_SIZE = 64; const DIALOG_ICON_SIZE = 64;
@ -187,7 +188,7 @@ const IMStatusChooserItem = new Lang.Class({
item = new IMStatusItem(_("Idle"), 'user-idle-symbolic'); item = new IMStatusItem(_("Idle"), 'user-idle-symbolic');
this._combo.addMenuItem(item, IMStatus.IDLE); this._combo.addMenuItem(item, IMStatus.IDLE);
item = new IMStatusItem(_("Unavailable"), 'user-offline-symbolic'); item = new IMStatusItem(_("Offline"), 'user-offline-symbolic');
this._combo.addMenuItem(item, IMStatus.OFFLINE); this._combo.addMenuItem(item, IMStatus.OFFLINE);
this._combo.connect('active-item-changed', this._combo.connect('active-item-changed',
@ -616,10 +617,13 @@ const UserMenuButton = new Lang.Class({
_updateLogout: function() { _updateLogout: function() {
let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY); let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY);
let alwaysShow = global.settings.get_boolean(ALWAYS_SHOW_LOG_OUT_KEY);
let systemAccount = this._user.system_account;
let localAccount = this._user.local_account;
let multiUser = this._userManager.has_multiple_users; let multiUser = this._userManager.has_multiple_users;
let multiSession = Gdm.get_session_ids().length > 1; let multiSession = Gdm.get_session_ids().length > 1;
this._logoutItem.actor.visible = allowLogout && (multiUser || multiSession); this._logoutItem.actor.visible = allowLogout && (alwaysShow || multiUser || multiSession || systemAccount || !localAccount);
}, },
_updateLockScreen: function() { _updateLockScreen: function() {
@ -748,7 +752,7 @@ const UserMenuButton = new Lang.Class({
item = new PopupMenu.PopupSeparatorMenuItem(); item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item); this.menu.addMenuItem(item);
item = new PopupMenu.PopupMenuItem(_("System Settings")); item = new PopupMenu.PopupMenuItem(_("Settings"));
item.connect('activate', Lang.bind(this, this._onPreferencesActivate)); item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
this.menu.addMenuItem(item); this.menu.addMenuItem(item);
this._systemSettings = item; this._systemSettings = item;

View File

@ -94,6 +94,11 @@ const ViewSelector = new Lang.Class({
this._searchPage = this._addPage(this._searchResults.actor, this._entry, this._searchPage = this._addPage(this._searchResults.actor, this._entry,
_("Search"), 'edit-find-symbolic'); _("Search"), 'edit-find-symbolic');
this._searchSettings = new Gio.Settings({ schema: Search.SEARCH_PROVIDERS_SCHEMA });
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::disable-external', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::sort-order', Lang.bind(this, this._reloadRemoteProviders));
// Default search providers // Default search providers
// Wanda comes obviously first // Wanda comes obviously first
this.addSearchProvider(new Wanda.WandaSearchProvider()); this.addSearchProvider(new Wanda.WandaSearchProvider());
@ -144,15 +149,17 @@ const ViewSelector = new Lang.Class({
this.constrainHeight = new Clutter.BindConstraint({ source: this._pageArea, this.constrainHeight = new Clutter.BindConstraint({ source: this._pageArea,
coordinate: Clutter.BindCoordinate.HEIGHT }); coordinate: Clutter.BindCoordinate.HEIGHT });
global.display.add_keybinding('toggle-application-view', Main.wm.addKeybinding('toggle-application-view',
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }), new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Lang.bind(this, this._showWithAppsPage)); Main.KeybindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW,
Lang.bind(this, this._toggleAppsPage));
}, },
_showWithAppsPage: function() { _toggleAppsPage: function() {
Main.overview.show(); Main.overview.show();
this._showAppsButton.set_checked(true); this._showAppsButton.checked = !this._showAppsButton.checked;
}, },
show: function() { show: function() {
@ -196,7 +203,7 @@ const ViewSelector = new Lang.Class({
}) })
});; });;
this._pageArea.add_actor(page); this._pageArea.add_actor(page);
return page return page;
}, },
_showPage: function(page) { _showPage: function(page) {
@ -433,7 +440,32 @@ const ViewSelector = new Lang.Class({
this._showPage(this._searchPage); this._showPage(this._searchPage);
}, },
_shouldUseSearchProvider: function(provider) {
// the disable-external GSetting only affects remote providers
if (!provider.isRemoteProvider)
return true;
if (this._searchSettings.get_boolean('disable-external'))
return false;
let appId = provider.appInfo.get_id();
let disable = this._searchSettings.get_strv('disabled');
return disable.indexOf(appId) == -1;
},
_reloadRemoteProviders: function() {
// removeSearchProvider() modifies the provider list we iterate on,
// so make a copy first
let remoteProviders = this._searchSystem.getRemoteProviders().slice(0);
remoteProviders.forEach(Lang.bind(this, this.removeSearchProvider));
RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, this.addSearchProvider));
},
addSearchProvider: function(provider) { addSearchProvider: function(provider) {
if (!this._shouldUseSearchProvider(provider))
return;
this._searchSystem.registerProvider(provider); this._searchSystem.registerProvider(provider);
this._searchResults.createProviderMeta(provider); this._searchResults.createProviderMeta(provider);
}, },

View File

@ -39,6 +39,8 @@ const WindowAttentionHandler = new Lang.Class({
let [title, banner] = this._getTitleAndBanner(app, window); let [title, banner] = this._getTitleAndBanner(app, window);
let notification = new MessageTray.Notification(source, title, banner); let notification = new MessageTray.Notification(source, title, banner);
notification.setForFeedback(true);
source.notify(notification); source.notify(notification);
source.signalIDs.push(window.connect('notify::title', Lang.bind(this, function() { source.signalIDs.push(window.connect('notify::title', Lang.bind(this, function() {

View File

@ -83,6 +83,8 @@ const WindowManager = new Lang.Class({
this._animationBlockCount = 0; this._animationBlockCount = 0;
this._allowedKeybindings = {};
this._switchData = null; this._switchData = null;
this._shellwm.connect('kill-switch-workspace', Lang.bind(this, this._switchWorkspaceDone)); this._shellwm.connect('kill-switch-workspace', Lang.bind(this, this._switchWorkspaceDone));
this._shellwm.connect('kill-window-effects', Lang.bind(this, function (shellwm, actor) { this._shellwm.connect('kill-window-effects', Lang.bind(this, function (shellwm, actor) {
@ -99,38 +101,66 @@ const WindowManager = new Lang.Class({
this._shellwm.connect('unmaximize', Lang.bind(this, this._unmaximizeWindow)); this._shellwm.connect('unmaximize', Lang.bind(this, this._unmaximizeWindow));
this._shellwm.connect('map', Lang.bind(this, this._mapWindow)); this._shellwm.connect('map', Lang.bind(this, this._mapWindow));
this._shellwm.connect('destroy', Lang.bind(this, this._destroyWindow)); this._shellwm.connect('destroy', Lang.bind(this, this._destroyWindow));
this._shellwm.connect('filter-keybinding', Lang.bind(this, this._filterKeybinding));
this._workspaceSwitcherPopup = null; this._workspaceSwitcherPopup = null;
Meta.keybindings_set_custom_handler('switch-to-workspace-left', this.setCustomKeybindingHandler('switch-to-workspace-left',
Lang.bind(this, this._showWorkspaceSwitcher)); Main.KeybindingMode.NORMAL |
Meta.keybindings_set_custom_handler('switch-to-workspace-right', Main.KeybindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
Meta.keybindings_set_custom_handler('switch-to-workspace-up', this.setCustomKeybindingHandler('switch-to-workspace-right',
Lang.bind(this, this._showWorkspaceSwitcher)); Main.KeybindingMode.NORMAL |
Meta.keybindings_set_custom_handler('switch-to-workspace-down', Main.KeybindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
Meta.keybindings_set_custom_handler('move-to-workspace-left', this.setCustomKeybindingHandler('switch-to-workspace-up',
Lang.bind(this, this._showWorkspaceSwitcher)); Main.KeybindingMode.NORMAL |
Meta.keybindings_set_custom_handler('move-to-workspace-right', Main.KeybindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
Meta.keybindings_set_custom_handler('move-to-workspace-up', this.setCustomKeybindingHandler('switch-to-workspace-down',
Lang.bind(this, this._showWorkspaceSwitcher)); Main.KeybindingMode.NORMAL |
Meta.keybindings_set_custom_handler('move-to-workspace-down', Main.KeybindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
Meta.keybindings_set_custom_handler('switch-windows', this.setCustomKeybindingHandler('move-to-workspace-left',
Lang.bind(this, this._startAppSwitcher)); Main.KeybindingMode.NORMAL |
Meta.keybindings_set_custom_handler('switch-group', Main.KeybindingMode.OVERVIEW,
Lang.bind(this, this._startAppSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
Meta.keybindings_set_custom_handler('switch-windows-backward', this.setCustomKeybindingHandler('move-to-workspace-right',
Lang.bind(this, this._startAppSwitcher)); Main.KeybindingMode.NORMAL |
Meta.keybindings_set_custom_handler('switch-group-backward', Main.KeybindingMode.OVERVIEW,
Lang.bind(this, this._startAppSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
Meta.keybindings_set_custom_handler('switch-panels', this.setCustomKeybindingHandler('move-to-workspace-up',
Lang.bind(this, this._startA11ySwitcher)); Main.KeybindingMode.NORMAL |
global.display.add_keybinding('open-application-menu', Main.KeybindingMode.OVERVIEW,
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }), Lang.bind(this, this._showWorkspaceSwitcher));
Meta.KeyBindingFlags.NONE, this.setCustomKeybindingHandler('move-to-workspace-down',
Lang.bind(this, this._openAppMenu)); Main.KeybindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-windows',
Main.KeybindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher));
this.setCustomKeybindingHandler('switch-group',
Main.KeybindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher));
this.setCustomKeybindingHandler('switch-windows-backward',
Main.KeybindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher));
this.setCustomKeybindingHandler('switch-group-backward',
Main.KeybindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher));
this.setCustomKeybindingHandler('switch-panels',
Main.KeybindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW |
Main.KeybindingMode.LOCK_SCREEN |
Main.KeybindingMode.UNLOCK_SCREEN |
Main.KeybindingMode.LOGIN_SCREEN,
Lang.bind(this, this._startA11ySwitcher));
this.addKeybinding('open-application-menu',
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Main.KeybindingMode.NORMAL,
Lang.bind(this, this._openAppMenu));
Main.overview.connect('showing', Lang.bind(this, function() { Main.overview.connect('showing', Lang.bind(this, function() {
for (let i = 0; i < this._dimmedWindows.length; i++) for (let i = 0; i < this._dimmedWindows.length; i++)
@ -142,6 +172,25 @@ const WindowManager = new Lang.Class({
})); }));
}, },
setCustomKeybindingHandler: function(name, modes, handler) {
if (Meta.keybindings_set_custom_handler(name, handler))
this.allowKeybinding(name, modes);
},
addKeybinding: function(name, settings, flags, modes, handler) {
if (global.display.add_keybinding(name, settings, flags, handler))
this.allowKeybinding(name, modes);
},
removeKeybinding: function(name) {
if (global.display.remove_keybinding(name))
this.allowKeybinding(name, Main.KeybindingMode.NONE);
},
allowKeybinding: function(name, modes) {
this._allowedKeybindings[name] = modes;
},
blockAnimations: function() { blockAnimations: function() {
this._animationBlockCount++; this._animationBlockCount++;
}, },
@ -424,6 +473,21 @@ const WindowManager = new Lang.Class({
} }
}, },
_filterKeybinding: function(shellwm, binding) {
if (Main.keybindingMode == Main.KeybindingMode.NONE)
return true;
// There's little sense in implementing a keybinding in mutter and
// not having it work in NORMAL mode; handle this case generically
// so we don't have to explicitly allow all builtin keybindings in
// NORMAL mode.
if (Main.keybindingMode == Main.KeybindingMode.NORMAL &&
binding.is_builtin())
return false;
return !(this._allowedKeybindings[binding.get_name()] & Main.keybindingMode);
},
_switchWorkspace : function(shellwm, from, to, direction) { _switchWorkspace : function(shellwm, from, to, direction) {
if (!this._shouldAnimate()) { if (!this._shouldAnimate()) {
shellwm.completed_switch_workspace(); shellwm.completed_switch_workspace();

View File

@ -159,6 +159,24 @@ const WindowClone = new Lang.Class({
this._selected = false; this._selected = false;
}, },
get slot() {
let x, y, w, h;
if (this.inDrag) {
x = this.dragOrigX;
y = this.dragOrigY;
w = this.actor.width * this.dragOrigScale;
h = this.actor.height * this.dragOrigScale;
} else {
x = this.actor.x;
y = this.actor.y;
w = this.actor.width * this.actor.scale_x;
h = this.actor.height * this.actor.scale_y;
}
return [x, y, w, h];
},
setStackAbove: function (actor) { setStackAbove: function (actor) {
this._stackAbove = actor; this._stackAbove = actor;
if (this.inDrag || this._zooming) if (this.inDrag || this._zooming)
@ -435,6 +453,11 @@ const WindowOverlay = new Lang.Class({
this._updateCaptionId = metaWindow.connect('notify::title', this._updateCaptionId = metaWindow.connect('notify::title',
Lang.bind(this, function(w) { Lang.bind(this, function(w) {
this.title.text = w.title; this.title.text = w.title;
// we need this for the next call to get_preferred_width
// to return useful results
this.title.set_size(-1, -1);
this._repositionSelf();
})); }));
let button = new St.Button({ style_class: 'window-close' }); let button = new St.Button({ style_class: 'window-close' });
@ -501,6 +524,11 @@ const WindowOverlay = new Lang.Class({
this.title.height + this.title._spacing]; this.title.height + this.title._spacing];
}, },
_repositionSelf: function() {
let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
this.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight, false);
},
/** /**
* @cloneX: x position of windowClone * @cloneX: x position of windowClone
* @cloneY: y position of windowClone * @cloneY: y position of windowClone
@ -538,9 +566,8 @@ const WindowOverlay = new Lang.Class({
else else
button.set_position(Math.floor(buttonX), Math.floor(buttonY)); button.set_position(Math.floor(buttonX), Math.floor(buttonY));
if (!title.fullWidth) let [titleMinWidth, titleNatWidth] = title.get_preferred_width(-1);
title.fullWidth = title.width; let titleWidth = Math.max(titleMinWidth, Math.min(titleNatWidth, cloneWidth));
let titleWidth = Math.min(title.fullWidth, cloneWidth);
let titleX = cloneX + (cloneWidth - titleWidth) / 2; let titleX = cloneX + (cloneWidth - titleWidth) / 2;
let titleY = cloneY + cloneHeight + title._spacing; let titleY = cloneY + cloneHeight + title._spacing;

View File

@ -1 +1,19 @@
dist_man_MANS = gnome-shell.1 XSLTPROC_FLAGS = \
--nonet \
--stringparam man.output.quietly 1 \
--stringparam funcsynopsis.style ansi \
--stringparam man.th.extra1.suppress 1 \
--stringparam man.authors.section.enabled 0 \
--stringparam man.copyright.section.enabled 0
.xml.1:
$(AM_V_GEN) $(XSLTPROC) $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $<
man_MANS = \
gnome-shell.1
xml_files = $(man_MANS:.1=.xml)
EXTRA_DIST = $(xml_files)
DISTCLEANFILES = $(man_MANS)

View File

@ -1,94 +0,0 @@
.\" Copyright (c) 2009, Marcelo Jorge Vieira (metal) <metal@alucinados.com>
.\"
.\" This is free documentation; you can redistribute it and/or
.\" modify it under the terms of the GNU General Public License as
.\" published by the Free Software Foundation; either version 2 of
.\" the License, or (at your option) any later version.
.\"
.\" The GNU General Public License's references to "object code"
.\" and "executables" are to be interpreted as the output of any
.\" document formatting or typesetting system, including
.\" intermediate and printed output.
.\"
.\" This manual is distributed in the hope that it will be useful,
.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
.\" GNU General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public
.\" License along with this manual; if not, write to the Free
.\" Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
.\" Boston, MA 02111-1301 USA.
.TH GNOME-SHELL 1
.SH NAME
gnome-shell \- Graphical shell for the GNOME desktop
.SH SYNOPSIS
.B gnome-shell [options]
.SH DESCRIPTION
GNOME Shell provides core user interface functions for the GNOME 3
desktop, like switching to windows and launching applications. GNOME
Shell takes advantage of the capabilities of modern graphics hardware
and introduces innovative user interface concepts to provide a
visually attractive and easy to use experience.
.SH OPTIONS
.TP
.B \-\-replace
Replace the running window manager
.br
.TP
.B \-\-sm-disable
Disable connection to the session manager
.br
.TP
.B \-\-sm-client-id=ID
Specify session management ID
.br
.TP
.B \-\-sm-save-file=FILE
Initialize session from savefile
.br
.TP
.B \-\-screen=SCREEN
X screen to use
.br
.TP
.B \-d, \-\-display=DISPLAY
X display to use
.br
.TP
.B \-\-sync
Make X calls synchronous
.br
.TP
.B \-\-version
Print version and exit
.br
.TP
.B \-\-help
Display help and exit
.br
.SH BUGS
The bug tracker can be reached by visiting the website
\fIhttps://bugzilla.gnome.org/buglist.cgi?product=gnome-shell\fR
Before sending a bug report, please verify that you have the latest
version of gnome-shell. Many bugs (major and minor) are fixed at each
release, and if yours is out of date, the problem may already have
been solved.
.SH ADDITIONAL INFORMATION
For further information, visit the website \fIhttp://live.gnome.org/GnomeShell\fR

159
man/gnome-shell.xml Normal file
View File

@ -0,0 +1,159 @@
<?xml version='1.0'?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
<refentry id="gnome-shell">
<refentryinfo>
<title>gnome-shell</title>
<productname>gnome-shell</productname>
<authorgroup>
<author>
<contrib>wrote the original gnome-shell man page</contrib>
<firstname>Marcelo Jorge</firstname>
<surname>Vieira</surname>
<email>metal@alucinados.com</email>
</author>
</authorgroup>
</refentryinfo>
<refmeta>
<refentrytitle>gnome-shell</refentrytitle>
<manvolnum>1</manvolnum>
</refmeta>
<refnamediv>
<refname>gnome-shell</refname>
<refpurpose>Graphical shell for the GNOME desktop</refpurpose>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
<command>gnome-shell <arg choice="opt" rep="repeat">OPTION</arg></command>
</cmdsynopsis>
</refsynopsisdiv>
<refsect1>
<title>Description</title>
<para>GNOME shell provides core user
interface functions for the GNOME 3 desktop, like switching
to windows and launching applications. GNOME shell takes
advantage of the capabilities of modern graphics hardware
and introduces innovative user interface concepts to provide
a visually attractive and easy to use experience.</para>
<para>gnome-shell is a required component of
the GNOME desktop, i.e. it is listed in the
RequiredComponents field of
<filename>/usr/share/gnome-session/sessions/gnome.session</filename>.
It is started in the window manager phase of the session.
</para>
</refsect1>
<refsect1>
<title>Options</title>
<variablelist>
<varlistentry>
<term><option>-r</option>, <option>--replace</option></term>
<listitem><para>Replace the running window manager</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--sm-disable</option></term>
<listitem><para>Disable connection to the session manager</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--sm-client-id=<replaceable>ID</replaceable></option></term>
<listitem><para>Specify session management <replaceable>ID</replaceable></para></listitem>
</varlistentry>
<varlistentry>
<term><option>--sm-save-file=<replaceable>FILE</replaceable></option></term>
<listitem><para>Initialize session from <replaceable>FILE</replaceable></para></listitem>
</varlistentry>
<varlistentry>
<term><option>--screen=<replaceable>SCREEN</replaceable></option></term>
<listitem><para>X screen to use</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-d</option>, <option>--display=<replaceable>DISPLAY</replaceable></option></term>
<listitem><para>X Display to use</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--sync</option></term>
<listitem><para>Make X calls synchronous</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--version</option></term>
<listitem><para>Print version and exit</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--help</option></term>
<listitem><para>Display help and exit</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--mode=<replaceable>MODE</replaceable></option></term>
<listitem><para>Use a specific mode, e.g. "gdm" for login screen</para></listitem>
</varlistentry>
<varlistentry>
<term><option>--list-modes</option></term>
<listitem><para>List possible modes and exit</para></listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1>
<title>Files</title>
<para>
<filename>/usr/share/gnome-session/sessions/gnome.session</filename>,
<filename>/usr/share/applications/gnome-shell.desktop</filename>.</para>
</refsect1>
<refsect1>
<title>Bugs</title>
<para>The bug tracker can be reached by visiting the
website <ulink url="https://bugzilla.gnome.org/buglist.cgi?product=gnome-shell">https://bugzilla.gnome.org/buglist.cgi?product=gnome-shell</ulink>.
Before sending a bug report, please verify that you have
the latest version of gnome-shell. Many bugs (major and
minor) are fixed at each release, and if yours is out of
date, the problem may already have been solved.</para>
</refsect1>
<refsect1>
<title>Additional Information</title>
<para>For further information, visit the website
<ulink url="http://live.gnome.org/GnomeShell">http://live.gnome.org/GnomeShell</ulink>.</para>
</refsect1>
</refentry>

481
po/cs.po

File diff suppressed because it is too large Load Diff

194
po/de.po
View File

@ -19,9 +19,9 @@ 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: 2012-10-14 16:48+0000\n" "POT-Creation-Date: 2012-11-06 04:39+0000\n"
"PO-Revision-Date: 2012-10-10 23:10+0100\n" "PO-Revision-Date: 2012-11-06 20:04+0100\n"
"Last-Translator: Tobias Endrigkeit <tobiasendrigkeit@googlemail.com>\n" "Last-Translator: Wolfgang Stoeggl <c72578@yahoo.de>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n" "Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: \n" "Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -148,56 +148,68 @@ msgstr ""
"Aufzählung entnommen." "Aufzählung entnommen."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "Always show the 'Log out' menuitem in the user menu."
msgstr "Den Menüeintrag »Abmelden« immer im Benutzermenü anzeigen."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations."
msgstr ""
"Dieser Schlüssel überschreibt das automatische Verbergen des Menüeintrags "
"»Abmelden« in Einzelbenutzer, Einzelsitzungssituationen."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Wochentag im Kalender anzeigen" msgstr "Wochentag im Kalender anzeigen"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "" msgstr ""
"Wenn dieser Wert gesetzt ist, wird der ISO-Wochentag im Kalender angezeigt." "Wenn dieser Wert gesetzt ist, wird der ISO-Wochentag im Kalender angezeigt."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs" msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs." msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "" msgstr ""
"Tastenkombination zum Umschalten der Sichtbarkeit des Benachrichtigungsfeldes" "Tastenkombination zum Umschalten der Sichtbarkeit des Benachrichtigungsfeldes"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "" msgstr ""
"Tastenkombination zum Umschalten der Sichtbarkeit des " "Tastenkombination zum Umschalten der Sichtbarkeit des "
"Benachrichtigungsfeldes." "Benachrichtigungsfeldes."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Tastenkombination zum Umschalten des Bildschirmaufzeichners" msgstr "Tastenkombination zum Umschalten des Bildschirmaufzeichners"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "" msgstr ""
"Tastenkombination zum Starten/Entfernen des eingebauten " "Tastenkombination zum Starten/Entfernen des eingebauten "
"Bildschirmaufzeichners." "Bildschirmaufzeichners."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Zu verwendende Tastatur" msgstr "Zu verwendende Tastatur"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Der Typ der zu verwendenden Tastatur" msgstr "Der Typ der zu verwendenden Tastatur"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Bildwiederholungsrate zur Aufnahme von Screencasts" msgstr "Bildwiederholungsrate zur Aufnahme von Screencasts"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -206,11 +218,11 @@ msgstr ""
"der GNOME-Shell aufgezeichnet werden soll, in Einzelbildern pro Sekunde." "der GNOME-Shell aufgezeichnet werden soll, in Einzelbildern pro Sekunde."
# hmm Enkodieren oder Kodieren? # hmm Enkodieren oder Kodieren?
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Die GStreamer-Weiterleitung zur Enkodierung des Screencasts" msgstr "Die GStreamer-Weiterleitung zur Enkodierung des Screencasts"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -238,11 +250,11 @@ msgstr ""
"aufzeichnet. %T wird als Platzhalter für die vermutete optimale Thread-" "aufzeichnet. %T wird als Platzhalter für die vermutete optimale Thread-"
"Anzahl auf dem System verwendet." "Anzahl auf dem System verwendet."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Die Dateiendung zum Speichern des Screencast" msgstr "Die Dateiendung zum Speichern des Screencast"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -303,8 +315,8 @@ msgstr "Anmeldefenster"
msgid "Power" msgid "Power"
msgstr "Ausschalten" msgstr "Ausschalten"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:664 #: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:664 ../js/ui/userMenu.js:668
#: ../js/ui/userMenu.js:775 #: ../js/ui/userMenu.js:779
msgid "Suspend" msgid "Suspend"
msgstr "Bereitschaft" msgstr "Bereitschaft"
@ -312,8 +324,8 @@ msgstr "Bereitschaft"
msgid "Restart" msgid "Restart"
msgstr "Neu starten" msgstr "Neu starten"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:662 ../js/ui/userMenu.js:664 #: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:666 ../js/ui/userMenu.js:668
#: ../js/ui/userMenu.js:774 #: ../js/ui/userMenu.js:778
msgid "Power Off" msgid "Power Off"
msgstr "Ausschalten" msgstr "Ausschalten"
@ -698,35 +710,35 @@ msgstr "Stumm"
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds. #. locale, without seconds.
#: ../js/ui/components/telepathyClient.js:948 #: ../js/ui/components/telepathyClient.js:952
#, no-c-format #, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>" msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "Gesendet am <b>%A</b> um <b>%X</b> " msgstr "Gesendet am <b>%A</b> um <b>%X</b> "
#. Translators: this is a time format in the style of "Wednesday, May 25", #. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year. #. shown when you get a chat message in the same year.
#: ../js/ui/components/telepathyClient.js:954 #: ../js/ui/components/telepathyClient.js:958
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>" msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "Gesendet am <b>%A</b>, <b>%d. %B</b>" msgstr "Gesendet am <b>%A</b>, <b>%d. %B</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year. #. shown when you get a chat message in a different year.
#: ../js/ui/components/telepathyClient.js:959 #: ../js/ui/components/telepathyClient.js:963
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y" msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "Gesendet am <b>%A</b>, <b>%d. %B</b> %Y" msgstr "Gesendet am <b>%A</b>, <b>%d. %B</b> %Y"
#. 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:988 #: ../js/ui/components/telepathyClient.js:992
#, 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:1092
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Einladung zum Betreten von %s" msgstr "Einladung zum Betreten von %s"
@ -734,42 +746,42 @@ 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:1100
#, 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:1102
#: ../js/ui/components/telepathyClient.js:1177 #: ../js/ui/components/telepathyClient.js:1181
#: ../js/ui/components/telepathyClient.js:1240 #: ../js/ui/components/telepathyClient.js:1244
msgid "Decline" msgid "Decline"
msgstr "Ablehnen" msgstr "Ablehnen"
#: ../js/ui/components/telepathyClient.js:1099 #: ../js/ui/components/telepathyClient.js:1103
#: ../js/ui/components/telepathyClient.js:1178 #: ../js/ui/components/telepathyClient.js:1182
#: ../js/ui/components/telepathyClient.js:1241 #: ../js/ui/components/telepathyClient.js:1245
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:1133
#, 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:1136
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Anruf von %s" msgstr "Anruf von %s"
#: ../js/ui/components/telepathyClient.js:1137 #: ../js/ui/components/telepathyClient.js:1141
#: ../js/ui/status/bluetooth.js:346 #: ../js/ui/status/bluetooth.js:346
msgid "Reject" msgid "Reject"
msgstr "Abweisen" msgstr "Abweisen"
#. 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:1143
msgid "Answer" msgid "Answer"
msgstr "Antworten" msgstr "Antworten"
@ -778,113 +790,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:1175
#, 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:1210
#, 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:1302
msgid "Network error" msgid "Network error"
msgstr "Netzwerkfehler" msgstr "Netzwerkfehler"
#: ../js/ui/components/telepathyClient.js:1300 #: ../js/ui/components/telepathyClient.js:1304
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Legitimierung fehlgeschlagen" msgstr "Legitimierung fehlgeschlagen"
#: ../js/ui/components/telepathyClient.js:1302 #: ../js/ui/components/telepathyClient.js:1306
msgid "Encryption error" msgid "Encryption error"
msgstr "Verschlüsselungsfehler" msgstr "Verschlüsselungsfehler"
#: ../js/ui/components/telepathyClient.js:1304 #: ../js/ui/components/telepathyClient.js:1308
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:1310
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:1312
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Zertifikat abgelaufen" msgstr "Zertifikat abgelaufen"
#: ../js/ui/components/telepathyClient.js:1310 #: ../js/ui/components/telepathyClient.js:1314
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:1316
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:1318
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:1320
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:1322
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:1324
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:1326
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:1328
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:1330
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:1332
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:1334
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:1336
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:1338
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:1340
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:1342
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:1344
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:1346
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"
@ -893,26 +905,26 @@ 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:1348
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:1358
#, c-format #, c-format
msgid "Connection to %s failed" msgid "Connection to %s failed"
msgstr "Verbindung zu %s ist fehlgeschlagen" msgstr "Verbindung zu %s ist fehlgeschlagen"
#: ../js/ui/components/telepathyClient.js:1363 #: ../js/ui/components/telepathyClient.js:1367
msgid "Reconnect" msgid "Reconnect"
msgstr "Erneut verbinden" msgstr "Erneut verbinden"
#: ../js/ui/components/telepathyClient.js:1364 #: ../js/ui/components/telepathyClient.js:1368
msgid "Edit account" msgid "Edit account"
msgstr "Konto bearbeiten" msgstr "Konto bearbeiten"
#: ../js/ui/components/telepathyClient.js:1409 #: ../js/ui/components/telepathyClient.js:1413
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Unbekannter Grund" msgstr "Unbekannter Grund"
@ -1095,23 +1107,23 @@ msgstr "Quelle zeigen"
msgid "Web Page" msgid "Web Page"
msgstr "Webseite" msgstr "Webseite"
#: ../js/ui/messageTray.js:1081 #: ../js/ui/messageTray.js:1084
msgid "Open" msgid "Open"
msgstr "Öffnen" msgstr "Öffnen"
#: ../js/ui/messageTray.js:1088 #: ../js/ui/messageTray.js:1091
msgid "Remove" msgid "Remove"
msgstr "Entfernen" msgstr "Entfernen"
#: ../js/ui/messageTray.js:1540 #: ../js/ui/messageTray.js:1543
msgid "Message Tray" msgid "Message Tray"
msgstr "Benachrichtigungsfeld" msgstr "Benachrichtigungsfeld"
#: ../js/ui/messageTray.js:2547 #: ../js/ui/messageTray.js:2549
msgid "System Information" msgid "System Information"
msgstr "Systeminformationen" msgstr "Systeminformationen"
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:373 #: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:374
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Unbekannt" msgstr "Unbekannt"
@ -1171,18 +1183,18 @@ msgstr "Bitte geben Sie einen Befehl ein:"
# %B - ausgeschriebener Name des Monats, abhängig von der gesetzten Umgebung # %B - ausgeschriebener Name des Monats, abhängig von der gesetzten Umgebung
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:79 #: ../js/ui/screenShield.js:80
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d. %B" msgstr "%A, %d. %B"
#: ../js/ui/screenShield.js:143 #: ../js/ui/screenShield.js:144
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d neue Nachricht" msgstr[0] "%d neue Nachricht"
msgstr[1] "%d neue Nachrichten" msgstr[1] "%d neue Nachrichten"
#: ../js/ui/screenShield.js:145 #: ../js/ui/screenShield.js:146
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@ -1638,59 +1650,59 @@ msgstr "Mikrofon"
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Als anderer Benutzer anmelden" msgstr "Als anderer Benutzer anmelden"
#: ../js/ui/userMenu.js:180 #: ../js/ui/userMenu.js:181
msgid "Available" msgid "Available"
msgstr "Verfügbar" msgstr "Verfügbar"
#: ../js/ui/userMenu.js:183 #: ../js/ui/userMenu.js:184
msgid "Busy" msgid "Busy"
msgstr "Beschäftigt" msgstr "Beschäftigt"
#: ../js/ui/userMenu.js:186 #: ../js/ui/userMenu.js:187
msgid "Invisible" msgid "Invisible"
msgstr "Unsichtbar" msgstr "Unsichtbar"
#: ../js/ui/userMenu.js:189 #: ../js/ui/userMenu.js:190
msgid "Away" msgid "Away"
msgstr "Abwesend" msgstr "Abwesend"
#: ../js/ui/userMenu.js:192 #: ../js/ui/userMenu.js:193
msgid "Idle" msgid "Idle"
msgstr "Untätig" msgstr "Untätig"
#: ../js/ui/userMenu.js:195 #: ../js/ui/userMenu.js:196
msgid "Unavailable" msgid "Unavailable"
msgstr "Nicht verfügbar" msgstr "Nicht verfügbar"
#: ../js/ui/userMenu.js:740 #: ../js/ui/userMenu.js:744
msgid "Notifications" msgid "Notifications"
msgstr "Benachrichtigungen" msgstr "Benachrichtigungen"
#: ../js/ui/userMenu.js:748 #: ../js/ui/userMenu.js:752
msgid "System Settings" msgid "System Settings"
msgstr "Systemeinstellungen" msgstr "Systemeinstellungen"
#: ../js/ui/userMenu.js:756 #: ../js/ui/userMenu.js:760
msgid "Switch User" msgid "Switch User"
msgstr "Benutzer wechseln" msgstr "Benutzer wechseln"
#: ../js/ui/userMenu.js:761 #: ../js/ui/userMenu.js:765
msgid "Log Out" msgid "Log Out"
msgstr "Abmelden" msgstr "Abmelden"
#: ../js/ui/userMenu.js:766 #: ../js/ui/userMenu.js:770
msgid "Lock" msgid "Lock"
msgstr "Sperren" msgstr "Sperren"
#: ../js/ui/userMenu.js:781 #: ../js/ui/userMenu.js:785
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Aktualisierungen installieren und neustarten" msgstr "Aktualisierungen installieren und neustarten"
#: ../js/ui/userMenu.js:799 #: ../js/ui/userMenu.js:803
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:800 #: ../js/ui/userMenu.js:804
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."
@ -1777,7 +1789,7 @@ msgstr ""
msgid "List possible modes" msgid "List possible modes"
msgstr "Die möglichen Modi auflisten" msgstr "Die möglichen Modi auflisten"
#: ../src/shell-app.c:621 #: ../src/shell-app.c:622
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "»%s« konnte nicht gestartet werden" msgstr "»%s« konnte nicht gestartet werden"

158
po/et.po
View File

@ -13,8 +13,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: 2012-09-22 22:24+0000\n" "POT-Creation-Date: 2012-11-16 18:27+0000\n"
"PO-Revision-Date: 2012-09-23 08:48+0300\n" "PO-Revision-Date: 2012-11-16 20:40+0300\n"
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n" "Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
"Language-Team: Estonian <>\n" "Language-Team: Estonian <>\n"
"Language: et\n" "Language: et\n"
@ -37,6 +37,15 @@ msgstr "Arvuti"
msgid "Show the message tray" msgid "Show the message tray"
msgstr "Teateala näitamine" msgstr "Teateala näitamine"
msgid "Focus the active notification"
msgstr "Aktiivse märguande fokuseerimine"
msgid "Show all applications"
msgstr "Kõigi rakenduste kuvamine"
msgid "Open the application menu"
msgstr "Rakenduste menüü avamine"
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "GNOME Shell" msgstr "GNOME Shell"
@ -116,6 +125,16 @@ msgstr ""
"Kasutatakse kasutaja poolt viimati vahetult määratud kiirsuhtluse oleku " "Kasutatakse kasutaja poolt viimati vahetult määratud kiirsuhtluse oleku "
"salvestamiseks. See väärtus pärineb GsmPresenceStatus nummerdusest." "salvestamiseks. See väärtus pärineb GsmPresenceStatus nummerdusest."
msgid "Always show the 'Log out' menuitem in the user menu."
msgstr "Kasutajamenüüs näidatakse alati 'Logi välja' menüükirjet."
msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations."
msgstr ""
"See võti keelab automaatse 'Logi välja' menüükirje peitmise, kui arvutis on "
"üks kasutaja ning avatud üks seanss."
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Kalendris näidatakse kuupäeva nädalavormingus" msgstr "Kalendris näidatakse kuupäeva nädalavormingus"
@ -128,12 +147,25 @@ msgstr "Rakenduste menüü avamise kiirklahv"
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Kiirklahv rakenduste menüü avamiseks." msgstr "Kiirklahv rakenduste menüü avamiseks."
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "\"Rakenduste vaate\" avamise kiirklahv"
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "\"Rakenduste vaate\" avamise kiirklahv tegevuste ülevaates."
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Teateala nähtavuse muutmise kiirklahv" msgstr "Teateala nähtavuse muutmise kiirklahv"
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Kiirklahv teateala nähtavuse muutmiseks." msgstr "Kiirklahv teateala nähtavuse muutmiseks."
msgid "Keybinding to focus the active notification"
msgstr "Aktiivse teate fokuseerimise kiirklahv"
msgid "Keybinding to focus the active notification."
msgstr "Aktiivse teate fokuseerimise kiirklahv."
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Erkaanilindistaja lülitamise kiirklahv" msgstr "Erkaanilindistaja lülitamise kiirklahv"
@ -195,6 +227,34 @@ msgstr ""
"konteinervormingusse salvestades tuleks ka sellele vormingule vastav laiend " "konteinervormingusse salvestades tuleks ka sellele vormingule vastav laiend "
"määrata." "määrata."
msgid "Attach modal dialog to the parent window"
msgstr "Modaaldialoog kuulub vanemakna juurde"
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr ""
"See võti on ülimuslik võtme org.gnome.mutter suhtes, kui kasutatakse GNOME "
"Shelli."
msgid "Arrangement of buttons on the titlebar"
msgstr "Nuppude järjekord tiitliribal"
msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell."
msgstr ""
"See võti on ülimuslik võtme org.gnome.desktop.wm.preferences suhtes, kui "
"kasutatakse GNOME Shelli."
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "Akende lohistamisel ekraani serva lubatakse serva paigutamine"
msgid "Workspaces are managed dynamically"
msgstr "Tööalasid hallatakse dünaamiliselt"
msgid "Workspaces only on primary monitor"
msgstr "Tööalad peamisel monitoril"
#, c-format #, c-format
msgid "There was an error loading the preferences dialog for %s:" msgid "There was an error loading the preferences dialog for %s:"
msgstr "%s jaoks eelistuste dialoogi laadimisel esines viga:" msgstr "%s jaoks eelistuste dialoogi laadimisel esines viga:"
@ -225,9 +285,22 @@ msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Logi sisse" msgstr "Logi sisse"
msgid "Next"
msgstr "Järgmine"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
msgid "Username: "
msgstr "Kasutajanimi: "
msgid "Login Window" msgid "Login Window"
msgstr "Sisselogimisaken" msgstr "Sisselogimisaken"
#. Translators: accessible name of the power menu in the login screen
msgid "Power"
msgstr "Vool"
msgid "Suspend" msgid "Suspend"
msgstr "Uinak" msgstr "Uinak"
@ -437,12 +510,6 @@ msgstr "Parool: "
msgid "Key: " msgid "Key: "
msgstr "Võti: " msgstr "Võti: "
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
msgid "Username: "
msgstr "Kasutajanimi: "
msgid "Identity: " msgid "Identity: "
msgstr "Identiteet: " msgstr "Identiteet: "
@ -533,24 +600,27 @@ msgstr "Heli peale"
msgid "Mute" msgid "Mute"
msgstr "Heli maha" msgstr "Heli maha"
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by the word "Yesterday". i.e. "14:30 on Yesterday"
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#, no-c-format #, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>" msgid "<b>%H:%M</b> on Yesterday"
msgstr "Saadetud: <b>%A</b>, <b>%X</b>" msgstr "Eile <b>%H:%M</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25", #. Translators: this is a time format string followed by a week day name. i.e. "14:30 on Monday
#. shown when you get a chat message in the same year.
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>" msgid "<b>%H:%M</b> on <b>%A</b>"
msgstr "Saadeti <b>%A</b>, <b>%B %d</b>" msgstr "<b>%H:%M</b>, <b>%A</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "14:30 on Wednesday, May 25",
#. shown when you get a chat message in a different year. #. shown when you get a chat message in the same year
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y" msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>"
msgstr "Saadeti <b>%A</b>, <b>%B %d</b>, %Y" msgstr "<b>%H:%M</b>, <b>%A</b>, <b>%d. %B</b>"
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year
#, no-c-format
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>, %Y"
msgstr "<b>%H:%M</b>, <b>%A</b>, <b>%d. %B</b> %Y"
#. 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.
@ -587,9 +657,6 @@ msgstr "%s tahab alustada videokõnet"
msgid "Call from %s" msgid "Call from %s"
msgstr "%s helistab" msgstr "%s helistab"
msgid "Reject"
msgstr "Lükka tagasi"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
msgid "Answer" msgid "Answer"
msgstr "Vasta" msgstr "Vasta"
@ -897,8 +964,11 @@ msgstr "Ülemine riba"
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Enter a Command"
msgstr "Palun sisesta käsk:" msgstr "Palun sisesta käsk"
msgid "Close"
msgstr "Sulge"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
@ -1011,16 +1081,6 @@ msgstr "ühendumine..."
msgid "Send Files..." msgid "Send Files..."
msgstr "Failide saatmine..." msgstr "Failide saatmine..."
msgid "Browse Files..."
msgstr "Failide sirvimine..."
msgid "Error browsing device"
msgstr "Viga seadme sirvimisel"
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "Küsitud seadet pole võimalik sirvida, viga on '%s'"
msgid "Keyboard Settings" msgid "Keyboard Settings"
msgstr "Klaviatuurisätted" msgstr "Klaviatuurisätted"
@ -1044,6 +1104,9 @@ msgstr "Luba alati"
msgid "Grant this time only" msgid "Grant this time only"
msgstr "Luba ainult seekord" msgstr "Luba ainult seekord"
msgid "Reject"
msgstr "Lükka tagasi"
#, c-format #, c-format
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "Paardumise kinnitus seadmele %s" msgstr "Paardumise kinnitus seadmele %s"
@ -1154,9 +1217,6 @@ msgstr "Juhtmeta"
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "Mobiiliühendus" msgstr "Mobiiliühendus"
msgid "VPN Connections"
msgstr "VPN-ühendused"
msgid "Network Settings" msgid "Network Settings"
msgstr "Võrgusätted" msgstr "Võrgusätted"
@ -1274,20 +1334,17 @@ msgstr "Eemal"
msgid "Idle" msgid "Idle"
msgstr "Jõude" msgstr "Jõude"
msgid "Unavailable" msgid "Offline"
msgstr "Pole saadaval" msgstr "Ühendamata"
msgid "Switch User"
msgstr "Vaheta kasutajat"
msgid "Switch Session"
msgstr "Vaheta seanssi"
msgid "Notifications" msgid "Notifications"
msgstr "Märguanded" msgstr "Märguanded"
msgid "System Settings" msgid "Settings"
msgstr "Süsteemi sätted" msgstr "Sätted"
msgid "Switch User"
msgstr "Vaheta kasutajat"
msgid "Log Out" msgid "Log Out"
msgstr "Logi välja" msgstr "Logi välja"
@ -1404,9 +1461,6 @@ msgstr "Kasutaja katkestas autentimisdialoogi"
#~ msgid "If true, display date in the clock, in addition to time." #~ msgid "If true, display date in the clock, in addition to time."
#~ msgstr "Kui määratud, siis kuvatakse kellaaja kõrval ka kuupäeva." #~ msgstr "Kui määratud, siis kuvatakse kellaaja kõrval ka kuupäeva."
#~ msgid "Offline"
#~ msgstr "Ühendamata"
#~ msgid "CONTACTS" #~ msgid "CONTACTS"
#~ msgstr "KONTAKTID" #~ msgstr "KONTAKTID"

View File

@ -708,7 +708,7 @@ msgstr "ارسال در <b>%A</b>, <b>%B %d</b>, %Y"
#: ../js/ui/components/telepathyClient.js:988 #: ../js/ui/components/telepathyClient.js:988
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s با عنوان %s شناخته می‌شود" msgstr "%s با عنوان %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.
@ -723,7 +723,7 @@ msgstr "دعوتنامه به %s"
#: ../js/ui/components/telepathyClient.js:1096 #: ../js/ui/components/telepathyClient.js:1096
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s از شما دعوت می‌کند که به %s بپیوندید" msgstr "%s از شما دعوت می‌کند که به %s بپیوندید"
#: ../js/ui/components/telepathyClient.js:1098 #: ../js/ui/components/telepathyClient.js:1098
#: ../js/ui/components/telepathyClient.js:1177 #: ../js/ui/components/telepathyClient.js:1177
@ -767,13 +767,13 @@ msgstr "پاسخگویی"
#: ../js/ui/components/telepathyClient.js:1171 #: ../js/ui/components/telepathyClient.js:1171
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s در حال ارسال %s به شما است" msgstr "%s در حال ارسال %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:1206
#, 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 اجازه دسترسی برای دیدن زمان‌هایی که شما برخط هستید را دارد" msgstr "%s اجازه دسترسی برای دیدن زمان‌هایی که شما برخط هستید را دارد"
#: ../js/ui/components/telepathyClient.js:1298 #: ../js/ui/components/telepathyClient.js:1298
msgid "Network error" msgid "Network error"
@ -938,8 +938,8 @@ msgstr ""
#, c-format #, c-format
msgid "%s will be logged out automatically in %d second." msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds." msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد." msgstr[0] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
msgstr[1] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد." msgstr[1] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
#: ../js/ui/endSessionDialog.js:70 #: ../js/ui/endSessionDialog.js:70
#, c-format #, c-format
@ -1698,7 +1698,7 @@ msgstr ""
#: ../js/ui/wanda.js:121 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "%s پیشگو می‌گوید" msgstr "%s پیشگو می‌گوید"
#: ../js/ui/wanda.js:162 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
@ -1852,16 +1852,16 @@ msgstr "محاوره تایید هویت از طرف کاربر رد شد"
#~ msgstr "شبکه" #~ msgstr "شبکه"
#~ msgid "%s is online." #~ msgid "%s is online."
#~ msgstr "%s بر خط است." #~ msgstr "%s بر خط است."
#~ msgid "%s is offline." #~ msgid "%s is offline."
#~ msgstr "%s برون خط است." #~ msgstr "%s برون خط است."
#~ msgid "%s is away." #~ msgid "%s is away."
#~ msgstr "%s غایب است." #~ msgstr "%s غایب است."
#~ msgid "%s is busy." #~ msgid "%s is busy."
#~ msgstr "%s مشغول است." #~ msgstr "%s مشغول است."
#~ msgid "Hidden" #~ msgid "Hidden"
#~ msgstr "نامرئی" #~ msgstr "نامرئی"

551
po/gl.po

File diff suppressed because it is too large Load Diff

723
po/he.po

File diff suppressed because it is too large Load Diff

419
po/nb.po
View File

@ -6,10 +6,10 @@
# Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010. # Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell 3.5.x\n" "Project-Id-Version: gnome-shell 3.7.x\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-10-11 20:24+0200\n" "POT-Creation-Date: 2012-11-05 19:06+0100\n"
"PO-Revision-Date: 2012-10-11 20:25+0200\n" "PO-Revision-Date: 2012-11-05 19:10+0100\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"
@ -34,6 +34,14 @@ msgstr "System"
msgid "Show the message tray" msgid "Show the message tray"
msgstr "Vis meldingstrau" msgstr "Vis meldingstrau"
#: ../data/50-gnome-shell-system.xml.in.h:3
msgid "Show all applications"
msgstr "Vis alle programmer"
#: ../data/50-gnome-shell-system.xml.in.h:4
msgid "Open the application menu"
msgstr "Åpne programmenyen"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "GNOME Shell" msgstr "GNOME Shell"
@ -128,50 +136,71 @@ msgid ""
msgstr "" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "Always show the 'Log out' menuitem in the user menu."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Vis dato for uken i kalender" msgstr "Vis dato for uken i kalender"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "Viser ISO-ukedato i kalenderen hvis «true»." msgstr "Viser ISO-ukedato i kalenderen hvis «true»."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Tastaturbinding som åpner programmenyen" msgstr "Tastaturbinding som åpner programmenyen"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Tastaturbinding som åpner programmenyen." msgstr "Tastaturbinding som åpner programmenyen."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
#, fuzzy
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Tastaturbinding som åpner programmenyen"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
#, fuzzy
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "Tastaturbinding som åpner programmenyen."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Tastaturbinding som slår av/på synlighet for meldingstrau" msgstr "Tastaturbinding som slår av/på synlighet for meldingstrau"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Tastaturbinding som slår av/på synlighet for meldingstrauet." msgstr "Tastaturbinding som slår av/på synlighet for meldingstrauet."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Tastaturbinding som slår av/på skjermopptak" msgstr "Tastaturbinding som slår av/på skjermopptak"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Tastaturbinding som starter/stopper innebygget opptak av skjerm." msgstr "Tastaturbinding som starter/stopper innebygget opptak av skjerm."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Tastatur som skal brukes" msgstr "Tastatur som skal brukes"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Type tastatur som skal brukes." msgstr "Type tastatur som skal brukes."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Bildefrekvens i bruk ved lagring av skjermvideoer." msgstr "Bildefrekvens i bruk ved lagring av skjermvideoer."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -179,11 +208,11 @@ msgstr ""
"Bildefrekvensen i den ferdige skjermvideoen tatt opp med GNOME Shells " "Bildefrekvensen i den ferdige skjermvideoen tatt opp med GNOME Shells "
"skjermvideoopptaker i bilder per sekund." "skjermvideoopptaker i bilder per sekund."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Gstreamer-kommandokø brukt til å kode skjermvideoen" msgstr "Gstreamer-kommandokø brukt til å kode skjermvideoen"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
#, fuzzy, no-c-format #, fuzzy, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -200,11 +229,11 @@ msgstr ""
"Setter GStreamer-rør som brukes til å kode opptak. Den følger syntaksen som " "Setter GStreamer-rør som brukes til å kode opptak. Den følger syntaksen som "
"brukes for gst-launch. Røret må ha en..." "brukes for gst-launch. Røret må ha en..."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Filendelse i bruk ved lagring av skjermvideo" msgstr "Filendelse i bruk ved lagring av skjermvideo"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -214,6 +243,37 @@ msgstr ""
"og bruke denne filendelsen. Den bør endres når du gjør opptak til et nytt " "og bruke denne filendelsen. Den bør endres når du gjør opptak til et nytt "
"oppbevaringsformat." "oppbevaringsformat."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid "Attach modal dialog to the parent window"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid "Arrangement of buttons on the titlebar"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid "Workspaces are managed dynamically"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "Workspaces only on primary monitor"
msgstr ""
#: ../js/extensionPrefs/main.js:124 #: ../js/extensionPrefs/main.js:124
#, c-format #, c-format
msgid "There was an error loading the preferences dialog for %s:" msgid "There was an error loading the preferences dialog for %s:"
@ -227,11 +287,11 @@ 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:529 #: ../js/gdm/loginDialog.js:560
msgid "Session..." msgid "Session..."
msgstr "Økt …" msgstr "Økt …"
#: ../js/gdm/loginDialog.js:677 #: ../js/gdm/loginDialog.js:704
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Logg inn" msgstr "Logg inn"
@ -239,56 +299,56 @@ msgstr "Logg inn"
#. 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:736 #: ../js/gdm/loginDialog.js:764
msgid "Not listed?" msgid "Not listed?"
msgstr "Ikke listet?" msgstr "Ikke listet?"
#: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:906 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 #: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:171
msgid "Cancel" msgid "Cancel"
msgstr "Avbryt" msgstr "Avbryt"
#: ../js/gdm/loginDialog.js:894 #: ../js/gdm/loginDialog.js:911
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Logg inn" msgstr "Logg inn"
#: ../js/gdm/loginDialog.js:1215 #: ../js/gdm/loginDialog.js:1237
msgid "Login Window" msgid "Login Window"
msgstr "Innloggingsvindu" msgstr "Innloggingsvindu"
#. Translators: accessible name of the power menu in the login screen #. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:35 #: ../js/gdm/powerMenu.js:36
msgid "Power" msgid "Power"
msgstr "Strøm" msgstr "Strøm"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:664 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:667 ../js/ui/userMenu.js:671
#: ../js/ui/userMenu.js:775 #: ../js/ui/userMenu.js:782
msgid "Suspend" msgid "Suspend"
msgstr "Hvilemodus" msgstr "Hvilemodus"
#: ../js/gdm/powerMenu.js:94 #: ../js/gdm/powerMenu.js:98
msgid "Restart" msgid "Restart"
msgstr "Start på nytt" msgstr "Start på nytt"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:662 ../js/ui/userMenu.js:664 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:669
#: ../js/ui/userMenu.js:774 #: ../js/ui/userMenu.js:671 ../js/ui/userMenu.js:781
msgid "Power Off" msgid "Power Off"
msgstr "Slå av" msgstr "Slå av"
#: ../js/gdm/util.js:148 #: ../js/gdm/util.js:151
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:265 #: ../js/gdm/util.js:268
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(eller dra finger)" msgstr "(eller dra finger)"
#: ../js/gdm/util.js:290 #: ../js/gdm/util.js:293
#, 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)"
@ -338,7 +398,7 @@ msgstr "Legg til i favoritter"
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s ble lagt til i dine favoritter." msgstr "%s ble lagt til i dine favoritter."
#: ../js/ui/appFavorites.js:118 #: ../js/ui/appFavorites.js:121
#, c-format #, c-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s ble fjernet fra dine favoritter." msgstr "%s ble fjernet fra dine favoritter."
@ -457,48 +517,48 @@ msgid "S"
msgstr "Lø" msgstr "Lø"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:699 #: ../js/ui/calendar.js:700
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Ingenting planlagt" msgstr "Ingenting planlagt"
#. 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:715 #: ../js/ui/calendar.js:716
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A %B %d" msgstr "%A %B %d"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:718 #: ../js/ui/calendar.js:719
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A %B %d, %Y" msgstr "%A %B %d, %Y"
#: ../js/ui/calendar.js:728 #: ../js/ui/calendar.js:729
msgid "Today" msgid "Today"
msgstr "I dag" msgstr "I dag"
#: ../js/ui/calendar.js:732 #: ../js/ui/calendar.js:733
msgid "Tomorrow" msgid "Tomorrow"
msgstr "I morgen" msgstr "I morgen"
#: ../js/ui/calendar.js:743 #: ../js/ui/calendar.js:744
msgid "This week" msgid "This week"
msgstr "Denne uken" msgstr "Denne uken"
#: ../js/ui/calendar.js:751 #: ../js/ui/calendar.js:752
msgid "Next week" msgid "Next week"
msgstr "Neste uke" msgstr "Neste uke"
#: ../js/ui/components/autorunManager.js:297 #: ../js/ui/components/autorunManager.js:295
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Avtagbare enheter" msgstr "Avtagbare enheter"
#: ../js/ui/components/autorunManager.js:594 #: ../js/ui/components/autorunManager.js:591
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Åpne med %s" msgstr "Åpne med %s"
#: ../js/ui/components/autorunManager.js:620 #: ../js/ui/components/autorunManager.js:617
msgid "Eject" msgid "Eject"
msgstr "Løs ut" msgstr "Løs ut"
@ -652,38 +712,42 @@ msgstr "Fjern demping"
msgid "Mute" msgid "Mute"
msgstr "Demp" msgstr "Demp"
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by the word "Yesterday". i.e. "14:30 on Yesterday"
#. If applicable, replace %X with a strftime format valid for your #: ../js/ui/components/telepathyClient.js:945
#. locale, without seconds.
#: ../js/ui/components/telepathyClient.js:948
#, no-c-format #, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>" msgid "<b>%H:%M</b> on Yesterday"
msgstr "Sendt <b>%X</b> på <b>%A</b>" msgstr "<b>%H.%M</b> i går"
#. Translators: this is a time format in the style of "Wednesday, May 25", #. Translators: this is a time format string followed by a week day name. i.e. "14:30 on Monday
#. shown when you get a chat message in the same year. #: ../js/ui/components/telepathyClient.js:951
#: ../js/ui/components/telepathyClient.js:954
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>" msgid "<b>%H:%M</b> on <b>%A</b>"
msgstr "Sendt <b>%A</b>, <b>%B %d</b>" msgstr "<b>%H.%M</b> <b>%A</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "14:30 on Wednesday, May 25",
#. shown when you get a chat message in a different year. #. shown when you get a chat message in the same year
#: ../js/ui/components/telepathyClient.js:959 #: ../js/ui/components/telepathyClient.js:957
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y" msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>"
msgstr "Sendt <b>%A</b>, <b>%B %d</b>, %Y" msgstr "<b>%H.%M</b>, <b>%A</b>, <b>%B</b> <b>%d</b>"
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year
#: ../js/ui/components/telepathyClient.js:962
#, no-c-format
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>, %Y"
msgstr "<b>%H.%M</b>, <b>%A</b>, <b>%B</b> <b>%d</b>, %Y"
#. 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:988 #: ../js/ui/components/telepathyClient.js:990
#, 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"
@ -691,42 +755,42 @@ 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:1177
#: ../js/ui/components/telepathyClient.js:1240
msgid "Decline"
msgstr "Avslå"
#: ../js/ui/components/telepathyClient.js:1099 #: ../js/ui/components/telepathyClient.js:1099
#: ../js/ui/components/telepathyClient.js:1178 #: ../js/ui/components/telepathyClient.js:1178
#: ../js/ui/components/telepathyClient.js:1241 #: ../js/ui/components/telepathyClient.js:1241
msgid "Decline"
msgstr "Avslå"
#: ../js/ui/components/telepathyClient.js:1100
#: ../js/ui/components/telepathyClient.js:1179
#: ../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"
#: ../js/ui/components/telepathyClient.js:1137 #: ../js/ui/components/telepathyClient.js:1138
#: ../js/ui/status/bluetooth.js:346 #: ../js/ui/status/bluetooth.js:346
msgid "Reject" msgid "Reject"
msgstr "Avvis" msgstr "Avvis"
#. 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"
@ -735,110 +799,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"
@ -846,26 +910,26 @@ 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 "Connection to %s failed" msgid "Connection to %s failed"
msgstr "Tilkobling til %s feilet" msgstr "Tilkobling til %s feilet"
#: ../js/ui/components/telepathyClient.js:1363 #: ../js/ui/components/telepathyClient.js:1364
msgid "Reconnect" msgid "Reconnect"
msgstr "Koble til på nytt" msgstr "Koble til på nytt"
#: ../js/ui/components/telepathyClient.js:1364 #: ../js/ui/components/telepathyClient.js:1365
msgid "Edit account" msgid "Edit account"
msgstr "Rediger konto" msgstr "Rediger konto"
#: ../js/ui/components/telepathyClient.js:1409 #: ../js/ui/components/telepathyClient.js:1410
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Ukjent årsak" msgstr "Ukjent årsak"
@ -884,7 +948,7 @@ msgstr "Åpne kalender"
#. 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:190 #: ../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"
@ -989,11 +1053,11 @@ msgstr "Installer"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Last ned og installer «%s» fra extensions.gnome.org?" msgstr "Last ned og installer «%s» fra extensions.gnome.org?"
#: ../js/ui/keyboard.js:337 #: ../js/ui/keyboard.js:308
msgid "tray" msgid "tray"
msgstr "varslingsområde" msgstr "varslingsområde"
#: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195 #: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:205
msgid "Keyboard" msgid "Keyboard"
msgstr "Tastatur" msgstr "Tastatur"
@ -1046,32 +1110,32 @@ msgstr "Vis kildekode"
msgid "Web Page" msgid "Web Page"
msgstr "Nettside" msgstr "Nettside"
#: ../js/ui/messageTray.js:1081 #: ../js/ui/messageTray.js:1088
msgid "Open" msgid "Open"
msgstr "Åpne" msgstr "Åpne"
#: ../js/ui/messageTray.js:1088 #: ../js/ui/messageTray.js:1095
msgid "Remove" msgid "Remove"
msgstr "Fjern" msgstr "Fjern"
#: ../js/ui/messageTray.js:1540 #: ../js/ui/messageTray.js:1539
msgid "Message Tray" msgid "Message Tray"
msgstr "Meldingstrau" msgstr "Meldingstrau"
#: ../js/ui/messageTray.js:2547 #: ../js/ui/messageTray.js:2563
msgid "System Information" msgid "System Information"
msgstr "Systeminformasjon" msgstr "Systeminformasjon"
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:373 #: ../js/ui/notificationDaemon.js:504 ../src/shell-app.c:374
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Ukjent" msgstr "Ukjent"
#: ../js/ui/overview.js:82 #: ../js/ui/overview.js:89
msgid "Undo" msgid "Undo"
msgstr "Angre" msgstr "Angre"
#: ../js/ui/overview.js:127 #: ../js/ui/overview.js:133
msgid "Overview" msgid "Overview"
msgstr "Oversikt" msgstr "Oversikt"
@ -1079,27 +1143,27 @@ msgstr "Oversikt"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: ../js/ui/overview.js:201 #: ../js/ui/overview.js:207
msgid "Type to search..." msgid "Type to search..."
msgstr "Skriv for å søke …" msgstr "Skriv for å søke …"
#. 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/overview.js:222 #: ../js/ui/overview.js:228
msgid "Dash" msgid "Dash"
msgstr "Favoritter" msgstr "Favoritter"
#: ../js/ui/panel.js:567 #: ../js/ui/panel.js:581
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:599 #: ../js/ui/panel.js:613
msgid "Activities" msgid "Activities"
msgstr "Aktiviteter" msgstr "Aktiviteter"
#: ../js/ui/panel.js:965 #: ../js/ui/panel.js:980
msgid "Top Bar" msgid "Top Bar"
msgstr "Topp-panel" msgstr "Topp-panel"
@ -1113,23 +1177,27 @@ msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:205 #: ../js/ui/runDialog.js:205
msgid "Please enter a command:" msgid "Enter a Command"
msgstr "Oppgi en kommando:" msgstr "Oppgi en kommando"
#: ../js/ui/runDialog.js:241
msgid "Close"
msgstr "Lukk"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:79 #: ../js/ui/screenShield.js:80
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %B %d" msgstr "%A, %B %d"
#: ../js/ui/screenShield.js:143 #: ../js/ui/screenShield.js:144
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d ny melding" msgstr[0] "%d ny melding"
msgstr[1] "%d nye meldinger" msgstr[1] "%d nye meldinger"
#: ../js/ui/screenShield.js:145 #: ../js/ui/screenShield.js:146
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@ -1168,7 +1236,7 @@ msgstr "Passord"
msgid "Remember Password" msgid "Remember Password"
msgstr "Husk passord" msgstr "Husk passord"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 #: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:174
msgid "Unlock" msgid "Unlock"
msgstr "Lås opp" msgstr "Lås opp"
@ -1223,7 +1291,7 @@ msgstr "Stor tekst"
#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31 #: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31
#: ../js/ui/status/bluetooth.js:251 ../js/ui/status/bluetooth.js:304 #: ../js/ui/status/bluetooth.js:251 ../js/ui/status/bluetooth.js:304
#: ../js/ui/status/bluetooth.js:335 ../js/ui/status/bluetooth.js:371 #: ../js/ui/status/bluetooth.js:335 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:400 ../js/ui/status/network.js:867 #: ../js/ui/status/bluetooth.js:400 ../js/ui/status/network.js:873
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@ -1252,12 +1320,12 @@ msgstr "maskinvare slått av"
msgid "Connection" msgid "Connection"
msgstr "Tilkobling" msgstr "Tilkobling"
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:458 #: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:475
msgid "disconnecting..." msgid "disconnecting..."
msgstr "kobler fra …" msgstr "kobler fra …"
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:464 #: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:481
#: ../js/ui/status/network.js:934 #: ../js/ui/status/network.js:1507
msgid "connecting..." msgid "connecting..."
msgstr "kobler til …" msgstr "kobler til …"
@ -1367,109 +1435,106 @@ msgstr "slått av"
#. 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:456 #: ../js/ui/status/network.js:473
msgid "unmanaged" msgid "unmanaged"
msgstr "ikke håndtert" msgstr "ikke håndtert"
#. 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:467 ../js/ui/status/network.js:937 #: ../js/ui/status/network.js:484 ../js/ui/status/network.js:1510
msgid "authentication required" msgid "authentication required"
msgstr "autentisering kreves" msgstr "autentisering kreves"
#. 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:477 #: ../js/ui/status/network.js:494
msgid "firmware missing" msgid "firmware missing"
msgstr "fastvare mangler" msgstr "fastvare mangler"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:484 #: ../js/ui/status/network.js:501
msgid "cable unplugged" msgid "cable unplugged"
msgstr "kabel koblet fra" msgstr "kabel koblet fra"
#. 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:489 #: ../js/ui/status/network.js:506
msgid "unavailable" msgid "unavailable"
msgstr "ikke tilgjengelig" msgstr "ikke tilgjengelig"
#: ../js/ui/status/network.js:491 ../js/ui/status/network.js:939 #: ../js/ui/status/network.js:508 ../js/ui/status/network.js:1512
msgid "connection failed" msgid "connection failed"
msgstr "tilkobling feilet" msgstr "tilkobling feilet"
#: ../js/ui/status/network.js:552 ../js/ui/status/network.js:1529 #: ../js/ui/status/network.js:560 ../js/ui/status/network.js:1446
#: ../js/ui/status/network.js:1588
msgid "More..." msgid "More..."
msgstr "Mer …" msgstr "Mer …"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active, #. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name) #. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1459 #: ../js/ui/status/network.js:596 ../js/ui/status/network.js:1376
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Tilkoblet (privat)" msgstr "Tilkoblet (privat)"
#: ../js/ui/status/network.js:663 #: ../js/ui/status/network.js:669
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "Automatisk Ethernet" msgstr "Automatisk Ethernet"
#: ../js/ui/status/network.js:721 #: ../js/ui/status/network.js:727
msgid "Auto broadband" msgid "Auto broadband"
msgstr "Automatisk bredbånd" msgstr "Automatisk bredbånd"
#: ../js/ui/status/network.js:724 #: ../js/ui/status/network.js:730
msgid "Auto dial-up" msgid "Auto dial-up"
msgstr "Automatisk oppringt" msgstr "Automatisk oppringt"
#. TRANSLATORS: this the automatic wireless connection name (including the network name) #. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:853 ../js/ui/status/network.js:1476 #: ../js/ui/status/network.js:859 ../js/ui/status/network.js:1393
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "Automatisk %s" msgstr "Automatisk %s"
#: ../js/ui/status/network.js:855 #: ../js/ui/status/network.js:861
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Automatisk Bluetooth" msgstr "Automatisk Bluetooth"
#: ../js/ui/status/network.js:1478 #: ../js/ui/status/network.js:1395
msgid "Auto wireless" msgid "Auto wireless"
msgstr "Automatisk trådløst" msgstr "Automatisk trådløst"
#: ../js/ui/status/network.js:1575 #: ../js/ui/status/network.js:1637
msgid "Enable networking" msgid "Enable networking"
msgstr "Slå på nettverk" msgstr "Slå på nettverk"
#: ../js/ui/status/network.js:1597 #: ../js/ui/status/network.js:1659
msgid "Wired" msgid "Wired"
msgstr "Kablet" msgstr "Kablet"
#: ../js/ui/status/network.js:1608 #: ../js/ui/status/network.js:1670
msgid "Wireless" msgid "Wireless"
msgstr "Trådløst" msgstr "Trådløst"
#: ../js/ui/status/network.js:1618 #: ../js/ui/status/network.js:1680
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "Mobilt bredbånd" msgstr "Mobilt bredbånd"
#: ../js/ui/status/network.js:1628 #: ../js/ui/status/network.js:1691
msgid "VPN Connections"
msgstr "VPN-tilkoblinger"
#: ../js/ui/status/network.js:1635
msgid "Network Settings" msgid "Network Settings"
msgstr "Innstillinger for nettverk" msgstr "Innstillinger for nettverk"
#: ../js/ui/status/network.js:1679 #: ../js/ui/status/network.js:1735
msgid "Network Manager" msgid "Network Manager"
msgstr "Nettverkshåndtering" msgstr "Nettverkshåndtering"
#: ../js/ui/status/network.js:1769 #: ../js/ui/status/network.js:1809
msgid "Connection failed" msgid "Connection failed"
msgstr "Tilkobling feilet" msgstr "Tilkobling feilet"
#: ../js/ui/status/network.js:1770 #: ../js/ui/status/network.js:1810
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:2065 #: ../js/ui/status/network.js:2108
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Nettverk er slått av" msgstr "Nettverk er slått av"
@ -1579,63 +1644,63 @@ msgstr "Volum"
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:176 #: ../js/ui/unlockDialog.js:181
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Logg inn som en annen bruker" msgstr "Logg inn som en annen bruker"
#: ../js/ui/userMenu.js:180 #: ../js/ui/userMenu.js:176
msgid "Available" msgid "Available"
msgstr "Tilgjengelig" msgstr "Tilgjengelig"
#: ../js/ui/userMenu.js:183 #: ../js/ui/userMenu.js:179
msgid "Busy" msgid "Busy"
msgstr "Opptatt" msgstr "Opptatt"
#: ../js/ui/userMenu.js:186 #: ../js/ui/userMenu.js:182
msgid "Invisible" msgid "Invisible"
msgstr "Usynlig" msgstr "Usynlig"
#: ../js/ui/userMenu.js:189 #: ../js/ui/userMenu.js:185
msgid "Away" msgid "Away"
msgstr "Borte" msgstr "Borte"
#: ../js/ui/userMenu.js:192 #: ../js/ui/userMenu.js:188
msgid "Idle" msgid "Idle"
msgstr "Ledig" msgstr "Ledig"
#: ../js/ui/userMenu.js:195 #: ../js/ui/userMenu.js:191
msgid "Unavailable" msgid "Offline"
msgstr "Ikke tilgjengelig" msgstr "Frakoblet"
#: ../js/ui/userMenu.js:740 #: ../js/ui/userMenu.js:747
msgid "Notifications" msgid "Notifications"
msgstr "Varslinger" msgstr "Varslinger"
#: ../js/ui/userMenu.js:748 #: ../js/ui/userMenu.js:755
msgid "System Settings" msgid "System Settings"
msgstr "Systeminnstillinger" msgstr "Systeminnstillinger"
#: ../js/ui/userMenu.js:756 #: ../js/ui/userMenu.js:763
msgid "Switch User" msgid "Switch User"
msgstr "Bytt bruker" msgstr "Bytt bruker"
#: ../js/ui/userMenu.js:761 #: ../js/ui/userMenu.js:768
msgid "Log Out" msgid "Log Out"
msgstr "Logg ut" msgstr "Logg ut"
#: ../js/ui/userMenu.js:766 #: ../js/ui/userMenu.js:773
msgid "Lock" msgid "Lock"
msgstr "Lås" msgstr "Lås"
#: ../js/ui/userMenu.js:781 #: ../js/ui/userMenu.js:788
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Installer oppdateringer og start på nytt" msgstr "Installer oppdateringer og start på nytt"
#: ../js/ui/userMenu.js:799 #: ../js/ui/userMenu.js:806
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Din pratestatus vil bli satt til opptatt" msgstr "Din pratestatus vil bli satt til opptatt"
#: ../js/ui/userMenu.js:800 #: ../js/ui/userMenu.js:807
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."
@ -1644,15 +1709,15 @@ msgstr ""
"tilkoblingsstatus er justert for å la andre vite at du kanskje ikke ser " "tilkoblingsstatus er justert for å la andre vite at du kanskje ikke ser "
"deres meldinger." "deres meldinger."
#: ../js/ui/viewSelector.js:85 #: ../js/ui/viewSelector.js:87
msgid "Windows" msgid "Windows"
msgstr "Vinduer" msgstr "Vinduer"
#: ../js/ui/viewSelector.js:89 #: ../js/ui/viewSelector.js:91
msgid "Applications" msgid "Applications"
msgstr "Programmer" msgstr "Programmer"
#: ../js/ui/viewSelector.js:93 #: ../js/ui/viewSelector.js:95
msgid "Search" msgid "Search"
msgstr "Søk" msgstr "Søk"
@ -1721,7 +1786,7 @@ msgstr "Bruk spesifikt modus, f.eks «gdm» for innloggingsskjerm"
msgid "List possible modes" msgid "List possible modes"
msgstr "Vis mulige modi" msgstr "Vis mulige modi"
#: ../src/shell-app.c:621 #: ../src/shell-app.c:622
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Klarte ikke å starte «%s»" msgstr "Klarte ikke å starte «%s»"

244
po/pl.po
View File

@ -11,8 +11,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-09-25 15:12+0200\n" "POT-Creation-Date: 2012-10-31 19:12+0100\n"
"PO-Revision-Date: 2012-09-25 15:13+0200\n" "PO-Revision-Date: 2012-10-31 19:13+0100\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n" "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <gnomepl@aviary.pl>\n" "Language-Team: Polish <gnomepl@aviary.pl>\n"
"Language: pl\n" "Language: pl\n"
@ -142,62 +142,74 @@ msgstr ""
"użytkownika. Wartość pochodzi ze spisu GsmPresenceStatus." "użytkownika. Wartość pochodzi ze spisu GsmPresenceStatus."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "Always show the 'Log out' menuitem in the user menu."
msgstr "Wyświetlanie elementu menu \"Wyloguj się\" w menu użytkownika."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations."
msgstr ""
"Ten klucz zastępuje automatyczne ukrywanie elementu menu \"Wyloguj się\" w "
"sytuacji, gdy istnieje tylko jeden użytkownik i jedna sesja."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Wyświetlanie dnia tygodnia w kalendarzu" msgstr "Wyświetlanie dnia tygodnia w kalendarzu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "" msgstr ""
"Jeśli jest ustawione na \"true\", to wyświetla w kalendarzu dzień tygodnia w " "Jeśli jest ustawione na \"true\", to wyświetla w kalendarzu dzień tygodnia w "
"formacie ISO." "formacie ISO."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Skrót do otwarcia menu programu" msgstr "Skrót do otwarcia menu programu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Skrót do otwarcia menu programu." msgstr "Skrót do otwarcia menu programu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Skrót do przełączenia widoczności obszaru powiadamiania" msgstr "Skrót do przełączenia widoczności obszaru powiadamiania"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Skrót do przełączenia widoczności obszaru powiadamiania." msgstr "Skrót do przełączenia widoczności obszaru powiadamiania."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Skrót do przełączenia nagrywania ekranu" msgstr "Skrót do przełączenia nagrywania ekranu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Skrót do uruchomienia/zatrzymania wbudowanego nagrywania ekranu." msgstr "Skrót do uruchomienia/zatrzymania wbudowanego nagrywania ekranu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Której klawiatury używać" msgstr "Której klawiatury używać"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Typ używanej klawiatury." msgstr "Typ używanej klawiatury."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Liczba klatek na sekundę do nagrywania ekranu." msgstr "Liczba klatek na sekundę do nagrywania ekranu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
msgstr "Liczba klatek na sekundę wynikowego nagrania ekranu." msgstr "Liczba klatek na sekundę wynikowego nagrania ekranu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Potok biblioteki GStreamer używany do zakodowania nagrania ekranu" msgstr "Potok biblioteki GStreamer używany do zakodowania nagrania ekranu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -222,11 +234,11 @@ msgstr ""
"i nagrywa do formatu WebM używając kodeka VP8. %T jest zamieniane na " "i nagrywa do formatu WebM używając kodeka VP8. %T jest zamieniane na "
"odgadniętą optymalną liczbę wątków dla komputera." "odgadniętą optymalną liczbę wątków dla komputera."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Rozszerzenie pliku używane do przechowywania nagrań ekranu" msgstr "Rozszerzenie pliku używane do przechowywania nagrań ekranu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -252,11 +264,11 @@ msgstr ""
"Proszę wybrać rozszerzenie do skonfigurowania używając powyższego pola " "Proszę wybrać rozszerzenie do skonfigurowania używając powyższego pola "
"wyboru." "wyboru."
#: ../js/gdm/loginDialog.js:528 #: ../js/gdm/loginDialog.js:529
msgid "Session..." msgid "Session..."
msgstr "Sesja..." msgstr "Sesja..."
#: ../js/gdm/loginDialog.js:676 #: ../js/gdm/loginDialog.js:677
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Proszę się zalogować" msgstr "Proszę się zalogować"
@ -264,23 +276,23 @@ msgstr "Proszę się zalogować"
#. 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:743 #: ../js/gdm/loginDialog.js:736
msgid "Not listed?" msgid "Not listed?"
msgstr "Inny użytkownik?" msgstr "Inny użytkownik?"
#: ../js/gdm/loginDialog.js:896 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 #: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
msgid "Cancel" msgid "Cancel"
msgstr "Anuluj" msgstr "Anuluj"
#: ../js/gdm/loginDialog.js:901 #: ../js/gdm/loginDialog.js:894
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Zaloguj" msgstr "Zaloguj"
#: ../js/gdm/loginDialog.js:1240 #: ../js/gdm/loginDialog.js:1215
msgid "Login Window" msgid "Login Window"
msgstr "Okno logowania" msgstr "Okno logowania"
@ -289,8 +301,8 @@ msgstr "Okno logowania"
msgid "Power" msgid "Power"
msgstr "Zasilanie" msgstr "Zasilanie"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:664 ../js/ui/userMenu.js:668
#: ../js/ui/userMenu.js:778 #: ../js/ui/userMenu.js:779
msgid "Suspend" msgid "Suspend"
msgstr "Uśpij" msgstr "Uśpij"
@ -298,8 +310,8 @@ msgstr "Uśpij"
msgid "Restart" msgid "Restart"
msgstr "Uruchom ponownie" msgstr "Uruchom ponownie"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:666 ../js/ui/userMenu.js:668
#: ../js/ui/userMenu.js:777 #: ../js/ui/userMenu.js:778
msgid "Power Off" msgid "Power Off"
msgstr "Wyłącz komputer" msgstr "Wyłącz komputer"
@ -350,7 +362,7 @@ msgstr "Ustawienia"
msgid "New Window" msgid "New Window"
msgstr "Nowe okno" msgstr "Nowe okno"
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271 #: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Usuń z ulubionych" msgstr "Usuń z ulubionych"
@ -514,16 +526,16 @@ msgstr "Ten tydzień"
msgid "Next week" msgid "Next week"
msgstr "Następny tydzień" msgstr "Następny tydzień"
#: ../js/ui/components/autorunManager.js:278 #: ../js/ui/components/autorunManager.js:297
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Urządzenia wymienne" msgstr "Urządzenia wymienne"
#: ../js/ui/components/autorunManager.js:575 #: ../js/ui/components/autorunManager.js:594
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Otwórz za pomocą %s" msgstr "Otwórz za pomocą %s"
#: ../js/ui/components/autorunManager.js:601 #: ../js/ui/components/autorunManager.js:620
msgid "Eject" msgid "Eject"
msgstr "Wysuń" msgstr "Wysuń"
@ -680,35 +692,35 @@ msgstr "Wycisz"
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds. #. locale, without seconds.
#: ../js/ui/components/telepathyClient.js:948 #: ../js/ui/components/telepathyClient.js:950
#, no-c-format #, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>" msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "Wysłano w dniu <b>%e %b</b> o godzinie <b>%H:%M</b>" msgstr "Wysłano w dniu <b>%e %b</b> o godzinie <b>%H:%M</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25", #. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year. #. shown when you get a chat message in the same year.
#: ../js/ui/components/telepathyClient.js:954 #: ../js/ui/components/telepathyClient.js:956
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>" msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "Wysłano w dniu <b>%d %B</b>, <b>%A</b>" msgstr "Wysłano w dniu <b>%d %B</b>, <b>%A</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year. #. shown when you get a chat message in a different year.
#: ../js/ui/components/telepathyClient.js:959 #: ../js/ui/components/telepathyClient.js:961
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y" msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "Wysłano w dniu <b>%d %B</b> %Y, <b>%A</b>" msgstr "Wysłano w dniu <b>%d %B</b> %Y, <b>%A</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:988 #: ../js/ui/components/telepathyClient.js:990
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "Użytkownik %s jest teraz znany jako %s" msgstr "Użytkownik %s jest teraz znany 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:1090
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Zaproszenie do pokoju %s" msgstr "Zaproszenie do pokoju %s"
@ -716,42 +728,42 @@ msgstr "Zaproszenie do pokoju %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:1098
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "Użytkownik %s zaprasza do dołączenia do pokoju %s" msgstr "Użytkownik %s zaprasza do dołączenia do pokoju %s"
#: ../js/ui/components/telepathyClient.js:1098 #: ../js/ui/components/telepathyClient.js:1100
#: ../js/ui/components/telepathyClient.js:1177 #: ../js/ui/components/telepathyClient.js:1179
#: ../js/ui/components/telepathyClient.js:1240 #: ../js/ui/components/telepathyClient.js:1242
msgid "Decline" msgid "Decline"
msgstr "Odmów" msgstr "Odmów"
#: ../js/ui/components/telepathyClient.js:1099 #: ../js/ui/components/telepathyClient.js:1101
#: ../js/ui/components/telepathyClient.js:1178 #: ../js/ui/components/telepathyClient.js:1180
#: ../js/ui/components/telepathyClient.js:1241 #: ../js/ui/components/telepathyClient.js:1243
msgid "Accept" msgid "Accept"
msgstr "Zaakceptuj" msgstr "Zaakceptuj"
#. 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:1131
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Wideorozmowa z użytkownikiem %s" msgstr "Wideorozmowa z użytkownikiem %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:1134
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Rozmowa z użytkownikiem %s" msgstr "Rozmowa z użytkownikiem %s"
#: ../js/ui/components/telepathyClient.js:1137 #: ../js/ui/components/telepathyClient.js:1139
#: ../js/ui/status/bluetooth.js:346 #: ../js/ui/status/bluetooth.js:346
msgid "Reject" msgid "Reject"
msgstr "Odrzuć" msgstr "Odrzuć"
#. 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:1141
msgid "Answer" msgid "Answer"
msgstr "Odbierz" msgstr "Odbierz"
@ -760,111 +772,111 @@ msgstr "Odbierz"
#. * 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:1173
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "Użytkownik %s przysyła plik %s" msgstr "Użytkownik %s przysyła plik %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:1208
#, 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 "Użytkownik %s prosi o uprawnienie do wyświetlania stanu" msgstr "Użytkownik %s prosi o uprawnienie do wyświetlania stanu"
#: ../js/ui/components/telepathyClient.js:1298 #: ../js/ui/components/telepathyClient.js:1300
msgid "Network error" msgid "Network error"
msgstr "Błąd sieci" msgstr "Błąd sieci"
#: ../js/ui/components/telepathyClient.js:1300 #: ../js/ui/components/telepathyClient.js:1302
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Uwierzytelnienie się nie powiodło" msgstr "Uwierzytelnienie się nie powiodło"
#: ../js/ui/components/telepathyClient.js:1302 #: ../js/ui/components/telepathyClient.js:1304
msgid "Encryption error" msgid "Encryption error"
msgstr "Błąd szyfrowania" msgstr "Błąd szyfrowania"
#: ../js/ui/components/telepathyClient.js:1304 #: ../js/ui/components/telepathyClient.js:1306
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Nie podano certyfikatu" msgstr "Nie podano certyfikatu"
#: ../js/ui/components/telepathyClient.js:1306 #: ../js/ui/components/telepathyClient.js:1308
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Certyfikat jest niezaufany" msgstr "Certyfikat jest niezaufany"
#: ../js/ui/components/telepathyClient.js:1308 #: ../js/ui/components/telepathyClient.js:1310
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Certyfikat wygasł" msgstr "Certyfikat wygasł"
#: ../js/ui/components/telepathyClient.js:1310 #: ../js/ui/components/telepathyClient.js:1312
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Certyfikat nie został aktywowany" msgstr "Certyfikat nie został aktywowany"
#: ../js/ui/components/telepathyClient.js:1312 #: ../js/ui/components/telepathyClient.js:1314
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Nazwa komputera certyfikatu się nie zgadza" msgstr "Nazwa komputera certyfikatu się nie zgadza"
#: ../js/ui/components/telepathyClient.js:1314 #: ../js/ui/components/telepathyClient.js:1316
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Odcisk palca certyfikatu się nie zgadza" msgstr "Odcisk palca certyfikatu się nie zgadza"
#: ../js/ui/components/telepathyClient.js:1316 #: ../js/ui/components/telepathyClient.js:1318
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Certyfikat został samodzielnie podpisany" msgstr "Certyfikat został samodzielnie podpisany"
#: ../js/ui/components/telepathyClient.js:1318 #: ../js/ui/components/telepathyClient.js:1320
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "Stan jest ustawiony na offline" msgstr "Stan jest ustawiony na offline"
#: ../js/ui/components/telepathyClient.js:1320 #: ../js/ui/components/telepathyClient.js:1322
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Szyfrowanie jest niedostępne" msgstr "Szyfrowanie jest niedostępne"
#: ../js/ui/components/telepathyClient.js:1322 #: ../js/ui/components/telepathyClient.js:1324
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "Certyfikat jest nieprawidłowy" msgstr "Certyfikat jest nieprawidłowy"
#: ../js/ui/components/telepathyClient.js:1324 #: ../js/ui/components/telepathyClient.js:1326
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Odrzucono połączenie" msgstr "Odrzucono połączenie"
#: ../js/ui/components/telepathyClient.js:1326 #: ../js/ui/components/telepathyClient.js:1328
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "Nie można nawiązać połączenia" msgstr "Nie można nawiązać połączenia"
#: ../js/ui/components/telepathyClient.js:1328 #: ../js/ui/components/telepathyClient.js:1330
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Utracono połączenie" msgstr "Utracono połączenie"
#: ../js/ui/components/telepathyClient.js:1330 #: ../js/ui/components/telepathyClient.js:1332
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "To konto jest już połączone z serwerem" msgstr "To konto jest już połączone z serwerem"
#: ../js/ui/components/telepathyClient.js:1332 #: ../js/ui/components/telepathyClient.js:1334
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 ""
"Połączenie zostało zastąpione nowym z wykorzystaniem tego samego zasobu" "Połączenie zostało zastąpione nowym z wykorzystaniem tego samego zasobu"
#: ../js/ui/components/telepathyClient.js:1334 #: ../js/ui/components/telepathyClient.js:1336
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "Konto już istnieje na serwerze" msgstr "Konto już istnieje na serwerze"
#: ../js/ui/components/telepathyClient.js:1336 #: ../js/ui/components/telepathyClient.js:1338
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "Serwer jest obecnie zbyt zajęty, aby obsłużyć połączenie" msgstr "Serwer jest obecnie zbyt zajęty, aby obsłużyć połączenie"
#: ../js/ui/components/telepathyClient.js:1338 #: ../js/ui/components/telepathyClient.js:1340
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Certyfikat został unieważniony" msgstr "Certyfikat został unieważniony"
#: ../js/ui/components/telepathyClient.js:1340 #: ../js/ui/components/telepathyClient.js:1342
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"Certyfikat używa niezabezpieczonego algorytmu szyfrowania lub jest " "Certyfikat używa niezabezpieczonego algorytmu szyfrowania lub jest "
"kryptograficznie słaby" "kryptograficznie słaby"
#: ../js/ui/components/telepathyClient.js:1342 #: ../js/ui/components/telepathyClient.js:1344
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"
@ -872,30 +884,30 @@ msgstr ""
"Długość certyfikatu serwera lub głębokość jego łańcucha przekracza " "Długość certyfikatu serwera lub głębokość jego łańcucha przekracza "
"ograniczenia nałożone przez bibliotekę kryptograficzną" "ograniczenia nałożone przez bibliotekę kryptograficzną"
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1346
msgid "Internal error" msgid "Internal error"
msgstr "Błąd wewnętrzny" msgstr "Błąd wewnętrzny"
#. 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:1356
#, c-format #, c-format
msgid "Connection to %s failed" msgid "Connection to %s failed"
msgstr "Połączenie z kontem %s się nie powiodło" msgstr "Połączenie z kontem %s się nie powiodło"
#: ../js/ui/components/telepathyClient.js:1363 #: ../js/ui/components/telepathyClient.js:1365
msgid "Reconnect" msgid "Reconnect"
msgstr "Połącz ponownie" msgstr "Połącz ponownie"
#: ../js/ui/components/telepathyClient.js:1364 #: ../js/ui/components/telepathyClient.js:1366
msgid "Edit account" msgid "Edit account"
msgstr "Modyfikuj konto" msgstr "Modyfikuj konto"
#: ../js/ui/components/telepathyClient.js:1409 #: ../js/ui/components/telepathyClient.js:1411
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Nieznana przyczyna" msgstr "Nieznana przyczyna"
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273 #: ../js/ui/dash.js:253 ../js/ui/dash.js:292
msgid "Show Applications" msgid "Show Applications"
msgstr "Wyświetl programy" msgstr "Wyświetl programy"
@ -903,14 +915,14 @@ msgstr "Wyświetl programy"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Ustawienia daty i czasu" msgstr "Ustawienia daty i czasu"
#: ../js/ui/dateMenu.js:109 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Otwórz kalendarz" msgstr "Otwórz kalendarz"
#. 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:175 #: ../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"
@ -1075,23 +1087,23 @@ msgstr "Wyświetl źródło"
msgid "Web Page" msgid "Web Page"
msgstr "Strona WWW" msgstr "Strona WWW"
#: ../js/ui/messageTray.js:1081 #: ../js/ui/messageTray.js:1084
msgid "Open" msgid "Open"
msgstr "Otwórz" msgstr "Otwórz"
#: ../js/ui/messageTray.js:1088 #: ../js/ui/messageTray.js:1091
msgid "Remove" msgid "Remove"
msgstr "Usuń" msgstr "Usuń"
#: ../js/ui/messageTray.js:2088 #: ../js/ui/messageTray.js:1543
msgid "Message Tray" msgid "Message Tray"
msgstr "Obszar powiadamiania" msgstr "Obszar powiadamiania"
#: ../js/ui/messageTray.js:2551 #: ../js/ui/messageTray.js:2549
msgid "System Information" msgid "System Information"
msgstr "Informacje systemowe" msgstr "Informacje systemowe"
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:373 #: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:374
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Nieznany" msgstr "Nieznany"
@ -1147,7 +1159,7 @@ msgstr "Proszę wprowadzić polecenie:"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:79 #: ../js/ui/screenShield.js:80
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %e %B" msgstr "%A, %e %B"
@ -1199,7 +1211,7 @@ msgstr "Hasło"
msgid "Remember Password" msgid "Remember Password"
msgstr "Zapamiętanie hasła" msgstr "Zapamiętanie hasła"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 #: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
msgid "Unlock" msgid "Unlock"
msgstr "Odblokuj" msgstr "Odblokuj"
@ -1614,67 +1626,63 @@ msgstr "Głośność"
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:176 #: ../js/ui/unlockDialog.js:177
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Zaloguj jako inny użytkownik" msgstr "Zaloguj jako inny użytkownik"
#: ../js/ui/userMenu.js:180 #: ../js/ui/userMenu.js:181
msgid "Available" msgid "Available"
msgstr "Dostępny" msgstr "Dostępny"
#: ../js/ui/userMenu.js:183 #: ../js/ui/userMenu.js:184
msgid "Busy" msgid "Busy"
msgstr "Zajęty" msgstr "Zajęty"
#: ../js/ui/userMenu.js:186 #: ../js/ui/userMenu.js:187
msgid "Invisible" msgid "Invisible"
msgstr "Niewidoczny" msgstr "Niewidoczny"
#: ../js/ui/userMenu.js:189 #: ../js/ui/userMenu.js:190
msgid "Away" msgid "Away"
msgstr "Nieobecny" msgstr "Nieobecny"
#: ../js/ui/userMenu.js:192 #: ../js/ui/userMenu.js:193
msgid "Idle" msgid "Idle"
msgstr "Bezczynny" msgstr "Bezczynny"
#: ../js/ui/userMenu.js:195 #: ../js/ui/userMenu.js:196
msgid "Unavailable" msgid "Unavailable"
msgstr "Niedostępny" msgstr "Niedostępny"
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759 #: ../js/ui/userMenu.js:744
msgid "Switch User"
msgstr "Przełącz użytkownika"
#: ../js/ui/userMenu.js:619
msgid "Switch Session"
msgstr "Przełącz sesję"
#: ../js/ui/userMenu.js:743
msgid "Notifications" msgid "Notifications"
msgstr "Powiadomienia" msgstr "Powiadomienia"
#: ../js/ui/userMenu.js:751 #: ../js/ui/userMenu.js:752
msgid "System Settings" msgid "System Settings"
msgstr "Ustawienia systemu" msgstr "Ustawienia systemu"
#: ../js/ui/userMenu.js:764 #: ../js/ui/userMenu.js:760
msgid "Switch User"
msgstr "Przełącz użytkownika"
#: ../js/ui/userMenu.js:765
msgid "Log Out" msgid "Log Out"
msgstr "Wyloguj się" msgstr "Wyloguj się"
#: ../js/ui/userMenu.js:769 #: ../js/ui/userMenu.js:770
msgid "Lock" msgid "Lock"
msgstr "Zablokuj ekran" msgstr "Zablokuj ekran"
#: ../js/ui/userMenu.js:784 #: ../js/ui/userMenu.js:785
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Zaktualizuj i uruchom ponownie" msgstr "Zaktualizuj i uruchom ponownie"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:803
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Stan komunikatora zostanie ustawiony na \"zajęty\"" msgstr "Stan komunikatora zostanie ustawiony na \"zajęty\""
#: ../js/ui/userMenu.js:803 #: ../js/ui/userMenu.js:804
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."
@ -1696,7 +1704,7 @@ msgstr "Programy"
msgid "Search" msgid "Search"
msgstr "Wyszukiwanie" msgstr "Wyszukiwanie"
#: ../js/ui/wanda.js:119 #: ../js/ui/wanda.js:117
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1705,12 +1713,12 @@ msgstr ""
"Nic mądrego na dzisiaj:\n" "Nic mądrego na dzisiaj:\n"
"%s" "%s"
#: ../js/ui/wanda.js:123 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Wyrocznia %s przemawia" msgstr "Wyrocznia %s przemawia"
#: ../js/ui/wanda.js:164 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "Twój ulubiony żart" msgstr "Twój ulubiony żart"
@ -1747,23 +1755,23 @@ msgstr[2] "%u wejść"
msgid "System Sounds" msgid "System Sounds"
msgstr "Dźwięki systemowe" msgstr "Dźwięki systemowe"
#: ../src/main.c:330 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "Wyświetla wersję" msgstr "Wyświetla wersję"
#: ../src/main.c:336 #: ../src/main.c:338
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Tryb używany przez GDM dla ekranu logowania" msgstr "Tryb używany przez GDM dla ekranu logowania"
#: ../src/main.c:342 #: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Używa podanego trybu, np. \"gdm\" dla ekranu logowania" msgstr "Używa podanego trybu, np. \"gdm\" dla ekranu logowania"
#: ../src/main.c:348 #: ../src/main.c:350
msgid "List possible modes" msgid "List possible modes"
msgstr "Wyświetla listę możliwych trybów" msgstr "Wyświetla listę możliwych trybów"
#: ../src/shell-app.c:621 #: ../src/shell-app.c:622
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Uruchomienie \"%s\" się nie powiodło" msgstr "Uruchomienie \"%s\" się nie powiodło"

256
po/ru.po
View File

@ -15,8 +15,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: 2012-09-25 00:06+0000\n" "POT-Creation-Date: 2012-10-31 16:48+0000\n"
"PO-Revision-Date: 2012-09-27 16:38+0400\n" "PO-Revision-Date: 2012-11-04 20:48+0400\n"
"Last-Translator: Yuri Myasoedov <omerta13@yandex.ru>\n" "Last-Translator: Yuri Myasoedov <omerta13@yandex.ru>\n"
"Language-Team: русский <gnome-cyr@gnome.org>\n" "Language-Team: русский <gnome-cyr@gnome.org>\n"
"Language: ru\n" "Language: ru\n"
@ -141,51 +141,63 @@ msgstr ""
"Данное значение берётся из перечисления GsmPresenceStatus." "Данное значение берётся из перечисления GsmPresenceStatus."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "Always show the 'Log out' menuitem in the user menu."
msgstr "Всегда показывать в меню пункт «Завершить сеанс»."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations."
msgstr ""
"Этот ключ переопределяет автоматическое скрытие пункта «Завершить сеанс» при "
"использовании одиночного сеанса."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Показывать в часах дату недели" msgstr "Показывать в часах дату недели"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "Если установлено, календарь будет показывать неделю в формате ISO." msgstr "Если установлено, календарь будет показывать неделю в формате ISO."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Комбинация клавиш для открытия меню приложения" msgstr "Комбинация клавиш для открытия меню приложения"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Комбинация клавиш для открытия меню приложения." msgstr "Комбинация клавиш для открытия меню приложения."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Комбинация клавиш для переключения видимости панели сообщений" msgstr "Комбинация клавиш для переключения видимости панели сообщений"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Комбинация клавиш для переключения видимости панели сообщений." msgstr "Комбинация клавиш для переключения видимости панели сообщений."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Комбинация клавиш для переключения записи экрана" msgstr "Комбинация клавиш для переключения записи экрана"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "" msgstr ""
"Комбинация клавиш для запуска/остановки встроенного средства записи экрана." "Комбинация клавиш для запуска/остановки встроенного средства записи экрана."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Какую клавиатуру использовать" msgstr "Какую клавиатуру использовать"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Тип используемой клавиатуры." msgstr "Тип используемой клавиатуры."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Частота смены кадров для записи скринкастов." msgstr "Частота смены кадров для записи скринкастов."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -193,11 +205,11 @@ msgstr ""
"Частота смены кадров в скринкасте, записанном с помощью GNOME Shell (кадров/" "Частота смены кадров в скринкасте, записанном с помощью GNOME Shell (кадров/"
"сек)." "сек)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Конвейер gstreamer, используемый для кодирования скринкастов" msgstr "Конвейер gstreamer, используемый для кодирования скринкастов"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -224,11 +236,11 @@ msgstr ""
"используется как заполнитель для определения оптимального количества потоков " "используется как заполнитель для определения оптимального количества потоков "
"в системе." "в системе."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Расширение файла, использующееся для хранения скринкастов" msgstr "Расширение файла, использующееся для хранения скринкастов"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -251,11 +263,11 @@ msgstr "Расширение"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Выберите расширение из выпадающего списка." msgstr "Выберите расширение из выпадающего списка."
#: ../js/gdm/loginDialog.js:527 #: ../js/gdm/loginDialog.js:529
msgid "Session..." msgid "Session..."
msgstr "Сеанс…" msgstr "Сеанс…"
#: ../js/gdm/loginDialog.js:675 #: ../js/gdm/loginDialog.js:677
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Вход в систему" msgstr "Вход в систему"
@ -263,34 +275,33 @@ msgstr "Вход в систему"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:742 #: ../js/gdm/loginDialog.js:736
msgid "Not listed?" msgid "Not listed?"
msgstr "Нет в списке?" msgstr "Нет в списке?"
#: ../js/gdm/loginDialog.js:895 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 #: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
msgid "Cancel" msgid "Cancel"
msgstr "Отмена" msgstr "Отмена"
#: ../js/gdm/loginDialog.js:900 #: ../js/gdm/loginDialog.js:894
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Войти" msgstr "Войти"
#: ../js/gdm/loginDialog.js:1239 #: ../js/gdm/loginDialog.js:1215
msgid "Login Window" msgid "Login Window"
msgstr "Окно входа в систему" msgstr "Окно входа в систему"
#. Translators: accessible name of the power menu in the login screen #. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:35 #: ../js/gdm/powerMenu.js:35
#| msgid "Power Off"
msgid "Power" msgid "Power"
msgstr "Питание" msgstr "Питание"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:664 ../js/ui/userMenu.js:668
#: ../js/ui/userMenu.js:778 #: ../js/ui/userMenu.js:779
msgid "Suspend" msgid "Suspend"
msgstr "Ждущий режим" msgstr "Ждущий режим"
@ -298,8 +309,8 @@ msgstr "Ждущий режим"
msgid "Restart" msgid "Restart"
msgstr "Перезапустить" msgstr "Перезапустить"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:666 ../js/ui/userMenu.js:668
#: ../js/ui/userMenu.js:777 #: ../js/ui/userMenu.js:778
msgid "Power Off" msgid "Power Off"
msgstr "Выключить" msgstr "Выключить"
@ -350,7 +361,7 @@ msgstr "НАСТРОЙКИ"
msgid "New Window" msgid "New Window"
msgstr "Новое окно" msgstr "Новое окно"
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271 #: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Удалить из избранного" msgstr "Удалить из избранного"
@ -514,16 +525,16 @@ msgstr "Эта неделя"
msgid "Next week" msgid "Next week"
msgstr "Следующая неделя" msgstr "Следующая неделя"
#: ../js/ui/components/autorunManager.js:278 #: ../js/ui/components/autorunManager.js:297
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Cъёмные устройства" msgstr "Cъёмные устройства"
#: ../js/ui/components/autorunManager.js:575 #: ../js/ui/components/autorunManager.js:594
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Открыть с помощью %s" msgstr "Открыть с помощью %s"
#: ../js/ui/components/autorunManager.js:601 #: ../js/ui/components/autorunManager.js:620
msgid "Eject" msgid "Eject"
msgstr "Извлечь" msgstr "Извлечь"
@ -679,35 +690,35 @@ msgstr "Приглушить звук"
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds. #. locale, without seconds.
#: ../js/ui/components/telepathyClient.js:948 #: ../js/ui/components/telepathyClient.js:950
#, no-c-format #, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>" msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "Отправлено в <b>%X</b> в <b>%A</b>" msgstr "Отправлено в <b>%X</b> в <b>%A</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25", #. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year. #. shown when you get a chat message in the same year.
#: ../js/ui/components/telepathyClient.js:954 #: ../js/ui/components/telepathyClient.js:956
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>" msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "Отправлено в <b>%A</b>, <b>%B %d</b>" msgstr "Отправлено в <b>%A</b>, <b>%B %d</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year. #. shown when you get a chat message in a different year.
#: ../js/ui/components/telepathyClient.js:959 #: ../js/ui/components/telepathyClient.js:961
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y" msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "Отправлено в <b>%A</b>, <b>%B %d</b>, %Y" msgstr "Отправлено в <b>%A</b>, <b>%B %d</b>, %Y"
#. 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:988 #: ../js/ui/components/telepathyClient.js:990
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s теперь известен как %s" msgstr "%s теперь известен как %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:1090
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Приглашение в %s" msgstr "Приглашение в %s"
@ -715,42 +726,42 @@ msgstr "Приглашение в %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:1098
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s приглашает вас присоединиться к %s" msgstr "%s приглашает вас присоединиться к %s"
#: ../js/ui/components/telepathyClient.js:1098 #: ../js/ui/components/telepathyClient.js:1100
#: ../js/ui/components/telepathyClient.js:1177 #: ../js/ui/components/telepathyClient.js:1179
#: ../js/ui/components/telepathyClient.js:1240 #: ../js/ui/components/telepathyClient.js:1242
msgid "Decline" msgid "Decline"
msgstr "Отказаться" msgstr "Отказаться"
#: ../js/ui/components/telepathyClient.js:1099 #: ../js/ui/components/telepathyClient.js:1101
#: ../js/ui/components/telepathyClient.js:1178 #: ../js/ui/components/telepathyClient.js:1180
#: ../js/ui/components/telepathyClient.js:1241 #: ../js/ui/components/telepathyClient.js:1243
msgid "Accept" msgid "Accept"
msgstr "Принять" msgstr "Принять"
#. 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:1131
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Вас вызывает %s по видео" msgstr "Вас вызывает %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:1134
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Вас вызывает %s" msgstr "Вас вызывает %s"
#: ../js/ui/components/telepathyClient.js:1137 #: ../js/ui/components/telepathyClient.js:1139
#: ../js/ui/status/bluetooth.js:346 #: ../js/ui/status/bluetooth.js:346
msgid "Reject" msgid "Reject"
msgstr "Отклонить" msgstr "Отклонить"
#. 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:1141
msgid "Answer" msgid "Answer"
msgstr "Ответить" msgstr "Ответить"
@ -759,111 +770,111 @@ msgstr "Ответить"
#. * 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:1173
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s отправляет вам %s" msgstr "%s отправляет вам %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:1208
#, 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 хотел бы получить разрешение видеть, когда вы в сети" msgstr "%s хотел бы получить разрешение видеть, когда вы в сети"
#: ../js/ui/components/telepathyClient.js:1298 #: ../js/ui/components/telepathyClient.js:1300
msgid "Network error" msgid "Network error"
msgstr "Ошибка сети" msgstr "Ошибка сети"
#: ../js/ui/components/telepathyClient.js:1300 #: ../js/ui/components/telepathyClient.js:1302
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Ошибка аутентификации" msgstr "Ошибка аутентификации"
#: ../js/ui/components/telepathyClient.js:1302 #: ../js/ui/components/telepathyClient.js:1304
msgid "Encryption error" msgid "Encryption error"
msgstr "Ошибка шифрования" msgstr "Ошибка шифрования"
#: ../js/ui/components/telepathyClient.js:1304 #: ../js/ui/components/telepathyClient.js:1306
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Сертификат не предоставляется" msgstr "Сертификат не предоставляется"
#: ../js/ui/components/telepathyClient.js:1306 #: ../js/ui/components/telepathyClient.js:1308
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Недоверенный сертификат" msgstr "Недоверенный сертификат"
#: ../js/ui/components/telepathyClient.js:1308 #: ../js/ui/components/telepathyClient.js:1310
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Срок действия сертификата истёк" msgstr "Срок действия сертификата истёк"
#: ../js/ui/components/telepathyClient.js:1310 #: ../js/ui/components/telepathyClient.js:1312
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Сертификат не активирован" msgstr "Сертификат не активирован"
#: ../js/ui/components/telepathyClient.js:1312 #: ../js/ui/components/telepathyClient.js:1314
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Имя узла сертификата не совпадает" msgstr "Имя узла сертификата не совпадает"
#: ../js/ui/components/telepathyClient.js:1314 #: ../js/ui/components/telepathyClient.js:1316
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Отпечаток сертификата не совпадает" msgstr "Отпечаток сертификата не совпадает"
#: ../js/ui/components/telepathyClient.js:1316 #: ../js/ui/components/telepathyClient.js:1318
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Самоподписанный сертификат" msgstr "Самоподписанный сертификат"
#: ../js/ui/components/telepathyClient.js:1318 #: ../js/ui/components/telepathyClient.js:1320
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "Установлен статус «не в сети»" msgstr "Установлен статус «не в сети»"
#: ../js/ui/components/telepathyClient.js:1320 #: ../js/ui/components/telepathyClient.js:1322
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Шифрование недоступно" msgstr "Шифрование недоступно"
#: ../js/ui/components/telepathyClient.js:1322 #: ../js/ui/components/telepathyClient.js:1324
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "Недействительный сертификат" msgstr "Недействительный сертификат"
#: ../js/ui/components/telepathyClient.js:1324 #: ../js/ui/components/telepathyClient.js:1326
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "В соединении отказано" msgstr "В соединении отказано"
#: ../js/ui/components/telepathyClient.js:1326 #: ../js/ui/components/telepathyClient.js:1328
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "Соединение не может быть установлено" msgstr "Соединение не может быть установлено"
#: ../js/ui/components/telepathyClient.js:1328 #: ../js/ui/components/telepathyClient.js:1330
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Соединение потеряно" msgstr "Соединение потеряно"
#: ../js/ui/components/telepathyClient.js:1330 #: ../js/ui/components/telepathyClient.js:1332
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "Эта учётная запись уже подключена к серверу" msgstr "Эта учётная запись уже подключена к серверу"
#: ../js/ui/components/telepathyClient.js:1332 #: ../js/ui/components/telepathyClient.js:1334
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 "Соединение было заменено новым, используя тот же источник"
#: ../js/ui/components/telepathyClient.js:1334 #: ../js/ui/components/telepathyClient.js:1336
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "Учётная запись уже существует на сервере" msgstr "Учётная запись уже существует на сервере"
#: ../js/ui/components/telepathyClient.js:1336 #: ../js/ui/components/telepathyClient.js:1338
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "" msgstr ""
"Сервер в настоящее время сильно перегружен, чтобы обработать соединение" "Сервер в настоящее время сильно перегружен, чтобы обработать соединение"
#: ../js/ui/components/telepathyClient.js:1338 #: ../js/ui/components/telepathyClient.js:1340
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Сертификат аннулирован" msgstr "Сертификат аннулирован"
#: ../js/ui/components/telepathyClient.js:1340 #: ../js/ui/components/telepathyClient.js:1342
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"Сертификат использует небезопасный алгоритм шифрования или он " "Сертификат использует небезопасный алгоритм шифрования или он "
"криптографически нестоек" "криптографически нестоек"
#: ../js/ui/components/telepathyClient.js:1342 #: ../js/ui/components/telepathyClient.js:1344
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"
@ -871,30 +882,30 @@ msgstr ""
"Длина сертификата сервера, или глубина цепочки сертификатов сервера, " "Длина сертификата сервера, или глубина цепочки сертификатов сервера, "
"превышает пределы, установленные библиотекой криптографии" "превышает пределы, установленные библиотекой криптографии"
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1346
msgid "Internal error" msgid "Internal error"
msgstr "Внутренняя ошибка" msgstr "Внутренняя ошибка"
#. 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:1356
#, c-format #, c-format
msgid "Connection to %s failed" msgid "Connection to %s failed"
msgstr "Сбой подключения к %s" msgstr "Сбой подключения к %s"
#: ../js/ui/components/telepathyClient.js:1363 #: ../js/ui/components/telepathyClient.js:1365
msgid "Reconnect" msgid "Reconnect"
msgstr "Переподключиться" msgstr "Переподключиться"
#: ../js/ui/components/telepathyClient.js:1364 #: ../js/ui/components/telepathyClient.js:1366
msgid "Edit account" msgid "Edit account"
msgstr "Изменить учётную запись" msgstr "Изменить учётную запись"
#: ../js/ui/components/telepathyClient.js:1409 #: ../js/ui/components/telepathyClient.js:1411
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Неизвестная причина" msgstr "Неизвестная причина"
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273 #: ../js/ui/dash.js:253 ../js/ui/dash.js:292
msgid "Show Applications" msgid "Show Applications"
msgstr "Показать приложения" msgstr "Показать приложения"
@ -902,14 +913,14 @@ msgstr "Показать приложения"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Настроить дату и время" msgstr "Настроить дату и время"
#: ../js/ui/dateMenu.js:109 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Открыть календарь" msgstr "Открыть календарь"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:175 #: ../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"
@ -1019,11 +1030,11 @@ msgstr "Установить"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Загрузить и установить расширение «%s» с extensions.gnome.org?" msgstr "Загрузить и установить расширение «%s» с extensions.gnome.org?"
#: ../js/ui/keyboard.js:327 #: ../js/ui/keyboard.js:337
msgid "tray" msgid "tray"
msgstr "лоток" msgstr "лоток"
#: ../js/ui/keyboard.js:561 ../js/ui/status/keyboard.js:195 #: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:205
msgid "Keyboard" msgid "Keyboard"
msgstr "Клавиатура" msgstr "Клавиатура"
@ -1076,23 +1087,23 @@ msgstr "Показать код"
msgid "Web Page" msgid "Web Page"
msgstr "Веб-страница" msgstr "Веб-страница"
#: ../js/ui/messageTray.js:1080 #: ../js/ui/messageTray.js:1084
msgid "Open" msgid "Open"
msgstr "Открыть" msgstr "Открыть"
#: ../js/ui/messageTray.js:1087 #: ../js/ui/messageTray.js:1091
msgid "Remove" msgid "Remove"
msgstr "Удалить" msgstr "Удалить"
#: ../js/ui/messageTray.js:2055 #: ../js/ui/messageTray.js:1543
msgid "Message Tray" msgid "Message Tray"
msgstr "Панель сообщений" msgstr "Панель сообщений"
#: ../js/ui/messageTray.js:2511 #: ../js/ui/messageTray.js:2549
msgid "System Information" msgid "System Information"
msgstr "Системная информация" msgstr "Системная информация"
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:373 #: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:374
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Неизвестно" msgstr "Неизвестно"
@ -1148,7 +1159,7 @@ msgstr "Введите команду:"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:79 #: ../js/ui/screenShield.js:80
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%d %B, %A" msgstr "%d %B, %A"
@ -1200,7 +1211,7 @@ msgstr "Пароль"
msgid "Remember Password" msgid "Remember Password"
msgstr "Запомнить пароль" msgstr "Запомнить пароль"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 #: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
msgid "Unlock" msgid "Unlock"
msgstr "Разблокировать" msgstr "Разблокировать"
@ -1318,7 +1329,7 @@ msgstr "Настроить клавиатуру"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Настроить мышь" msgstr "Настроить мышь"
#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:236 #: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:234
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Настроить звук" msgstr "Настроить звук"
@ -1607,7 +1618,7 @@ msgid "Unknown"
msgstr "Неизвестно" msgstr "Неизвестно"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:223 #: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Громкость" msgstr "Громкость"
@ -1615,67 +1626,63 @@ msgstr "Громкость"
msgid "Microphone" msgid "Microphone"
msgstr "Микрофон" msgstr "Микрофон"
#: ../js/ui/unlockDialog.js:176 #: ../js/ui/unlockDialog.js:177
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Войти от имени другого пользователя" msgstr "Войти от имени другого пользователя"
#: ../js/ui/userMenu.js:180 #: ../js/ui/userMenu.js:181
msgid "Available" msgid "Available"
msgstr "Доступен" msgstr "Доступен"
#: ../js/ui/userMenu.js:183 #: ../js/ui/userMenu.js:184
msgid "Busy" msgid "Busy"
msgstr "Занят" msgstr "Занят"
#: ../js/ui/userMenu.js:186 #: ../js/ui/userMenu.js:187
msgid "Invisible" msgid "Invisible"
msgstr "Невидим" msgstr "Невидим"
#: ../js/ui/userMenu.js:189 #: ../js/ui/userMenu.js:190
msgid "Away" msgid "Away"
msgstr "Отошёл" msgstr "Отошёл"
#: ../js/ui/userMenu.js:192 #: ../js/ui/userMenu.js:193
msgid "Idle" msgid "Idle"
msgstr "Бездействует" msgstr "Бездействует"
#: ../js/ui/userMenu.js:195 #: ../js/ui/userMenu.js:196
msgid "Unavailable" msgid "Unavailable"
msgstr "Недоступен" msgstr "Недоступен"
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759 #: ../js/ui/userMenu.js:744
msgid "Switch User"
msgstr "Сменить пользователя"
#: ../js/ui/userMenu.js:619
msgid "Switch Session"
msgstr "Переключить сеанс"
#: ../js/ui/userMenu.js:743
msgid "Notifications" msgid "Notifications"
msgstr "Уведомления" msgstr "Уведомления"
#: ../js/ui/userMenu.js:751 #: ../js/ui/userMenu.js:752
msgid "System Settings" msgid "System Settings"
msgstr "Системные параметры" msgstr "Системные параметры"
#: ../js/ui/userMenu.js:764 #: ../js/ui/userMenu.js:760
msgid "Switch User"
msgstr "Сменить пользователя"
#: ../js/ui/userMenu.js:765
msgid "Log Out" msgid "Log Out"
msgstr "Выйти из системы" msgstr "Выйти из системы"
#: ../js/ui/userMenu.js:769 #: ../js/ui/userMenu.js:770
msgid "Lock" msgid "Lock"
msgstr "Заблокировать" msgstr "Заблокировать"
#: ../js/ui/userMenu.js:784 #: ../js/ui/userMenu.js:785
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Установить обновления и выполнить перезагрузку" msgstr "Установить обновления и выполнить перезагрузку"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:803
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Будет установлен статус «не беспокоить»" msgstr "Будет установлен статус «не беспокоить»"
#: ../js/ui/userMenu.js:803 #: ../js/ui/userMenu.js:804
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."
@ -1695,7 +1702,7 @@ msgstr "Приложения"
msgid "Search" msgid "Search"
msgstr "Поиск" msgstr "Поиск"
#: ../js/ui/wanda.js:119 #: ../js/ui/wanda.js:117
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1704,12 +1711,12 @@ msgstr ""
"Извините, на сегодня нет никаких советов:\n" "Извините, на сегодня нет никаких советов:\n"
"%s" "%s"
#: ../js/ui/wanda.js:123 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Оракул говорит: «%s»" msgstr "Оракул говорит: «%s»"
#: ../js/ui/wanda.js:164 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "Ваше любимое «пасхальное яйцо»" msgstr "Ваше любимое «пасхальное яйцо»"
@ -1746,24 +1753,24 @@ msgstr[2] "%u входов"
msgid "System Sounds" msgid "System Sounds"
msgstr "Системные звуки" msgstr "Системные звуки"
#: ../src/main.c:330 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "Показать номер версии" msgstr "Показать номер версии"
#: ../src/main.c:336 #: ../src/main.c:338
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Режим, используемый GDM для окна входа в систему" msgstr "Режим, используемый GDM для окна входа в систему"
#: ../src/main.c:342 #: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "" msgstr ""
"Использовать для экрана входа в систему определённый режим, например «gdm»" "Использовать для экрана входа в систему определённый режим, например «gdm»"
#: ../src/main.c:348 #: ../src/main.c:350
msgid "List possible modes" msgid "List possible modes"
msgstr "Список возможных режимов" msgstr "Список возможных режимов"
#: ../src/shell-app.c:621 #: ../src/shell-app.c:622
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Не удалось запустить «%s»" msgstr "Не удалось запустить «%s»"
@ -1788,6 +1795,9 @@ msgstr "По умолчанию"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Пользователь отклонил диалог аутентификации" msgstr "Пользователь отклонил диалог аутентификации"
#~ msgid "Switch Session"
#~ msgstr "Переключить сеанс"
#~ msgid "disabled OpenSearch providers" #~ msgid "disabled OpenSearch providers"
#~ msgstr "отключённые провайдеры OpenSearch" #~ msgstr "отключённые провайдеры OpenSearch"

296
po/sk.po
View File

@ -10,8 +10,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: 2012-10-18 16:51+0000\n" "POT-Creation-Date: 2012-10-27 16:22+0000\n"
"PO-Revision-Date: 2012-10-13 22:35+0100\n" "PO-Revision-Date: 2012-10-28 19:49+0000\n"
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n" "Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n" "Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
"Language: sk\n" "Language: sk\n"
@ -25,8 +25,6 @@ msgstr ""
msgid "Screenshots" msgid "Screenshots"
msgstr "Snímky obrazovky" msgstr "Snímky obrazovky"
# PM: inde dianie na obrazovke
# DK:presne taketo nieco som chcel povedat ale nevedel som ako
#: ../data/50-gnome-shell-screenshot.xml.in.h:2 #: ../data/50-gnome-shell-screenshot.xml.in.h:2
msgid "Record a screencast" msgid "Record a screencast"
msgstr "Zaznamenať dianie na obrazovke" msgstr "Zaznamenať dianie na obrazovke"
@ -37,20 +35,16 @@ msgstr "Systém"
#: ../data/50-gnome-shell-system.xml.in.h:2 #: ../data/50-gnome-shell-system.xml.in.h:2
msgid "Show the message tray" msgid "Show the message tray"
msgstr "Zobraz lištu správ" msgstr "Zobrazí lištu správ"
# tooltip # tooltip
#: ../data/50-gnome-shell-system.xml.in.h:3 #: ../data/50-gnome-shell-system.xml.in.h:3
#, fuzzy
#| msgid "Show Applications"
msgid "Show all applications" msgid "Show all applications"
msgstr "Zobrazí aplikácie" msgstr "Zobrazí všetky aplikácie"
#: ../data/50-gnome-shell-system.xml.in.h:4 #: ../data/50-gnome-shell-system.xml.in.h:4
#, fuzzy
#| msgid "Keybinding to open the application menu"
msgid "Open the application menu" msgid "Open the application menu"
msgstr "Klávesová skratka na otvorenie ponuky aplikácií" msgstr "Otvorí ponuku aplikácií"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
@ -85,13 +79,9 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 #: ../data/org.gnome.shell.gschema.xml.in.in.h:3
msgid "Uuids of extensions to enable" msgid "Uuids of extensions to enable"
msgstr "Uuid identifikátory rozšírení určených na povolenie" msgstr "Vlastnosť uuid rozšírení určených na povolenie"
# PM: nepáči sa mi konštrukcia viet, preklad vyznieva strojovo
# DK: uz lepsie?
# PM: lepšie ale nepáči sa mi org.gnome.Shell. mne sa vidí že to bude nejaký súbor a potom predložka na asi nebude dobre
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 #: ../data/org.gnome.shell.gschema.xml.in.in.h:4
#, fuzzy
msgid "" msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which " "GNOME Shell extensions have a uuid property; this key lists extensions which "
"should be loaded. Any extension that wants to be loaded needs to be in this " "should be loaded. Any extension that wants to be loaded needs to be in this "
@ -101,7 +91,7 @@ msgstr ""
"Rozšírenia pre GNOME Shell majú vlastnosť uuid; tento kľúč obsahuje zoznam " "Rozšírenia pre GNOME Shell majú vlastnosť uuid; tento kľúč obsahuje zoznam "
"rozšírení, ktoré by mali byť načítané. Každé rozšírenie, ktoré je potrebné " "rozšírení, ktoré by mali byť načítané. Každé rozšírenie, ktoré je potrebné "
"načítať, musí byť v tomto zozname. Tento zoznam môžete upraviť aj ručne " "načítať, musí byť v tomto zozname. Tento zoznam môžete upraviť aj ručne "
"pomocou metód DBus EnableExtension a DisableExtension na org.gnome.Shell." "pomocou metód DBus EnableExtension a DisableExtension v org.gnome.Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 #: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Whether to collect stats about applications usage" msgid "Whether to collect stats about applications usage"
@ -176,17 +166,15 @@ msgid "Keybinding to open the application menu."
msgstr "Klávesová skratka na otvorenie ponuky aplikácií." msgstr "Klávesová skratka na otvorenie ponuky aplikácií."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
#, fuzzy
#| msgid "Keybinding to open the application menu"
msgid "Keybinding to open the \"Show Applications\" view" msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Klávesová skratka na otvorenie ponuky aplikácií" msgstr "Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
#, fuzzy
#| msgid "Keybinding to open the application menu."
msgid "" msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview." "Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "Klávesová skratka na otvorenie ponuky aplikácií." msgstr ""
"Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“ v prehľade "
"aktivít."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
@ -211,7 +199,7 @@ msgstr "Ktorú klávesnicu používať"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Typ klávesnice, ktorý sa má používať." msgstr "Typ klávesnice, ktorá sa má používať."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
@ -273,6 +261,39 @@ msgstr ""
"základe aktuálneho dátumu a použije túto príponu. Pri nahrávaní do iného " "základe aktuálneho dátumu a použije túto príponu. Pri nahrávaní do iného "
"formátu kontajneru by mala byť zmenená." "formátu kontajneru by mala byť zmenená."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "Attach modal dialog to the parent window"
msgstr "Pripojiť modálne dialógové okno k rodičovskému oknu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "Tento kľúč preváži kľúč v org.gnome.mutter po spustení GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid "Arrangement of buttons on the titlebar"
msgstr "Usporiadanie tlačidiel na titulku okna"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell."
msgstr ""
"Tento kľúč preváži kľúč v org.gnome.desktop.wm.preferences po spustení GNOME "
"Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "Workspaces are managed dynamically"
msgstr "Pracovné priestory sú spravované dynamicky"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "Workspaces only on primary monitor"
msgstr "Pracovné priestory sú iba na primárnom monitore"
#: ../js/extensionPrefs/main.js:124 #: ../js/extensionPrefs/main.js:124
#, c-format #, c-format
msgid "There was an error loading the preferences dialog for %s:" msgid "There was an error loading the preferences dialog for %s:"
@ -286,11 +307,11 @@ msgstr "Rozšírenie"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Použitím ponuky vyberte rozšírenie na nastavenie" msgstr "Použitím ponuky vyberte rozšírenie na nastavenie"
#: ../js/gdm/loginDialog.js:529 #: ../js/gdm/loginDialog.js:560
msgid "Session..." msgid "Session..."
msgstr "Relácia..." msgstr "Relácia..."
#: ../js/gdm/loginDialog.js:677 #: ../js/gdm/loginDialog.js:704
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Prihlásenie" msgstr "Prihlásenie"
@ -299,42 +320,42 @@ msgstr "Prihlásenie"
#. 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:736 #: ../js/gdm/loginDialog.js:763
msgid "Not listed?" msgid "Not listed?"
msgstr "Nie ste v zozname?" msgstr "Nie ste v zozname?"
#: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:901 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167 #: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:168
msgid "Cancel" msgid "Cancel"
msgstr "Zrušiť" msgstr "Zrušiť"
#: ../js/gdm/loginDialog.js:894 #: ../js/gdm/loginDialog.js:906
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Prihlásiť sa" msgstr "Prihlásiť sa"
#: ../js/gdm/loginDialog.js:1215 #: ../js/gdm/loginDialog.js:1217
msgid "Login Window" msgid "Login Window"
msgstr "Prihlasovacie okno" msgstr "Prihlasovacie okno"
#. Translators: accessible name of the power menu in the login screen #. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:37 #: ../js/gdm/powerMenu.js:36
msgid "Power" msgid "Power"
msgstr "Napájanie" msgstr "Napájanie"
#: ../js/gdm/powerMenu.js:95 ../js/ui/userMenu.js:655 ../js/ui/userMenu.js:659 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667
#: ../js/ui/userMenu.js:770 #: ../js/ui/userMenu.js:778
msgid "Suspend" msgid "Suspend"
msgstr "Uspať" msgstr "Uspať"
#: ../js/gdm/powerMenu.js:100 #: ../js/gdm/powerMenu.js:98
msgid "Restart" msgid "Restart"
msgstr "Reštartovať" msgstr "Reštartovať"
#: ../js/gdm/powerMenu.js:105 ../js/ui/userMenu.js:657 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:665
#: ../js/ui/userMenu.js:659 ../js/ui/userMenu.js:769 #: ../js/ui/userMenu.js:667 ../js/ui/userMenu.js:777
msgid "Power Off" msgid "Power Off"
msgstr "Vypnúť" msgstr "Vypnúť"
@ -517,35 +538,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:699 #: ../js/ui/calendar.js:700
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Žiadne naplánované udalosti" msgstr "Žiadne naplánované udalosti"
#. 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:715 #: ../js/ui/calendar.js:716
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:718 #: ../js/ui/calendar.js:719
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:728 #: ../js/ui/calendar.js:729
msgid "Today" msgid "Today"
msgstr "Dnes" msgstr "Dnes"
#: ../js/ui/calendar.js:732 #: ../js/ui/calendar.js:733
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Zajtra" msgstr "Zajtra"
#: ../js/ui/calendar.js:743 #: ../js/ui/calendar.js:744
msgid "This week" msgid "This week"
msgstr "Tento týždeň" msgstr "Tento týždeň"
#: ../js/ui/calendar.js:751 #: ../js/ui/calendar.js:752
msgid "Next week" msgid "Next week"
msgstr "Ďalší týždeň" msgstr "Ďalší týždeň"
@ -553,10 +574,11 @@ msgstr "Ďalší týždeň"
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Vymeniteľné zariadenia" msgstr "Vymeniteľné zariadenia"
# DK: doplnil som slovo "programu", aby to znelo prirodzenejsie. priklad:po pripojeni USB kluca bolo zobrazene "Otvoriť pomocou Súbory"
#: ../js/ui/components/autorunManager.js:591 #: ../js/ui/components/autorunManager.js:591
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Otvoriť pomocou %s" msgstr "Otvoriť pomocou programu %s"
#: ../js/ui/components/autorunManager.js:617 #: ../js/ui/components/autorunManager.js:617
msgid "Eject" msgid "Eject"
@ -623,7 +645,7 @@ msgstr ""
#: ../js/ui/components/networkAgent.js:314 #: ../js/ui/components/networkAgent.js:314
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "Overenie totožnosti drôtovej 802.1X" msgstr "Overenie totožnosti k drôtovej sieti 802.1X"
#: ../js/ui/components/networkAgent.js:316 #: ../js/ui/components/networkAgent.js:316
msgid "Network name: " msgid "Network name: "
@ -631,7 +653,7 @@ msgstr "Názov siete: "
#: ../js/ui/components/networkAgent.js:321 #: ../js/ui/components/networkAgent.js:321
msgid "DSL authentication" msgid "DSL authentication"
msgstr "Overenie totožnosti DSL" msgstr "Overenie totožnosti k DSL"
#: ../js/ui/components/networkAgent.js:328 #: ../js/ui/components/networkAgent.js:328
msgid "PIN code required" msgid "PIN code required"
@ -639,7 +661,7 @@ msgstr "Požaduje sa kód PIN"
#: ../js/ui/components/networkAgent.js:329 #: ../js/ui/components/networkAgent.js:329
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "Pre zariadenie mobilnej siete je potrebný PIN kód" msgstr "Pre zariadenie mobilnej siete je potrebný kód PIN"
#: ../js/ui/components/networkAgent.js:330 #: ../js/ui/components/networkAgent.js:330
msgid "PIN: " msgid "PIN: "
@ -647,7 +669,7 @@ msgstr "PIN: "
#: ../js/ui/components/networkAgent.js:336 #: ../js/ui/components/networkAgent.js:336
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Heslo pre mobilnú sieť" msgstr "Heslo k mobilnej sieti"
#: ../js/ui/components/networkAgent.js:337 #: ../js/ui/components/networkAgent.js:337
#, c-format #, c-format
@ -675,11 +697,12 @@ msgstr "Overiť totožnosť"
msgid "Sorry, that didn't work. Please try again." msgid "Sorry, that didn't work. Please try again."
msgstr "Prepáčte, ale nezabralo to. Skúste to, prosím, znova." msgstr "Prepáčte, ale nezabralo to. Skúste to, prosím, znova."
# %d je datum, %t je cas
#. Translators: this is a filename used for screencast recording #. Translators: this is a filename used for screencast recording
#: ../js/ui/components/recorder.js:44 #: ../js/ui/components/recorder.js:44
#, no-c-format #, no-c-format
msgid "Screencast from %d %t" msgid "Screencast from %d %t"
msgstr "Záznam videa obrazovky z %d %t" msgstr "Záznam videa obrazovky dňa %d o %t"
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use #. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does. #. system-users for now as Empathy does.
@ -714,44 +737,42 @@ msgid "Mute"
msgstr "Stlmiť" msgstr "Stlmiť"
#. Translators: this is a time format string followed by the word "Yesterday". i.e. "14:30 on Yesterday" #. Translators: this is a time format string followed by the word "Yesterday". i.e. "14:30 on Yesterday"
#: ../js/ui/components/telepathyClient.js:941 #: ../js/ui/components/telepathyClient.js:943
#, no-c-format #, no-c-format
msgid "<b>%H:%M</b> on Yesterday" msgid "<b>%H:%M</b> on Yesterday"
msgstr "" msgstr "včera o <b>%H:%M</b>"
#. Translators: this is a time format string followed by a week day name. i.e. "14:30 on Monday #. Translators: this is a time format string followed by a week day name. i.e. "14:30 on Monday
#: ../js/ui/components/telepathyClient.js:947 #: ../js/ui/components/telepathyClient.js:949
#, fuzzy, no-c-format #, no-c-format
#| msgid "Sent at <b>%X</b> on <b>%A</b>"
msgid "<b>%H:%M</b> on <b>%A</b>" msgid "<b>%H:%M</b> on <b>%A</b>"
msgstr "Čas odoslania: <b>%A</b>, <b>%R</b>" msgstr "v <b>%A</b> o <b>%H:%M</b>"
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25", #. Translators: this is a time format in the style of "14:30 on Wednesday, May 25",
#. shown when you get a chat message in the same year #. shown when you get a chat message in the same year
#: ../js/ui/components/telepathyClient.js:953 #: ../js/ui/components/telepathyClient.js:955
#, fuzzy, no-c-format #, no-c-format
#| msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>" msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>"
msgstr "Čas odoslania: <b>%A</b>, <b>%e. %B</b>" msgstr "v <b>%A</b> o <b>%H:%M</b>, <b>%e.</b> <b>%B</b>"
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "14:30 on Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year #. shown when you get a chat message in a different year
#: ../js/ui/components/telepathyClient.js:958 #: ../js/ui/components/telepathyClient.js:960
#, fuzzy, no-c-format #, no-c-format
#| msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>, %Y" msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>, %Y"
msgstr "Čas odoslania: <b>%A</b>, <b>%e. %B</b> %Y" msgstr "v <b>%A</b> o <b>%H:%M</b>, <b>%e.</b> <b>%B</b>, %Y"
#. 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:986 #: ../js/ui/components/telepathyClient.js:988
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s odteraz vystupuje ako %s" msgstr "Kontakt %s odteraz vystupuje ako %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:1085 #: ../js/ui/components/telepathyClient.js:1087
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Pozvánka do %s" msgstr "Pozvánka do %s"
@ -759,42 +780,42 @@ msgstr "Pozvánka do %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:1093 #: ../js/ui/components/telepathyClient.js:1095
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s vás pozýva aby ste sa pridali do %s" msgstr "Kontakt %s vás pozýva aby ste sa pridali do %s"
#: ../js/ui/components/telepathyClient.js:1095 #: ../js/ui/components/telepathyClient.js:1097
#: ../js/ui/components/telepathyClient.js:1174 #: ../js/ui/components/telepathyClient.js:1176
#: ../js/ui/components/telepathyClient.js:1237 #: ../js/ui/components/telepathyClient.js:1239
msgid "Decline" msgid "Decline"
msgstr "Odmietnuť" msgstr "Odmietnuť"
#: ../js/ui/components/telepathyClient.js:1096 #: ../js/ui/components/telepathyClient.js:1098
#: ../js/ui/components/telepathyClient.js:1175 #: ../js/ui/components/telepathyClient.js:1177
#: ../js/ui/components/telepathyClient.js:1238 #: ../js/ui/components/telepathyClient.js:1240
msgid "Accept" msgid "Accept"
msgstr "Prijať" msgstr "Prijať"
#. 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:1126 #: ../js/ui/components/telepathyClient.js:1128
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Videohovor od používateľa %s" msgstr "Videohovor od kontaktu %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:1129 #: ../js/ui/components/telepathyClient.js:1131
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Hovor od používateľa %s" msgstr "Hovor od kontaktu %s"
#: ../js/ui/components/telepathyClient.js:1134 #: ../js/ui/components/telepathyClient.js:1136
#: ../js/ui/status/bluetooth.js:346 #: ../js/ui/status/bluetooth.js:346
msgid "Reject" msgid "Reject"
msgstr "Odmietnuť" msgstr "Odmietnuť"
#. 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:1136 #: ../js/ui/components/telepathyClient.js:1138
msgid "Answer" msgid "Answer"
msgstr "Prijať hovor" msgstr "Prijať hovor"
@ -803,110 +824,111 @@ msgstr "Prijať hovor"
#. * 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:1168 #: ../js/ui/components/telepathyClient.js:1170
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s vám posiela %s" msgstr "Kontakt %s vám posiela %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1203 #: ../js/ui/components/telepathyClient.js:1205
#, 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 by chcel získať oprávnenie vidieť, kedy ste pripojený" msgstr ""
"Kontakt %s by chcel získať oprávnenie vidieť, kedy ste pripojený"
#: ../js/ui/components/telepathyClient.js:1295 #: ../js/ui/components/telepathyClient.js:1297
msgid "Network error" msgid "Network error"
msgstr "Chyba siete" msgstr "Chyba siete"
#: ../js/ui/components/telepathyClient.js:1297 #: ../js/ui/components/telepathyClient.js:1299
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Overenie totožnosti zlyhalo" msgstr "Overenie totožnosti zlyhalo"
#: ../js/ui/components/telepathyClient.js:1299 #: ../js/ui/components/telepathyClient.js:1301
msgid "Encryption error" msgid "Encryption error"
msgstr "Chyba šifrovania" msgstr "Chyba šifrovania"
#: ../js/ui/components/telepathyClient.js:1301 #: ../js/ui/components/telepathyClient.js:1303
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Neposkytnutý certifikát" msgstr "Neposkytnutý certifikát"
#: ../js/ui/components/telepathyClient.js:1303 #: ../js/ui/components/telepathyClient.js:1305
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Nedôveryhodný certifikát" msgstr "Nedôveryhodný certifikát"
#: ../js/ui/components/telepathyClient.js:1305 #: ../js/ui/components/telepathyClient.js:1307
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Certifikát s ukončenou platnosťou" msgstr "Certifikát s ukončenou platnosťou"
#: ../js/ui/components/telepathyClient.js:1307 #: ../js/ui/components/telepathyClient.js:1309
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Neaktivovaný certifikát" msgstr "Neaktivovaný certifikát"
#: ../js/ui/components/telepathyClient.js:1309 #: ../js/ui/components/telepathyClient.js:1311
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Certifikát s nesúhlasným názvom hostiteľa" msgstr "Certifikát s nesúhlasným názvom hostiteľa"
#: ../js/ui/components/telepathyClient.js:1311 #: ../js/ui/components/telepathyClient.js:1313
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Certifikát s nesúhlasným odtlačkom" msgstr "Certifikát s nesúhlasným odtlačkom"
#: ../js/ui/components/telepathyClient.js:1313 #: ../js/ui/components/telepathyClient.js:1315
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Sebou podpísaný certifikát" msgstr "Sebou podpísaný certifikát"
#: ../js/ui/components/telepathyClient.js:1315 #: ../js/ui/components/telepathyClient.js:1317
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "Stav je nastavený na odhlásený" msgstr "Stav je nastavený na odhlásený"
#: ../js/ui/components/telepathyClient.js:1317 #: ../js/ui/components/telepathyClient.js:1319
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Šifrovanie nie je dostupné" msgstr "Šifrovanie nie je dostupné"
#: ../js/ui/components/telepathyClient.js:1319 #: ../js/ui/components/telepathyClient.js:1321
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "Certifikát je neplatný" msgstr "Certifikát je neplatný"
#: ../js/ui/components/telepathyClient.js:1321 #: ../js/ui/components/telepathyClient.js:1323
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Pripojenie bolo odmietnuté" msgstr "Pripojenie bolo odmietnuté"
#: ../js/ui/components/telepathyClient.js:1323 #: ../js/ui/components/telepathyClient.js:1325
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "Nedá sa nadviazať spojenie" msgstr "Nedá sa nadviazať spojenie"
#: ../js/ui/components/telepathyClient.js:1325 #: ../js/ui/components/telepathyClient.js:1327
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Spojenie sa stratilo" msgstr "Spojenie sa stratilo"
#: ../js/ui/components/telepathyClient.js:1327 #: ../js/ui/components/telepathyClient.js:1329
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "Tento účet je už pripojený k serveru" msgstr "Tento účet je už pripojený k serveru"
#: ../js/ui/components/telepathyClient.js:1329 #: ../js/ui/components/telepathyClient.js:1331
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 "Pripojenie bolo nahradené novým, ktoré používa rovnaký zdroj" msgstr "Pripojenie bolo nahradené novým, ktoré používa rovnaký zdroj"
#: ../js/ui/components/telepathyClient.js:1331 #: ../js/ui/components/telepathyClient.js:1333
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "Účet na serveri už existuje" msgstr "Účet na serveri už existuje"
#: ../js/ui/components/telepathyClient.js:1333 #: ../js/ui/components/telepathyClient.js:1335
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "Server je momentálne príliš zaneprázdnený na zvládnutie pripojenia" msgstr "Server je momentálne príliš zaneprázdnený na zvládnutie pripojenia"
#: ../js/ui/components/telepathyClient.js:1335 #: ../js/ui/components/telepathyClient.js:1337
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Certifikát bol zrušený" msgstr "Certifikát bol zrušený"
#: ../js/ui/components/telepathyClient.js:1337 #: ../js/ui/components/telepathyClient.js:1339
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"Šifrovací algoritmus používaný certifikátom nie je bezpečný alebo je " "Šifrovací algoritmus používaný certifikátom nie je bezpečný alebo je "
"kryptograficky slabý" "kryptograficky slabý"
#: ../js/ui/components/telepathyClient.js:1339 #: ../js/ui/components/telepathyClient.js:1341
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"
@ -914,26 +936,26 @@ msgstr ""
"Dĺžka certifikátu servera, alebo hĺbka reťazca certifikátu servera presahuje " "Dĺžka certifikátu servera, alebo hĺbka reťazca certifikátu servera presahuje "
"limit stanovený kryptografickou knižnicou." "limit stanovený kryptografickou knižnicou."
#: ../js/ui/components/telepathyClient.js:1341 #: ../js/ui/components/telepathyClient.js:1343
msgid "Internal error" msgid "Internal error"
msgstr "Vnútorná chyba" msgstr "Vnútorná 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:1351 #: ../js/ui/components/telepathyClient.js:1353
#, c-format #, c-format
msgid "Connection to %s failed" msgid "Connection to %s failed"
msgstr "Pripojenie k %s zlyhalo" msgstr "Pripojenie k %s zlyhalo"
#: ../js/ui/components/telepathyClient.js:1360 #: ../js/ui/components/telepathyClient.js:1362
msgid "Reconnect" msgid "Reconnect"
msgstr "Znovu sa pripojiť" msgstr "Znovu sa pripojiť"
#: ../js/ui/components/telepathyClient.js:1361 #: ../js/ui/components/telepathyClient.js:1363
msgid "Edit account" msgid "Edit account"
msgstr "Upraviť účet" msgstr "Upraviť účet"
#: ../js/ui/components/telepathyClient.js:1406 #: ../js/ui/components/telepathyClient.js:1408
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Neznámy dôvod" msgstr "Neznámy dôvod"
@ -992,7 +1014,7 @@ msgstr[2] "Budete automaticky odhlásený o %d sekundy."
#: ../js/ui/endSessionDialog.js:74 #: ../js/ui/endSessionDialog.js:74
msgid "Logging out of the system." msgid "Logging out of the system."
msgstr "Odhlasuje sa zo systému." msgstr "Prebieha odhlásenie zo systému."
#: ../js/ui/endSessionDialog.js:76 #: ../js/ui/endSessionDialog.js:76
msgctxt "button" msgctxt "button"
@ -1120,21 +1142,21 @@ msgstr "Zobraziť zdroj"
msgid "Web Page" msgid "Web Page"
msgstr "Webová stránka" msgstr "Webová stránka"
#: ../js/ui/messageTray.js:1082 #: ../js/ui/messageTray.js:1083
msgid "Open" msgid "Open"
msgstr "Otvoriť" msgstr "Otvoriť"
#: ../js/ui/messageTray.js:1089 #: ../js/ui/messageTray.js:1090
msgid "Remove" msgid "Remove"
msgstr "Odstrániť" msgstr "Odstrániť"
# DK: zvazoval som pouzit "Panel správ" # DK: zvazoval som pouzit "Panel správ"
# neviem co bude vhodnejsie ako preklad "tray" # neviem co bude vhodnejsie ako preklad "tray"
#: ../js/ui/messageTray.js:1545 #: ../js/ui/messageTray.js:1534
msgid "Message Tray" msgid "Message Tray"
msgstr "Lišta správ" msgstr "Lišta správ"
#: ../js/ui/messageTray.js:2552 #: ../js/ui/messageTray.js:2557
msgid "System Information" msgid "System Information"
msgstr "Informácie o systéme" msgstr "Informácie o systéme"
@ -1175,7 +1197,7 @@ msgstr "Ukončiť"
msgid "Activities" msgid "Activities"
msgstr "Aktivity" msgstr "Aktivity"
#: ../js/ui/panel.js:965 #: ../js/ui/panel.js:966
msgid "Top Bar" msgid "Top Bar"
msgstr "Horná lišta" msgstr "Horná lišta"
@ -1197,11 +1219,11 @@ msgstr "Prosím, zadajte príkaz:"
# v ostatnych retazcoch je pouzite %e, tak to bude asi OK # v ostatnych retazcoch je pouzite %e, tak to bude asi OK
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:79 #: ../js/ui/screenShield.js:80
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %e. %B" msgstr "%A, %e. %B"
#: ../js/ui/screenShield.js:143 #: ../js/ui/screenShield.js:144
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
@ -1209,13 +1231,13 @@ msgstr[0] "%d nových správ"
msgstr[1] "%d nová správa" msgstr[1] "%d nová správa"
msgstr[2] "%d nové správy" msgstr[2] "%d nové správy"
#: ../js/ui/screenShield.js:145 #: ../js/ui/screenShield.js:146
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
msgstr[0] "%d nových upozornení" msgstr[0] "%d nových oznámení"
msgstr[1] "%d nové upozornenie" msgstr[1] "%d nové oznámenie"
msgstr[2] "%d nové upozornenia" msgstr[2] "%d nové oznámenia"
#: ../js/ui/searchDisplay.js:275 #: ../js/ui/searchDisplay.js:275
msgid "Searching..." msgid "Searching..."
@ -1249,13 +1271,13 @@ msgstr "Heslo"
msgid "Remember Password" msgid "Remember Password"
msgstr "Zapamätať heslo" msgstr "Zapamätať heslo"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170 #: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:171
msgid "Unlock" msgid "Unlock"
msgstr "Odblokovať" msgstr "Odblokovať"
#: ../js/ui/status/accessibility.js:39 #: ../js/ui/status/accessibility.js:39
msgid "Accessibility" msgid "Accessibility"
msgstr "Prístupnosť" msgstr "Zjednodušenie ovládania"
#: ../js/ui/status/accessibility.js:44 #: ../js/ui/status/accessibility.js:44
msgid "Zoom" msgid "Zoom"
@ -1537,7 +1559,7 @@ msgstr "Mobilné"
#: ../js/ui/status/network.js:1628 #: ../js/ui/status/network.js:1628
msgid "VPN Connections" msgid "VPN Connections"
msgstr "VPN pripojenia" msgstr "Pripojenia k VPN"
#: ../js/ui/status/network.js:1635 #: ../js/ui/status/network.js:1635
msgid "Network Settings" msgid "Network Settings"
@ -1669,7 +1691,7 @@ msgstr "Hlasitosť"
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofón" msgstr "Mikrofón"
#: ../js/ui/unlockDialog.js:177 #: ../js/ui/unlockDialog.js:178
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Prihlásiť ako iný používateľ" msgstr "Prihlásiť ako iný používateľ"
@ -1697,35 +1719,35 @@ msgstr "Nečinný"
msgid "Unavailable" msgid "Unavailable"
msgstr "Nedostupný" msgstr "Nedostupný"
#: ../js/ui/userMenu.js:735 #: ../js/ui/userMenu.js:743
msgid "Notifications" msgid "Notifications"
msgstr "Upozornenia" msgstr "Upozornenia"
#: ../js/ui/userMenu.js:743 #: ../js/ui/userMenu.js:751
msgid "System Settings" msgid "System Settings"
msgstr "Nastavenia systému" msgstr "Nastavenia systému"
#: ../js/ui/userMenu.js:751 #: ../js/ui/userMenu.js:759
msgid "Switch User" msgid "Switch User"
msgstr "Prepnúť používateľa" msgstr "Prepnúť používateľa"
#: ../js/ui/userMenu.js:756 #: ../js/ui/userMenu.js:764
msgid "Log Out" msgid "Log Out"
msgstr "Odhlásiť sa" msgstr "Odhlásiť sa"
#: ../js/ui/userMenu.js:761 #: ../js/ui/userMenu.js:769
msgid "Lock" msgid "Lock"
msgstr "Uzamknúť" msgstr "Uzamknúť"
#: ../js/ui/userMenu.js:776 #: ../js/ui/userMenu.js:784
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Nainštalovať aktualizácie a reštartovať" msgstr "Nainštalovať aktualizácie a reštartovať"
#: ../js/ui/userMenu.js:794 #: ../js/ui/userMenu.js:802
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Váš stav bude nastavený na zaneprázdnený" msgstr "Váš stav bude nastavený na zaneprázdnený"
#: ../js/ui/userMenu.js:795 #: ../js/ui/userMenu.js:803
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."

View File

@ -218,12 +218,12 @@ msgstr "يىغقۇچقا قوش"
#: ../js/ui/appFavorites.js:91 #: ../js/ui/appFavorites.js:91
#, c-format #, c-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s يىغقۇچىڭىزغا قوشۇلدى." msgstr "%s يىغقۇچىڭىزغا قوشۇلدى."
#: ../js/ui/appFavorites.js:122 #: ../js/ui/appFavorites.js:122
#, c-format #, c-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ." msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ."
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
@ -437,7 +437,7 @@ msgstr "يېقىنقى تۈرلەر"
#: ../js/ui/endSessionDialog.js:63 #: ../js/ui/endSessionDialog.js:63
#, c-format #, c-format
msgid "Log Out %s" msgid "Log Out %s"
msgstr "%s تىزىمدىن چىقىش" msgstr "%s تىزىمدىن چىقىش"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70 #: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
msgid "Log Out" msgid "Log Out"
@ -452,7 +452,7 @@ msgstr ""
#: ../js/ui/endSessionDialog.js:66 #: ../js/ui/endSessionDialog.js:66
#, c-format #, c-format
msgid "%s will be logged out automatically in %d seconds." msgid "%s will be logged out automatically in %d seconds."
msgstr "%s تىزىمدىن %d سېكۇنتتىن كېيىن ئۆزلۈكىدىن چىقىسىز." msgstr "%s تىزىمدىن %d سېكۇنتتىن كېيىن ئۆزلۈكىدىن چىقىسىز."
#: ../js/ui/endSessionDialog.js:67 #: ../js/ui/endSessionDialog.js:67
#, c-format #, c-format
@ -566,7 +566,7 @@ msgstr "سىزىقچە"
#: ../js/ui/panel.js:533 #: ../js/ui/panel.js:533
#, c-format #, c-format
msgid "Quit %s" msgid "Quit %s"
msgstr "%s چېكىن" msgstr "%s چېكىن"
#. Button on the left side of the panel. #. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview". #. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
@ -799,7 +799,7 @@ msgstr "رەت قىل"
#: ../js/ui/status/bluetooth.js:408 #: ../js/ui/status/bluetooth.js:408
#, c-format #, c-format
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "%s نىڭ جەزملىشىنى جۈپلەشتۈرۈۋاتىدۇ" msgstr "%s نىڭ جەزملىشىنى جۈپلەشتۈرۈۋاتىدۇ"
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448 #: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format #, c-format
@ -823,7 +823,7 @@ msgstr "ماسلاشمىدى"
#: ../js/ui/status/bluetooth.js:441 #: ../js/ui/status/bluetooth.js:441
#, c-format #, c-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "%s دىن كەلگەن جۈپلەش ئىلتىماسى" msgstr "%s دىن كەلگەن جۈپلەش ئىلتىماسى"
#: ../js/ui/status/bluetooth.js:449 #: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device." msgid "Please enter the PIN mentioned on the device."
@ -1074,22 +1074,22 @@ msgstr "مىكروفون"
#: ../js/ui/telepathyClient.js:335 #: ../js/ui/telepathyClient.js:335
#, c-format #, c-format
msgid "%s is online." msgid "%s is online."
msgstr "%s توردا." msgstr "%s توردا."
#: ../js/ui/telepathyClient.js:340 #: ../js/ui/telepathyClient.js:340
#, c-format #, c-format
msgid "%s is offline." msgid "%s is offline."
msgstr "%s توردا يوق." msgstr "%s توردا يوق."
#: ../js/ui/telepathyClient.js:343 #: ../js/ui/telepathyClient.js:343
#, c-format #, c-format
msgid "%s is away." msgid "%s is away."
msgstr "%s يوق." msgstr "%s يوق."
#: ../js/ui/telepathyClient.js:346 #: ../js/ui/telepathyClient.js:346
#, c-format #, c-format
msgid "%s is busy." msgid "%s is busy."
msgstr "%s ئالدىراش." msgstr "%s ئالدىراش."
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
@ -1114,7 +1114,7 @@ msgstr "ئىزدە"
#: ../js/ui/windowAttentionHandler.js:42 #: ../js/ui/windowAttentionHandler.js:42
#, c-format #, c-format
msgid "%s has finished starting" msgid "%s has finished starting"
msgstr "%s باشلاشنى تاماملىدى" msgstr "%s باشلاشنى تاماملىدى"
#: ../js/ui/windowAttentionHandler.js:44 #: ../js/ui/windowAttentionHandler.js:44
#, c-format #, c-format

View File

@ -119,7 +119,6 @@ shell_public_headers_h = \
shell-network-agent.h \ shell-network-agent.h \
shell-perf-log.h \ shell-perf-log.h \
shell-screenshot.h \ shell-screenshot.h \
shell-screen-grabber.h \
shell-slicer.h \ shell-slicer.h \
shell-stack.h \ shell-stack.h \
shell-tp-client.h \ shell-tp-client.h \
@ -167,7 +166,6 @@ libgnome_shell_la_SOURCES = \
shell-polkit-authentication-agent.h \ shell-polkit-authentication-agent.h \
shell-polkit-authentication-agent.c \ shell-polkit-authentication-agent.c \
shell-screenshot.c \ shell-screenshot.c \
shell-screen-grabber.c \
shell-secure-text-buffer.c \ shell-secure-text-buffer.c \
shell-secure-text-buffer.h \ shell-secure-text-buffer.h \
shell-slicer.c \ shell-slicer.c \
@ -232,8 +230,6 @@ test_recorder_LDADD = $(TEST_SHELL_RECORDER_LIBS)
test_recorder_SOURCES = \ test_recorder_SOURCES = \
$(shell_recorder_sources) $(shell_recorder_private_sources) \ $(shell_recorder_sources) $(shell_recorder_private_sources) \
shell-screen-grabber.c \
shell-screen-grabber.h \
test-recorder.c test-recorder.c
endif BUILD_RECORDER endif BUILD_RECORDER

View File

@ -31,7 +31,6 @@
#include <string.h> #include <string.h>
#define HANDLE_LIBICAL_MEMORY #define HANDLE_LIBICAL_MEMORY
#include <libecal/libecal.h> #include <libecal/libecal.h>
#include <libedataserverui/libedataserverui.h>
#undef CALENDAR_ENABLE_DEBUG #undef CALENDAR_ENABLE_DEBUG
#include "calendar-debug.h" #include "calendar-debug.h"

View File

@ -34,7 +34,6 @@
#include <unistd.h> #include <unistd.h>
#include <gio/gio.h> #include <gio/gio.h>
#include <gtk/gtk.h>
#define HANDLE_LIBICAL_MEMORY #define HANDLE_LIBICAL_MEMORY
#include <libecal/libecal.h> #include <libecal/libecal.h>
@ -985,9 +984,11 @@ on_name_lost (GDBusConnection *connection,
const gchar *name, const gchar *name,
gpointer user_data) gpointer user_data)
{ {
GMainLoop *main_loop = user_data;
g_print ("gnome-shell-calendar-server[%d]: Lost (or failed to acquire) the name " BUS_NAME " - exiting\n", g_print ("gnome-shell-calendar-server[%d]: Lost (or failed to acquire) the name " BUS_NAME " - exiting\n",
(gint) getpid ()); (gint) getpid ());
gtk_main_quit (); g_main_loop_quit (main_loop);
} }
static void static void
@ -1003,11 +1004,13 @@ stdin_channel_io_func (GIOChannel *source,
GIOCondition condition, GIOCondition condition,
gpointer data) gpointer data)
{ {
GMainLoop *main_loop = data;
if (condition & G_IO_HUP) if (condition & G_IO_HUP)
{ {
g_debug ("gnome-shell-calendar-server[%d]: Got HUP on stdin - exiting\n", g_debug ("gnome-shell-calendar-server[%d]: Got HUP on stdin - exiting\n",
(gint) getpid ()); (gint) getpid ());
gtk_main_quit (); g_main_loop_quit (main_loop);
} }
else else
{ {
@ -1022,6 +1025,7 @@ main (int argc,
{ {
GError *error; GError *error;
GOptionContext *opt_context; GOptionContext *opt_context;
GMainLoop *main_loop;
gint ret; gint ret;
guint name_owner_id; guint name_owner_id;
GIOChannel *stdin_channel; GIOChannel *stdin_channel;
@ -1031,10 +1035,6 @@ main (int argc,
name_owner_id = 0; name_owner_id = 0;
stdin_channel = NULL; stdin_channel = NULL;
/* We need to initialize GTK+ since evolution-data-server may decide to use
* GTK+ to pop up a dialog box */
gtk_init (&argc, &argv);
introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
g_assert (introspection_data != NULL); g_assert (introspection_data != NULL);
@ -1048,11 +1048,15 @@ main (int argc,
goto out; goto out;
} }
main_loop = g_main_loop_new (NULL, FALSE);
stdin_channel = g_io_channel_unix_new (STDIN_FILENO); stdin_channel = g_io_channel_unix_new (STDIN_FILENO);
g_io_add_watch (stdin_channel, g_io_add_watch_full (stdin_channel,
G_IO_HUP, G_PRIORITY_DEFAULT,
stdin_channel_io_func, G_IO_HUP,
NULL); stdin_channel_io_func,
g_main_loop_ref (main_loop),
(GDestroyNotify) g_main_loop_unref);
name_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, name_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
BUS_NAME, BUS_NAME,
@ -1061,10 +1065,12 @@ main (int argc,
on_bus_acquired, on_bus_acquired,
on_name_acquired, on_name_acquired,
on_name_lost, on_name_lost,
NULL, g_main_loop_ref (main_loop),
NULL); (GDestroyNotify) g_main_loop_unref);
gtk_main (); g_main_loop_run (main_loop);
g_main_loop_unref (main_loop);
ret = 0; ret = 0;

View File

@ -28,7 +28,7 @@ def show_version(option, opt_str, value, parser):
def wait_for_dbus_name(wait_name): def wait_for_dbus_name(wait_name):
loop = GLib.MainLoop() loop = GLib.MainLoop()
def on_name_appeared(connection, name, name_owner, *args): def on_name_appeared(connection, name, new_owner, *args):
if not (name == wait_name and new_owner != ''): if not (name == wait_name and new_owner != ''):
return return
loop.quit() loop.quit()
@ -60,13 +60,18 @@ def start_perf_helper():
wait_for_dbus_name (PERF_HELPER_NAME) wait_for_dbus_name (PERF_HELPER_NAME)
def stop_perf_helper(): def stop_perf_helper():
proxy = Gio.DBusProxy(g_bus_type=Gio.BusType.SESSION, bus = Gio.bus_get_sync(Gio.BusType.SESSION, None)
g_name=PERF_HELPER_NAME,
g_interface=PERF_HELPER_IFACE, proxy = Gio.DBusProxy.new_sync(bus,
g_object_path=PERF_HELPER_PATH) Gio.DBusProxyFlags.NONE,
None,
PERF_HELPER_NAME,
PERF_HELPER_PATH,
PERF_HELPER_IFACE,
None)
proxy.Exit() proxy.Exit()
def start_shell(extra_args, perf_output=None): def start_shell(perf_output=None):
# Set up environment # Set up environment
env = dict(os.environ) env = dict(os.environ)
env['SHELL_PERF_MODULE'] = options.perf env['SHELL_PERF_MODULE'] = options.perf
@ -76,19 +81,21 @@ def start_shell(extra_args, perf_output=None):
env['SHELL_PERF_OUTPUT'] = perf_output env['SHELL_PERF_OUTPUT'] = perf_output
self_dir = os.path.dirname(os.path.abspath(sys.argv[0])) self_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
args = []
args.append(os.path.join(self_dir, 'gnome-shell')) args.append(os.path.join(self_dir, 'gnome-shell'))
# pass on any additional arguments
args += extra_args if options.replace:
args.append('--replace')
return subprocess.Popen(args, env=env) return subprocess.Popen(args, env=env)
def run_shell(args, perf_output=None): def run_shell(perf_output=None):
# we do no additional supervision of gnome-shell, # we do no additional supervision of gnome-shell,
# beyond that of wait # beyond that of wait
# in particular, we don't kill the shell upon # in particular, we don't kill the shell upon
# receving a KeyboardInterrupt, as we expect to be # receving a KeyboardInterrupt, as we expect to be
# in the same process group # in the same process group
shell = start_shell(extra_args, perf_output=perf_output) shell = start_shell(perf_output=perf_output)
shell.wait() shell.wait()
return shell.returncode == 0 return shell.returncode == 0
@ -173,7 +180,7 @@ def upload_performance_report(report_text):
print "Performance report upload failed with status %d" % response.status print "Performance report upload failed with status %d" % response.status
print response.read() print response.read()
def run_performance_test(args): def run_performance_test():
iters = options.perf_iters iters = options.perf_iters
if options.perf_warmup: if options.perf_warmup:
iters += 1 iters += 1
@ -192,7 +199,7 @@ def run_performance_test(args):
# Run the performance test and collect the output as JSON # Run the performance test and collect the output as JSON
normal_exit = False normal_exit = False
try: try:
normal_exit = run_shell(args, perf_output=output_file) normal_exit = run_shell(perf_output=output_file)
except: except:
stop_perf_helper() stop_perf_helper()
raise raise
@ -288,7 +295,8 @@ def run_performance_test(args):
parser = optparse.OptionParser() parser = optparse.OptionParser()
parser.add_option("", "--perf", metavar="PERF_MODULE", parser.add_option("", "--perf", metavar="PERF_MODULE",
help="Specify the name of a performance module to run") help="Specify the name of a performance module to run",
default="core")
parser.add_option("", "--perf-iters", type="int", metavar="ITERS", parser.add_option("", "--perf-iters", type="int", metavar="ITERS",
help="Numbers of iterations of performance module to run", help="Numbers of iterations of performance module to run",
default=1) default=1)
@ -301,9 +309,16 @@ parser.add_option("", "--perf-upload", action="store_true",
parser.add_option("", "--version", action="callback", callback=show_version, parser.add_option("", "--version", action="callback", callback=show_version,
help="Display version and exit") help="Display version and exit")
parser.add_option("-r", "--replace", action="store_true",
help="Replace the running window manager")
options, args = parser.parse_args() options, args = parser.parse_args()
normal_exit = run_performance_test(args) if args:
parser.print_usage()
sys.exit(1)
normal_exit = run_performance_test()
if normal_exit: if normal_exit:
sys.exit(0) sys.exit(0)
else: else:

View File

@ -72,6 +72,9 @@ static void gnome_shell_plugin_kill_switch_workspace (MetaPlugin *plugin);
static gboolean gnome_shell_plugin_xevent_filter (MetaPlugin *plugin, static gboolean gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
XEvent *event); XEvent *event);
static gboolean gnome_shell_plugin_keybinding_filter (MetaPlugin *plugin,
MetaKeyBinding *binding);
static const MetaPluginInfo *gnome_shell_plugin_plugin_info (MetaPlugin *plugin); static const MetaPluginInfo *gnome_shell_plugin_plugin_info (MetaPlugin *plugin);
@ -126,8 +129,9 @@ gnome_shell_plugin_class_init (GnomeShellPluginClass *klass)
plugin_class->kill_window_effects = gnome_shell_plugin_kill_window_effects; plugin_class->kill_window_effects = gnome_shell_plugin_kill_window_effects;
plugin_class->kill_switch_workspace = gnome_shell_plugin_kill_switch_workspace; plugin_class->kill_switch_workspace = gnome_shell_plugin_kill_switch_workspace;
plugin_class->xevent_filter = gnome_shell_plugin_xevent_filter; plugin_class->xevent_filter = gnome_shell_plugin_xevent_filter;
plugin_class->plugin_info = gnome_shell_plugin_plugin_info; plugin_class->keybinding_filter = gnome_shell_plugin_keybinding_filter;
plugin_class->plugin_info = gnome_shell_plugin_plugin_info;
} }
static void static void
@ -337,6 +341,13 @@ gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE; return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
} }
static gboolean
gnome_shell_plugin_keybinding_filter (MetaPlugin *plugin,
MetaKeyBinding *binding)
{
return _shell_wm_filter_keybinding (get_shell_wm (), binding);
}
static const static const
MetaPluginInfo *gnome_shell_plugin_plugin_info (MetaPlugin *plugin) MetaPluginInfo *gnome_shell_plugin_plugin_info (MetaPlugin *plugin)
{ {

View File

@ -38,7 +38,7 @@ extern GType gnome_shell_plugin_get_type (void);
#define OVERRIDES_SCHEMA "org.gnome.shell.overrides" #define OVERRIDES_SCHEMA "org.gnome.shell.overrides"
#define WM_NAME "GNOME Shell" #define WM_NAME "GNOME Shell"
#define GNOME_WM_KEYBINDINGS "Metacity,Mutter,GNOME Shell" #define GNOME_WM_KEYBINDINGS "Mutter,GNOME Shell"
static gboolean is_gdm_mode = FALSE; static gboolean is_gdm_mode = FALSE;
static char *session_mode = NULL; static char *session_mode = NULL;

View File

@ -73,6 +73,7 @@ struct _ShellApp
char *window_id_string; char *window_id_string;
char *casefolded_name; char *casefolded_name;
char *casefolded_generic_name;
char *name_collation_key; char *name_collation_key;
char *casefolded_exec; char *casefolded_exec;
char **casefolded_keywords; char **casefolded_keywords;
@ -1310,6 +1311,7 @@ static void
shell_app_init_search_data (ShellApp *app) shell_app_init_search_data (ShellApp *app)
{ {
const char *name; const char *name;
const char *generic_name;
const char *exec; const char *exec;
const char * const *keywords; const char * const *keywords;
char *normalized_exec; char *normalized_exec;
@ -1319,6 +1321,12 @@ shell_app_init_search_data (ShellApp *app)
name = g_app_info_get_name (G_APP_INFO (appinfo)); name = g_app_info_get_name (G_APP_INFO (appinfo));
app->casefolded_name = shell_util_normalize_and_casefold (name); app->casefolded_name = shell_util_normalize_and_casefold (name);
generic_name = g_desktop_app_info_get_generic_name (appinfo);
if (generic_name)
app->casefolded_generic_name = shell_util_normalize_and_casefold (generic_name);
else
app->casefolded_generic_name = NULL;
exec = g_app_info_get_executable (G_APP_INFO (appinfo)); exec = g_app_info_get_executable (G_APP_INFO (appinfo));
normalized_exec = shell_util_normalize_and_casefold (exec); normalized_exec = shell_util_normalize_and_casefold (exec);
app->casefolded_exec = trim_exec_line (normalized_exec); app->casefolded_exec = trim_exec_line (normalized_exec);
@ -1388,6 +1396,18 @@ _shell_app_match_search_terms (ShellApp *app,
current_match = MATCH_SUBSTRING; current_match = MATCH_SUBSTRING;
} }
if (app->casefolded_generic_name)
{
p = strstr (app->casefolded_generic_name, term);
if (p != NULL)
{
if (p == app->casefolded_generic_name || *(p - 1) == ' ')
current_match = MATCH_PREFIX;
else if (current_match < MATCH_PREFIX)
current_match = MATCH_SUBSTRING;
}
}
if (app->casefolded_exec) if (app->casefolded_exec)
{ {
p = strstr (app->casefolded_exec, term); p = strstr (app->casefolded_exec, term);
@ -1497,6 +1517,7 @@ shell_app_finalize (GObject *object)
g_free (app->window_id_string); g_free (app->window_id_string);
g_free (app->casefolded_name); g_free (app->casefolded_name);
g_free (app->casefolded_generic_name);
g_free (app->name_collation_key); g_free (app->name_collation_key);
g_free (app->casefolded_exec); g_free (app->casefolded_exec);
g_strfreev (app->casefolded_keywords); g_strfreev (app->casefolded_keywords);

View File

@ -1693,43 +1693,3 @@ shell_global_get_session_mode (ShellGlobal *global)
return global->session_mode; return global->session_mode;
} }
/**
* shell_global_create_xrootpmap_texture:
* @global: The #ShellGlobal
*
* This returns the _XROOTPMAP_ID pixmap that gdm should have stuffed
* in the root window. The goal here is to allow a smooth fade between
* plymouth and the shell greeter. This is also a workaround for gjs not
* supporting raw xlib types.
*
* Returns: (transfer floating): A #ClutterActor that represents the
* _XROOTPMAP_ID pixmap property from the root window.
*/
ClutterActor *
shell_global_create_xrootpmap_texture (ShellGlobal *global)
{
Atom res_type;
int res_format;
unsigned long res_nitems, bytesafter;
unsigned char *data;
Pixmap root_pixmap_id = None;
g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL);
if (XGetWindowProperty (global->xdisplay,
DefaultRootWindow (global->xdisplay),
XInternAtom (global->xdisplay, "_XROOTPMAP_ID", False),
0, G_MAXLONG, False, XA_PIXMAP,
&res_type, &res_format, &res_nitems, &bytesafter, &data) == Success)
{
if (res_type == XA_PIXMAP && res_format == 32 && res_nitems == 1)
root_pixmap_id = * (Pixmap *) data;
XFree (data);
}
if (root_pixmap_id != None)
return clutter_x11_texture_pixmap_new_with_pixmap (root_pixmap_id);
else
return NULL;
}

View File

@ -136,8 +136,6 @@ void shell_global_reexec_self (ShellGlobal *global);
const char * shell_global_get_session_mode (ShellGlobal *global); const char * shell_global_get_session_mode (ShellGlobal *global);
ClutterActor * shell_global_create_xrootpmap_texture (ShellGlobal *global);
G_END_DECLS G_END_DECLS
#endif /* __SHELL_GLOBAL_H__ */ #endif /* __SHELL_GLOBAL_H__ */

View File

@ -37,10 +37,11 @@
#define ISO_3166_COUNTRY_CODES DATADIR "/zoneinfo/iso3166.tab" #define ISO_3166_COUNTRY_CODES DATADIR "/zoneinfo/iso3166.tab"
static ShellCountryMobileProvider *country_mobile_provider_new (const char *country_code,
const gchar *country_name);
static GHashTable * static GHashTable *
read_country_codes (void) read_country_codes (const gchar *country_codes)
{ {
GHashTable *table; GHashTable *table;
GIOChannel *channel; GIOChannel *channel;
@ -48,18 +49,21 @@ read_country_codes (void)
GError *error = NULL; GError *error = NULL;
GIOStatus status; GIOStatus status;
channel = g_io_channel_new_file (ISO_3166_COUNTRY_CODES, "r", &error); channel = g_io_channel_new_file (country_codes, "r", &error);
if (!channel) { if (!channel) {
if (error) { if (error) {
g_warning ("Could not read " ISO_3166_COUNTRY_CODES ": %s", error->message); g_warning ("Could not read %s: %s", country_codes, error->message);
g_error_free (error); g_error_free (error);
} else } else
g_warning ("Could not read " ISO_3166_COUNTRY_CODES ": Unknown error"); g_warning ("Could not read %s: Unknown error", country_codes);
return NULL; return NULL;
} }
table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); table = g_hash_table_new_full (g_str_hash,
g_str_equal,
g_free,
(GDestroyNotify)shell_country_mobile_provider_unref);
buffer = g_string_sized_new (32); buffer = g_string_sized_new (32);
status = G_IO_STATUS_NORMAL; status = G_IO_STATUS_NORMAL;
@ -69,6 +73,7 @@ read_country_codes (void)
switch (status) { switch (status) {
case G_IO_STATUS_NORMAL: case G_IO_STATUS_NORMAL:
if (buffer->str[0] != '#') { if (buffer->str[0] != '#') {
ShellCountryMobileProvider *country_provider;
char **pieces; char **pieces;
pieces = g_strsplit (buffer->str, "\t", 2); pieces = g_strsplit (buffer->str, "\t", 2);
@ -80,7 +85,8 @@ read_country_codes (void)
pieces[1] = g_strdup (_("United Kingdom")); pieces[1] = g_strdup (_("United Kingdom"));
} }
g_hash_table_insert (table, pieces[0], pieces[1]); country_provider = country_mobile_provider_new (pieces[0], pieces[1]);
g_hash_table_insert (table, pieces[0], country_provider);
g_free (pieces); g_free (pieces);
} }
@ -117,7 +123,6 @@ typedef enum {
} MobileContextState; } MobileContextState;
typedef struct { typedef struct {
GHashTable *country_codes;
GHashTable *table; GHashTable *table;
char *current_country; char *current_country;
@ -276,6 +281,86 @@ shell_mobile_provider_get_type (void)
return type; return type;
} }
static ShellCountryMobileProvider *
country_mobile_provider_new (const char *country_code,
const gchar *country_name)
{
ShellCountryMobileProvider *country_provider;
country_provider = g_slice_new0 (ShellCountryMobileProvider);
country_provider->refs = 1;
country_provider->country_code = g_strdup (country_code);
country_provider->country_name = g_strdup (country_name);
return country_provider;
}
ShellCountryMobileProvider *
shell_country_mobile_provider_ref (ShellCountryMobileProvider *country_provider)
{
country_provider->refs++;
return country_provider;
}
void
shell_country_mobile_provider_unref (ShellCountryMobileProvider *country_provider)
{
if (--country_provider->refs == 0) {
g_free (country_provider->country_code);
g_free (country_provider->country_name);
g_slist_free_full (country_provider->providers,
(GDestroyNotify) shell_mobile_provider_unref);
g_slice_free (ShellCountryMobileProvider, country_provider);
}
}
/**
* shell_country_mobile_provider_get_country_code:
*
* Returns: (transfer none): the code of the country.
*/
const gchar *
shell_country_mobile_provider_get_country_code (ShellCountryMobileProvider *country_provider)
{
return country_provider->country_code;
}
/**
* shell_country_mobile_provider_get_country_name:
*
* Returns: (transfer none): the name of the country.
*/
const gchar *
shell_country_mobile_provider_get_country_name (ShellCountryMobileProvider *country_provider)
{
return country_provider->country_name;
}
/**
* shell_country_mobile_provider_get_providers:
*
* Returns: (element-type Shell.MobileProvider) (transfer none): the
* list of #ShellMobileProvider this country exposes.
*/
GSList *
shell_country_mobile_provider_get_providers (ShellCountryMobileProvider *country_provider)
{
return country_provider->providers;
}
GType
shell_country_mobile_provider_get_type (void)
{
static GType type = 0;
if (G_UNLIKELY (type == 0)) {
type = g_boxed_type_register_static ("ShellCountryMobileProvider",
(GBoxedCopyFunc) shell_country_mobile_provider_ref,
(GBoxedFreeFunc) shell_country_mobile_provider_unref);
}
return type;
}
static void static void
provider_list_free (gpointer data) provider_list_free (gpointer data)
{ {
@ -310,15 +395,17 @@ parser_toplevel_start (MobileParser *parser,
for (i = 0; attribute_names && attribute_names[i]; i++) { for (i = 0; attribute_names && attribute_names[i]; i++) {
if (!strcmp (attribute_names[i], "code")) { if (!strcmp (attribute_names[i], "code")) {
char *country_code; char *country_code;
char *country; ShellCountryMobileProvider *country_provider;
country_code = g_ascii_strup (attribute_values[i], -1); country_code = g_ascii_strup (attribute_values[i], -1);
country = g_hash_table_lookup (parser->country_codes, country_code); country_provider = g_hash_table_lookup (parser->table, country_code);
if (country) { /* Ensure we have a country provider for this country code */
parser->current_country = g_strdup (country); if (!country_provider) {
g_free (country_code); g_warning ("%s: adding providers for unknown country '%s'", __func__, country_code);
} else country_provider = country_mobile_provider_new (country_code, NULL);
parser->current_country = country_code; g_hash_table_insert (parser->table, country_code, country_provider);
}
parser->current_country = country_code;
parser->state = PARSER_COUNTRY; parser->state = PARSER_COUNTRY;
break; break;
@ -455,7 +542,13 @@ parser_country_end (MobileParser *parser,
const char *name) const char *name)
{ {
if (!strcmp (name, "country")) { if (!strcmp (name, "country")) {
g_hash_table_insert (parser->table, parser->current_country, parser->current_providers); ShellCountryMobileProvider *country_provider;
country_provider = g_hash_table_lookup (parser->table, parser->current_country);
if (country_provider)
/* Store providers for this country */
country_provider->providers = parser->current_providers;
parser->current_country = NULL; parser->current_country = NULL;
parser->current_providers = NULL; parser->current_providers = NULL;
parser->text_buffer = NULL; parser->text_buffer = NULL;
@ -616,15 +709,16 @@ static const GMarkupParser mobile_parser = {
/** /**
* shell_mobile_providers_parse: * shell_mobile_providers_parse:
* @out_ccs: (out) (allow-none): (element-type utf8 utf8): a #GHashTable containing * @country_codes: (allow-none) File with the list of country codes.
* country codes * @service_providers: (allow-none) File with the list of service providers.
* *
* Returns: (element-type utf8 GList) (transfer container): a * Returns: (element-type utf8 Shell.CountryMobileProvider) (transfer full): a
* hash table where keys are country names #gchar, values are a #GSList * hash table where keys are country names #gchar and values are #ShellCountryMobileProvider.
* of #ShellMobileProvider. Everything is destroyed with g_hash_table_destroy(). * Everything is destroyed with g_hash_table_destroy().
*/ */
GHashTable * GHashTable *
shell_mobile_providers_parse (GHashTable **out_ccs) shell_mobile_providers_parse (const gchar *country_codes,
const gchar *service_providers)
{ {
GMarkupParseContext *ctx; GMarkupParseContext *ctx;
GIOChannel *channel; GIOChannel *channel;
@ -634,24 +728,29 @@ shell_mobile_providers_parse (GHashTable **out_ccs)
GIOStatus status; GIOStatus status;
gsize len = 0; gsize len = 0;
/* Use default paths if none given */
if (!country_codes)
country_codes = ISO_3166_COUNTRY_CODES;
if (!service_providers)
service_providers = MOBILE_BROADBAND_PROVIDER_INFO;
memset (&parser, 0, sizeof (MobileParser)); memset (&parser, 0, sizeof (MobileParser));
parser.country_codes = read_country_codes (); parser.table = read_country_codes (country_codes);
if (!parser.country_codes) if (!parser.table)
goto out; goto out;
channel = g_io_channel_new_file (MOBILE_BROADBAND_PROVIDER_INFO, "r", &error); channel = g_io_channel_new_file (service_providers, "r", &error);
if (!channel) { if (!channel) {
if (error) { if (error) {
g_warning ("Could not read " MOBILE_BROADBAND_PROVIDER_INFO ": %s", error->message); g_warning ("Could not read %s: %s", service_providers, error->message);
g_error_free (error); g_error_free (error);
} else } else
g_warning ("Could not read " MOBILE_BROADBAND_PROVIDER_INFO ": Unknown error"); g_warning ("Could not read %s: Unknown error", service_providers);
goto out; goto out;
} }
parser.table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, provider_list_free);
parser.state = PARSER_TOPLEVEL; parser.state = PARSER_TOPLEVEL;
ctx = g_markup_parse_context_new (&mobile_parser, 0, &parser, NULL); ctx = g_markup_parse_context_new (&mobile_parser, 0, &parser, NULL);
@ -696,13 +795,7 @@ shell_mobile_providers_parse (GHashTable **out_ccs)
g_free (parser.current_country); g_free (parser.current_country);
g_free (parser.text_buffer); g_free (parser.text_buffer);
out: out:
if (parser.country_codes) {
if (out_ccs)
*out_ccs = parser.country_codes;
else
g_hash_table_destroy (parser.country_codes);
}
return parser.table; return parser.table;
} }
@ -744,12 +837,17 @@ dump_gsm (ShellMobileAccessMethod *method)
static void static void
dump_country (gpointer key, gpointer value, gpointer user_data) dump_country (gpointer key, gpointer value, gpointer user_data)
{ {
GSList *citer, *miter; GSList *miter, *citer;
ShellCountryMobileProvider *country_provider = value;
for (citer = value; citer; citer = g_slist_next (citer)) { g_print ("Country: %s (%s)\n",
country_provider->country_code,
country_provider->country_name);
for (citer = country_provider->providers; citer; citer = g_slist_next (citer)) {
ShellMobileProvider *provider = citer->data; ShellMobileProvider *provider = citer->data;
g_print ("Provider: %s (%s)\n", provider->name, (const char *) key); g_print (" Provider: %s (%s)\n", provider->name, (const char *) key);
for (miter = provider->methods; miter; miter = g_slist_next (miter)) { for (miter = provider->methods; miter; miter = g_slist_next (miter)) {
ShellMobileAccessMethod *method = miter->data; ShellMobileAccessMethod *method = miter->data;
GSList *liter; GSList *liter;
@ -779,10 +877,10 @@ dump_country (gpointer key, gpointer value, gpointer user_data)
} }
void void
shell_mobile_providers_dump (GHashTable *providers) shell_mobile_providers_dump (GHashTable *country_providers)
{ {
g_return_if_fail (providers != NULL); g_return_if_fail (country_providers != NULL);
g_hash_table_foreach (providers, dump_country, NULL); g_hash_table_foreach (country_providers, dump_country, NULL);
} }
/* All the following don't exist in nm-applet, because C doesn't need /* All the following don't exist in nm-applet, because C doesn't need

View File

@ -76,10 +76,19 @@ typedef struct {
gint refs; gint refs;
} ShellMobileProvider; } ShellMobileProvider;
typedef struct {
char *country_code;
char *country_name;
GSList *providers;
gint refs;
} ShellCountryMobileProvider;
GType shell_gsm_mcc_mnc_get_type (void); /* added in porting */ GType shell_gsm_mcc_mnc_get_type (void); /* added in porting */
GType shell_mobile_provider_get_type (void);
GType shell_mobile_access_method_get_type (void); GType shell_mobile_access_method_get_type (void);
GType shell_mobile_provider_get_type (void);
GType shell_country_mobile_provider_get_type (void);
ShellMobileProvider *shell_mobile_provider_ref (ShellMobileProvider *provider); ShellMobileProvider *shell_mobile_provider_ref (ShellMobileProvider *provider);
void shell_mobile_provider_unref (ShellMobileProvider *provider); void shell_mobile_provider_unref (ShellMobileProvider *provider);
@ -89,8 +98,14 @@ GSList * shell_mobile_provider_get_cdma_sid (ShellMobileProvider *pr
ShellMobileAccessMethod *shell_mobile_access_method_ref (ShellMobileAccessMethod *method); ShellMobileAccessMethod *shell_mobile_access_method_ref (ShellMobileAccessMethod *method);
void shell_mobile_access_method_unref (ShellMobileAccessMethod *method); void shell_mobile_access_method_unref (ShellMobileAccessMethod *method);
GHashTable *shell_mobile_providers_parse (GHashTable **out_ccs); ShellCountryMobileProvider *shell_country_mobile_provider_ref (ShellCountryMobileProvider *country_provider);
void shell_country_mobile_provider_unref (ShellCountryMobileProvider *country_provider);
const gchar *shell_country_mobile_provider_get_country_code (ShellCountryMobileProvider *country_provider);
const gchar *shell_country_mobile_provider_get_country_name (ShellCountryMobileProvider *country_provider);
GSList *shell_country_mobile_provider_get_providers (ShellCountryMobileProvider *country_provider);
void shell_mobile_providers_dump (GHashTable *providers); GHashTable *shell_mobile_providers_parse (const gchar *country_codes,
const gchar *service_providers);
void shell_mobile_providers_dump (GHashTable *country_providers);
#endif /* SHELL_MOBILE_PROVIDERS_H */ #endif /* SHELL_MOBILE_PROVIDERS_H */

View File

@ -14,6 +14,9 @@ struct _ShellRecorderSrc
GMutex mutex_data; GMutex mutex_data;
GMutex *mutex; GMutex *mutex;
GstClock *clock;
GstClockTime last_frame_time;
GstCaps *caps; GstCaps *caps;
GAsyncQueue *queue; GAsyncQueue *queue;
gboolean closed; gboolean closed;
@ -41,6 +44,10 @@ static void
shell_recorder_src_init (ShellRecorderSrc *src) shell_recorder_src_init (ShellRecorderSrc *src)
{ {
gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME); gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME);
gst_base_src_set_live (GST_BASE_SRC (src), TRUE);
src->clock = gst_system_clock_obtain ();
src->last_frame_time = 0;
src->queue = g_async_queue_new (); src->queue = g_async_queue_new ();
src->mutex = &src->mutex_data; src->mutex = &src->mutex_data;
@ -89,6 +96,10 @@ shell_recorder_src_create (GstPushSrc *push_src,
return GST_FLOW_EOS; return GST_FLOW_EOS;
buffer = g_async_queue_pop (src->queue); buffer = g_async_queue_pop (src->queue);
if (src->last_frame_time == 0)
src->last_frame_time = gst_clock_get_time (GST_CLOCK (src->clock));
if (buffer == RECORDER_QUEUE_END) if (buffer == RECORDER_QUEUE_END)
{ {
/* Returning UNEXPECTED here will cause a EOS message to be sent */ /* Returning UNEXPECTED here will cause a EOS message to be sent */
@ -100,6 +111,9 @@ shell_recorder_src_create (GstPushSrc *push_src,
- (int)(gst_buffer_get_size(buffer) / 1024)); - (int)(gst_buffer_get_size(buffer) / 1024));
*buffer_out = buffer; *buffer_out = buffer;
GST_BUFFER_DURATION(*buffer_out) = GST_CLOCK_DIFF (src->last_frame_time, gst_clock_get_time (GST_CLOCK (src->clock)));
src->last_frame_time = gst_clock_get_time (GST_CLOCK (src->clock));
return GST_FLOW_OK; return GST_FLOW_OK;
} }
@ -141,6 +155,8 @@ shell_recorder_src_finalize (GObject *object)
g_mutex_clear (src->mutex); g_mutex_clear (src->mutex);
gst_object_unref (src->clock);
G_OBJECT_CLASS (shell_recorder_src_parent_class)->finalize (object); G_OBJECT_CLASS (shell_recorder_src_parent_class)->finalize (object);
} }

View File

@ -11,9 +11,11 @@
#define GST_USE_UNSTABLE_API #define GST_USE_UNSTABLE_API
#include <gst/gst.h> #include <gst/gst.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include "shell-recorder-src.h" #include "shell-recorder-src.h"
#include "shell-recorder.h" #include "shell-recorder.h"
#include "shell-screen-grabber.h"
#include <clutter/x11/clutter-x11.h> #include <clutter/x11/clutter-x11.h>
#include <X11/extensions/Xfixes.h> #include <X11/extensions/Xfixes.h>
@ -46,7 +48,7 @@ struct _ShellRecorder {
int stage_width; int stage_width;
int stage_height; int stage_height;
ShellScreenGrabber *grabber; GdkScreen *gdk_screen;
gboolean have_pointer; gboolean have_pointer;
int pointer_x; int pointer_x;
@ -65,7 +67,7 @@ struct _ShellRecorder {
int framerate; int framerate;
char *pipeline_description; char *pipeline_description;
char *filename; char *file_template;
/* We might have multiple pipelines that are finishing encoding /* We might have multiple pipelines that are finishing encoding
* to go along with the current pipeline where we are recording. * to go along with the current pipeline where we are recording.
@ -90,6 +92,7 @@ struct _RecorderPipeline
GstElement *pipeline; GstElement *pipeline;
GstElement *src; GstElement *src;
int outfile; int outfile;
char *filename;
}; };
static void recorder_set_stage (ShellRecorder *recorder, static void recorder_set_stage (ShellRecorder *recorder,
@ -98,8 +101,8 @@ static void recorder_set_framerate (ShellRecorder *recorder,
int framerate); int framerate);
static void recorder_set_pipeline (ShellRecorder *recorder, static void recorder_set_pipeline (ShellRecorder *recorder,
const char *pipeline); const char *pipeline);
static void recorder_set_filename (ShellRecorder *recorder, static void recorder_set_file_template (ShellRecorder *recorder,
const char *filename); const char *file_template);
static void recorder_pipeline_set_caps (RecorderPipeline *pipeline); static void recorder_pipeline_set_caps (RecorderPipeline *pipeline);
static void recorder_pipeline_closed (RecorderPipeline *pipeline); static void recorder_pipeline_closed (RecorderPipeline *pipeline);
@ -109,7 +112,7 @@ enum {
PROP_STAGE, PROP_STAGE,
PROP_FRAMERATE, PROP_FRAMERATE,
PROP_PIPELINE, PROP_PIPELINE,
PROP_FILENAME PROP_FILE_TEMPLATE
}; };
G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT); G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT);
@ -256,11 +259,11 @@ shell_recorder_init (ShellRecorder *recorder)
shell_recorder_src_register (); shell_recorder_src_register ();
recorder->gdk_screen = gdk_screen_get_default ();
recorder->recording_icon = create_recording_icon (); recorder->recording_icon = create_recording_icon ();
recorder->memory_target = get_memory_target(); recorder->memory_target = get_memory_target();
recorder->grabber = shell_screen_grabber_new ();
recorder->state = RECORDER_STATE_CLOSED; recorder->state = RECORDER_STATE_CLOSED;
recorder->framerate = DEFAULT_FRAMES_PER_SECOND; recorder->framerate = DEFAULT_FRAMES_PER_SECOND;
} }
@ -269,18 +272,6 @@ static void
shell_recorder_finalize (GObject *object) shell_recorder_finalize (GObject *object)
{ {
ShellRecorder *recorder = SHELL_RECORDER (object); ShellRecorder *recorder = SHELL_RECORDER (object);
GSList *l;
for (l = recorder->pipelines; l; l = l->next)
{
RecorderPipeline *pipeline = l->data;
/* Remove the back-reference. The pipeline will be freed
* when it finishes. (Or when the process exits, but that's
* out of our control.)
*/
pipeline->recorder = NULL;
}
if (recorder->update_memory_used_timeout) if (recorder->update_memory_used_timeout)
g_source_remove (recorder->update_memory_used_timeout); g_source_remove (recorder->update_memory_used_timeout);
@ -290,9 +281,7 @@ shell_recorder_finalize (GObject *object)
recorder_set_stage (recorder, NULL); recorder_set_stage (recorder, NULL);
recorder_set_pipeline (recorder, NULL); recorder_set_pipeline (recorder, NULL);
recorder_set_filename (recorder, NULL); recorder_set_file_template (recorder, NULL);
g_object_unref (recorder->grabber);
cogl_handle_unref (recorder->recording_icon); cogl_handle_unref (recorder->recording_icon);
@ -471,6 +460,12 @@ static void
recorder_draw_buffer_meter (ShellRecorder *recorder) recorder_draw_buffer_meter (ShellRecorder *recorder)
{ {
int fill_level; int fill_level;
GdkRectangle primary_monitor;
float rects[16];
gdk_screen_get_monitor_geometry (recorder->gdk_screen,
gdk_screen_get_primary_monitor (recorder->gdk_screen),
&primary_monitor);
recorder_update_memory_used (recorder, FALSE); recorder_update_memory_used (recorder, FALSE);
@ -485,14 +480,27 @@ recorder_draw_buffer_meter (ShellRecorder *recorder)
fill_level = MIN (60, (recorder->memory_used * 60) / recorder->memory_target); fill_level = MIN (60, (recorder->memory_used * 60) / recorder->memory_target);
/* A hollow rectangle filled from the left to fill_level */ /* A hollow rectangle filled from the left to fill_level */
cogl_rectangle (recorder->stage_width - 64, recorder->stage_height - 10, rects[0] = primary_monitor.x + primary_monitor.width - 64;
recorder->stage_width - 2, recorder->stage_height - 9); rects[1] = primary_monitor.y + primary_monitor.height - 10;
cogl_rectangle (recorder->stage_width - 64, recorder->stage_height - 9, rects[2] = primary_monitor.x + primary_monitor.width - 2;
recorder->stage_width - (63 - fill_level), recorder->stage_height - 3); rects[3] = primary_monitor.y + primary_monitor.height - 9;
cogl_rectangle (recorder->stage_width - 3, recorder->stage_height - 9,
recorder->stage_width - 2, recorder->stage_height - 3); rects[4] = primary_monitor.x + primary_monitor.width - 64;
cogl_rectangle (recorder->stage_width - 64, recorder->stage_height - 3, rects[5] = primary_monitor.y + primary_monitor.height - 9;
recorder->stage_width - 2, recorder->stage_height - 2); rects[6] = primary_monitor.x + primary_monitor.width - (63 - fill_level);
rects[7] = primary_monitor.y + primary_monitor.height - 3;
rects[8] = primary_monitor.x + primary_monitor.width - 3;
rects[9] = primary_monitor.y + primary_monitor.height - 9;
rects[10] = primary_monitor.x + primary_monitor.width - 2;
rects[11] = primary_monitor.y + primary_monitor.height - 3;
rects[12] = primary_monitor.x + primary_monitor.width - 64;
rects[13] = primary_monitor.y + primary_monitor.height - 3;
rects[14] = primary_monitor.x + primary_monitor.width - 2;
rects[15] = primary_monitor.y + primary_monitor.height - 2;
cogl_rectangles (rects, 4);
} }
/* We want to time-stamp each frame based on the actual time it was /* We want to time-stamp each frame based on the actual time it was
@ -542,8 +550,13 @@ recorder_record_frame (ShellRecorder *recorder)
size = recorder->stage_width * recorder->stage_height * 4; size = recorder->stage_width * recorder->stage_height * 4;
data = shell_screen_grabber_grab (recorder->grabber, data = g_malloc (recorder->stage_width * 4 * recorder->stage_height);
0, 0, recorder->stage_width, recorder->stage_height); cogl_read_pixels (0, 0, /* x/y */
recorder->stage_width,
recorder->stage_height,
COGL_READ_PIXELS_COLOR_BUFFER,
CLUTTER_CAIRO_FORMAT_ARGB32,
data);
buffer = gst_buffer_new(); buffer = gst_buffer_new();
gst_buffer_insert_memory (buffer, -1, gst_buffer_insert_memory (buffer, -1,
@ -571,12 +584,17 @@ recorder_on_stage_paint (ClutterActor *actor,
{ {
if (recorder->state == RECORDER_STATE_RECORDING) if (recorder->state == RECORDER_STATE_RECORDING)
{ {
GdkRectangle primary_monitor;
gdk_screen_get_monitor_geometry (recorder->gdk_screen,
gdk_screen_get_primary_monitor (recorder->gdk_screen),
&primary_monitor);
if (!recorder->only_paint) if (!recorder->only_paint)
recorder_record_frame (recorder); recorder_record_frame (recorder);
cogl_set_source_texture (recorder->recording_icon); cogl_set_source_texture (recorder->recording_icon);
cogl_rectangle (recorder->stage_width - 32, recorder->stage_height - 42, cogl_rectangle (primary_monitor.x + primary_monitor.width - 32, primary_monitor.y + primary_monitor.height - 42,
recorder->stage_width, recorder->stage_height - 10); primary_monitor.x + primary_monitor.width, primary_monitor.y + primary_monitor.height - 10);
} }
if (recorder->state == RECORDER_STATE_RECORDING || recorder->memory_used != 0) if (recorder->state == RECORDER_STATE_RECORDING || recorder->memory_used != 0)
@ -917,22 +935,22 @@ recorder_set_pipeline (ShellRecorder *recorder,
} }
static void static void
recorder_set_filename (ShellRecorder *recorder, recorder_set_file_template (ShellRecorder *recorder,
const char *filename) const char *file_template)
{ {
if (filename == recorder->filename || if (file_template == recorder->file_template ||
(filename && recorder->filename && strcmp (recorder->filename, filename) == 0)) (file_template && recorder->file_template && strcmp (recorder->file_template, file_template) == 0))
return; return;
if (recorder->current_pipeline) if (recorder->current_pipeline)
shell_recorder_close (recorder); shell_recorder_close (recorder);
if (recorder->filename) if (recorder->file_template)
g_free (recorder->filename); g_free (recorder->file_template);
recorder->filename = g_strdup (filename); recorder->file_template = g_strdup (file_template);
g_object_notify (G_OBJECT (recorder), "filename"); g_object_notify (G_OBJECT (recorder), "file-template");
} }
static void static void
@ -954,8 +972,8 @@ shell_recorder_set_property (GObject *object,
case PROP_PIPELINE: case PROP_PIPELINE:
recorder_set_pipeline (recorder, g_value_get_string (value)); recorder_set_pipeline (recorder, g_value_get_string (value));
break; break;
case PROP_FILENAME: case PROP_FILE_TEMPLATE:
recorder_set_filename (recorder, g_value_get_string (value)); recorder_set_file_template (recorder, g_value_get_string (value));
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -982,8 +1000,8 @@ shell_recorder_get_property (GObject *object,
case PROP_PIPELINE: case PROP_PIPELINE:
g_value_set_string (value, recorder->pipeline_description); g_value_set_string (value, recorder->pipeline_description);
break; break;
case PROP_FILENAME: case PROP_FILE_TEMPLATE:
g_value_set_string (value, recorder->filename); g_value_set_string (value, recorder->file_template);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -1027,9 +1045,9 @@ shell_recorder_class_init (ShellRecorderClass *klass)
G_PARAM_READWRITE)); G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_FILENAME, PROP_FILE_TEMPLATE,
g_param_spec_string ("filename", g_param_spec_string ("file-template",
"Filename", "File Template",
"The filename template to use for output files", "The filename template to use for output files",
NULL, NULL,
G_PARAM_READWRITE)); G_PARAM_READWRITE));
@ -1149,13 +1167,14 @@ get_absolute_path (char *maybe_relative)
* be opened. * be opened.
*/ */
static int static int
recorder_open_outfile (ShellRecorder *recorder) recorder_open_outfile (ShellRecorder *recorder,
char **outfilename)
{ {
const char *pattern; const char *pattern;
int flags; int flags;
int outfile = -1; int outfile = -1;
pattern = recorder->filename; pattern = recorder->file_template;
if (!pattern) if (!pattern)
return -1; return -1;
@ -1230,8 +1249,12 @@ recorder_open_outfile (ShellRecorder *recorder)
{ {
g_printerr ("Recording to %s\n", path); g_printerr ("Recording to %s\n", path);
if (outfilename != NULL)
*outfilename = path;
else
g_free (path);
g_string_free (filename, TRUE); g_string_free (filename, TRUE);
g_free (path);
goto out; goto out;
} }
@ -1269,7 +1292,8 @@ recorder_pipeline_add_sink (RecorderPipeline *pipeline)
return TRUE; return TRUE;
} }
pipeline->outfile = recorder_open_outfile (pipeline->recorder); pipeline->outfile = recorder_open_outfile (pipeline->recorder,
&pipeline->filename);
if (pipeline->outfile == -1) if (pipeline->outfile == -1)
goto out; goto out;
@ -1344,6 +1368,10 @@ recorder_pipeline_free (RecorderPipeline *pipeline)
if (pipeline->outfile != -1) if (pipeline->outfile != -1)
close (pipeline->outfile); close (pipeline->outfile);
g_free (pipeline->filename);
g_clear_object (&pipeline->recorder);
g_free (pipeline); g_free (pipeline);
} }
@ -1393,6 +1421,10 @@ recorder_pipeline_closed (RecorderPipeline *pipeline)
if (pipeline->recorder) if (pipeline->recorder)
{ {
GtkRecentManager *recent_manager;
GFile *file;
char *uri;
ShellRecorder *recorder = pipeline->recorder; ShellRecorder *recorder = pipeline->recorder;
if (pipeline == recorder->current_pipeline) if (pipeline == recorder->current_pipeline)
{ {
@ -1401,6 +1433,15 @@ recorder_pipeline_closed (RecorderPipeline *pipeline)
shell_recorder_close (recorder); shell_recorder_close (recorder);
} }
recent_manager = gtk_recent_manager_get_default ();
file = g_file_new_for_path (pipeline->filename);
uri = g_file_get_uri (file);
gtk_recent_manager_add_item (recent_manager,
uri);
g_free (uri);
g_object_unref (file);
recorder->pipelines = g_slist_remove (recorder->pipelines, pipeline); recorder->pipelines = g_slist_remove (recorder->pipelines, pipeline);
} }
@ -1452,7 +1493,7 @@ recorder_open_pipeline (ShellRecorder *recorder)
GstBus *bus; GstBus *bus;
pipeline = g_new0(RecorderPipeline, 1); pipeline = g_new0(RecorderPipeline, 1);
pipeline->recorder = recorder; pipeline->recorder = g_object_ref (recorder);
pipeline->outfile = - 1; pipeline->outfile = - 1;
pipeline_description = recorder->pipeline_description; pipeline_description = recorder->pipeline_description;
@ -1555,10 +1596,10 @@ shell_recorder_set_framerate (ShellRecorder *recorder,
} }
/** /**
* shell_recorder_set_filename: * shell_recorder_set_file_template:
* @recorder: the #ShellRecorder * @recorder: the #ShellRecorder
* @filename: the filename template to use for output files, * @file_template: the filename template to use for output files,
* or %NULL for the defalt value. * or %NULL for the defalt value.
* *
* Sets the filename that will be used when creating output * Sets the filename that will be used when creating output
* files. This is only used if the configured pipeline has an * files. This is only used if the configured pipeline has an
@ -1573,12 +1614,12 @@ shell_recorder_set_framerate (ShellRecorder *recorder,
* The default value is 'shell-%d%u-%c.ogg'. * The default value is 'shell-%d%u-%c.ogg'.
*/ */
void void
shell_recorder_set_filename (ShellRecorder *recorder, shell_recorder_set_file_template (ShellRecorder *recorder,
const char *filename) const char *file_template)
{ {
g_return_if_fail (SHELL_IS_RECORDER (recorder)); g_return_if_fail (SHELL_IS_RECORDER (recorder));
recorder_set_filename (recorder, filename); recorder_set_file_template (recorder, file_template);
} }
@ -1593,7 +1634,7 @@ shell_recorder_set_filename (ShellRecorder *recorder,
* should have an unconnected sink pad where the recorded * should have an unconnected sink pad where the recorded
* video is recorded. It will normally have a unconnected * video is recorded. It will normally have a unconnected
* source pad; output from that pad will be written into the * source pad; output from that pad will be written into the
* output file. (See shell_recorder_set_filename().) However * output file. (See shell_recorder_set_file_template().) However
* the pipeline can also take care of its own output - this * the pipeline can also take care of its own output - this
* might be used to send the output to an icecast server * might be used to send the output to an icecast server
* via shout2send or similar. * via shout2send or similar.
@ -1689,9 +1730,6 @@ shell_recorder_close (ShellRecorder *recorder)
recorder->repaint_hook_id = 0; recorder->repaint_hook_id = 0;
} }
recorder_remove_redraw_timeout (recorder);
recorder_close_pipeline (recorder);
recorder->state = RECORDER_STATE_CLOSED; recorder->state = RECORDER_STATE_CLOSED;
/* Release the refcount we took when we started recording */ /* Release the refcount we took when we started recording */

View File

@ -32,8 +32,8 @@ ShellRecorder *shell_recorder_new (ClutterStage *stage);
void shell_recorder_set_framerate (ShellRecorder *recorder, void shell_recorder_set_framerate (ShellRecorder *recorder,
int framerate); int framerate);
void shell_recorder_set_filename (ShellRecorder *recorder, void shell_recorder_set_file_template (ShellRecorder *recorder,
const char *filename); const char *file_template);
void shell_recorder_set_pipeline (ShellRecorder *recorder, void shell_recorder_set_pipeline (ShellRecorder *recorder,
const char *pipeline); const char *pipeline);
gboolean shell_recorder_record (ShellRecorder *recorder); gboolean shell_recorder_record (ShellRecorder *recorder);

View File

@ -1,210 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#include <string.h>
#include <clutter/clutter.h>
#include <cogl/cogl.h>
#include <GL/gl.h>
#include <GL/glx.h>
#include <GL/glext.h>
#include "shell-screen-grabber.h"
PFNGLBINDBUFFERARBPROC pf_glBindBufferARB;
PFNGLBUFFERDATAARBPROC pf_glBufferDataARB;
PFNGLDELETEBUFFERSARBPROC pf_glDeleteBuffersARB;
PFNGLGENBUFFERSARBPROC pf_glGenBuffersARB;
PFNGLMAPBUFFERARBPROC pf_glMapBufferARB;
PFNGLUNMAPBUFFERARBPROC pf_glUnmapBufferARB;
struct _ShellScreenGrabberClass
{
GObjectClass parent_class;
};
struct _ShellScreenGrabber
{
GObject parent_instance;
int have_pixel_buffers;
int have_pack_invert;
int width, height;
GLuint pixel_buffer;
};
G_DEFINE_TYPE(ShellScreenGrabber, shell_screen_grabber, G_TYPE_OBJECT);
static void
shell_screen_grabber_finalize (GObject *gobject)
{
ShellScreenGrabber *grabber = SHELL_SCREEN_GRABBER (gobject);
if (grabber->pixel_buffer != 0)
pf_glDeleteBuffersARB (1, &grabber->pixel_buffer);
}
static void
shell_screen_grabber_class_init (ShellScreenGrabberClass *grabber_class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (grabber_class);
gobject_class->finalize = shell_screen_grabber_finalize;
}
static void
shell_screen_grabber_init (ShellScreenGrabber *grabber)
{
grabber->have_pixel_buffers = -1;
grabber->width = -1;
grabber->height= -1;
grabber->pixel_buffer = 0;
}
ShellScreenGrabber *
shell_screen_grabber_new (void)
{
return g_object_new (SHELL_TYPE_SCREEN_GRABBER, NULL);
}
/**
* shell_screen_grabber_grab:
* x: X coordinate of the rectangle to grab
* y: Y coordinate of the rectangle to grab
* width: width of the rectangle to grab
* height: heigth of the rectangle to grab
*
* Grabs pixel data from a portion of the screen.
*
* Return value: buffer holding the grabbed data. The data is stored as 32-bit
* words with native-endian xRGB pixels (i.e., the same as CAIRO_FORMAT_RGB24)
* with no padding on the rows. So, the size of the buffer is width * height * 4
* bytes. Free with g_free().
**/
guchar *
shell_screen_grabber_grab (ShellScreenGrabber *grabber,
int x,
int y,
int width,
int height)
{
guchar *data;
gsize row_bytes;
gsize data_size;
row_bytes = width * 4;
data_size = row_bytes * height;
data = g_malloc (data_size);
if (grabber->have_pixel_buffers == -1)
{
const GLubyte* extensions = glGetString (GL_EXTENSIONS);
grabber->have_pixel_buffers = strstr ((const char *)extensions, "GL_EXT_pixel_buffer_object") != NULL;
grabber->have_pack_invert = strstr ((const char *)extensions, "GL_MESA_pack_invert") != NULL;
}
if (grabber->have_pixel_buffers)
{
GLubyte *mapped_data;
GLint old_swap_bytes, old_lsb_first, old_row_length, old_skip_pixels, old_skip_rows, old_alignment;
GLint old_pack_invert = GL_FALSE;
GLint vp_size[4];
guchar *src_row, *dest_row;
int i;
cogl_flush ();
if (pf_glBindBufferARB == NULL)
{
pf_glBindBufferARB = (PFNGLBINDBUFFERARBPROC) cogl_get_proc_address ("glBindBufferARB");
pf_glBufferDataARB = (PFNGLBUFFERDATAARBPROC) cogl_get_proc_address ("glBufferDataARB");
pf_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) cogl_get_proc_address ("glDeleteBuffersARB");
pf_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) cogl_get_proc_address ("glGenBuffersARB");
pf_glMapBufferARB = (PFNGLMAPBUFFERARBPROC) cogl_get_proc_address ("glMapBufferARB");
pf_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC) cogl_get_proc_address ("glUnmapBufferARB");
}
glGetIntegerv (GL_PACK_SWAP_BYTES, &old_swap_bytes);
glGetIntegerv (GL_PACK_LSB_FIRST, &old_lsb_first);
glGetIntegerv (GL_PACK_ROW_LENGTH, &old_row_length);
glGetIntegerv (GL_PACK_SKIP_PIXELS, &old_skip_pixels);
glGetIntegerv (GL_PACK_SKIP_ROWS, &old_skip_rows);
glGetIntegerv (GL_PACK_ALIGNMENT, &old_alignment);
glPixelStorei (GL_PACK_SWAP_BYTES, GL_FALSE);
glPixelStorei (GL_PACK_LSB_FIRST, GL_FALSE);
glPixelStorei (GL_PACK_ROW_LENGTH, 0);
glPixelStorei (GL_PACK_SKIP_PIXELS, 0);
glPixelStorei (GL_PACK_SKIP_ROWS, 0);
glPixelStorei (GL_PACK_ALIGNMENT, 1);
if (grabber->have_pack_invert)
{
glGetIntegerv (GL_PACK_INVERT_MESA, &old_pack_invert);
glPixelStorei (GL_PACK_INVERT_MESA, GL_FALSE);
}
if (grabber->pixel_buffer != 0 &&
(grabber->width != width ||
grabber->height != height))
{
pf_glDeleteBuffersARB (1, &grabber->pixel_buffer);
grabber->pixel_buffer = 0;
}
if (grabber->pixel_buffer == 0)
{
pf_glGenBuffersARB (1, &grabber->pixel_buffer);
pf_glBindBufferARB (GL_PIXEL_PACK_BUFFER_ARB, grabber->pixel_buffer);
pf_glBufferDataARB (GL_PIXEL_PACK_BUFFER_ARB, data_size, 0, GL_STREAM_READ_ARB);
grabber->width = width;
grabber->height = height;
}
else
{
pf_glBindBufferARB (GL_PIXEL_PACK_BUFFER_ARB, grabber->pixel_buffer);
}
/* In OpenGL, (x,y) specifies the bottom-left corner rather than the
* top-left */
glGetIntegerv (GL_VIEWPORT, vp_size);
y = vp_size[3] - (y + height);
glReadPixels (x, y, width, height, GL_BGRA, GL_UNSIGNED_BYTE, 0);
mapped_data = pf_glMapBufferARB (GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB);
src_row = mapped_data + (height - 1) * row_bytes;
dest_row = data;
for (i = 0; i < height; i++)
{
memcpy (dest_row, src_row, row_bytes);
src_row -= row_bytes;
dest_row += row_bytes;
}
pf_glUnmapBufferARB (GL_PIXEL_PACK_BUFFER_ARB);
pf_glBindBufferARB (GL_PIXEL_PACK_BUFFER_ARB, 0);
glPixelStorei (GL_PACK_SWAP_BYTES, old_swap_bytes);
glPixelStorei (GL_PACK_LSB_FIRST, old_lsb_first);
glPixelStorei (GL_PACK_ROW_LENGTH, old_row_length);
glPixelStorei (GL_PACK_SKIP_PIXELS, old_skip_pixels);
glPixelStorei (GL_PACK_SKIP_ROWS, old_skip_rows);
glPixelStorei (GL_PACK_ALIGNMENT, old_alignment);
if (grabber->have_pack_invert)
glPixelStorei (GL_PACK_INVERT_MESA, old_pack_invert);
}
else
{
cogl_read_pixels (x, y,
width, height,
COGL_READ_PIXELS_COLOR_BUFFER,
CLUTTER_CAIRO_FORMAT_ARGB32,
data);
}
return data;
}

View File

@ -1,44 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#ifndef __SHELL_SCREEN_GRABBER_H__
#define __SHELL_SCREEN_GRABBER_H__
#include <glib-object.h>
G_BEGIN_DECLS
/**
* SECTION:shell-screen-grabber
* @short_description: Grab pixel data from the screen
*
* The #ShellScreenGrabber object is used to download previous drawn
* content to the screen. It internally uses pixel-buffer objects if
* available, otherwise falls back to cogl_read_pixels().
*
* If you are repeatedly grabbing images of the same size from the
* screen, it makes sense to create one #ShellScreenGrabber and keep
* it around. Otherwise, it's fine to simply create one as needed and
* then get rid of it.
*/
typedef struct _ShellScreenGrabber ShellScreenGrabber;
typedef struct _ShellScreenGrabberClass ShellScreenGrabberClass;
#define SHELL_TYPE_SCREEN_GRABBER (shell_screen_grabber_get_type ())
#define SHELL_SCREEN_GRABBER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SHELL_TYPE_SCREEN_GRABBER, ShellScreenGrabber))
#define SHELL_SCREEN_GRABBER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_SCREEN_GRABBER, ShellScreenGrabberClass))
#define SHELL_IS_SCREEN_GRABBER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SHELL_TYPE_SCREEN_GRABBER))
#define SHELL_IS_SCREEN_GRABBER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_SCREEN_GRABBER))
#define SHELL_SCREEN_GRABBER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_SCREEN_GRABBER, ShellScreenGrabberClass))
GType shell_screen_grabber_get_type (void) G_GNUC_CONST;
ShellScreenGrabber *shell_screen_grabber_new (void);
guchar * shell_screen_grabber_grab (ShellScreenGrabber *grabber,
int x,
int y,
int width,
int height);
G_END_DECLS
#endif /* __SHELL_SCREEN_GRABBER_H__ */

View File

@ -1,5 +1,8 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#define COGL_ENABLE_EXPERIMENTAL_API
#define CLUTTER_ENABLE_EXPERIMENTAL_API
#include <X11/extensions/Xfixes.h> #include <X11/extensions/Xfixes.h>
#include <clutter/x11/clutter-x11.h> #include <clutter/x11/clutter-x11.h>
#include <clutter/clutter.h> #include <clutter/clutter.h>
@ -10,7 +13,6 @@
#include <meta/meta-shaped-texture.h> #include <meta/meta-shaped-texture.h>
#include "shell-global.h" #include "shell-global.h"
#include "shell-screen-grabber.h"
#include "shell-screenshot.h" #include "shell-screenshot.h"
struct _ShellScreenshotClass struct _ShellScreenshotClass
@ -90,18 +92,33 @@ do_grab_screenshot (_screenshot_data *screenshot_data,
int width, int width,
int height) int height)
{ {
ShellScreenGrabber *grabber; CoglBitmap *bitmap;
static const cairo_user_data_key_t key; ClutterBackend *backend;
CoglContext *context;
int stride;
guchar *data; guchar *data;
grabber = shell_screen_grabber_new (); backend = clutter_get_default_backend ();
data = shell_screen_grabber_grab (grabber, x, y, width, height); context = clutter_backend_get_cogl_context (backend);
g_object_unref (grabber);
screenshot_data->image = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_RGB24, screenshot_data->image = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
width, height, width * 4); width, height);
cairo_surface_set_user_data (screenshot_data->image, &key,
data, (cairo_destroy_func_t)g_free);
data = cairo_image_surface_get_data (screenshot_data->image);
stride = cairo_image_surface_get_stride (screenshot_data->image);
bitmap = cogl_bitmap_new_for_data (context,
width,
height,
CLUTTER_CAIRO_FORMAT_ARGB32,
stride,
data);
cogl_framebuffer_read_pixels_into_bitmap (cogl_get_draw_framebuffer (),
x, y,
COGL_READ_PIXELS_COLOR_BUFFER,
bitmap);
cogl_object_unref (bitmap);
} }
static void static void

View File

@ -35,6 +35,9 @@ void _shell_wm_kill_window_effects (ShellWM *wm,
MetaWindowActor *actor); MetaWindowActor *actor);
void _shell_wm_kill_switch_workspace (ShellWM *wm); void _shell_wm_kill_switch_workspace (ShellWM *wm);
gboolean _shell_wm_filter_keybinding (ShellWM *wm,
MetaKeyBinding *binding);
G_END_DECLS G_END_DECLS
#endif /* __SHELL_WM_PRIVATE_H__ */ #endif /* __SHELL_WM_PRIVATE_H__ */

View File

@ -26,6 +26,7 @@ enum
SWITCH_WORKSPACE, SWITCH_WORKSPACE,
KILL_SWITCH_WORKSPACE, KILL_SWITCH_WORKSPACE,
KILL_WINDOW_EFFECTS, KILL_WINDOW_EFFECTS,
FILTER_KEYBINDING,
LAST_SIGNAL LAST_SIGNAL
}; };
@ -115,6 +116,14 @@ shell_wm_class_init (ShellWMClass *klass)
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
META_TYPE_WINDOW_ACTOR); META_TYPE_WINDOW_ACTOR);
shell_wm_signals[FILTER_KEYBINDING] =
g_signal_new ("filter-keybinding",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
g_signal_accumulator_true_handled, NULL, NULL,
G_TYPE_BOOLEAN, 1,
META_TYPE_KEY_BINDING);
} }
void void
@ -267,6 +276,17 @@ _shell_wm_destroy (ShellWM *wm,
g_signal_emit (wm, shell_wm_signals[DESTROY], 0, actor); g_signal_emit (wm, shell_wm_signals[DESTROY], 0, actor);
} }
gboolean
_shell_wm_filter_keybinding (ShellWM *wm,
MetaKeyBinding *binding)
{
gboolean rv;
g_signal_emit (wm, shell_wm_signals[FILTER_KEYBINDING], 0, binding, &rv);
return rv;
}
/** /**
* shell_wm_new: * shell_wm_new:
* @plugin: the #MetaPlugin * @plugin: the #MetaPlugin

View File

@ -65,6 +65,10 @@
#include "st-clipboard.h" #include "st-clipboard.h"
#include "st-private.h" #include "st-private.h"
#include <clutter/x11/clutter-x11.h>
#include <X11/Xlib.h>
#include <X11/cursorfont.h>
#include "st-widget-accessible.h" #include "st-widget-accessible.h"
#define HAS_FOCUS(actor) (clutter_actor_get_stage (actor) && clutter_stage_get_key_focus ((ClutterStage *) clutter_actor_get_stage (actor)) == actor) #define HAS_FOCUS(actor) (clutter_actor_get_stage (actor) && clutter_stage_get_key_focus ((ClutterStage *) clutter_actor_get_stage (actor)) == actor)
@ -613,6 +617,38 @@ st_entry_key_focus_in (ClutterActor *actor)
clutter_actor_grab_key_focus (priv->entry); clutter_actor_grab_key_focus (priv->entry);
} }
static void
st_entry_set_cursor (StEntry *entry,
gboolean use_ibeam)
{
Display *dpy;
ClutterActor *stage, *actor = CLUTTER_ACTOR (entry);
Window wid;
static Cursor ibeam = None;
dpy = clutter_x11_get_default_display ();
stage = clutter_actor_get_stage (actor);
wid = clutter_x11_get_stage_window (CLUTTER_STAGE (stage));
if (ibeam == None)
ibeam = XCreateFontCursor (dpy, XC_xterm);
if (use_ibeam)
XDefineCursor (dpy, wid, ibeam);
else
XUndefineCursor (dpy, wid);
}
static gboolean
st_entry_crossing_event (ClutterActor *actor,
ClutterCrossingEvent *event)
{
if (event->source == ST_ENTRY (actor)->priv->entry && event->related != NULL)
st_entry_set_cursor (ST_ENTRY (actor), (event->type == CLUTTER_ENTER));
return FALSE;
}
static void static void
st_entry_class_init (StEntryClass *klass) st_entry_class_init (StEntryClass *klass)
{ {
@ -635,6 +671,9 @@ st_entry_class_init (StEntryClass *klass)
actor_class->key_press_event = st_entry_key_press_event; actor_class->key_press_event = st_entry_key_press_event;
actor_class->key_focus_in = st_entry_key_focus_in; actor_class->key_focus_in = st_entry_key_focus_in;
actor_class->enter_event = st_entry_crossing_event;
actor_class->leave_event = st_entry_crossing_event;
widget_class->style_changed = st_entry_style_changed; widget_class->style_changed = st_entry_style_changed;
widget_class->navigate_focus = st_entry_navigate_focus; widget_class->navigate_focus = st_entry_navigate_focus;
widget_class->get_accessible_type = st_entry_accessible_get_type; widget_class->get_accessible_type = st_entry_accessible_get_type;

View File

@ -1073,6 +1073,8 @@ typedef struct {
gchar *path; gchar *path;
gint grid_width, grid_height; gint grid_width, grid_height;
ClutterActor *actor; ClutterActor *actor;
GFunc load_callback;
gpointer load_callback_data;
} AsyncImageData; } AsyncImageData;
static void static void
@ -1089,6 +1091,7 @@ on_sliced_image_loaded (GObject *source_object,
GAsyncResult *res, GAsyncResult *res,
gpointer user_data) gpointer user_data)
{ {
GObject *cache = source_object;
AsyncImageData *data = (AsyncImageData *)user_data; AsyncImageData *data = (AsyncImageData *)user_data;
GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res); GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
GList *list; GList *list;
@ -1102,6 +1105,9 @@ on_sliced_image_loaded (GObject *source_object,
clutter_actor_hide (actor); clutter_actor_hide (actor);
clutter_actor_add_child (data->actor, actor); clutter_actor_add_child (data->actor, actor);
} }
if (data->load_callback != NULL)
data->load_callback (cache, data->load_callback_data);
} }
static void static void
@ -1156,6 +1162,8 @@ load_sliced_image (GSimpleAsyncResult *result,
* @path: Path to a filename * @path: Path to a filename
* @grid_width: Width in pixels * @grid_width: Width in pixels
* @grid_height: Height in pixels * @grid_height: Height in pixels
* @load_callback: (scope async) (allow-none): Function called when the image is loaded, or %NULL
* @user_data: Data to pass to the load callback
* *
* This function reads a single image file which contains multiple images internally. * This function reads a single image file which contains multiple images internally.
* The image file will be divided using @grid_width and @grid_height; * The image file will be divided using @grid_width and @grid_height;
@ -1165,10 +1173,12 @@ load_sliced_image (GSimpleAsyncResult *result,
* Returns: (transfer none): A new #ClutterActor * Returns: (transfer none): A new #ClutterActor
*/ */
ClutterActor * ClutterActor *
st_texture_cache_load_sliced_image (StTextureCache *cache, st_texture_cache_load_sliced_image (StTextureCache *cache,
const gchar *path, const gchar *path,
gint grid_width, gint grid_width,
gint grid_height) gint grid_height,
GFunc load_callback,
gpointer user_data)
{ {
AsyncImageData *data; AsyncImageData *data;
GSimpleAsyncResult *result; GSimpleAsyncResult *result;
@ -1179,6 +1189,8 @@ st_texture_cache_load_sliced_image (StTextureCache *cache,
data->grid_height = grid_height; data->grid_height = grid_height;
data->path = g_strdup (path); data->path = g_strdup (path);
data->actor = actor; data->actor = actor;
data->load_callback = load_callback;
data->load_callback_data = user_data;
g_object_ref (G_OBJECT (actor)); g_object_ref (G_OBJECT (actor));
result = g_simple_async_result_new (G_OBJECT (cache), on_sliced_image_loaded, data, st_texture_cache_load_sliced_image); result = g_simple_async_result_new (G_OBJECT (cache), on_sliced_image_loaded, data, st_texture_cache_load_sliced_image);

View File

@ -69,10 +69,12 @@ GType st_texture_cache_get_type (void) G_GNUC_CONST;
StTextureCache* st_texture_cache_get_default (void); StTextureCache* st_texture_cache_get_default (void);
ClutterActor * ClutterActor *
st_texture_cache_load_sliced_image (StTextureCache *cache, st_texture_cache_load_sliced_image (StTextureCache *cache,
const gchar *path, const gchar *path,
gint grid_width, gint grid_width,
gint grid_height); gint grid_height,
GFunc load_callback,
gpointer user_data);
ClutterActor *st_texture_cache_bind_pixbuf_property (StTextureCache *cache, ClutterActor *st_texture_cache_bind_pixbuf_property (StTextureCache *cache,
GObject *object, GObject *object,

View File

@ -31,6 +31,9 @@ struct _StThemeContext {
PangoFontDescription *font; PangoFontDescription *font;
StThemeNode *root_node; StThemeNode *root_node;
StTheme *theme; StTheme *theme;
/* set of StThemeNode */
GHashTable *nodes;
}; };
struct _StThemeContextClass { struct _StThemeContextClass {
@ -66,6 +69,8 @@ st_theme_context_finalize (GObject *object)
(gpointer) st_theme_context_changed, (gpointer) st_theme_context_changed,
context); context);
if (context->nodes)
g_hash_table_unref (context->nodes);
if (context->root_node) if (context->root_node)
g_object_unref (context->root_node); g_object_unref (context->root_node);
if (context->theme) if (context->theme)
@ -105,6 +110,10 @@ st_theme_context_init (StThemeContext *context)
"resolution-changed", "resolution-changed",
G_CALLBACK (st_theme_context_changed), G_CALLBACK (st_theme_context_changed),
context); context);
context->nodes = g_hash_table_new_full ((GHashFunc) st_theme_node_hash,
(GEqualFunc) st_theme_node_equal,
g_object_unref, NULL);
} }
/** /**
@ -146,6 +155,7 @@ st_theme_context_changed (StThemeContext *context)
{ {
StThemeNode *old_root = context->root_node; StThemeNode *old_root = context->root_node;
context->root_node = NULL; context->root_node = NULL;
g_hash_table_remove_all (context->nodes);
emit_changed (context); emit_changed (context);
@ -299,3 +309,27 @@ st_theme_context_get_root_node (StThemeContext *context)
return context->root_node; return context->root_node;
} }
/**
* st_theme_context_intern_node:
* @context: a #StThemeContext
* @node: a #StThemeNode
*
* Return an existing node matching @node, or if that isn't possible,
* @node itself.
*
* Return value: (transfer none): a node with the same properties as @node
*/
StThemeNode *
st_theme_context_intern_node (StThemeContext *context,
StThemeNode *node)
{
StThemeNode *mine = g_hash_table_lookup (context->nodes, node);
/* this might be node or not - it doesn't actually matter */
if (mine != NULL)
return mine;
g_hash_table_add (context->nodes, g_object_ref (node));
return node;
}

View File

@ -62,6 +62,9 @@ const PangoFontDescription *st_theme_context_get_font (StThemeContext
StThemeNode * st_theme_context_get_root_node (StThemeContext *context); StThemeNode * st_theme_context_get_root_node (StThemeContext *context);
StThemeNode * st_theme_context_intern_node (StThemeContext *context,
StThemeNode *node);
G_END_DECLS G_END_DECLS
#endif /* __ST_THEME_CONTEXT_H__ */ #endif /* __ST_THEME_CONTEXT_H__ */

View File

@ -1553,7 +1553,7 @@ st_theme_node_paint_borders (StThemeNode *node,
{ {
ClutterColor effective_border; ClutterColor effective_border;
gboolean skip_corner_1, skip_corner_2; gboolean skip_corner_1, skip_corner_2;
float x1, y1, x2, y2; float rects[16];
over (&border_color, &node->background_color, &effective_border); over (&border_color, &node->background_color, &effective_border);
alpha = paint_opacity * effective_border.alpha / 255; alpha = paint_opacity * effective_border.alpha / 255;
@ -1569,46 +1569,44 @@ st_theme_node_paint_borders (StThemeNode *node,
skip_corner_1 = border_radius[ST_CORNER_TOPLEFT] > 0; skip_corner_1 = border_radius[ST_CORNER_TOPLEFT] > 0;
skip_corner_2 = border_radius[ST_CORNER_TOPRIGHT] > 0; skip_corner_2 = border_radius[ST_CORNER_TOPRIGHT] > 0;
x1 = skip_corner_1 ? max_width_radius[ST_CORNER_TOPLEFT] : 0; rects[0] = skip_corner_1 ? max_width_radius[ST_CORNER_TOPLEFT] : 0;
y1 = 0; rects[1] = 0;
x2 = skip_corner_2 ? width - max_width_radius[ST_CORNER_TOPRIGHT] : width; rects[2] = skip_corner_2 ? width - max_width_radius[ST_CORNER_TOPRIGHT] : width;
y2 = border_width[ST_SIDE_TOP]; rects[3] = border_width[ST_SIDE_TOP];
cogl_rectangle (x1, y1, x2, y2);
/* EAST */ /* EAST */
skip_corner_1 = border_radius[ST_CORNER_TOPRIGHT] > 0; skip_corner_1 = border_radius[ST_CORNER_TOPRIGHT] > 0;
skip_corner_2 = border_radius[ST_CORNER_BOTTOMRIGHT] > 0; skip_corner_2 = border_radius[ST_CORNER_BOTTOMRIGHT] > 0;
x1 = width - border_width[ST_SIDE_RIGHT]; rects[4] = width - border_width[ST_SIDE_RIGHT];
y1 = skip_corner_1 ? max_width_radius[ST_CORNER_TOPRIGHT] rects[5] = skip_corner_1 ? max_width_radius[ST_CORNER_TOPRIGHT]
: border_width[ST_SIDE_TOP]; : border_width[ST_SIDE_TOP];
x2 = width; rects[6] = width;
y2 = skip_corner_2 ? height - max_width_radius[ST_CORNER_BOTTOMRIGHT] rects[7] = skip_corner_2 ? height - max_width_radius[ST_CORNER_BOTTOMRIGHT]
: height - border_width[ST_SIDE_BOTTOM]; : height - border_width[ST_SIDE_BOTTOM];
cogl_rectangle (x1, y1, x2, y2);
/* SOUTH */ /* SOUTH */
skip_corner_1 = border_radius[ST_CORNER_BOTTOMLEFT] > 0; skip_corner_1 = border_radius[ST_CORNER_BOTTOMLEFT] > 0;
skip_corner_2 = border_radius[ST_CORNER_BOTTOMRIGHT] > 0; skip_corner_2 = border_radius[ST_CORNER_BOTTOMRIGHT] > 0;
x1 = skip_corner_1 ? max_width_radius[ST_CORNER_BOTTOMLEFT] : 0; rects[8] = skip_corner_1 ? max_width_radius[ST_CORNER_BOTTOMLEFT] : 0;
y1 = height - border_width[ST_SIDE_BOTTOM]; rects[9] = height - border_width[ST_SIDE_BOTTOM];
x2 = skip_corner_2 ? width - max_width_radius[ST_CORNER_BOTTOMRIGHT] rects[10] = skip_corner_2 ? width - max_width_radius[ST_CORNER_BOTTOMRIGHT]
: width; : width;
y2 = height; rects[11] = height;
cogl_rectangle (x1, y1, x2, y2);
/* WEST */ /* WEST */
skip_corner_1 = border_radius[ST_CORNER_TOPLEFT] > 0; skip_corner_1 = border_radius[ST_CORNER_TOPLEFT] > 0;
skip_corner_2 = border_radius[ST_CORNER_BOTTOMLEFT] > 0; skip_corner_2 = border_radius[ST_CORNER_BOTTOMLEFT] > 0;
x1 = 0; rects[12] = 0;
y1 = skip_corner_1 ? max_width_radius[ST_CORNER_TOPLEFT] rects[13] = skip_corner_1 ? max_width_radius[ST_CORNER_TOPLEFT]
: border_width[ST_SIDE_TOP]; : border_width[ST_SIDE_TOP];
x2 = border_width[ST_SIDE_LEFT]; rects[14] = border_width[ST_SIDE_LEFT];
y2 = skip_corner_2 ? height - max_width_radius[ST_CORNER_BOTTOMLEFT] rects[15] = skip_corner_2 ? height - max_width_radius[ST_CORNER_BOTTOMLEFT]
: height - border_width[ST_SIDE_BOTTOM]; : height - border_width[ST_SIDE_BOTTOM];
cogl_rectangle (x1, y1, x2, y2);
cogl_rectangles (rects, 4);
} }
} }
@ -1875,6 +1873,7 @@ st_theme_node_paint_outline (StThemeNode *node,
{ {
float width, height; float width, height;
int outline_width; int outline_width;
float rects[16];
ClutterColor outline_color, effective_outline; ClutterColor outline_color, effective_outline;
width = box->x2 - box->x1; width = box->x2 - box->x1;
@ -1899,20 +1898,30 @@ st_theme_node_paint_outline (StThemeNode *node,
*/ */
/* NORTH */ /* NORTH */
cogl_rectangle (-outline_width, -outline_width, rects[0] = -outline_width;
width + outline_width, 0); rects[1] = -outline_width;
rects[2] = width + outline_width;
rects[3] = 0;
/* EAST */ /* EAST */
cogl_rectangle (width, 0, rects[4] = width;
width + outline_width, height); rects[5] = 0;
rects[6] = width + outline_width;
rects[7] = height;
/* SOUTH */ /* SOUTH */
cogl_rectangle (-outline_width, height, rects[8] = -outline_width;
width + outline_width, height + outline_width); rects[9] = height;
rects[10] = width + outline_width;
rects[11] = height + outline_width;
/* WEST */ /* WEST */
cogl_rectangle (-outline_width, 0, rects[12] = -outline_width;
0, height); rects[13] = 0;
rects[14] = 0;
rects[15] = height;
cogl_rectangles (rects, 4);
} }
void void
@ -2060,6 +2069,9 @@ st_theme_node_copy_cached_paint_state (StThemeNode *node,
g_return_if_fail (ST_IS_THEME_NODE (node)); g_return_if_fail (ST_IS_THEME_NODE (node));
g_return_if_fail (ST_IS_THEME_NODE (other)); g_return_if_fail (ST_IS_THEME_NODE (other));
if (node == other)
return;
/* Check omitted for speed: */ /* Check omitted for speed: */
/* g_return_if_fail (st_theme_node_paint_equal (node, other)); */ /* g_return_if_fail (st_theme_node_paint_equal (node, other)); */

View File

@ -77,8 +77,8 @@ struct _StThemeNode {
GType element_type; GType element_type;
char *element_id; char *element_id;
char *element_class; GStrv element_classes;
char *pseudo_class; GStrv pseudo_classes;
char *inline_style; char *inline_style;
CRDeclaration **properties; CRDeclaration **properties;

View File

@ -41,7 +41,6 @@ struct _StThemeNodeTransitionPrivate {
CoglHandle material; CoglHandle material;
ClutterAlpha *alpha;
ClutterTimeline *timeline; ClutterTimeline *timeline;
guint timeline_completed_id; guint timeline_completed_id;
@ -91,7 +90,6 @@ st_theme_node_transition_new (StThemeNode *from_node,
transition->priv->old_theme_node = g_object_ref (from_node); transition->priv->old_theme_node = g_object_ref (from_node);
transition->priv->new_theme_node = g_object_ref (to_node); transition->priv->new_theme_node = g_object_ref (to_node);
transition->priv->alpha = clutter_alpha_new ();
transition->priv->timeline = clutter_timeline_new (duration); transition->priv->timeline = clutter_timeline_new (duration);
transition->priv->timeline_completed_id = transition->priv->timeline_completed_id =
@ -101,9 +99,7 @@ st_theme_node_transition_new (StThemeNode *from_node,
g_signal_connect (transition->priv->timeline, "new-frame", g_signal_connect (transition->priv->timeline, "new-frame",
G_CALLBACK (on_timeline_new_frame), transition); G_CALLBACK (on_timeline_new_frame), transition);
clutter_alpha_set_mode (transition->priv->alpha, CLUTTER_EASE_IN_OUT_QUAD); clutter_timeline_set_progress_mode (transition->priv->timeline, CLUTTER_EASE_IN_OUT_QUAD);
clutter_alpha_set_timeline (transition->priv->alpha,
transition->priv->timeline);
clutter_timeline_start (transition->priv->timeline); clutter_timeline_start (transition->priv->timeline);
@ -334,7 +330,7 @@ st_theme_node_transition_paint (StThemeNodeTransition *transition,
} }
cogl_color_set_from_4f (&constant, 0., 0., 0., cogl_color_set_from_4f (&constant, 0., 0., 0.,
clutter_alpha_get_alpha (priv->alpha)); clutter_timeline_get_progress (priv->timeline));
cogl_material_set_layer_combine_constant (priv->material, 1, &constant); cogl_material_set_layer_combine_constant (priv->material, 1, &constant);
cogl_material_set_color4ub (priv->material, cogl_material_set_color4ub (priv->material,
@ -412,12 +408,6 @@ st_theme_node_transition_dispose (GObject *object)
priv->timeline_completed_id = 0; priv->timeline_completed_id = 0;
priv->timeline_new_frame_id = 0; priv->timeline_new_frame_id = 0;
if (priv->alpha)
{
g_object_unref (priv->alpha);
priv->alpha = NULL;
}
G_OBJECT_CLASS (st_theme_node_transition_parent_class)->dispose (object); G_OBJECT_CLASS (st_theme_node_transition_parent_class)->dispose (object);
} }
@ -436,8 +426,6 @@ st_theme_node_transition_init (StThemeNodeTransition *transition)
transition->priv->new_offscreen = NULL; transition->priv->new_offscreen = NULL;
transition->priv->needs_setup = TRUE; transition->priv->needs_setup = TRUE;
transition->priv->alpha = NULL;
} }
static void static void

View File

@ -96,8 +96,8 @@ st_theme_node_finalize (GObject *object)
StThemeNode *node = ST_THEME_NODE (object); StThemeNode *node = ST_THEME_NODE (object);
g_free (node->element_id); g_free (node->element_id);
g_free (node->element_class); g_strfreev (node->element_classes);
g_free (node->pseudo_class); g_strfreev (node->pseudo_classes);
g_free (node->inline_style); g_free (node->inline_style);
if (node->properties) if (node->properties)
@ -145,6 +145,33 @@ st_theme_node_finalize (GObject *object)
G_OBJECT_CLASS (st_theme_node_parent_class)->finalize (object); G_OBJECT_CLASS (st_theme_node_parent_class)->finalize (object);
} }
static GStrv
split_on_whitespace (const gchar *s)
{
gchar *cur;
gchar *l;
gchar *temp;
GPtrArray *arr;
if (s == NULL)
return NULL;
arr = g_ptr_array_new ();
l = g_strdup (s);
cur = strtok_r (l, " \t\f\r\n", &temp);
while (cur != NULL)
{
g_ptr_array_add (arr, g_strdup (cur));
cur = strtok_r (NULL, " \t\f\r\n", &temp);
}
g_free (l);
g_ptr_array_add (arr, NULL);
return (GStrv) g_ptr_array_free (arr, FALSE);
}
/** /**
* st_theme_node_new: * st_theme_node_new:
* @context: the context representing global state for this themed tree * @context: the context representing global state for this themed tree
@ -201,8 +228,8 @@ st_theme_node_new (StThemeContext *context,
node->element_type = element_type; node->element_type = element_type;
node->element_id = g_strdup (element_id); node->element_id = g_strdup (element_id);
node->element_class = g_strdup (element_class); node->element_classes = split_on_whitespace (element_class);
node->pseudo_class = g_strdup (pseudo_class); node->pseudo_classes = split_on_whitespace (pseudo_class);
node->inline_style = g_strdup (inline_style); node->inline_style = g_strdup (inline_style);
return node; return node;
@ -257,20 +284,30 @@ st_theme_node_get_element_id (StThemeNode *node)
return node->element_id; return node->element_id;
} }
const char * /**
st_theme_node_get_element_class (StThemeNode *node) * st_theme_node_get_element_classes:
*
* Returns: (transfer none): the element's classes
*/
GStrv
st_theme_node_get_element_classes (StThemeNode *node)
{ {
g_return_val_if_fail (ST_IS_THEME_NODE (node), NULL); g_return_val_if_fail (ST_IS_THEME_NODE (node), NULL);
return node->element_class; return node->element_classes;
} }
const char * /**
st_theme_node_get_pseudo_class (StThemeNode *node) * st_theme_node_get_pseudo_classes:
*
* Returns: (transfer none): the element's pseudo-classes
*/
GStrv
st_theme_node_get_pseudo_classes (StThemeNode *node)
{ {
g_return_val_if_fail (ST_IS_THEME_NODE (node), NULL); g_return_val_if_fail (ST_IS_THEME_NODE (node), NULL);
return node->pseudo_class; return node->pseudo_classes;
} }
/** /**
@ -304,16 +341,91 @@ gboolean
st_theme_node_equal (StThemeNode *node_a, StThemeNode *node_b) st_theme_node_equal (StThemeNode *node_a, StThemeNode *node_b)
{ {
g_return_val_if_fail (ST_IS_THEME_NODE (node_a), FALSE); g_return_val_if_fail (ST_IS_THEME_NODE (node_a), FALSE);
if (node_a == node_b)
return TRUE;
g_return_val_if_fail (ST_IS_THEME_NODE (node_b), FALSE); g_return_val_if_fail (ST_IS_THEME_NODE (node_b), FALSE);
return node_a->parent_node == node_b->parent_node && if (node_a->parent_node != node_b->parent_node ||
node_a->context == node_b->context && node_a->context != node_b->context ||
node_a->theme == node_b->theme && node_a->theme != node_b->theme ||
node_a->element_type == node_b->element_type && node_a->element_type != node_b->element_type ||
!g_strcmp0 (node_a->element_id, node_b->element_id) && g_strcmp0 (node_a->element_id, node_b->element_id) ||
!g_strcmp0 (node_a->element_class, node_b->element_class) && g_strcmp0 (node_a->inline_style, node_b->inline_style))
!g_strcmp0 (node_a->pseudo_class, node_b->pseudo_class) && return FALSE;
!g_strcmp0 (node_a->inline_style, node_b->inline_style);
if ((node_a->element_classes == NULL) != (node_b->element_classes == NULL))
return FALSE;
if ((node_a->pseudo_classes == NULL) != (node_b->pseudo_classes == NULL))
return FALSE;
if (node_a->element_classes != NULL)
{
int i;
for (i = 0; ; i++)
{
if (g_strcmp0 (node_a->element_classes[i],
node_b->element_classes[i]))
return FALSE;
if (node_a->element_classes[i] == NULL)
break;
}
}
if (node_a->pseudo_classes != NULL)
{
int i;
for (i = 0; ; i++)
{
if (g_strcmp0 (node_a->pseudo_classes[i],
node_b->pseudo_classes[i]))
return FALSE;
if (node_a->pseudo_classes[i] == NULL)
break;
}
}
return TRUE;
}
guint
st_theme_node_hash (StThemeNode *node)
{
guint hash = GPOINTER_TO_UINT (node->parent_node);
hash = hash * 33 + GPOINTER_TO_UINT (node->context);
hash = hash * 33 + GPOINTER_TO_UINT (node->theme);
hash = hash * 33 + ((guint) node->element_type);
if (node->element_id != NULL)
hash = hash * 33 + g_str_hash (node->element_id);
if (node->inline_style != NULL)
hash = hash * 33 + g_str_hash (node->inline_style);
if (node->element_classes != NULL)
{
gchar **it;
for (it = node->element_classes; *it != NULL; it++)
hash = hash * 33 + g_str_hash (*it) + 1;
}
if (node->pseudo_classes != NULL)
{
gchar **it;
for (it = node->pseudo_classes; *it != NULL; it++)
hash = hash * 33 + g_str_hash (*it) + 1;
}
return hash;
} }
static void static void
@ -3440,6 +3552,10 @@ st_theme_node_geometry_equal (StThemeNode *node,
StSide side; StSide side;
g_return_val_if_fail (ST_IS_THEME_NODE (node), FALSE); g_return_val_if_fail (ST_IS_THEME_NODE (node), FALSE);
if (node == other)
return TRUE;
g_return_val_if_fail (ST_IS_THEME_NODE (other), FALSE); g_return_val_if_fail (ST_IS_THEME_NODE (other), FALSE);
_st_theme_node_ensure_geometry (node); _st_theme_node_ensure_geometry (node);
@ -3484,6 +3600,10 @@ st_theme_node_paint_equal (StThemeNode *node,
int i; int i;
g_return_val_if_fail (ST_IS_THEME_NODE (node), FALSE); g_return_val_if_fail (ST_IS_THEME_NODE (node), FALSE);
if (node == other)
return TRUE;
g_return_val_if_fail (ST_IS_THEME_NODE (other), FALSE); g_return_val_if_fail (ST_IS_THEME_NODE (other), FALSE);
_st_theme_node_ensure_background (node); _st_theme_node_ensure_background (node);

View File

@ -110,11 +110,12 @@ StThemeNode *st_theme_node_get_parent (StThemeNode *node);
StTheme *st_theme_node_get_theme (StThemeNode *node); StTheme *st_theme_node_get_theme (StThemeNode *node);
gboolean st_theme_node_equal (StThemeNode *node_a, StThemeNode *node_b); gboolean st_theme_node_equal (StThemeNode *node_a, StThemeNode *node_b);
guint st_theme_node_hash (StThemeNode *node);
GType st_theme_node_get_element_type (StThemeNode *node); GType st_theme_node_get_element_type (StThemeNode *node);
const char *st_theme_node_get_element_id (StThemeNode *node); const char *st_theme_node_get_element_id (StThemeNode *node);
const char *st_theme_node_get_element_class (StThemeNode *node); GStrv st_theme_node_get_element_classes (StThemeNode *node);
const char *st_theme_node_get_pseudo_class (StThemeNode *node); GStrv st_theme_node_get_pseudo_classes (StThemeNode *node);
/* Generic getters ... these are not cached so are less efficient. The other /* Generic getters ... these are not cached so are less efficient. The other
* reason for adding the more specific version is that we can handle the * reason for adding the more specific version is that we can handle the

View File

@ -448,25 +448,17 @@ st_theme_new (const char *application_stylesheet,
static gboolean static gboolean
string_in_list (GString *stryng, string_in_list (GString *stryng,
const char *list) GStrv list)
{ {
const char *cur; gchar **it;
for (cur = list; *cur;) if (list == NULL)
return FALSE;
for (it = list; *it != NULL; it++)
{ {
while (*cur && cr_utils_is_white_space (*cur)) if (!strqcmp (*it, stryng->str, stryng->len))
cur++; return TRUE;
if (strncmp (cur, stryng->str, stryng->len) == 0)
{
cur += stryng->len;
if ((!*cur) || cr_utils_is_white_space (*cur))
return TRUE;
}
/* skip to next whitespace character */
while (*cur && !cr_utils_is_white_space (*cur))
cur++;
} }
return FALSE; return FALSE;
@ -477,7 +469,7 @@ pseudo_class_add_sel_matches_style (StTheme *a_this,
CRAdditionalSel *a_add_sel, CRAdditionalSel *a_add_sel,
StThemeNode *a_node) StThemeNode *a_node)
{ {
const char *node_pseudo_class; GStrv node_pseudo_classes;
g_return_val_if_fail (a_this g_return_val_if_fail (a_this
&& a_add_sel && a_add_sel
@ -487,12 +479,10 @@ pseudo_class_add_sel_matches_style (StTheme *a_this,
&& a_add_sel->content.pseudo->name->stryng->str && a_add_sel->content.pseudo->name->stryng->str
&& a_node, FALSE); && a_node, FALSE);
node_pseudo_class = st_theme_node_get_pseudo_class (a_node); node_pseudo_classes = st_theme_node_get_pseudo_classes (a_node);
if (node_pseudo_class == NULL) return string_in_list (a_add_sel->content.pseudo->name->stryng,
return FALSE; node_pseudo_classes);
return string_in_list (a_add_sel->content.pseudo->name->stryng, node_pseudo_class);
} }
/** /**
@ -507,7 +497,7 @@ static gboolean
class_add_sel_matches_style (CRAdditionalSel *a_add_sel, class_add_sel_matches_style (CRAdditionalSel *a_add_sel,
StThemeNode *a_node) StThemeNode *a_node)
{ {
const char *element_class; GStrv element_classes;
g_return_val_if_fail (a_add_sel g_return_val_if_fail (a_add_sel
&& a_add_sel->type == CLASS_ADD_SELECTOR && a_add_sel->type == CLASS_ADD_SELECTOR
@ -516,11 +506,10 @@ class_add_sel_matches_style (CRAdditionalSel *a_add_sel,
&& a_add_sel->content.class_name->stryng->str && a_add_sel->content.class_name->stryng->str
&& a_node, FALSE); && a_node, FALSE);
element_class = st_theme_node_get_element_class (a_node); element_classes = st_theme_node_get_element_classes (a_node);
if (element_class == NULL)
return FALSE;
return string_in_list (a_add_sel->content.class_name->stryng, element_class); return string_in_list (a_add_sel->content.class_name->stryng,
element_classes);
} }
/* /*

View File

@ -589,6 +589,8 @@ st_widget_get_theme_node (StWidget *widget)
if (priv->theme_node == NULL) if (priv->theme_node == NULL)
{ {
StThemeContext *context;
StThemeNode *tmp_node;
StThemeNode *parent_node = NULL; StThemeNode *parent_node = NULL;
ClutterStage *stage = NULL; ClutterStage *stage = NULL;
ClutterActor *parent; ClutterActor *parent;
@ -629,16 +631,20 @@ st_widget_get_theme_node (StWidget *widget)
else else
pseudo_class = direction_pseudo_class; pseudo_class = direction_pseudo_class;
priv->theme_node = st_theme_node_new (st_theme_context_get_for_stage (stage), context = st_theme_context_get_for_stage (stage);
parent_node, priv->theme, tmp_node = st_theme_node_new (context, parent_node, priv->theme,
G_OBJECT_TYPE (widget), G_OBJECT_TYPE (widget),
clutter_actor_get_name (CLUTTER_ACTOR (widget)), clutter_actor_get_name (CLUTTER_ACTOR (widget)),
priv->style_class, priv->style_class,
pseudo_class, pseudo_class,
priv->inline_style); priv->inline_style);
if (pseudo_class != direction_pseudo_class) if (pseudo_class != direction_pseudo_class)
g_free (pseudo_class); g_free (pseudo_class);
priv->theme_node = g_object_ref (st_theme_context_intern_node (context,
tmp_node));
g_object_unref (tmp_node);
} }
return priv->theme_node; return priv->theme_node;
@ -1526,6 +1532,12 @@ st_widget_recompute_style (StWidget *widget,
int transition_duration; int transition_duration;
gboolean paint_equal; gboolean paint_equal;
if (new_theme_node == old_theme_node)
{
widget->priv->is_style_dirty = FALSE;
return;
}
if (!old_theme_node || if (!old_theme_node ||
!st_theme_node_geometry_equal (old_theme_node, new_theme_node)) !st_theme_node_geometry_equal (old_theme_node, new_theme_node))
clutter_actor_queue_relayout ((ClutterActor *) widget); clutter_actor_queue_relayout ((ClutterActor *) widget);

View File

@ -3,6 +3,7 @@
#define GST_USE_UNSTABLE_API #define GST_USE_UNSTABLE_API
#include "shell-recorder.h" #include "shell-recorder.h"
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include <gtk/gtk.h>
#include <gst/gst.h> #include <gst/gst.h>
/* Very simple test of the ShellRecorder class; shows some text strings /* Very simple test of the ShellRecorder class; shows some text strings
@ -11,23 +12,34 @@
static ShellRecorder *recorder = NULL; static ShellRecorder *recorder = NULL;
static gboolean static gboolean
stop_recording_timeout (gpointer data) stop_recording_timeout (ClutterActor *stage)
{ {
if (recorder) if (recorder)
{ {
shell_recorder_close (recorder); shell_recorder_close (recorder);
/* quit when the recorder finishes closing
*/
g_object_weak_ref (G_OBJECT (recorder),
(GWeakNotify)
clutter_actor_destroy,
stage);
g_object_unref (recorder); g_object_unref (recorder);
} }
else
clutter_main_quit (); {
clutter_actor_destroy (stage);
}
return FALSE; return FALSE;
} }
static void static void
on_animation_completed (ClutterAnimation *animation) on_animation_completed (ClutterAnimation *animation,
ClutterStage *stage)
{ {
g_timeout_add (1000, stop_recording_timeout, NULL); g_timeout_add (1000, (GSourceFunc) stop_recording_timeout, stage);
} }
static void static void
@ -35,7 +47,7 @@ on_stage_realized (ClutterActor *stage,
gpointer data) gpointer data)
{ {
recorder = shell_recorder_new (CLUTTER_STAGE (stage)); recorder = shell_recorder_new (CLUTTER_STAGE (stage));
shell_recorder_set_filename (recorder, "test-recorder.ogg"); shell_recorder_set_file_template (recorder, "test-recorder.webm");
shell_recorder_record (recorder); shell_recorder_record (recorder);
} }
@ -46,6 +58,7 @@ int main (int argc, char **argv)
ClutterAnimation *animation; ClutterAnimation *animation;
ClutterColor red, green, blue; ClutterColor red, green, blue;
gtk_init (&argc, &argv);
gst_init (&argc, &argv); gst_init (&argc, &argv);
if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
return 1; return 1;
@ -69,7 +82,7 @@ int main (int argc, char **argv)
"y", 240.0, "y", 240.0,
NULL); NULL);
g_signal_connect (animation, "completed", g_signal_connect (animation, "completed",
G_CALLBACK (on_animation_completed), NULL); G_CALLBACK (on_animation_completed), stage);
text = g_object_new (CLUTTER_TYPE_TEXT, text = g_object_new (CLUTTER_TYPE_TEXT,
"text", "Blue", "text", "Blue",
@ -110,7 +123,5 @@ int main (int argc, char **argv)
clutter_main (); clutter_main ();
g_object_unref (stage);
return 0; return 0;
} }

View File

@ -18,6 +18,7 @@ TEST_JS = \
interactive/scrolling.js \ interactive/scrolling.js \
interactive/scroll-view-sizing.js \ interactive/scroll-view-sizing.js \
interactive/table.js \ interactive/table.js \
interactive/test-title.js \
interactive/transitions.js \ interactive/transitions.js \
testcommon/100-200.svg \ testcommon/100-200.svg \
testcommon/200-100.svg \ testcommon/200-100.svg \
@ -25,11 +26,14 @@ TEST_JS = \
testcommon/border-image.png \ testcommon/border-image.png \
testcommon/face-plain.png \ testcommon/face-plain.png \
testcommon/ui.js \ testcommon/ui.js \
testcommon/iso3166-test.tab \
testcommon/serviceproviders-test.xml \
unit/format.js \ unit/format.js \
unit/insertSorted.js \ unit/insertSorted.js \
unit/markup.js \ unit/markup.js \
unit/jsParse.js \ unit/jsParse.js \
unit/url.js unit/url.js \
unit/mobileProviders.js
EXTRA_DIST += $(TEST_JS) EXTRA_DIST += $(TEST_JS)
TEST_MISC = \ TEST_MISC = \

34
tests/interactive/test-title.js Executable file
View File

@ -0,0 +1,34 @@
#!/usr/bin/env gjs
const Gtk = imports.gi.Gtk;
const Mainloop = imports.mainloop;
function nextTitle() {
let length = Math.random() * 20;
let str = '';
for (let i = 0; i < length; i++) {
// 97 == 'a'
str += String.fromCharCode(97 + Math.random() * 26);
}
return str;
}
function main() {
Gtk.init(null);
let win = new Gtk.Window({ title: nextTitle() });
win.connect('destroy', Gtk.main_quit);
win.present();
Mainloop.timeout_add(5000, function() {
win.title = nextTitle();
return true;
});
Gtk.main();
}
main();

View File

@ -0,0 +1,3 @@
# Test country list
ES Spain
US United States

View File

@ -0,0 +1,44 @@
<?xml version="1.0"?>
<!-- -*- Mode: XML; tab-width: 2; indent-tabs-mode: t; c-basic-offset: 2 -*- -->
<!DOCTYPE serviceproviders SYSTEM "serviceproviders.2.dtd">
<serviceproviders format="2.0">
<!-- United States -->
<country code="us">
<provider>
<name>AT&amp;T</name>
<gsm>
<network-id mcc="310" mnc="038"/>
<network-id mcc="310" mnc="090"/>
<network-id mcc="310" mnc="150"/>
</gsm>
</provider>
<provider>
<name>Verizon</name>
<gsm>
<network-id mcc="310" mnc="995"/>
<network-id mcc="311" mnc="480"/>
</gsm>
<cdma>
<sid value="2"/>
<sid value="4"/>
<sid value="5"/>
</cdma>
</provider>
</country>
<!-- Spain -->
<country code="es">
<provider>
<name>Movistar (Telefónica)</name>
<gsm>
<network-id mcc="214" mnc="05"/>
<network-id mcc="214" mnc="07"/>
</gsm>
</provider>
</country>
</serviceproviders>

View File

@ -0,0 +1,78 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const GLib = imports.gi.GLib;
const Shell = imports.gi.Shell;
const JsUnit = imports.jsUnit;
const ModemManager = imports.misc.modemManager;
const Environment = imports.ui.environment;
Environment.init();
// Load test providers table
let countrycodesPath = GLib.getenv("GNOME_SHELL_TESTSDIR") + "/testcommon/iso3166-test.tab";
let serviceprovidersPath = GLib.getenv("GNOME_SHELL_TESTSDIR") + "/testcommon/serviceproviders-test.xml";
let providersTable = Shell.mobile_providers_parse(countrycodesPath, serviceprovidersPath);
function assertCountryFound(country_code, expected_country_name) {
let country = providersTable[country_code];
JsUnit.assertNotUndefined(country);
JsUnit.assertEquals(country.get_country_name(), expected_country_name);
}
function assertCountryNotFound(country_code) {
let country = providersTable[country_code];
JsUnit.assertUndefined(country);
}
function assertProviderFoundForMCCMNC(mccmnc, expected_provider_name) {
let provider_name = ModemManager.findProviderForMCCMNC(providersTable, mccmnc);
JsUnit.assertEquals(provider_name, expected_provider_name);
}
function assertProviderNotFoundForMCCMNC(mccmnc) {
let provider_name = ModemManager.findProviderForMCCMNC(providersTable, mccmnc);
JsUnit.assertNull(provider_name);
}
function assertProviderFoundForSid(sid, expected_provider_name) {
let provider_name = ModemManager.findProviderForSid(providersTable, sid);
JsUnit.assertEquals(provider_name, expected_provider_name);
}
function assertProviderNotFoundForSid(sid) {
let provider_name = ModemManager.findProviderForSid(providersTable, sid);
JsUnit.assertNull(provider_name);
}
// TEST:
// * Both 'US' and 'ES' country info should be loaded
assertCountryFound("ES", "Spain");
assertCountryFound("US", "United States");
// TEST:
// * Country info for 'FR' not given
assertCountryNotFound("FR");
// TEST:
// * Ensure operator names are found for the given MCC/MNC codes
assertProviderFoundForMCCMNC("21405", "Movistar (Telefónica)");
assertProviderFoundForMCCMNC("21407", "Movistar (Telefónica)");
assertProviderFoundForMCCMNC("310038", "AT&T");
assertProviderFoundForMCCMNC("310090", "AT&T");
assertProviderFoundForMCCMNC("310150", "AT&T");
assertProviderFoundForMCCMNC("310995", "Verizon");
assertProviderFoundForMCCMNC("311480", "Verizon");
// TEST:
// * Ensure NULL is given for unexpected MCC/MNC codes
assertProviderNotFoundForMCCMNC("12345");
// TEST:
// * Ensure operator names are found for the given SID codes
assertProviderFoundForSid(2, "Verizon");
assertProviderFoundForSid(4, "Verizon");
assertProviderFoundForSid(5, "Verizon");
// TEST:
// * Ensure NULL is given for unexpected SID codes
assertProviderNotFoundForSid(1);