Compare commits

...

220 Commits

Author SHA1 Message Date
3dff544396 Bump version to 3.14.3
Update NEWS.
2014-12-19 12:07:06 +01:00
7e7eab2bea gestures: Restrict actions based on keybindingMode
Just like keybindings and the message tray pointer barrier, gestures
don't always make sense - for instance, swiping up the screen shield
should not trigger the message tray just as the SelectArea action around
the left edge should not open the overview.
To avoid this, restrict gestures based on the current keybinding mode.

https://bugzilla.gnome.org/show_bug.cgi?id=740237
2014-12-19 11:48:27 +01:00
c568b44997 Calendar: ignore timeouts starting the calendar-server
In certain cases the timeout for starting the calendar helper can
be reached but the calendar helper still loads fine. If so, just
ignore the timeout and wait until we get a notification from
dbus of the successful start.

https://bugzilla.gnome.org/show_bug.cgi?id=735308
2014-12-14 17:19:12 -08:00
ce818c0ae5 calendar-server: activate evolution-source-registry manually at startup
g_dbus_proxy_new() (and library calls that wrap it) has an hardcoded
timeout of 25 seconds, which is insufficient for starting up e-s-r
in certain setups. Avoid a timeout error by starting the service
manually with a longer timeout before hand.
Also demote the error to a warning + exit failure instead of
a crash, to avoid triggering abrt reports.

https://bugzilla.gnome.org/show_bug.cgi?id=735308
2014-12-14 17:19:12 -08:00
ef2e301c08 Add ScrollView to calendar events
Added single ScrollView to make the calendar events scrollable

The calendar height will not go beyond the screen height
Calendar events for all periods will be enclosed in a single ScrollView

Moved the separator to top of the buttons while expanding

https://bugzilla.gnome.org/show_bug.cgi?id=705115
2014-12-11 18:48:22 +01:00
ba274f42b2 build: Workaround quoting issues in configure script
Default value of BROWSER_PLUGIN_DIR variable contains special symbols.
Thus quoting and inlining it in parameter expansion is not portable.
In particular it does not work in dash. Replace ${a:-b} parameter
expansion with conditional statement.

https://bugzilla.gnome.org/show_bug.cgi?id=739241
2014-11-29 16:37:54 +00:00
2ceaa05a5a gdm: fix sensitivity of auth prompt when cancelling early and user list is disabled
If the user list is disabled and the user clicks cancel quickly enough
after typing their username, they can get in a state where the
auth prompt gets stuck in the insensitive state.

This is because the login dialog code makes the prompt insensitive
while while pam is processing the provided username, but the prompt
only makes itself sensitive again when it is hidden.

This commit makes it sensitive right before asking for a username again.

https://bugzilla.gnome.org/show_bug.cgi?id=740141
2014-11-26 19:04:43 -06:00
047e454a7c gdm: disallow cancel after verification succeeds
Once verification has succeeded, the train's already
left the building and we shouldn't allow canceling.

This commit renders the cancel button non-reactive
and makes the cancel function be a noop after
verification succeeds.

https://bugzilla.gnome.org/show_bug.cgi?id=740141
2014-11-26 19:04:29 -06:00
86618ce1f9 network: properly remove connections from list
Due to a typo we were always removing the first (index 0) connection
from the global list of connections instead of the correct one.

This resulted in some connections remaining in the shell's connection
list long after they were removed.  In particular, this resulted in
multiple copies of a bluetooth connection appearing after suspend/resume
(when the device was readded and the cached connection list was
rescanned).

https://bugzilla.gnome.org/show_bug.cgi?id=740227
2014-11-26 16:08:17 -05:00
59724c5dd5 Bump version to 3.14.2
Update NEWS.
2014-11-12 19:30:14 +01:00
3bb500fed4 viewSelector: Hide workspace page after animating to app picker
WorkspacesDisplay relies on being hidden to disable workspace switches
by scrolling or panning. Usually viewSelector will hide the previous
page on page switch, but we currently miss the case when opening the
overview at the app picker, where the workspaces page is still shown
for the transition, but never hidden.
Fix this by calling hide() in addition to setting the opacity to 0 at
the end of the overview animation.

https://bugzilla.gnome.org/show_bug.cgi?id=737534
2014-11-12 19:19:31 +01:00
dcd3945bb7 Move style updates in AppIcon._onStateChanged out
There is currently no simple way to inject into AppIcon's state change,
so an extension that wants to do this has to destroy/remove/update all
icons in the Shell (i.e. in the Dash, AllView, FrequentView) on enable()
and disable() after updating AppIcon.prototype._onStateChange, or the
extension must require a restart of the Shell.

To solve this issue, we rename _onStateChanged to _updateRunningStyle,
and connect the notify::state signal with an anonymous function that
calls _updateRunningStyle.
This extra function call should allow extensions to just extend the
updateRunningStyle function in the prototype.

https://bugzilla.gnome.org/show_bug.cgi?id=739497
2014-11-06 21:31:47 +01:00
f414f616c4 dateMenu: Fix typo in _isToday()
getDay() is the day of week, what we want there is getDate().

https://bugzilla.gnome.org/show_bug.cgi?id=738725
2014-11-03 15:05:59 +01:00
e21e90c5e6 networkAgent: Support NM versions without :capabilities
Commit 926de53c0c bumped the requirement for NetworkManager,
which is problematic on a stable branch; optionally fall back to
the previous code.

https://bugzilla.gnome.org/show_bug.cgi?id=738485
2014-10-31 12:41:23 +00:00
1e7b2ef51f Bump version to 3.14.1.5
Update NEWS
2014-10-30 11:22:27 +00:00
c291de7479 Calendar: Inline _ellipsizeEventTime into caller
This patch inlines the function _ellipsizeEventTime into its only caller
_addEvent. This also removes the need for the global const
EventEllipses and is thus removed by this commit as well.

https://bugzilla.gnome.org/show_bug.cgi?id=727302
2014-10-27 19:33:25 -05:00
aee1a18270 Calendar: sort multi-day events by ending day/time
With commit dc6a60dde, the calendar displays the ending day and time of
a continuing multi-day event on its ending day. This results in the list
not appearing to be sorted. This patch sorts the list according to the
displayed day/time.

With the two appointments
Thursday 0800-1000 Foo, and Wednesday 0900-Friday 1200 Bar and today
being Monday, the rest of the week list currently displays:
F ...1200 Bar
T    0800 Foo
With this patch, the displaying order is switched because Friday comes
after Thursday.

https://bugzilla.gnome.org/show_bug.cgi?id=727302
2014-10-27 19:33:25 -05:00
6c67f26e7d Calendar: Show multi-day event continuation
Currently, multi-day events are shown as individual appointments on each
day.  This patch ellipsizes multi-day events to indicate continuation on
the prior or following day (or other time-period.)

The time label spot is now replaced by a box layout that contains the
prefix ellipsis label, the time label and the postfix ellipsis label.
In order to keep the alignment, ellipses are merely invisible (zero
opacity) when hidden.

The ellipses are styled using the events-day-time-ellipses class which,
by default, take the color of the event text.

When RTL is used, the box contents are adjusted accordingly (clutter
does that for us).

An event spanning three days now displays "...All Day..." in the
calendar on the second day.

https://bugzilla.gnome.org/show_bug.cgi?id=727302
2014-10-27 19:33:25 -05:00
deb651acbf BackgroundCache: plug an Animation object leak
We need to return early in case the animation file is the same,
otherwise we'll create a new Animation object and leak the previous
one.

https://bugzilla.gnome.org/show_bug.cgi?id=739252
2014-10-27 18:28:39 +01:00
d2011f6d7f messageTray: Summarize notifications when messages queue up
It is really annoying for the user to acknowledge multiple notifications
when they queue up. So, to prevent a notification flood that has to be
handled by the user one-by-one, a summarized-notification feature is
added which leaves a single summarized-notification for the user,
replacing multiple notifications if the number exceeds 1, which they may
or may not acknowledge. When this summarized-notification is acknowledged,
the message-tray is opened where they can view the notifications that were
summarized. This helps the user concentrate on his primary task
simultaneously informing them about the new notifications.

https://bugzilla.gnome.org/show_bug.cgi?id=702460
2014-10-27 18:22:36 +01:00
416adec904 Fix handling of SystemBackground
Since the background rework, SystemBackground is no longer a transparent
actor that you have to stack on top of a solid background, it is an
opaque actor. Fix the color of the background actor, and remove places
where we were setting the background color underneath the system background
and expecting blending - in particular, we can always set no_clear_hint
on the stage.

https://bugzilla.gnome.org/show_bug.cgi?id=738652
2014-10-16 17:17:33 -04:00
a72dca3610 Bump version to 3.14.1
Update NEWS.
2014-10-14 21:04:00 +02:00
5e5035a0f7 StWidget: carefully clear ->accessible pointer to avoid resurrection
The pointer to ->accessible was cleared too early in dispose, which
resulted in another accessible object being created when the actor
was removed from its parent in clutter_actor_dispose(). Use a
weak reference instead to clear the ->accessible pointer.

https://bugzilla.gnome.org/show_bug.cgi?id=738147
2014-10-13 12:46:35 -04:00
ffdb85e003 messageTray: add some missing signal disconnections
Disconnect some signal connections that weren't disconnected on actor destroy
(not the result of comprehensive review.)

https://bugzilla.gnome.org/show_bug.cgi?id=738256
2014-10-13 11:50:12 -04:00
6a969b934f gdm: fix missing braces
Incorrect braces meant that if the ShellUserVerifier was destroyed before
the call to fprintManager.GetDefaultDeviceRemote(), the reply would result in
an error.

https://bugzilla.gnome.org/show_bug.cgi?id=738256
2014-10-13 11:50:12 -04:00
8d3ff56846 gdm: disconnect signals
Many signal connections on global objects and on non-widgets were not
disconnected when the unlock screen was destroyed, causing leaks.

https://bugzilla.gnome.org/show_bug.cgi?id=738256
2014-10-13 11:50:11 -04:00
d8d046f2b3 AuthPrompt: properly remove user widgets
When replacing a user widget, we need to destroy the child, not just
unparent it, or it will leak.

https://bugzilla.gnome.org/show_bug.cgi?id=738256
2014-10-13 11:50:11 -04:00
0bec76b6ee app-well: Set menu width
Currently the app well menu has unrestricted with which can cause it to grow
with long window titles and can even go offscreen that way.

So set a max size, long titles will now be properly elipised.

https://bugzilla.gnome.org/show_bug.cgi?id=738054
2014-10-13 15:39:31 +02:00
aa3aea7520 window-tracker: Also listen for changes in the gtk-application-id
Wayland applications don't tend to have very useful WM Class properties,
as GTK+ isn't very good at picking an appropriate application ID. While
we should likely fix GTK+ to pick a better app ID, we do have the
existing gtk_shell for more accurate information. The only problem is
that the gtk_surface is set after the MetaWindow is constructed, and
we're not listening for changes on the GTK+ application ID.

Listen to changes on the GTK+ application ID to fix app tracking for
most GTK+ applications under Wayland.
2014-10-12 17:20:22 -07:00
49fcc93a4b window-tracker: Fix minor style issue 2014-10-12 17:20:12 -07:00
eaec459ee9 st: Bail out on clipboard requests if there is no text.
If a selection request happens through foreign means, the selected
text is NULL, and a crash happens.

https://bugzilla.gnome.org/show_bug.cgi?id=738314
2014-10-10 19:37:40 +02:00
72c6f0025d status/keyboard: Ensure we always have at least one input source
Most of the code handles the sources setting being empty and
InputSourceManager.currentSource being null because previously the
"model" (i.e. the sources list) was kept in gnome-settings-daemon.

But this is fragile and since we're now the canonical place where the
list lives we can force it to never be empty even if the gsetting is
empty or contains only invalid entries.  Adding the default keyboard
layout in that case is the safest thing to do.

https://bugzilla.gnome.org/show_bug.cgi?id=738303
2014-10-10 18:45:45 +02:00
aa3caff714 overviewControls: Really fix x align
Commit a4475465f1 fixed the wrong alignment for the fully visible
control, but regressed the partially slid-out one; take the slideX
factor into account to get the right offset for both cases.
2014-10-10 11:16:35 +02:00
522ccaba3f Updated Italian translation 2014-10-10 08:02:28 +00:00
3d00864599 Updates Persian Translations 2014-10-10 10:53:08 +03:30
bd3dfb8f6a Fix wrong comment 2014-10-09 14:55:13 +02:00
1b3c89f32b shell-recorder: Disable unredirection while recording
This is required to be able to record windows that would
otherwise be unredirected.

https://bugzilla.gnome.org/show_bug.cgi?id=738226
2014-10-09 14:52:25 +02:00
a4475465f1 overviewControls: Fix thinko in SlideLayout
Controls that slide left are located on the left, so the offset to
align them with the corresponding edge is always 0. It's controls
on the right that need a different offset when the available width
exceeds the child's width.

https://bugzilla.gnome.org/show_bug.cgi?id=728899
2014-10-09 14:21:23 +02:00
84f14cb61c Updated Kazakh translation 2014-10-09 10:54:59 +00:00
d0de411a59 iconGrid: Fix slowness on pulse animation for few items
Currently we use the same amount of total delay divided by all items,
but that makes the items animate slow if the amount of items is small.
To avoid that, use a smaller total amount delay for an amount of items
smaller than four.

https://bugzilla.gnome.org/show_bug.cgi?id=737017
2014-10-09 12:47:16 +02:00
2b9645b268 Use MetaWindow.get_frame_rect()
get_outer_rect() has been deprecated for a while, use the new
function instead.
2014-10-09 12:17:15 +02:00
4f08bebbf0 Updated Italian translation 2014-10-09 07:37:11 +00:00
4e8c476153 screenShield: fix trace back when unlocking session from another vt
commit 1d374ac8bd introduced a bug that
prevents unlock from working when initiated from another VT
(user switching).

This commit fixes the exception raised.

https://bugzilla.gnome.org/show_bug.cgi?id=708105
2014-10-08 09:43:33 -04:00
1d374ac8bd screenShield: focus login screen after lifting shield
This commit ensures the login screen gets focused after
the screen shield is raised.

The code affects the unlock screen as well, but it's
less important since the unlock screen gets destroyed
and recreated each time the curtain moves, so it
has an opportunity to take focus on its own.

https://bugzilla.gnome.org/show_bug.cgi?id=708105
2014-10-07 10:54:48 -04:00
83f0f4ea36 layout: Add the feedback group to the uiGroup
This makes DND under Wayland visible under the magnifier.
2014-10-06 17:08:20 -07:00
18f569280c userWidget: Respect the scale factor in the bin size we set
Otherwise, the widget will be too small on hi-DPI devices.

Based on a patch by: Darcy Beurle <darcy@beurle.id.au>

https://bugzilla.gnome.org/show_bug.cgi?id=735419
2014-10-06 17:02:04 -07:00
fc0c98805f Updated Spanish translation 2014-10-06 13:01:23 +02:00
6722b69b8a Updated Portuguese translation 2014-10-05 21:08:06 +00:00
f9d909f985 screenshot: Respect lockdown settings
We allow users/admins to lock down disk writes, respect that when
taking screenshots.

https://bugzilla.gnome.org/show_bug.cgi?id=737846
2014-10-03 17:08:56 +02:00
dd42cfa853 screencast: Re-add lockdown support
Commit 81bb7009ea removed support for the disable-disk-writes
lockdown feature for screencasts, add it back.

https://bugzilla.gnome.org/show_bug.cgi?id=737846
2014-10-03 17:08:56 +02:00
4ed4bb330e screencast: Don't leak recorders on failure
ShellRecorder.record() may fail, remove the recorder from the map
in that case.

https://bugzilla.gnome.org/show_bug.cgi?id=737846
2014-10-03 17:08:56 +02:00
f02b007337 shell-screenshot: Only allow one screenshot request at a time per sender
We currently allow infinite number of screenshot requests to be active at
the same time, which can "dos" the system and cause OOM.

So fail subsequent requests for the same sender when a screenshot operation
is already running.

https://bugzilla.gnome.org/show_bug.cgi?id=737456
2014-10-03 16:22:36 +02:00
0035de4ab7 screencast: Properly stop all recordings on session mode changes
We currently just clear out the map of recorders (which results
in the top bar indicator to be hidden), but don't stop the actual
recordings.
Spotted by Adel Gadllah on IRC.
2014-10-03 16:19:41 +02:00
28552d4b38 Updated Chinese (Taiwan) translation 2014-10-02 12:04:11 +00:00
42066a7c46 dateMenu: Don't generate JS garbage every clock tick
Instead of waking up the JS every second to set the clock and update a
date label the user will rarely see, simply use property binding to
bypass JS string handling, and update the date in the menu when the menu
is opened.
2014-10-01 15:42:49 -06:00
45847470d1 Updated German translation 2014-10-01 20:18:07 +00:00
72b0a3d78f search: Change order of duplicate search check
Checks for a duplicate search before setting the current search
to true and before cancelling the current search. This ensures that
if a duplicate search occurs while the previous search is still active,
the duplicate search will not incorrectly cancel or change the state
of the previous search.
2014-10-01 07:32:06 -06:00
fc3ad390b7 Updated gujarati translations 2014-10-01 15:52:13 +05:30
926de53c0c networkAgent: pass VPN hints to auth dialogs
Indicate to NetworkManager that the Shell's agent supports VPN
hints, and pass those hints to VPN auth dialogs that also indicate
that they support hints.

VPN plugins can request new secrets, for example if the previous
ones are incorrect (eg, user mis-typed the password) or some other
reason (next token code required to re-sync a hardware token).
The specific secret that the VPN wants, and a VPN-specific message,
are passed in hints from the plugin, to NetworkManager, to the
agent (GNOME Shell) and then to the auth dialog.

https://bugzilla.gnome.org/show_bug.cgi?id=737592
2014-09-30 09:34:44 -05:00
e6cd112379 search: Reset the search display when there's no search terms
Destroy the previous search view when there's no search terms, to make
sure old search items don't show up.
2014-09-30 00:55:01 -06:00
2cefc8be27 search: Match an empty array, not a null one
When the terms are missing, we pass an empty array, not a null one.
2014-09-30 00:55:01 -06:00
991179835e search: Factor out a function 2014-09-30 00:55:01 -06:00
0ca2fee54f layout: Don't update the input region while we have a modal
If we have a modal, the stage's input region doesn't really matter --
all events go to us anyway. To avoid doing extra work doing animations
when we have a modal, like menus, the overview, and the message tray,
just fizzle out all updates.

To make sure we catch updates, update the input region whenever we end a
modal.

https://bugzilla.gnome.org/show_bug.cgi?id=737001
2014-09-30 00:23:48 -06:00
778ef365d9 search: hide provider actors when they're created
When the overview is created, search is populated with one actor for
each provider. As they're not hidden though, they will contribute to the
overall size request of the search page, which will shift upwards the
overview grid.

Reviewed-By: Jasper St. Pierre <jstpierre@mecheye.net>
2014-09-29 22:42:25 -07:00
45937ed85d Updated Latvian translation 2014-09-28 16:38:01 +03:00
65a9c09c9c Updated Norwegian bokmål translation. 2014-09-27 15:33:54 +02:00
67b14d5fe5 st-entry: Implement Ctrl-u / Ctrl-k keybindings
These keybindings are well-established on the CLI (e.g. "kill-line"
and "unix-line-discard" in readline(3)), and adding support for them
is cheap ...

https://bugzilla.gnome.org/show_bug.cgi?id=737346
2014-09-26 22:03:31 +02:00
f976e46c46 Updated Norwegian bokmål translation. 2014-09-26 17:26:52 +02:00
7026209eae status/keyboard: obtain keyboard variant from IBus
This will fix unable to show keyboard variant from IBus through menu.

https://bugzilla.gnome.org/show_bug.cgi?id=735066
2014-09-26 17:08:25 +02:00
1e82d6edc2 windowMenu: Only disable "Always on Top" for fully maximized
Since (mutter) commit 49400657caae27 we disable the "Always on Top"
action for maximized windows, however when commit e7af257814
moved the window menu into the shell, this behavior was accidentally
extended to partially maximized (including tiled) windows.
As it can be desirable in this case to keep the window visible while
interacting with a different one, restore the previous behavior.

https://bugzilla.gnome.org/show_bug.cgi?id=737382
2014-09-25 23:10:03 +02:00
50ac1dd197 background: when a file changes, remove it from the image cache
MetaBackgroundCache doesn't itself use file watches, so when a image
that we are monitoring changes we need to purge it from the cache,
so that when we load it again we get the new image.

https://bugzilla.gnome.org/show_bug.cgi?id=710756
2014-09-24 23:06:07 -04:00
9d933356e1 keyboard: Make sure to destroy the key's BoxPointer
When the keyboard is destroyed, we destroy the keyboard actor, but the
keyboard's menu isn't part of the key itself, so it's never tracked.

The menus are actually tracked actors, so they slow down the layout
manager's code to rebuild regions and other things. Keeping this list
small is a good idea.

To prevent leaking menus, destroy the menu when the key is destroyed.

https://bugzilla.gnome.org/show_bug.cgi?id=736999
2014-09-23 15:58:08 -06:00
c2a5c00111 Updated Telugu translation 2014-09-23 14:19:29 +00:00
edb561a6ff update zh_CN translation 2014-09-23 19:43:00 +08:00
14c2460fe4 Updated translation for Afrikaans (af), with contributions by Dawid Loubser 2014-09-23 12:41:31 +02:00
598362448a Updated Hindi translation 2014-09-23 10:08:41 +00:00
845273d4c0 Updated Bengali (India) translation 2014-09-23 05:53:57 +00:00
3aebfdc319 Updated Czech translation 2014-09-23 07:07:12 +02:00
f423c371c8 Updated Galician translations 2014-09-23 01:51:11 +02:00
6fe1ad62ba Updated Serbian translation 2014-09-22 23:06:40 +02:00
63efe1db11 iconGrid: Don't use clones for pulse animation
The spring animation has to use clones to escape any clip set on the
parent, as it mainly occurs outside the parent. The same does not apply
to the pulse animation, which is very much in place - in fact, if the
parent is clipped (for instance a scrolled app folder), not having the
clip applied to the animated icons is indeed wrong.
Just animate the original grid actors instead, which gives the expected
result.

https://bugzilla.gnome.org/show_bug.cgi?id=736885
2014-09-22 20:46:41 +02:00
002ae0e7f1 Bump version to 3.14.0
Update NEWS.
2014-09-22 20:46:41 +02:00
4f5e5e1999 Update Czech translation 2014-09-22 15:16:22 +02:00
f4feb409ff Updated Kannada translation 2014-09-22 06:45:32 +00:00
05a035e6fd Updated Greek translation 2014-09-21 13:34:47 +00:00
7c2a3cc233 update Punjabi Translation - back for 3.14 2014-09-21 07:48:14 -05:00
7f660fd4d7 Updated Korean translation 2014-09-21 11:25:12 +09:00
c0730b610e Updated Ukrainian translation 2014-09-20 23:19:20 +03:00
b0cfcc4842 Updated Spanish translation 2014-09-20 19:05:06 +02:00
1afc9fefcc Updated Danish translation 2014-09-20 09:40:24 +02:00
90bea5785e Updated Kannada translation 2014-09-19 18:51:44 +00:00
61dacf3d91 Updated Hindi translation 2014-09-19 16:08:04 +00:00
3ae45bddad appDisplay: Hide empty app folders
Trying to open an empty folder currently leaves the parent view in a
rather confused state. While we should look into fixing this in the
future, empty folders are not useful at all to begin with, so hide them.

https://bugzilla.gnome.org/show_bug.cgi?id=736910
2014-09-19 15:12:03 +02:00
9ad4070d58 Updated German translation 2014-09-18 21:37:54 +00:00
1981b21ea8 Updated Spanish translation 2014-09-18 19:22:41 +02:00
9896135c97 a11y: set again NO_AT_BRIDGE=1 before calling meta_init()
It was removed on commit
70099872ab
because it was thought to not be needed anymore.

https://bugzilla.gnome.org/show_bug.cgi?id=736821
2014-09-18 15:37:10 +02:00
0d340099da Updated Oriya translation 2014-09-18 12:13:47 +00:00
cacc780111 Updated Nepali translation 2014-09-17 19:47:06 +00:00
a9a6da08a1 Updated Russian translation 2014-09-17 20:45:46 +04:00
ccb6b93b65 Bump version to 3.13.92
Update NEWS.
2014-09-17 06:36:54 +02:00
5623f3b4b5 messageTray: Add focusTrap
The summary container will trap the focus if any sources are present,
making the message tray menu unreachable by keynav. Apply the same
hack as in searchDisplay and add a focusTrap to move the focus manually
as necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=707799
2014-09-17 06:19:08 +02:00
a227d595f5 Updated Swedish translation 2014-09-16 20:15:14 +00:00
012955e341 Updated Danish translation 2014-09-16 20:54:42 +02:00
a41cd7d3cc appFavorites: Add gnome-boxes to the rename list 2014-09-16 17:14:36 +02:00
11d947f1e5 l10n: Update Japanese translation 2014-09-16 22:14:02 +09:00
2bb717b0b7 Updated Turkish translation 2014-09-16 09:04:55 +00:00
770f8c6538 Updated Malay translation 2014-09-16 06:49:52 +00:00
e76e0042a8 Updated Marathi Translations 2014-09-16 10:08:16 +05:30
91e266113c appFavorites: Add games to the rename list
Can't wait to double the size of this list when these start using D-Bus
activation.

These were actually renamed in GNOME 3.12, but we couldn't do anything
about it before, and now we can.
2014-09-15 17:05:06 -05:00
ed2956a2ea Updated Bulgarian translation 2014-09-15 20:21:14 +03:00
aa6f352cb0 st-box-layout: Don't report a paint volume when we have no allocation 2014-09-15 17:35:17 +02:00
5a42a91ee0 Updated Assamese translation 2014-09-15 09:30:21 +00:00
4d682c7861 [l10n] Updated Catalan (Valencian) translation 2014-09-14 23:34:57 +02:00
20fec42496 [l10n] Update Catalan translation 2014-09-14 23:34:55 +02:00
437df2f0bd Updated Slovak translation 2014-09-14 19:33:52 +00:00
445aa54622 Finnish translation update by Jiri Grönroos 2014-09-14 19:56:41 +03:00
7fa9ca0a9c Updated Hungarian translation 2014-09-14 13:23:25 +00:00
0fe7ae1810 Updated Russian translation 2014-09-14 15:25:43 +04:00
9c251d85cf Updated Hebrew translation 2014-09-13 23:32:50 +03:00
959b5fe5cf Added Nepali translation 2014-09-13 19:07:46 +00:00
75a8bf626a Updated Slovenian translation 2014-09-13 21:04:13 +02:00
eb514f335c Updated Korean translation 2014-09-14 01:13:56 +09:00
ad77b4ddfc Updated Tamil translation 2014-09-13 16:10:22 +00:00
534bf2b000 Updated Tamil translation 2014-09-13 16:02:03 +00:00
3821fd04a4 Updated Indonesian translation 2014-09-13 08:39:25 +00:00
b55b9cc7a9 Updated Brazilian Portuguese translation 2014-09-13 01:50:33 +00:00
ac6462c7c6 Update Arabic translation 2014-09-13 03:11:12 +03:00
aa7b0a285b search: Do not use deprecated GSettings:schema 2014-09-12 23:56:56 +02:00
0a63de8c8d Updated Polish translation 2014-09-12 23:50:15 +02:00
0992bd41ed background.js: fix updating a BackgroundSource on monitor changes
It was assumed that BackgroundSource objects were always destroyed
on monitor changes because the BackgroundManager objects that hold
references were destroyed, but sequencing of updating of different
BackgroundManager objects meant that was not the case.

Properly update any cached Background objects held by the
BackgroundSource on a change to the monitor layout; in particular this
means updating animations in case they are multi-resolution.
2014-09-12 17:10:04 -04:00
ed52a5a58b Updated Lithuanian translation 2014-09-12 22:29:16 +03:00
79bf770783 Updated French translation 2014-09-12 17:09:58 +00:00
c7e3b68dcd location: Add link to corresponding Settings
All other submenus link to the corresponding settings, so we should
do the same for location - the privacy panel in this case, which now
sports a "Location Services" switch ...

https://bugzilla.gnome.org/show_bug.cgi?id=736542
2014-09-12 18:59:36 +02:00
1b9318c82f keyring: Fix dialog layout in RTL locales
Another case of "StTable used to handle this for us" ...
2014-09-12 13:25:35 +02:00
6a142c4260 Remove some apps from the default favourite apps list
Remove Empathy, LibreOffice Writer and Documents.

https://bugzilla.gnome.org/show_bug.cgi?id=735682
2014-09-12 12:49:20 +03:00
c49f2e1384 search: Only queue an immediate search if we don't have one queued 2014-09-11 18:01:23 -06:00
9208473e59 search: Be a bit more careful in _doSearch about timeouts 2014-09-11 17:51:12 -06:00
08ece4c186 search: Fix timeout ordering 2014-09-11 17:50:56 -06:00
99c29366ee search: Make sure to clear the timeout 2014-09-11 17:40:00 -06:00
7a11964dfb search: Fix indentation 2014-09-11 17:14:54 -06:00
c4922f6624 search: Move the timeout for searching into setTerms
This lets us considerably clean up the event flow here and change how
things are structured. It also makes sure that we never show "No
Results" -- search.js not being aware of the timeout means that it might
not think that any work was being done when we show the page.
2014-09-11 17:10:26 -06:00
4f2070a7c6 search: Track search status more accurately
Keep a flag depending on whether a provider is in-flight, and use that
to determine what status label to show.

This ensures that we only show "No Results" when we're done searching
and we're sure that all providers have returned results back to us.
2014-09-11 17:10:26 -06:00
03177dc474 search: Merge SearchSystem with SearchResults
The complexities of tracking these two things separately, with the
display on one half, and the searching on the other half, is difficult
to manage. Squash it all together.
2014-09-11 17:10:26 -06:00
b9b4886a6f search: Don't bother clearing the result display twice
It's just extra work, and breaks our hide/show hack to prevent the
flashing on search results.
2014-09-11 17:10:25 -06:00
33e35f269f overview: Use a MetaWindow argument in window-drag-* signals/API
It is quite weird to have those calls/signals using WindowClone as an
argument, it is neater to pass MetaWindows around, and have each user
deal with their own representations of these.

https://bugzilla.gnome.org/show_bug.cgi?id=735972
2014-09-12 00:57:40 +02:00
b886656f61 workspace: Take a MetaWindow as argument to setReservedSlot()
And use it to lookup the local WindowClone that applies. Otherwise,
WorkspaceThumbnail.WindowClone objects may be mistakenly set, which
are not usable interchangeably with Workspace.WindowClone ones. This
may lead to several misbehaviors as fields available in the second
object but not in the first one are accessed, some those undefined
values get used in math ops, which result in NaNs over the place.

Likewise, the similar functions in WorkspacesViewBase subclasses take
now MetaWindow arguments too.

https://bugzilla.gnome.org/show_bug.cgi?id=735972
2014-09-12 00:57:40 +02:00
8589bfb62e Implement input source switching
Instead of calling out to gnome-settings-daemon we'll just implement
the switching logic ourselves and use mutter APIs that allow this
functionality to work both in X sessions and when we're a Wayland
compositor.

Switching IBus engines is done transparently as well just like g-s-d
used to do.

https://bugzilla.gnome.org/show_bug.cgi?id=736435
2014-09-11 19:14:46 +02:00
6a36a68f32 ibusManager: Spawn ibus-daemon
gnome-settings-daemon doesn't this for us anymore. Note that
ibus-daemon isn't DBus activatable but just spawning it is fine
because it does its own single instance management. The library
notifies us when it shows up and goes away through the connected and
disconnected signals.

https://bugzilla.gnome.org/show_bug.cgi?id=736435
2014-09-11 19:14:46 +02:00
a0a701757e status/keyboard: Move all UI elements to the indicator class
This will allow us to have multiple indicator instances, e.g. show a
indicator next to text entries in modal shell dialogs.

https://bugzilla.gnome.org/show_bug.cgi?id=736435
2014-09-11 19:14:46 +02:00
effe6fab3a status/keyboard: Factor out an InputSourceManager class
https://bugzilla.gnome.org/show_bug.cgi?id=736435
2014-09-11 19:14:46 +02:00
8e560f98d1 status/keyboard: Factor out a KeyboardManager class
This code will grow in a forthcoming patch so let's move it out.

https://bugzilla.gnome.org/show_bug.cgi?id=736435
2014-09-11 19:14:46 +02:00
58aabfcf5b status/keyboard: Move IBusManager into its own file
This also makes it a singleton for easier access from multiple places.

https://bugzilla.gnome.org/show_bug.cgi?id=736435
2014-09-11 19:14:45 +02:00
19e3f794f8 status/keyboard: Remove unused variable
https://bugzilla.gnome.org/show_bug.cgi?id=735976
2014-09-11 19:12:17 +02:00
2b1077aaa1 switcherPopup: Factor the initial selection into the base class
Only the application switcher needs to keep its own implementation
since it has two modes of operation depending on the binding.

https://bugzilla.gnome.org/show_bug.cgi?id=735976
2014-09-11 19:12:17 +02:00
547cdf86cc switcherPopup: Move _createSwitcher implementations into constructors
We don't really need this step as a separate method since all
implementations are supposed to be created and shown immediately. This
also ensures that we have items to show in all subclasses.

https://bugzilla.gnome.org/show_bug.cgi?id=735976
2014-09-11 19:12:17 +02:00
7653175c6f location: Translate accuracy level for geoclue
The enums values of geoclue have gaps in them (so more levels could be
added in future) but enum values of settings don't have such gaps so we
gotta translate between them.

Since desrt says that enums as integers in gsettings are bad, we now
treat accuracy level settings as string.

This fixes the recent regression of geoclue only allowing geiop level
accuracy to apps.

https://bugzilla.gnome.org/show_bug.cgi?id=736479
2014-09-11 17:43:46 +01:00
a4c1b55111 endSessionDialog: Fix DialogContent const
Fallout from commit 0258c7a518 ...
2014-09-11 17:05:48 +01:00
93205eefb9 global: Filter out destroyed actors from get_window_actors()
All current code assumes that the list of window actors corresponds to the
list of windows; however as the list returned by meta_get_window_actors()
now includes actors during the destroy animation, that assumption breaks.

Eventually we should make everyone move to a more appropriate API, but
for now make it work again by returning a filtered list of "good"
window actors.

https://bugzilla.gnome.org/show_bug.cgi?id=735927
2014-09-11 16:51:31 +01:00
ec3f8d4b85 endSessionDialog: Port offline updates to PackageKit's dbus interface
https://bugzilla.gnome.org/show_bug.cgi?id=736337
2014-09-11 16:13:42 +02:00
0258c7a518 endSessionDialog: Use DialogType constants instead of magic numbers 2014-09-11 15:04:46 +01:00
ebfdb8ec3c Updated German translation 2014-09-10 17:51:53 +00:00
6823bad2d8 popupMenu: Adjust submenu arrows to RTL icon changes
Since commit e04e507659, we will already get the right icon for the
submenu arrow, so we must not mirror it again. However we do need to
take the text direction into account for the rotation now (but that's
not actually too bad - the resulting code gets quite a bit easier).

https://bugzilla.gnome.org/show_bug.cgi?id=736343
2014-09-09 19:48:41 +02:00
491100c7ee appDisplay: Only allow ctrl-click for apps that can open new windows
Trust the heuristics in shell_app_can_open_new_window() to get it right
more often than not, and add an appropriate check in activate(). This
makes the behavior consistent with the dash, e.g. we will try to open
a new window (and show the corresponding animation) for apps that don't
have a "New window" item in their dash context menu.

https://bugzilla.gnome.org/show_bug.cgi?id=736329
2014-09-09 15:57:15 +02:00
762e770c84 update Punjabi Translation - back for 3.14 2014-09-08 19:29:30 -05:00
c214e3b07a Updated Czech translation 2014-09-08 12:37:49 +02:00
b656b1c22f Updated gujarati translations 2014-09-08 14:21:58 +05:30
d211680534 build: Bump GTK+ requirement
... for GTK_ICON_LOOKUP_DIR_{RTL,LTR}
2014-09-07 22:37:06 +02:00
d44c3d0cd3 iconGrid: Make actors reactive on animating out as well
Commit 9e5704b introduced a regression due to a sloppy mistake not
making actors reactive on animation out.
Fix that making actors reactive when animating out as well.
2014-09-07 13:03:24 +02:00
6cb1692841 Finnish translation update by Jiri Grönroos 2014-09-07 13:40:56 +03:00
593acb954d extensionPrefs: Improve handling of OutOfDate extensions
Our current UI is horrible in dealing with outdated extensions - we
don't give users any indication at all that something is not working as
expected (unless hiding the prefs button as we did until the last commit
counts).
To fix this, make the enable switch insensitive to indicate OutOfDate
extensions.

https://bugzilla.gnome.org/show_bug.cgi?id=736185
2014-09-06 22:06:23 +02:00
d209bc69b6 extensionPrefs: Remove version check from extensionAvailable()
It is confusing to treat outdated extensions as if they didn't exist
in some places, but like any other extensions elsewhere. In particular
gnome-tweak-tool still allows to launch prefs for them while making
it clear to users that the extension will not work - opening the
list of installed extensions in that case is unexpected and confusing.
Just remove the version check for now, we will soon follow tweak-tool
and use it to disable the extension switch instead.

https://bugzilla.gnome.org/show_bug.cgi?id=736185
2014-09-06 22:06:23 +02:00
4d64bbcf7d extensionSystem: Fix reloading on version-validation changes
The current code only works for enabled extensions, which means
that extensions that were marked OUT_OF_DATE cannot be enabled
without a restart when disabling the version check.
Fix this by reloading all extensions while making sure to only
enable any extensions when we're supposed to.

https://bugzilla.gnome.org/show_bug.cgi?id=736185
2014-09-06 22:06:07 +02:00
5bd4329b11 iconGrid: Fix latest commit
Wrong copy/paste, the "out" direction should use max distance between
source actor and original actor animating as latest item.
2014-09-06 14:07:22 +02:00
02870e5363 iconGrid: Remove unuseful comment 2014-09-06 13:54:09 +02:00
2a59478b37 iconGrid: Fix last item check on spring animation
Currently we consider the last item animating being the last actor of
the list, but that's wrong since the last item animating depends on the
distance between the source actor and the original position of the
animated actor.

Take that into account to check the last item of the animation.
2014-09-06 13:54:01 +02:00
04030f22a6 Updated Slovak translation 2014-09-06 12:17:09 +02:00
2cc4558018 l10n: Update Japanese translation 2014-09-06 13:27:39 +09:00
215eb5c65f windowManager: limit the "switch app" gesture to !overview.visible
This gesture only makes sense to be triggered outside the overview, when
dealing with application windows themselves.

https://bugzilla.gnome.org/show_bug.cgi?id=736110
2014-09-06 00:50:00 +02:00
5faef316b8 Revert "wobbly"
This reverts commit 6751ca4c18.

As fun as it is, I don't think we want this by default.
2014-09-05 14:51:01 -07:00
6751ca4c18 wobbly 2014-09-05 14:37:18 -07:00
84e0a20701 shellEntry: Remove unused style class 2014-09-05 14:37:18 -07:00
e04e507659 texture-cache: Use LTR/RTL icon lookup flags 2014-09-05 10:25:19 -07:00
6a48dee037 Updated Russian translation 2014-09-05 17:56:05 +04:00
ea3fd0cf65 main: Fix code indentation
This has been bothering me for a while.
2014-09-04 17:55:40 -07:00
9c614057be Updated Korean translation 2014-09-05 07:09:38 +09:00
8096e71c53 Fix problem when background settings change multiple times in rapid succession
The code that cleaned up when a background actor was destroyed tried to access
the Background as backgroundActor.background._delegate but when the destroy
signal is emitted, the MetaBackgroundActor was already disposed and
backgroundActor.background NULL.
2014-09-04 10:07:24 -04:00
73977795a6 Revert accidental commit "Test stuff"
This reverts commit 3b3445146d.
2014-09-03 13:47:18 -04:00
3b3445146d Test stuff 2014-09-03 13:45:01 -04:00
650dea017b Adapt to Mutter background changes
The rewrite of Mutter's background code (see bug 735637) requires
corresponding changes here - we no longer need to layer multiple
MetaBackgroundActors together.

The general strategy is that a BackgroundSource object is created
per GSettings schema, and keeps either one Background/MetaBackground pair,
or, for animation, a Background/Metabackground pair for each monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=735638
2014-09-03 13:45:01 -04:00
70099872ab a11y: initialize clutter accessibility always.
In order to ensure that is clutter AtkUtil implementation the current one.

https://bugzilla.gnome.org/show_bug.cgi?id=735908
2014-09-03 18:45:32 +02:00
dc5618558f popupMenu: Force submenu arrow rotation angles to multiples of 90
When you open or close a PopupSubMenu the arrow icon rotates, but
the code previously assumed that the starting angle was a multiple
of 90.  If you click the submenu fast enough the rotation could overlap
with the previous rotation and you'd get something that wasn't a multiple
of 90.
Now we ensure that the ending arrowRotation angle is always a multiple
of 90 regardless of what the starting angle is.

https://bugzilla.gnome.org/show_bug.cgi?id=728927
2014-09-03 17:50:03 +02:00
62481f4b7c Updated Polish translation 2014-09-03 16:21:24 +02:00
d3418f6381 Bump version to 3.13.91
Update NEWS.
2014-09-03 14:22:32 +02:00
57dd862e35 keyboard: Update for new code
_cursorChanged was folded into _sync at some point.
2014-09-02 14:47:48 -07:00
db76fb8ff9 iconGrid: Fix a typo
It was making icons of the spring animation going/returning to the wrong
position of the dash icon.
2014-09-02 23:24:19 +02:00
9e5704b498 iconGrid: Make actors non reactive while animating
Although the actor are with opacity 0, they were reactive, so the if the
user quickly make a click on the grid while animating it can launch an
app accidentally.
To avoid that make the actors non reactive while animating.
2014-09-02 22:53:14 +02:00
3deaeb4a90 keyboard: Monitor the ShowOSK property of g-s-d
Show the on-screen keyboard if gnome-settings-daemon requests that it
should be shown, such as when using a touchscreen input device. Do this
in addition to monitoring the accessibility setting for the OSK.

https://bugzilla.gnome.org/show_bug.cgi?id=702015
2014-09-02 22:42:33 +02:00
afb7f08e6b Updated Indonesian translation 2014-09-02 12:20:41 +00:00
38c70e73b9 overviewControls: Use correct translation in dragBegin
Commit 12845f0eef reset translationX to 0 to fix the slide-in
animation of the dash when dragging a search result, but 0 is the
wrong value for the thumbnail slider - the next time it will be
shown, it will just pop up instead of sliding in due to translationX
already being at its target value.
Fix this by making _updateTranslation take the actual visibility into
account and call that to set the correct translation in dragBegin.
2014-09-02 00:19:37 +02:00
e60bf44c2e overviewControls: Fix initial slide-in animation
Controls are slided in by animating translationX from the actor's
width to 0; however as _updateTranslation() will skip the animation
when the property is already at its target value and 0 happens to be
the initial value of translationX, the initial animation is skipped.
Fix this by initializing translationX to undefined, which will always
differ from a valid target value.
2014-09-02 00:19:37 +02:00
746a8692ac overviewControls: Don't update translation on slideIn()
The comment is right, updating the translation should be deferred
to pageEmpty, or else overview controls will just pop up instead
of sliding in. So revert that part of commit 6a7fa52879.
2014-09-02 00:19:37 +02:00
a00762ddd9 overviewControls: Fix typos in comment 2014-09-02 00:19:23 +02:00
3981b27d8f search: Remove DND code from GridSearchResult
Providers that need drag-and-drop behavior can implement this via the
createResultObject() hook (as the app search provider already does), no
need to duplicate that code in the generic result objects
(ListSearchResult already does not implement DND).

https://bugzilla.gnome.org/show_bug.cgi?id=734726
2014-09-02 00:07:32 +02:00
62786c09a8 appDisplay: Animate appIcon for new window of apps
Following design mockups, animate the icons on AllView, FrequentView,
Dash and Search to zoom out when opening a new window of the app or when
the app is not running and the user execute it.

https://bugzilla.gnome.org/show_bug.cgi?id=734726
2014-09-02 00:07:32 +02:00
67c216a6fe search: Allow providers to return the complete result object
This makes the existing createResultObject() match its name better
 and avoids oddities like nested StButtons in app search results.

https://bugzilla.gnome.org/show_bug.cgi?id=734726
2014-09-02 00:07:32 +02:00
e933302ae4 shell-glsl-quad: Provide a paint volume
To prevent from falling back to the slow path of doing a full-stage
repaint every time.
2014-09-01 14:06:08 -07:00
75d5e84a4b appDisplay: Animate indicators out
Given that we animate indicator in, it makes sense to animate them out
as well.
Also make possible animating indicators between view changes as well.

https://bugzilla.gnome.org/show_bug.cgi?id=734726
2014-09-01 22:34:51 +02:00
f160dda187 appDisplay: Animate AllView and FrequentView
Following design decision, we want to animate AllView and FrequentView
when opening and closing with a swarm spring form.

This involves a few changes needed to allow that, since from some time
now, we are animating page changes in viewSelector, using only a fade
transition. However now we want to let appDisplay and iconGrid apply its
own animation.

For that we special case the change to and from apps page on
viewSelector to let appDisplay to animate its own items, using and API
on appDisplay which at the same time uses an API on iconGrid.

Thanks Florian Müllner for the debugging work

https://bugzilla.gnome.org/show_bug.cgi?id=734726
2014-09-01 22:34:51 +02:00
9c474a635a appDisplay: Animate folder view items
Add a new animation  to folder view based on designers mockups that
emulates pulsating icons.
The code on iconGrid is though to work well for the upcoming patches to
animate AllView and FrequentView.

https://bugzilla.gnome.org/show_bug.cgi?id=734726
2014-09-01 22:33:42 +02:00
d445bd17eb screenShield: Accept scrolls / swipes either way
If you turn on natural scrolling, instead of swiping up, you need to
swipe down, which is bizarre. Just accept any type of scroll and have
them contribute to the delta.

https://bugzilla.gnome.org/show_bug.cgi?id=734874
2014-09-01 13:15:49 -07:00
584f8c8381 Makefile: Use $(NULL) in one more place 2014-09-01 13:06:51 -07:00
032a688a72 Revert "keyboard: Handle touch events"
This reverts commit a84fb99c0a.

This commit didn't make the OSK fully operational yet on Wayland, and
caused the double emission of key events on X11 due to the OSK keys
receiving first touch events from the passive touch grab, and then
emulated pointer events from event selection after the touch sequence
was rejected in the grab.

When we make a better effort at handling touch events just once on X11,
this commit can be reapplied and remaining wayland OSK support resumed
from there. In the mean time, this patch is better reverted.

https://bugzilla.gnome.org/show_bug.cgi?id=735681
2014-09-01 21:33:04 +02:00
285a7467d0 messageTray: Add bottom drag gesture to popup the message tray
https://bugzilla.gnome.org/show_bug.cgi?id=735625
2014-08-30 14:01:44 +02:00
3289105ac4 viewSelector: Take edge drag gesture into a separate file
This may not be solely used by this code, so take the gesture action
code to its own separate file.

https://bugzilla.gnome.org/show_bug.cgi?id=735625
2014-08-30 14:01:44 +02:00
51861b1e6b appFavorites: Add two more desktop files to the rename list 2014-08-29 13:21:58 +02:00
d85f97c744 grabHelper: Adjust to property name change
Commit bbfa616f27 renamed _ignoreRelease to _ignoreUntilRelease
in some places, but not others, which broke GrabHelper.ignoreRelease().
Complete the name change to fix the fallout (e.g. app launcher menus
closing on button release).
2014-08-28 19:49:51 +02:00
98847f2279 popupMenu: Use an appropriate key to move focus into the menu
The code from PanelMenu.Button assumed menus would open below their
source actor, making KEY_Down a good choice; however with the new
generic code, we should base the key used on the actual menu position.

https://bugzilla.gnome.org/show_bug.cgi?id=735614
2014-08-28 19:12:48 +02:00
1d58ea25ab popupMenu: Handle key-press events on sourceActor
The behavior of opening/closing/navigating a menu from its source
actor is generic enough to not limit it to PanelMenu.Buttons, so
move the code into PopupMenu itself.

https://bugzilla.gnome.org/show_bug.cgi?id=735614
2014-08-28 19:12:48 +02:00
9de05994db Update Persian Translation 2014-08-28 21:02:26 +04:30
c9f3afc38f workspace: Always remove removed windows
Since mutter commit 527c53a2a0582eba, MetaWorkspace::window-removed
is emitted *before* MetaWindow:workspace is updated, so the test
whether the removed window should still be on the workspace in
question will always return true.
Assume the test is no longer necessary nowadays to fix this very
obvious regression.

https://bugzilla.gnome.org/show_bug.cgi?id=735608
2014-08-28 16:57:29 +02:00
115 changed files with 28708 additions and 21149 deletions

135
NEWS
View File

@ -1,3 +1,138 @@
3.14.3
======
* Properly remove network connections from list [Ryan; #740227]
* Fix handling of cancel button on login screen [Ray; #740141]
* Fix build when using dash as default shell [Alexander; #739241]
* Make event list in calendar scrollable [Stalin; #705115]
* Fix calendar-server crash on DBus timeout [Giovanni; #735308]
* Fix gestures triggering erroneously [Florian; #740237]
Contributors:
Giovanni Campagna, Ryan Lortie, Florian Müllner, Stalin Pereira, Ray Strode,
Alexander Tsoy
3.14.2
======
* Do not hard-depend on latest NetworkManager [Florian; #738485]
* Fix check for isToday in calendar [Darcy; #738725]
* Fix workspace changes from app picker [Yuki; #737534]
* Misc. bug fixes [Yuki; #739497]
Contributors:
Darcy, Florian Müllner, Yuki
3.14.1.5
========
* Fix handing of SystemBackground [Owen; #738652]
* Summarize queued up notifications [Devyani; #702460]
* Plug an animation object leak [Rui; #739252]
* Improve handling of multi-day events [Andreas; #727302]
Contributors:
Andreas Brauchli, Devyani Kota, Rui Matos, Owen W. Taylor
3.14.1
======
* Fix pulse animation for scrolled app folders [Florian; #736885]
* Fix updating background on file changes [Owen; #710756]
* Obtain keyboard variant from IBus [Jinkyu; #735066]
* Implement Ctrl-u / Ctrl-k keybindings in entries [Florian; #737346]
* Pass VPN hints to auth dialog [Dan; #737592]
* Only allow one screenshot request at a time [Adel; #737456]
* Respect disable-save-to-disc lockdown setting [Florian; #737846]
* Respect scaling-factor for profile pictures [Darcy; #735419]
* Focus login screen after lifting the lock screen shield [Ray; #708105]
* Speed up pulse animation for few items [Carlos S.; #737017]
* Fix gap between workspace switcher and screen edge [Florian; #728899]
* Disable unredirection during recordings [Adel; #738226]
* Ensure there's always at least one input source [Rui; #738303]
* Restrict width of dash icons' context menus [Adel; #738054]
* Misc. bug fixes [Jasper, Florian, Carlos G., Owen; #736999, #737382, #737001,
#738314, #738256, #738147]
Contributors:
Darcy Beurle, Cosimo Cecchi, Adel Gadllah, Carlos Garnacho, Rui Matos,
Florian Müllner, Carlos Soriano, Jasper St. Pierre, Ray Strode, Patrick Ward,
Dan Williams, Owen W. Taylor, Jinkyu Yi
Translations:
Мирослав Николић po/sr, sr@latin.po, Fran Diéguez [gl], Marek Černocký [cs],
Saibal Ray [bn_IN], Rajesh Ranjan [hi], Friedel Wolff [af],
Zhou Fang [zh_CN], Krishnababu Krothapalli [te], Kjartan Maraas [nb],
Rūdolfs Mazurs [lv], Sweta Kothari [gu], Christian Kirbach [de],
Cheng-Chia Tseng [zh_TW], Pedro Albuquerque [pt], Daniel Mustieles [es],
Luca Ferretti [it], Baurzhan Muftakhidinov [kk], Arash Mousavi [fa],
Milo Casagrande [it]
3.14.0
======
* Fix exposure of the accessible tree [Alejandro; #736821]
* Hide empty app folders in app picker [Florian; #736910]
Contributors:
Florian Müllner, Alejandro Piñeiro
Translations:
Yuri Myasoedov [ru], Pawan Chitrakar [ne], Manoj Kumar Giri [or],
Daniel Mustieles [es], GNOME Translation Robot [de], Rajesh Ranjan [hi],
Shankar Prasad [kn], Kenneth Nielsen [da], Daniel Korostil [uk],
Changwoo Ryu [ko], A S Alam [pa], Tom Tryfonidis [el], Petr Kovar [cs]
3.13.92
=======
* Fix submenu arrow animations [Hashem; #728927]
* Always initialize clutter accessibility [Alejandro; #735908]
* Adapt to mutter background changes [Owen; #735638]
* Improve handling of outOfDate extensions in prefs [Florian; #736185]
* Port offline updates to PackageKit's DBus interface [Kalev; #736337]
* location: Translate accuracy levels for geoclue [Zeeshan; #736479]
* Implement input source switching [Rui; #736435]
* Fix crash when dragging window from workspace switcher [Carlos G.; #735972]
* Clean out list of default favorites [Elad; #735682]
* Add settings link to location submenu [Florian; #736542]
* Fix keynav of message tray menu button [Florian; #707799]
* Misc. bug fixes [Carlos G., Florian, Rui; #736110, #736329, #736343,
#735927, #735976]
Contributors:
Elad Alfassa, Zeeshan Ali (Khattak), Michael Catanzaro, Adel Gadllah,
Carlos Garnacho, Kalev Lember, Rui Matos, Florian Müllner, Hashem Nasarat,
Alejandro Piñeiro, Carlos Soriano, Jasper St. Pierre, Owen W. Taylor
Translations:
Piotr Drąg [pl], Changwoo Ryu [ko], Yuri Myasoedov [ru], Zhou Fang [ja],
Peter Mráz [sk], Ville-Pekka Vainio [fi], Sweta Kothari [gu],
Marek Černocký [cs], A S Alam [pa], Christian Kirbach [de],
Alexandre Franke [fr], Aurimas Černius [lt], Khaled Hosny [ar],
Enrico Nicoletto [pt_BR], Andika Triwidada [id], Shantha kumar [ta],
Matej Urbančič [sl], Pawan Chitrakar [ne], Yosef Or Boczko [he],
Balázs Úr [hu], Dušan Kazik [sk], Gil Forcada [ca],
Carles Ferrando [ca@valencia], Nilamdyuti Goswami [as], Ivaylo Valkov [bg],
Sandeep Sheshrao Shedmake [mr], Umarzuki Bin Mochlis Moktar [ms],
Muhammet Kara [tr], Jiro Matsuzawa [ja], Kris Thomsen [da],
Mattias Eriksson [sv]
3.13.91
=======
* Fix keynav into session menu on login screen [Florian; #735614]
* Add gesture to summon message tray [Carlos G.; #735625]
* Accept scrolls/swipes either way on the screen shield [Jasper; #734874]
* Animate opening the app picker and improve app folder animations
[Carlos S.; #734726]
* Animate app icons on launching a new window [Carlos S., Florian; #734726]
* Show the on-screen keyboard when touch input is being used [David; #702015]
* Misc. bug fixes [Bastien, Owen, Florian, Carlos G.; #735190, #735385,
#735608, #735681]
Contributors:
Carlos Garnacho, David King, Kalev Lember, Florian Müllner, Bastien Nocera,
Carlos Soriano, Jasper St. Pierre, Owen W. Taylor
Translations:
Fran Diéguez [gl], Sweta Kothari [gu], Manoj Kumar Giri [or],
Alain Lojewski [fr], Praveen Illa [te], Arash Mousavi [fa],
Andika Triwidada [id]
3.13.90
=======
* Make use of GLSL optional [Adel; #733623]

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.13.90],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.14.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])
@ -76,8 +76,8 @@ AC_MSG_RESULT($enable_systemd)
CLUTTER_MIN_VERSION=1.15.90
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.39.0
MUTTER_MIN_VERSION=3.13.90
GTK_MIN_VERSION=3.7.9
MUTTER_MIN_VERSION=3.14.3
GTK_MIN_VERSION=3.13.2
GIO_MIN_VERSION=2.37.0
LIBECAL_MIN_VERSION=3.5.3
LIBEDATASERVER_MIN_VERSION=3.5.3
@ -232,7 +232,9 @@ esac
AM_CFLAGS="$AM_CFLAGS $WARN_CFLAGS"
AC_SUBST(AM_CFLAGS)
BROWSER_PLUGIN_DIR="${BROWSER_PLUGIN_DIR:-"\${libdir}/mozilla/plugins"}"
if test -z "${BROWSER_PLUGIN_DIR}"; then
BROWSER_PLUGIN_DIR="\${libdir}/mozilla/plugins"
fi
AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the plugin to])
AC_CONFIG_FILES([

View File

@ -31,7 +31,7 @@
</_description>
</key>
<key name="favorite-apps" type="as">
<default>[ 'epiphany.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Documents.desktop', 'org.gnome.Software.desktop' ]</default>
<default>[ 'epiphany.desktop', 'evolution.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Software.desktop' ]</default>
<_summary>List of desktop file IDs for favorite applications</_summary>
<_description>
The applications corresponding to these identifiers

View File

@ -232,6 +232,10 @@ StScrollBar StButton#vhandle:active {
border-width: 0px;
}
.app-well-menu {
max-width: 400px;
}
/* The remaining popup-menu sizing is all done in ems, so that if you
* override .popup-menu.font-size, everything else will scale with it.
*/
@ -1159,6 +1163,7 @@ StScrollBar StButton#vhandle:active {
.show-apps:checked > .overview-icon,
.show-apps:active > .overview-icon,
.search-provider-icon:active,
.grid-search-result:active .overview-icon,
.list-search-result:active {
background-gradient-start: rgba(255, 255, 255, .05);
background-gradient-end: rgba(255, 255, 255, .15);
@ -1489,6 +1494,10 @@ StScrollBar StButton#vhandle:active {
text-align: right;
}
.events-day-time-ellipses {
color: rgba(153, 153, 153, 1.0);
}
.events-day-time:rtl {
text-align: left;
}

View File

@ -59,14 +59,10 @@ const Application = new Lang.Class({
_extensionAvailable: function(uuid) {
let extension = ExtensionUtils.extensions[uuid];
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
if (!extension)
return false;
if (checkVersion && ExtensionUtils.isOutOfDate(extension))
return false;
if (!extension.dir.get_child('prefs.js').query_exists(null))
return false;
@ -285,6 +281,10 @@ const ExtensionRow = new Lang.Class({
function() {
this._switch.state = this._isEnabled();
}));
this._settings.connect('changed::disable-extension-version-validation',
Lang.bind(this, function() {
this._switch.sensitive = this._canEnable();
}));
this._buildUI();
},
@ -323,6 +323,7 @@ const ExtensionRow = new Lang.Class({
this.prefsButton = button;
this._switch = new Gtk.Switch({ valign: Gtk.Align.CENTER,
sensitive: this._canEnable(),
state: this._isEnabled() });
this._switch.connect('notify::active', Lang.bind(this,
function() {
@ -335,6 +336,13 @@ const ExtensionRow = new Lang.Class({
hbox.add(this._switch);
},
_canEnable: function() {
let extension = ExtensionUtils.extensions[this.uuid];
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
return !(checkVersion && ExtensionUtils.isOutOfDate(extension));
},
_isEnabled: function() {
let extensions = this._settings.get_strv('enabled-extensions');
return extensions.indexOf(this.uuid) != -1;

View File

@ -134,8 +134,7 @@ const AuthPrompt = new Lang.Class({
},
_onDestroy: function() {
this._userVerifier.clear();
this._userVerifier.disconnectAll();
this._userVerifier.destroy();
this._userVerifier = null;
},
@ -261,6 +260,7 @@ const AuthPrompt = new Lang.Class({
_onVerificationComplete: function() {
this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
this.cancelButton.reactive = false;
},
_onReset: function() {
@ -419,17 +419,20 @@ const AuthPrompt = new Lang.Class({
},
setUser: function(user) {
let oldChild = this._userWell.get_child();
if (oldChild)
oldChild.destroy();
if (user) {
let userWidget = new UserWidget.UserWidget(user);
this._userWell.set_child(userWidget.actor);
} else {
this._userWell.set_child(null);
}
},
reset: function() {
let oldStatus = this.verificationStatus;
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
this.cancelButton.reactive = true;
if (oldStatus == AuthPromptStatus.VERIFYING)
this._userVerifier.cancel();
@ -498,6 +501,9 @@ const AuthPrompt = new Lang.Class({
},
cancel: function() {
if (this.verificationStatus == AuthPromptStatus.NOT_VERIFYING || this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) {
return;
}
this.reset();
this.emit('cancelled');
}

View File

@ -64,6 +64,8 @@ const UserListItem = new Lang.Class({
reactive: true,
x_align: St.Align.START,
x_fill: true });
this.actor.connect('destroy',
Lang.bind(this, this._onDestroy));
this._userWidget = new UserWidget.UserWidget(this.user);
layout.add(this._userWidget.actor);
@ -87,6 +89,10 @@ const UserListItem = new Lang.Class({
this.actor.remove_style_pseudo_class('logged-in');
},
_onDestroy: function() {
this._user.disconnect(this._userChangedId);
},
_onClicked: function() {
this.emit('activate');
},
@ -373,13 +379,12 @@ const LoginDialog = new Lang.Class({
if (GLib.getenv('GDM_GREETER_TEST') != '1') {
this._greeter = gdmClient.get_greeter_sync(null);
this._greeter.connect('default-session-name-changed',
Lang.bind(this, this._onDefaultSessionChanged));
this._greeter.connect('session-opened',
Lang.bind(this, this._onSessionOpened));
this._greeter.connect('timed-login-requested',
Lang.bind(this, this._onTimedLoginRequested));
this._defaultSessionChangedId = this._greeter.connect('default-session-name-changed',
Lang.bind(this, this._onDefaultSessionChanged));
this._sessionOpenedId = this._greeter.connect('session-opened',
Lang.bind(this, this._onSessionOpened));
this._timedLoginRequestedId = this._greeter.connect('timed-login-requested',
Lang.bind(this, this._onTimedLoginRequested));
}
this._settings = new Gio.Settings({ schema_id: GdmUtil.LOGIN_SCREEN_SCHEMA });
@ -394,8 +399,8 @@ const LoginDialog = new Lang.Class({
Lang.bind(this, this._updateLogo));
this._textureCache = St.TextureCache.get_default();
this._textureCache.connect('texture-file-changed',
Lang.bind(this, this._updateLogoTexture));
this._updateLogoTextureId = this._textureCache.connect('texture-file-changed',
Lang.bind(this, this._updateLogoTexture));
this._userSelectionBox = new St.BoxLayout({ style_class: 'login-dialog-user-selection-box',
x_align: Clutter.ActorAlign.CENTER,
@ -476,8 +481,8 @@ const LoginDialog = new Lang.Class({
// If the user list is enabled, it should take key focus; make sure the
// screen shield is initialized first to prevent it from stealing the
// focus later
Main.layoutManager.connect('startup-complete',
Lang.bind(this, this._updateDisableUserList));
this._startupCompleteId = Main.layoutManager.connect('startup-complete',
Lang.bind(this, this._updateDisableUserList));
},
_ensureUserListLoaded: function() {
@ -638,6 +643,8 @@ const LoginDialog = new Lang.Class({
realmManager.release();
}));
this._updateCancelButton();
this._authPrompt.updateSensitivity(true);
this._showPrompt();
},
@ -665,10 +672,12 @@ const LoginDialog = new Lang.Class({
},
_gotGreeterSessionProxy: function(proxy) {
proxy.connect('g-properties-changed', Lang.bind(this, function() {
if (proxy.Active)
this._loginScreenSessionActivated();
}));
this._greeterSessionProxy = proxy;
this._greeterSessionProxyChangedId =
proxy.connect('g-properties-changed', Lang.bind(this, function() {
if (proxy.Active)
this._loginScreenSessionActivated();
}));
},
_startSession: function(serviceName) {
@ -890,6 +899,30 @@ const LoginDialog = new Lang.Class({
this._userManager.disconnect(this._userManagerLoadedId);
this._userManagerLoadedId = 0;
}
if (this._userAddedId) {
this._userManager.disconnect(this._userAddedId);
this._userAddedId = 0;
}
if (this._userRemovedId) {
this._userManager.disconnect(this._userRemovedId);
this._userRemovedId = 0;
}
this._textureCache.disconnect(this._updateLogoTextureId);
Main.layoutManager.disconnect(this._startupCompleteId);
if (this._settings) {
this._settings.run_dispose();
this._settings = null;
}
if (this._greeter) {
this._greeter.disconnect(this._defaultSessionChangedId);
this._greeter.disconnect(this._sessionOpenedId);
this._greeter.disconnect(this._timedLoginRequestedId);
this._greeter = null;
}
if (this._greeterSessionProxy) {
this._greeterSessionProxy.disconnect(this._greeterSessionProxyChangedId);
this._greeterSessionProxy = null;
}
},
_loadUserList: function() {
@ -904,15 +937,15 @@ const LoginDialog = new Lang.Class({
this._userList.addUser(users[i]);
}
this._userManager.connect('user-added',
Lang.bind(this, function(userManager, user) {
this._userList.addUser(user);
}));
this._userAddedId = this._userManager.connect('user-added',
Lang.bind(this, function(userManager, user) {
this._userList.addUser(user);
}));
this._userManager.connect('user-removed',
Lang.bind(this, function(userManager, user) {
this._userList.removeUser(user);
}));
this._userRemovedId = this._userManager.connect('user-removed',
Lang.bind(this, function(userManager, user) {
this._userList.removeUser(user);
}));
return GLib.SOURCE_REMOVE;
},

View File

@ -142,10 +142,10 @@ const ShellUserVerifier = new Lang.Class({
// after a user has been picked.
this._checkForSmartcard();
this._smartcardManager.connect('smartcard-inserted',
Lang.bind(this, this._checkForSmartcard));
this._smartcardManager.connect('smartcard-removed',
Lang.bind(this, this._checkForSmartcard));
this._smartcardInsertedId = this._smartcardManager.connect('smartcard-inserted',
Lang.bind(this, this._checkForSmartcard));
this._smartcardRemovedId = this._smartcardManager.connect('smartcard-removed',
Lang.bind(this, this._checkForSmartcard));
this._messageQueue = [];
this._messageQueueTimeoutId = 0;
@ -159,8 +159,8 @@ const ShellUserVerifier = new Lang.Class({
if (this._oVirtCredentialsManager.hasToken())
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
this._oVirtCredentialsManager.connect('user-authenticated',
Lang.bind(this, this._oVirtUserAuthenticated));
this._oVirtUserAuthenticatedId = this._oVirtCredentialsManager.connect('user-authenticated',
Lang.bind(this, this._oVirtUserAuthenticated));
},
begin: function(userName, hold) {
@ -191,20 +191,37 @@ const ShellUserVerifier = new Lang.Class({
}
},
_clearUserVerifier: function() {
if (this._userVerifier) {
this._userVerifier.run_dispose();
this._userVerifier = null;
}
},
clear: function() {
if (this._cancellable) {
this._cancellable.cancel();
this._cancellable = null;
}
if (this._userVerifier) {
this._userVerifier.run_dispose();
this._userVerifier = null;
}
this._clearUserVerifier();
this._clearMessageQueue();
},
destroy: function() {
this.clear();
this._settings.run_dispose();
this._settings = null;
this._smartcardManager.disconnect(this._smartcardInsertedId);
this._smartcardManager.disconnect(this._smartcardRemovedId);
this._smartcardManager = null;
this._oVirtCredentialsManager.disconnect(this._oVirtUserAuthenticatedId);
this._oVirtCredentialsManager = null;
},
answerQuery: function(serviceName, answer) {
if (!this.hasPendingMessages) {
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
@ -283,9 +300,10 @@ const ShellUserVerifier = new Lang.Class({
this._fprintManager.GetDefaultDeviceRemote(Gio.DBusCallFlags.NONE, this._cancellable, Lang.bind(this,
function(device, error) {
if (!error && device)
if (!error && device) {
this._haveFingerprintReader = true;
this._updateDefaultService();
}
}));
},
@ -326,6 +344,7 @@ const ShellUserVerifier = new Lang.Class({
_reauthenticationChannelOpened: function(client, result) {
try {
this._clearUserVerifier();
this._userVerifier = client.open_reauthentication_channel_finish(result);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
return;
@ -349,6 +368,7 @@ const ShellUserVerifier = new Lang.Class({
_userVerifierGot: function(client, result) {
try {
this._clearUserVerifier();
this._userVerifier = client.get_user_verifier_finish(result);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) {
return;

View File

@ -16,7 +16,9 @@
<file>misc/fileUtils.js</file>
<file>misc/gnomeSession.js</file>
<file>misc/history.js</file>
<file>misc/ibusManager.js</file>
<file>misc/jsParse.js</file>
<file>misc/keyboardManager.js</file>
<file>misc/loginManager.js</file>
<file>misc/modemManager.js</file>
<file>misc/objectManager.js</file>
@ -42,6 +44,7 @@
<file>ui/dash.js</file>
<file>ui/dateMenu.js</file>
<file>ui/dnd.js</file>
<file>ui/edgeDragAction.js</file>
<file>ui/endSessionDialog.js</file>
<file>ui/environment.js</file>
<file>ui/extensionDownloader.js</file>

180
js/misc/ibusManager.js Normal file
View File

@ -0,0 +1,180 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Signals = imports.signals;
try {
var IBus = imports.gi.IBus;
if (!('new_async' in IBus.Bus))
throw "IBus version is too old";
const IBusCandidatePopup = imports.ui.ibusCandidatePopup;
} catch (e) {
var IBus = null;
log(e);
}
let _ibusManager = null;
function getIBusManager() {
if (_ibusManager == null)
_ibusManager = new IBusManager();
return _ibusManager;
}
const IBusManager = new Lang.Class({
Name: 'IBusManager',
// This is the longest we'll keep the keyboard frozen until an input
// source is active.
_MAX_INPUT_SOURCE_ACTIVATION_TIME: 4000, // ms
_init: function() {
if (!IBus)
return;
IBus.init();
this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
this._panelService = null;
this._engines = {};
this._ready = false;
this._registerPropertiesId = 0;
this._currentEngineName = null;
this._ibus = IBus.Bus.new_async();
this._ibus.connect('connected', Lang.bind(this, this._onConnected));
this._ibus.connect('disconnected', Lang.bind(this, this._clear));
// Need to set this to get 'global-engine-changed' emitions
this._ibus.set_watch_ibus_signal(true);
this._ibus.connect('global-engine-changed', Lang.bind(this, this._engineChanged));
this._spawn();
},
_spawn: function() {
try {
Gio.Subprocess.new(['ibus-daemon', '--xim', '--panel', 'disable'],
Gio.SubprocessFlags.NONE);
} catch(e) {
log('Failed to launch ibus-daemon: ' + e.message);
}
},
_clear: function() {
if (this._panelService)
this._panelService.destroy();
this._panelService = null;
this._candidatePopup.setPanelService(null);
this._engines = {};
this._ready = false;
this._registerPropertiesId = 0;
this._currentEngineName = null;
this.emit('ready', false);
this._spawn();
},
_onConnected: function() {
this._ibus.list_engines_async(-1, null, Lang.bind(this, this._initEngines));
this._ibus.request_name_async(IBus.SERVICE_PANEL,
IBus.BusNameFlag.REPLACE_EXISTING,
-1, null,
Lang.bind(this, this._initPanelService));
},
_initEngines: function(ibus, result) {
let enginesList = this._ibus.list_engines_async_finish(result);
if (enginesList) {
for (let i = 0; i < enginesList.length; ++i) {
let name = enginesList[i].get_name();
this._engines[name] = enginesList[i];
}
this._updateReadiness();
} else {
this._clear();
}
},
_initPanelService: function(ibus, result) {
let success = this._ibus.request_name_async_finish(result);
if (success) {
this._panelService = new IBus.PanelService({ connection: this._ibus.get_connection(),
object_path: IBus.PATH_PANEL });
this._candidatePopup.setPanelService(this._panelService);
this._panelService.connect('update-property', Lang.bind(this, this._updateProperty));
// If an engine is already active we need to get its properties
this._ibus.get_global_engine_async(-1, null, Lang.bind(this, function(i, result) {
let engine;
try {
engine = this._ibus.get_global_engine_async_finish(result);
if (!engine)
return;
} catch(e) {
return;
}
this._engineChanged(this._ibus, engine.get_name());
}));
this._updateReadiness();
} else {
this._clear();
}
},
_updateReadiness: function() {
this._ready = (Object.keys(this._engines).length > 0 &&
this._panelService != null);
this.emit('ready', this._ready);
},
_engineChanged: function(bus, engineName) {
if (!this._ready)
return;
this._currentEngineName = engineName;
if (this._registerPropertiesId != 0)
return;
this._registerPropertiesId =
this._panelService.connect('register-properties', Lang.bind(this, function(p, props) {
if (!props.get(0))
return;
this._panelService.disconnect(this._registerPropertiesId);
this._registerPropertiesId = 0;
this.emit('properties-registered', this._currentEngineName, props);
}));
},
_updateProperty: function(panel, prop) {
this.emit('property-updated', this._currentEngineName, prop);
},
activateProperty: function(key, state) {
this._panelService.property_activate(key, state);
},
getEngineDesc: function(id) {
if (!IBus || !this._ready)
return null;
return this._engines[id];
},
setEngine: function(id, callback) {
if (!IBus || !this._ready || id == this._currentEngineName) {
if (callback)
callback();
return;
}
this._ibus.set_global_engine_async(id, this._MAX_INPUT_SOURCE_ACTIVATION_TIME,
null, callback);
},
});
Signals.addSignalMethods(IBusManager.prototype);

153
js/misc/keyboardManager.js Normal file
View File

@ -0,0 +1,153 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const GLib = imports.gi.GLib;
const GnomeDesktop = imports.gi.GnomeDesktop;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Main = imports.ui.main;
const DEFAULT_LOCALE = 'en_US';
const DEFAULT_LAYOUT = 'us';
const DEFAULT_VARIANT = '';
let _xkbInfo = null;
function getXkbInfo() {
if (_xkbInfo == null)
_xkbInfo = new GnomeDesktop.XkbInfo();
return _xkbInfo;
}
let _keyboardManager = null;
function getKeyboardManager() {
if (_keyboardManager == null)
_keyboardManager = new KeyboardManager();
return _keyboardManager;
}
function releaseKeyboard() {
if (Main.modalCount > 0)
global.display.unfreeze_keyboard(global.get_current_time());
else
global.display.ungrab_keyboard(global.get_current_time());
}
function holdKeyboard() {
global.freeze_keyboard(global.get_current_time());
}
const KeyboardManager = new Lang.Class({
Name: 'KeyboardManager',
// The XKB protocol doesn't allow for more that 4 layouts in a
// keymap. Wayland doesn't impose this limit and libxkbcommon can
// handle up to 32 layouts but since we need to support X clients
// even as a Wayland compositor, we can't bump this.
MAX_LAYOUTS_PER_GROUP: 4,
_init: function() {
this._xkbInfo = getXkbInfo();
this._current = null;
this._localeLayoutInfo = this._getLocaleLayout();
this._layoutInfos = {};
},
_applyLayoutGroup: function(group) {
let options = this._buildOptionsString();
let [layouts, variants] = this._buildGroupStrings(group);
Meta.get_backend().set_keymap(layouts, variants, options);
},
_applyLayoutGroupIndex: function(idx) {
Meta.get_backend().lock_layout_group(idx);
},
apply: function(id) {
let info = this._layoutInfos[id];
if (!info)
return;
if (this._current && this._current.group == info.group) {
if (this._current.groupIndex != info.groupIndex)
this._applyLayoutGroupIndex(info.groupIndex);
} else {
this._applyLayoutGroup(info.group);
this._applyLayoutGroupIndex(info.groupIndex);
}
this._current = info;
},
reapply: function() {
if (!this._current)
return;
this._applyLayoutGroup(this._current.group);
this._applyLayoutGroupIndex(this._current.groupIndex);
},
setUserLayouts: function(ids) {
this._current = null;
this._layoutInfos = {};
for (let i = 0; i < ids.length; ++i) {
let [found, , , _layout, _variant] = this._xkbInfo.get_layout_info(ids[i]);
if (found)
this._layoutInfos[ids[i]] = { id: ids[i], layout: _layout, variant: _variant };
}
let i = 0;
let group = [];
for (let id in this._layoutInfos) {
// We need to leave one slot on each group free so that we
// can add a layout containing the symbols for the
// language used in UI strings to ensure that toolkits can
// handle mnemonics like Alt+Ф even if the user is
// actually typing in a different layout.
let groupIndex = i % (this.MAX_LAYOUTS_PER_GROUP - 1);
if (groupIndex == 0)
group = [];
let info = this._layoutInfos[id];
group[groupIndex] = info;
info.group = group;
info.groupIndex = groupIndex;
i += 1;
}
},
_getLocaleLayout: function() {
let locale = GLib.get_language_names()[0];
if (locale.indexOf('_') == -1)
locale = DEFAULT_LOCALE;
let [found, , id] = GnomeDesktop.get_input_source_from_locale(locale);
if (!found)
[, , id] = GnomeDesktop.get_input_source_from_locale(DEFAULT_LOCALE);
let [found, , , _layout, _variant] = this._xkbInfo.get_layout_info(id);
if (found)
return { layout: _layout, variant: _variant };
else
return { layout: DEFAULT_LAYOUT, variant: DEFAULT_VARIANT };
},
_buildGroupStrings: function(_group) {
let group = _group.concat(this._localeLayoutInfo);
let layouts = group.map(function(g) { return g.layout; }).join(',');
let variants = group.map(function(g) { return g.variant; }).join(',');
return [layouts, variants];
},
setKeyboardOptions: function(options) {
this._xkbOptions = options;
},
_buildOptionsString: function() {
let options = this._xkbOptions.join(',');
return options;
}
});

View File

@ -58,6 +58,14 @@ const AppSwitcherPopup = new Lang.Class({
this._currentWindow = -1;
this.thumbnailsVisible = false;
let apps = Shell.AppSystem.get_default().get_running ();
if (apps.length == 0)
return;
this._switcherList = new AppSwitcher(apps, this);
this._items = this._switcherList.icons;
},
_allocate: function (actor, box, flags) {
@ -99,20 +107,6 @@ const AppSwitcherPopup = new Lang.Class({
}
},
_createSwitcher: function() {
let apps = Shell.AppSystem.get_default().get_running ();
if (apps.length == 0)
return false;
this._switcherList = new AppSwitcher(apps, this);
this._items = this._switcherList.icons;
if (this._items.length == 0)
return false;
return true;
},
_initialSelection: function(backward, binding) {
if (binding == 'switch-group') {
if (backward) {
@ -365,9 +359,18 @@ const WindowSwitcherPopup = new Lang.Class({
Name: 'WindowSwitcherPopup',
Extends: SwitcherPopup.SwitcherPopup,
_init: function(items) {
this.parent(items);
_init: function() {
this.parent();
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' });
let windows = this._getWindowList();
if (windows.length == 0)
return;
let mode = this._settings.get_enum('app-icon-mode');
this._switcherList = new WindowList(windows, mode);
this._items = this._switcherList.icons;
},
_getWindowList: function() {
@ -375,31 +378,6 @@ const WindowSwitcherPopup = new Lang.Class({
return global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
},
_createSwitcher: function() {
let windows = this._getWindowList();
if (windows.length == 0)
return false;
let mode = this._settings.get_enum('app-icon-mode');
this._switcherList = new WindowList(windows, mode);
this._items = this._switcherList.icons;
if (this._items.length == 0)
return false;
return true;
},
_initialSelection: function(backward, binding) {
if (binding == 'switch-windows-backward' || backward)
this._select(this._items.length - 1);
else if (this._items.length == 1)
this._select(0);
else
this._select(1);
},
_keyPressHandler: function(keysym, action) {
if (action == Meta.KeyBindingAction.SWITCH_WINDOWS) {
this._select(this._next());

View File

@ -34,7 +34,9 @@ const MIN_COLUMNS = 4;
const MIN_ROWS = 4;
const INACTIVE_GRID_OPACITY = 77;
const INACTIVE_GRID_OPACITY_ANIMATION_TIME = 0.40;
// This time needs to be less than IconGrid.EXTRA_SPACE_ANIMATION_TIME
// to not clash with other animations
const INACTIVE_GRID_OPACITY_ANIMATION_TIME = 0.24;
const FOLDER_SUBICON_FRACTION = .4;
const MIN_FREQUENT_APPS_COUNT = 3;
@ -43,6 +45,16 @@ const INDICATORS_BASE_TIME = 0.25;
const INDICATORS_ANIMATION_DELAY = 0.125;
const INDICATORS_ANIMATION_MAX_TIME = 0.75;
// Follow iconGrid animations approach and divide by 2 to animate out to
// not annoy the user when the user wants to quit appDisplay.
// Also, make sure we don't exceed iconGrid animation total time or
// views switch time.
const INDICATORS_BASE_TIME_OUT = 0.125;
const INDICATORS_ANIMATION_DELAY_OUT = 0.0625;
const INDICATORS_ANIMATION_MAX_TIME_OUT =
Math.min (VIEWS_SWITCH_TIME,
IconGrid.ANIMATION_TIME_OUT + IconGrid.ANIMATION_MAX_DELAY_OUT_FOR_ITEM);
const PAGE_SWITCH_TIME = 0.3;
const VIEWS_SWITCH_TIME = 0.4;
@ -177,6 +189,57 @@ const BaseAppView = new Lang.Class({
this.selectApp(id);
}));
}
},
_doSpringAnimation: function(animationDirection) {
this._grid.actor.opacity = 255;
this._grid.animateSpring(animationDirection,
Main.overview.getShowAppsButton());
},
animate: function(animationDirection, onComplete) {
if (animationDirection == IconGrid.AnimationDirection.IN) {
let toAnimate = this._grid.actor.connect('notify::allocation', Lang.bind(this,
function() {
this._grid.actor.disconnect(toAnimate);
// We need to hide the grid temporary to not flash it
// for a frame
this._grid.actor.opacity = 0;
Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
Lang.bind(this, function() {
this._doSpringAnimation(animationDirection)
}));
}));
} else {
this._doSpringAnimation(animationDirection);
}
if (onComplete) {
let animationDoneId = this._grid.connect('animation-done', Lang.bind(this,
function () {
this._grid.disconnect(animationDoneId);
onComplete();
}));
}
},
animateSwitch: function(animationDirection) {
Tweener.removeTweens(this.actor);
Tweener.removeTweens(this._grid.actor);
let params = { time: VIEWS_SWITCH_TIME,
transition: 'easeOutQuad' };
if (animationDirection == IconGrid.AnimationDirection.IN) {
this.actor.show();
params.opacity = 255;
params.delay = VIEWS_SWITCH_ANIMATION_DELAY;
} else {
params.opacity = 0;
params.delay = 0;
params.onComplete = Lang.bind(this, function() { this.actor.hide() });
}
Tweener.addTween(this._grid.actor, params);
}
});
Signals.addSignalMethods(BaseAppView.prototype);
@ -214,7 +277,10 @@ const PageIndicators = new Lang.Class({
this._currentPage = undefined;
this.actor.connect('notify::mapped',
Lang.bind(this, this._animateIndicators));
Lang.bind(this, function() {
this.animateIndicators(IconGrid.AnimationDirection.IN);
})
);
},
setNPages: function(nPages) {
@ -255,7 +321,7 @@ const PageIndicators = new Lang.Class({
children[i].set_checked(i == this._currentPage);
},
_animateIndicators: function() {
animateIndicators: function(animationDirection) {
if (!this.actor.mapped)
return;
@ -263,24 +329,32 @@ const PageIndicators = new Lang.Class({
if (children.length == 0)
return;
for (let i = 0; i < this._nPages; i++)
Tweener.removeTweens(children[i]);
let offset;
if (this.actor.get_text_direction() == Clutter.TextDirection.RTL)
offset = -children[0].width;
else
offset = children[0].width;
let delay = INDICATORS_ANIMATION_DELAY;
let totalAnimationTime = INDICATORS_BASE_TIME + INDICATORS_ANIMATION_DELAY * this._nPages;
if (totalAnimationTime > INDICATORS_ANIMATION_MAX_TIME)
delay -= (totalAnimationTime - INDICATORS_ANIMATION_MAX_TIME) / this._nPages;
let isAnimationIn = animationDirection == IconGrid.AnimationDirection.IN;
let delay = isAnimationIn ? INDICATORS_ANIMATION_DELAY :
INDICATORS_ANIMATION_DELAY_OUT;
let baseTime = isAnimationIn ? INDICATORS_BASE_TIME : INDICATORS_BASE_TIME_OUT;
let totalAnimationTime = baseTime + delay * this._nPages;
let maxTime = isAnimationIn ? INDICATORS_ANIMATION_MAX_TIME :
INDICATORS_ANIMATION_MAX_TIME_OUT;
if (totalAnimationTime > maxTime)
delay -= (totalAnimationTime - maxTime) / this._nPages;
for (let i = 0; i < this._nPages; i++) {
children[i].translation_x = offset;
children[i].translation_x = isAnimationIn ? offset : 0;
Tweener.addTween(children[i],
{ translation_x: 0,
time: INDICATORS_BASE_TIME + delay * i,
{ translation_x: isAnimationIn ? 0 : offset,
time: baseTime + delay * i,
transition: 'easeInOutQuad',
delay: VIEWS_SWITCH_ANIMATION_DELAY
delay: isAnimationIn ? VIEWS_SWITCH_ANIMATION_DELAY : 0
});
}
}
@ -323,7 +397,7 @@ const AllView = new Lang.Class({
this._stack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
let box = new St.BoxLayout({ vertical: true });
this._currentPage = 0;
this._grid.currentPage = 0;
this._stack.add_actor(this._grid.actor);
this._eventBlocker = new St.Widget({ x_expand: true, y_expand: true });
this._stack.add_actor(this._eventBlocker);
@ -455,14 +529,52 @@ const AllView = new Lang.Class({
this._refilterApps();
},
// Overriden from BaseAppView
animate: function (animationDirection, onComplete) {
if (animationDirection == IconGrid.AnimationDirection.OUT &&
this._displayingPopup && this._currentPopup) {
this._currentPopup.popdown();
let spaceClosedId = this._grid.connect('space-closed', Lang.bind(this,
function() {
this._grid.disconnect(spaceClosedId);
// Given that we can't call this.parent() inside the
// signal handler, call again animate which will
// call the parent given that popup is already
// closed.
this.animate(animationDirection, onComplete);
}));
} else {
this.parent(animationDirection, onComplete);
if (animationDirection == IconGrid.AnimationDirection.OUT)
this._pageIndicators.animateIndicators(animationDirection);
}
},
animateSwitch: function(animationDirection) {
this.parent(animationDirection);
if (this._currentPopup && this._displayingPopup &&
animationDirection == IconGrid.AnimationDirection.OUT)
Tweener.addTween(this._currentPopup.actor,
{ time: VIEWS_SWITCH_TIME,
transition: 'easeOutQuad',
opacity: 0,
onComplete: function() {
this.opacity = 255;
} });
if (animationDirection == IconGrid.AnimationDirection.OUT)
this._pageIndicators.animateIndicators(animationDirection);
},
getCurrentPageY: function() {
return this._grid.getPageY(this._currentPage);
return this._grid.getPageY(this._grid.currentPage);
},
goToPage: function(pageNumber) {
pageNumber = clamp(pageNumber, 0, this._grid.nPages() - 1);
if (this._currentPage == pageNumber && this._displayingPopup && this._currentPopup)
if (this._grid.currentPage == pageNumber && this._displayingPopup && this._currentPopup)
return;
if (this._displayingPopup && this._currentPopup)
this._currentPopup.popdown();
@ -482,7 +594,7 @@ const AllView = new Lang.Class({
let time;
// Only take the velocity into account on page changes, otherwise
// return smoothly to the current page using the default velocity
if (this._currentPage != pageNumber) {
if (this._grid.currentPage != pageNumber) {
let minVelocity = totalHeight / (PAGE_SWITCH_TIME * 1000);
velocity = Math.max(minVelocity, velocity);
time = (diffToPage / velocity) / 1000;
@ -493,9 +605,9 @@ const AllView = new Lang.Class({
// longer than PAGE_SWITCH_TIME
time = Math.min(time, PAGE_SWITCH_TIME);
this._currentPage = pageNumber;
this._grid.currentPage = pageNumber;
Tweener.addTween(this._adjustment,
{ value: this._grid.getPageY(this._currentPage),
{ value: this._grid.getPageY(this._grid.currentPage),
time: time,
transition: 'easeOutQuad' });
this._pageIndicators.setCurrentPage(pageNumber);
@ -524,9 +636,9 @@ const AllView = new Lang.Class({
let direction = event.get_scroll_direction();
if (direction == Clutter.ScrollDirection.UP)
this.goToPage(this._currentPage - 1);
this.goToPage(this._grid.currentPage - 1);
else if (direction == Clutter.ScrollDirection.DOWN)
this.goToPage(this._currentPage + 1);
this.goToPage(this._grid.currentPage + 1);
return Clutter.EVENT_STOP;
},
@ -566,10 +678,10 @@ const AllView = new Lang.Class({
return Clutter.EVENT_STOP;
if (event.get_key_symbol() == Clutter.Page_Up) {
this.goToPage(this._currentPage - 1);
this.goToPage(this._grid.currentPage - 1);
return Clutter.EVENT_STOP;
} else if (event.get_key_symbol() == Clutter.Page_Down) {
this.goToPage(this._currentPage + 1);
this.goToPage(this._grid.currentPage + 1);
return Clutter.EVENT_STOP;
}
@ -630,7 +742,7 @@ const AllView = new Lang.Class({
if (this._availWidth != availWidth || this._availHeight != availHeight || oldNPages != this._grid.nPages()) {
this._adjustment.value = 0;
this._currentPage = 0;
this._grid.currentPage = 0;
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
function() {
this._pageIndicators.setNPages(this._grid.nPages());
@ -792,6 +904,19 @@ const AppDisplay = new Lang.Class({
let layout = new ControlsBoxLayout({ homogeneous: true });
this._controls = new St.Widget({ style_class: 'app-view-controls',
layout_manager: layout });
this._controls.connect('notify::mapped', Lang.bind(this,
function() {
// controls are faded either with their parent or
// explicitly in animate(); we can't know how they'll be
// shown next, so make sure to restore their opacity
// when they are hidden
if (this._controls.mapped)
return;
Tweener.removeTweens(this._controls);
this._controls.opacity = 255;
}));
layout.hookup_style(this._controls);
this.actor.add_actor(new St.Bin({ child: this._controls }));
@ -815,23 +940,39 @@ const AppDisplay = new Lang.Class({
this._updateFrequentVisibility();
},
animate: function(animationDirection, onComplete) {
let currentView = this._views[global.settings.get_uint('app-picker-view')].view;
// Animate controls opacity using iconGrid animation time, since
// it will be the time the AllView or FrequentView takes to show
// it entirely.
let finalOpacity;
if (animationDirection == IconGrid.AnimationDirection.IN) {
this._controls.opacity = 0;
finalOpacity = 255;
} else {
finalOpacity = 0
}
Tweener.addTween(this._controls,
{ time: IconGrid.ANIMATION_TIME_IN,
transition: 'easeInOutQuad',
opacity: finalOpacity,
});
currentView.animate(animationDirection, onComplete);
},
_showView: function(activeIndex) {
for (let i = 0; i < this._views.length; i++) {
let actor = this._views[i].view.actor;
let params = { time: VIEWS_SWITCH_TIME,
opacity: (i == activeIndex) ? 255 : 0,
delay: (i == activeIndex) ? VIEWS_SWITCH_ANIMATION_DELAY : 0 };
if (i == activeIndex)
actor.visible = true;
else
params.onComplete = function() { actor.hide(); };
Tweener.addTween(actor, params);
if (i == activeIndex)
this._views[i].control.add_style_pseudo_class('checked');
else
this._views[i].control.remove_style_pseudo_class('checked');
let animationDirection = i == activeIndex ? IconGrid.AnimationDirection.IN :
IconGrid.AnimationDirection.OUT;
this._views[i].view.animateSwitch(animationDirection);
}
},
@ -913,26 +1054,6 @@ const AppSearchProvider = new Lang.Class({
this.getInitialResultSet(terms, callback, cancellable);
},
activateResult: function(result) {
let app = this._appSys.lookup_app(result);
let event = Clutter.get_current_event();
let modifiers = event ? event.get_state() : 0;
let openNewWindow = modifiers & Clutter.ModifierType.CONTROL_MASK;
if (openNewWindow)
app.open_new_window(-1);
else
app.activate();
},
dragActivateResult: function(id, params) {
params = Params.parse(params, { workspace: -1,
timestamp: 0 });
let app = this._appSys.lookup_app(id);
app.open_new_window(workspace);
},
createResultObject: function (resultMeta) {
let app = this._appSys.lookup_app(resultMeta['id']);
return new AppIcon(app);
@ -964,6 +1085,11 @@ const FolderView = new Lang.Class({
Util.ensureActorVisibleInScrollView(this.actor, actor);
},
// Overriden from BaseAppView
animate: function(animationDirection) {
this._grid.animatePulse(animationDirection);
},
createFolderIcon: function(size) {
let layout = new Clutter.GridLayout();
let icon = new St.Widget({ layout_manager: layout,
@ -1141,6 +1267,7 @@ const FolderIcon = new Lang.Class({
addAppId(appInfo.get_id());
});
this.actor.visible = this.view.getAllItems().length > 0;
this.view.loadGrid();
this.emit('apps-changed');
},
@ -1339,8 +1466,17 @@ const AppFolderPopup = new Lang.Class({
this.actor.show();
this._boxPointer.setArrowActor(this._source.actor);
// We need to hide the icons of the view until the boxpointer animation
// is completed so we can animate the icons after as we like without
// showing them while boxpointer is animating.
this._view.actor.opacity = 0;
this._boxPointer.show(BoxPointer.PopupAnimation.FADE |
BoxPointer.PopupAnimation.SLIDE);
BoxPointer.PopupAnimation.SLIDE,
Lang.bind(this,
function() {
this._view.actor.opacity = 255;
this._view.animate(IconGrid.AnimationDirection.IN);
}));
this.emit('open-state-changed', true);
},
@ -1428,10 +1564,11 @@ const AppIcon = new Lang.Class({
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._menuTimeoutId = 0;
this._stateChangedId = this.app.connect('notify::state',
Lang.bind(this,
this._onStateChanged));
this._onStateChanged();
this._stateChangedId = this.app.connect('notify::state', Lang.bind(this,
function () {
this._updateRunningStyle();
}));
this._updateRunningStyle();
},
_onDestroy: function() {
@ -1452,7 +1589,7 @@ const AppIcon = new Lang.Class({
}
},
_onStateChanged: function() {
_updateRunningStyle: function() {
if (this.app.state != Shell.AppState.STOPPED)
this.actor.add_style_class_name('running');
else
@ -1495,13 +1632,7 @@ const AppIcon = new Lang.Class({
_onClicked: function(actor, button) {
this._removeMenuTimeout();
if (button == 0 || button == 1) {
this._onActivate(Clutter.get_current_event());
} else if (button == 2) {
this.app.open_new_window(-1);
Main.overview.hide();
}
this.activate(button);
},
_onKeyboardPopupMenu: function() {
@ -1555,19 +1686,29 @@ const AppIcon = new Lang.Class({
this.emit('menu-state-changed', false);
},
_onActivate: function (event) {
let modifiers = event.get_state();
activate: function (button) {
let event = Clutter.get_current_event();
let modifiers = event ? event.get_state() : 0;
let openNewWindow = this.app.can_open_new_window () &&
modifiers & Clutter.ModifierType.CONTROL_MASK &&
this.app.state == Shell.AppState.RUNNING ||
button && button == 2;
if (modifiers & Clutter.ModifierType.CONTROL_MASK
&& this.app.state == Shell.AppState.RUNNING) {
if (this.app.state == Shell.AppState.STOPPED || openNewWindow)
this.animateLaunch();
if (openNewWindow)
this.app.open_new_window(-1);
} else {
else
this.app.activate();
}
Main.overview.hide();
},
animateLaunch: function() {
this.icon.animateZoomOut();
},
shellWorkspaceLaunch : function(params) {
params = Params.parse(params, { workspace: -1,
timestamp: 0 });
@ -1649,6 +1790,9 @@ const AppIconMenu = new Lang.Class({
if (this._source.app.can_open_new_window()) {
this._newWindowMenuItem = this._appendMenuItem(_("New Window"));
this._newWindowMenuItem.connect('activate', Lang.bind(this, function() {
if (this._source.app.state == Shell.AppState.STOPPED)
this._source.animateLaunch();
this._source.app.open_new_window(-1);
this.emit('activate-window', null);
}));

View File

@ -14,7 +14,13 @@ const RENAMED_DESKTOP_IDS = {
'gcalctool.desktop': 'gnome-calculator.desktop',
'gedit.desktop': 'org.gnome.gedit.desktop',
'glchess.desktop': 'gnome-chess.desktop',
'glines.desktop': 'five-or-more.desktop',
'gnect.desktop': 'four-in-a-row.desktop',
'gnibbles.desktop': 'gnome-nibbles.desktop',
'gnobots2.desktop': 'gnome-robots.desktop',
'gnome-boxes.desktop': 'org.gnome.Boxes.desktop',
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
'gnome-contacts.desktop': 'org.gnome.Contacts.desktop',
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
@ -22,8 +28,12 @@ const RENAMED_DESKTOP_IDS = {
'gnome-software.desktop': 'org.gnome.Software.desktop',
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
'gnomine.desktop': 'gnome-mines.desktop',
'gnotravex.desktop': 'gnome-tetravex.desktop',
'gnotski.desktop': 'gnome-klotski.desktop',
'gtali.desktop': 'tali.desktop',
'nautilus.desktop': 'org.gnome.Nautilus.desktop',
'polari.desktop': 'org.gnome.Polari.desktop',
'totem.desktop': 'org.gnome.Totem.desktop',
};
const AppFavorites = new Lang.Class({

File diff suppressed because it is too large Load Diff

View File

@ -2,6 +2,7 @@
const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const St = imports.gi.St;
@ -13,6 +14,7 @@ const Shell = imports.gi.Shell;
const MSECS_IN_DAY = 24 * 60 * 60 * 1000;
const SHOW_WEEKDATE_KEY = 'show-weekdate';
const ELLIPSIS_CHAR = '\u2026';
// alias to prevent xgettext from picking up strings translated in GTK+
const gtk30_ = Gettext_gtk30.gettext;
@ -58,19 +60,21 @@ function _getEndOfDay(date) {
return ret;
}
function _formatEventTime(event, clockFormat) {
function _formatEventTime(event, clockFormat, periodBegin, periodEnd) {
let ret;
if (event.allDay) {
let allDay = (event.allDay || (event.date <= periodBegin && event.end >= periodEnd));
if (allDay) {
/* Translators: Shown in calendar event list for all day events
* Keep it short, best if you can use less then 10 characters
*/
ret = C_("event list time", "All Day");
} else {
let date = event.date >= periodBegin ? event.date : event.end;
switch (clockFormat) {
case '24h':
/* Translators: Shown in calendar event list, if 24h format,
\u2236 is a ratio character, similar to : */
ret = event.date.toLocaleFormat(C_("event list time", "%H\u2236%M"));
ret = date.toLocaleFormat(C_("event list time", "%H\u2236%M"));
break;
default:
@ -79,7 +83,7 @@ function _formatEventTime(event, clockFormat) {
/* Translators: Shown in calendar event list, if 12h format,
\u2236 is a ratio character, similar to : and \u2009 is
a thin space */
ret = event.date.toLocaleFormat(C_("event list time", "%l\u2236%M\u2009%p"));
ret = date.toLocaleFormat(C_("event list time", "%l\u2236%M\u2009%p"));
break;
}
}
@ -248,11 +252,24 @@ const DBusEventSource = new Lang.Class({
this._initialized = false;
this._dbusProxy = new CalendarServer();
this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(object, result) {
let loaded = false;
try {
this._dbusProxy.init_finish(result);
loaded = true;
} catch(e) {
log('Error loading calendars: ' + e.message);
return;
if (e.matches(Gio.DBusError, Gio.DBusError.TIMED_OUT)) {
// Ignore timeouts and install signals as normal, because with high
// probability the service will appear later on, and we will get a
// NameOwnerChanged which will finish loading
//
// (But still _initialized to false, because the proxy does not know
// about the HasCalendars property and would cause an exception trying
// to read it)
} else {
log('Error loading calendars: ' + e.message);
return;
}
}
this._dbusProxy.connectSignal('Changed', Lang.bind(this, this._onChanged));
@ -268,9 +285,11 @@ const DBusEventSource = new Lang.Class({
this.emit('notify::has-calendars');
}));
this._initialized = true;
this.emit('notify::has-calendars');
this._onNameAppeared();
this._initialized = loaded;
if (loaded) {
this.emit('notify::has-calendars');
this._onNameAppeared();
}
}));
},
@ -292,6 +311,7 @@ const DBusEventSource = new Lang.Class({
},
_onNameAppeared: function(owner) {
this._initialized = true;
this._resetCache();
this._loadEvents(true);
},
@ -361,6 +381,12 @@ const DBusEventSource = new Lang.Class({
result.push(event);
}
}
result.sort(function(event1, event2) {
// sort events by end time on ending day
let d1 = event1.date < begin && event1.end <= end ? event1.end : event1.date;
let d2 = event2.date < begin && event2.end <= end ? event2.end : event2.date;
return d1.getTime() - d2.getTime();
});
return result;
},
@ -721,12 +747,18 @@ const EventsList = new Lang.Class({
this._eventSource.connect('changed', Lang.bind(this, this._update));
},
_addEvent: function(event, index, includeDayName) {
_addEvent: function(event, index, includeDayName, periodBegin, periodEnd) {
let eventBox = new St.BoxLayout();
eventBox.set_vertical(false);
let dayString;
if (includeDayName)
dayString = _getEventDayAbbreviation(event.date.getDay());
else
if (includeDayName) {
if (event.date >= periodBegin)
dayString = _getEventDayAbbreviation(event.date.getDay());
else /* show event end day if it began earlier */
dayString = _getEventDayAbbreviation(event.end.getDay());
} else {
dayString = '';
}
let dayLabel = new St.Label({ style_class: 'events-day-dayname',
text: dayString,
@ -738,17 +770,32 @@ const EventsList = new Lang.Class({
let rtl = this.actor.get_text_direction() == Clutter.TextDirection.RTL;
let layout = this.actor.layout_manager;
layout.attach(dayLabel, rtl ? 2 : 0, index, 1, 1);
eventBox.add_actor(dayLabel);
let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);
let timeString = _formatEventTime(event, clockFormat);
let timeString = _formatEventTime(event, clockFormat, periodBegin, periodEnd);
let timeLabel = new St.Label({ style_class: 'events-day-time',
text: timeString,
y_align: Clutter.ActorAlign.START });
timeLabel.clutter_text.line_wrap = false;
timeLabel.clutter_text.ellipsize = false;
layout.attach(timeLabel, 1, index, 1, 1);
let preEllipsisLabel = new St.Label({ style_class: 'events-day-time-ellipses',
text: ELLIPSIS_CHAR,
y_align: Clutter.ActorAlign.START });
let postEllipsisLabel = new St.Label({ style_class: 'events-day-time-ellipses',
text: ELLIPSIS_CHAR,
y_align: Clutter.ActorAlign.START });
if (event.allDay || event.date >= periodBegin)
preEllipsisLabel.opacity = 0;
if (event.allDay || event.end <= periodEnd)
postEllipsisLabel.opacity = 0;
let timeLabelBoxLayout = new St.BoxLayout({ x_align: Clutter.ActorAlign.START });
timeLabelBoxLayout.add(preEllipsisLabel);
timeLabelBoxLayout.add(timeLabel);
timeLabelBoxLayout.add(postEllipsisLabel);
timeLabelBoxLayout.set_size(50, 1);
eventBox.add_actor(timeLabelBoxLayout);
let titleLabel = new St.Label({ style_class: 'events-day-task',
text: event.summary,
@ -756,30 +803,29 @@ const EventsList = new Lang.Class({
titleLabel.clutter_text.line_wrap = true;
titleLabel.clutter_text.ellipsize = false;
layout.attach(titleLabel, rtl ? 0 : 2, index, 1, 1);
eventBox.add_actor(titleLabel);
this._eventListBox.add_actor(eventBox);
},
_addPeriod: function(header, index, begin, end, includeDayName, showNothingScheduled) {
let events = this._eventSource.getEvents(begin, end);
_addPeriod: function(header, index, periodBegin, periodEnd, includeDayName, showNothingScheduled) {
let events = this._eventSource.getEvents(periodBegin, periodEnd);
if (events.length == 0 && !showNothingScheduled)
return index;
let label = new St.Label({ style_class: 'events-day-header', text: header });
let layout = this.actor.layout_manager;
layout.attach(label, 0, index, 3, 1);
this._eventListBox.add_actor(label);
index++;
for (let n = 0; n < events.length; n++) {
this._addEvent(events[n], index, includeDayName);
this._addEvent(events[n], index, includeDayName, periodBegin, periodEnd);
index++;
}
if (events.length == 0 && showNothingScheduled) {
let now = new Date();
/* Translators: Text to show if there are no events */
let nothingEvent = new CalendarEvent(now, now, _("Nothing Scheduled"), true);
this._addEvent(nothingEvent, index, false);
let nothingEvent = new CalendarEvent(periodBegin, periodBegin, _("Nothing Scheduled"), true);
this._addEvent(nothingEvent, index, false, periodBegin, periodEnd);
index++;
}
@ -787,8 +833,6 @@ const EventsList = new Lang.Class({
},
_showOtherDay: function(day) {
this.actor.destroy_all_children();
let dayBegin = _getBeginningOfDay(day);
let dayEnd = _getEndOfDay(day);
@ -804,7 +848,6 @@ const EventsList = new Lang.Class({
},
_showToday: function() {
this.actor.destroy_all_children();
let index = 0;
let now = new Date();
@ -849,6 +892,24 @@ const EventsList = new Lang.Class({
if (this._eventSource.isLoading)
return;
this.actor.destroy_all_children();
let layout = this.actor.layout_manager;
this._eventListContainer = new St.BoxLayout({ x_expand: true, y_expand: true });
this._eventListContainer.set_vertical(true);
this._eventListBox = new St.BoxLayout();
this._eventListBox.set_vertical(true);
let eventScrollView = new St.ScrollView({style_class: 'vfade',
hscrollbar_policy: Gtk.PolicyType.NEVER,
vscrollbar_policy: Gtk.PolicyType.AUTOMATIC});
eventScrollView.add_actor(this._eventListBox);
this._eventListContainer.add_actor(eventScrollView);
layout.attach(this._eventListContainer, 0, 0, 1, 1);
let today = new Date();
if (_sameDay (this._date, today)) {
this._showToday();

View File

@ -84,6 +84,7 @@ const KeyringDialog = new Lang.Class({
let table = new St.Widget({ style_class: 'keyring-dialog-control-table',
layout_manager: layout });
layout.hookup_style(table);
let rtl = table.get_text_direction() == Clutter.TextDirection.RTL;
let row = 0;
if (this.prompt.password_visible) {
@ -92,7 +93,6 @@ const KeyringDialog = new Lang.Class({
y_align: Clutter.ActorAlign.CENTER });
label.set_text(_("Password:"));
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
layout.attach(label, 0, row, 1, 1);
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
text: '',
can_focus: true,
@ -100,7 +100,14 @@ const KeyringDialog = new Lang.Class({
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onPasswordActivate));
layout.attach(this._passwordEntry, 1, row, 1, 1);
if (rtl) {
layout.attach(this._passwordEntry, 0, row, 1, 1);
layout.attach(label, 1, row, 1, 1);
} else {
layout.attach(label, 0, row, 1, 1);
layout.attach(this._passwordEntry, 1, row, 1, 1);
}
row++;
} else {
this._passwordEntry = null;
@ -111,7 +118,6 @@ const KeyringDialog = new Lang.Class({
x_align: Clutter.ActorAlign.START,
y_align: Clutter.ActorAlign.CENTER }));
label.set_text(_("Type again:"));
layout.attach(label, 0, row, 1, 1);
this._confirmEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
text: '',
can_focus: true,
@ -119,7 +125,13 @@ const KeyringDialog = new Lang.Class({
this._confirmEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
ShellEntry.addContextMenu(this._confirmEntry, { isPassword: true });
this._confirmEntry.clutter_text.connect('activate', Lang.bind(this, this._onConfirmActivate));
layout.attach(this._confirmEntry, 1, row, 1, 1);
if (rtl) {
layout.attach(this._confirmEntry, 0, row, 1, 1);
layout.attach(label, 1, row, 1, 1);
} else {
layout.attach(label, 0, row, 1, 1);
layout.attach(this._confirmEntry, 1, row, 1, 1);
}
row++;
} else {
this._confirmEntry = null;
@ -132,7 +144,7 @@ const KeyringDialog = new Lang.Class({
let choice = new CheckBox.CheckBox();
this.prompt.bind_property('choice-label', choice.getLabelActor(), 'text', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('choice-chosen', choice.actor, 'checked', GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL);
layout.attach(choice.actor, 1, row, 1, 1);
layout.attach(choice.actor, rtl ? 0 : 1, row, 1, 1);
row++;
}
@ -140,7 +152,7 @@ const KeyringDialog = new Lang.Class({
x_align: Clutter.ActorAlign.START });
warning.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
warning.clutter_text.line_wrap = true;
layout.attach(warning, 1, row, 1, 1);
layout.attach(warning, rtl ? 0 : 1, row, 1, 1);
this.prompt.bind_property('warning-visible', warning, 'visible', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('warning', warning, 'text', GObject.BindingFlags.SYNC_CREATE);

View File

@ -380,6 +380,12 @@ const VPNRequestHandler = new Lang.Class({
argv.push('-i');
if (flags & NMClient.SecretAgentGetSecretsFlags.REQUEST_NEW)
argv.push('-r');
if (authHelper.supportsHints) {
for (let i = 0; i < hints.length; i++) {
argv.push('-t');
argv.push(hints[i]);
}
}
this._newStylePlugin = authHelper.externalUIMode;
@ -598,7 +604,15 @@ const NetworkAgent = new Lang.Class({
Name: 'NetworkAgent',
_init: function() {
this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent' });
try {
this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent',
capabilities: NMClient.SecretAgentCapabilities.VPN_HINTS
});
} catch(e) {
// Support older versions without NetworkAgent:capabilities
this._native = new Shell.NetworkAgent({ identifier: 'org.gnome.Shell.NetworkAgent'
});
}
this._dialogs = { };
this._vpnRequests = { };
@ -698,16 +712,23 @@ const NetworkAgent = new Lang.Class({
let service = keyfile.get_string('VPN Connection', 'service');
let binary = keyfile.get_string('GNOME', 'auth-dialog');
let externalUIMode = false;
let hints = false;
try {
externalUIMode = keyfile.get_boolean('GNOME', 'supports-external-ui-mode');
} catch(e) { } // ignore errors if key does not exist
try {
hints = keyfile.get_boolean('GNOME', 'supports-hints');
} catch(e) { } // ignore errors if key does not exist
let path = binary;
if (!GLib.path_is_absolute(path)) {
path = GLib.build_filenamev([Config.LIBEXECDIR, path]);
}
if (GLib.file_test(path, GLib.FileTest.IS_EXECUTABLE))
this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode };
this._vpnBinaries[service] = { fileName: path, externalUIMode: externalUIMode, supportsHints: hints };
else
throw new Error('VPN plugin at %s is not executable'.format(path));
} catch(e) {

View File

@ -140,20 +140,10 @@ const CtrlAltTabPopup = new Lang.Class({
Name: 'CtrlAltTabPopup',
Extends: SwitcherPopup.SwitcherPopup,
_createSwitcher: function() {
this._switcherList = new CtrlAltTabSwitcher(this._items);
return true;
},
_init: function(items) {
this.parent(items);
_initialSelection: function(backward, binding) {
if (binding == 'switch-panels') {
if (backward)
this._selectedIndex = this._items.length - 1;
} else if (binding == 'switch-panels-backward') {
if (!backward)
this._selectedIndex = this._items.length - 1;
}
this._select(this._selectedIndex);
this._switcherList = new CtrlAltTabSwitcher(this._items);
},
_keyPressHandler: function(keysym, action) {

View File

@ -3,6 +3,7 @@
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const GnomeDesktop = imports.gi.GnomeDesktop;
const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Cairo = imports.cairo;
@ -58,7 +59,7 @@ const DateMenuButton = new Lang.Class({
// Fill up the first column
vbox = new St.BoxLayout({vertical: true});
vbox = new St.BoxLayout({vertical: true, x_expand: true, y_expand: true });
hbox.add(vbox);
// Date
@ -95,11 +96,11 @@ const DateMenuButton = new Lang.Class({
this._openCalendarItem = new PopupMenu.PopupMenuItem(_("Open Calendar"));
this._openCalendarItem.connect('activate', Lang.bind(this, this._onOpenCalendarActivate));
vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: false, y_fill: false});
this._openClocksItem = new PopupMenu.PopupMenuItem(_("Open Clocks"));
this._openClocksItem.connect('activate', Lang.bind(this, this._onOpenClocksActivate));
vbox.add(this._openClocksItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
vbox.add(this._openClocksItem.actor, {y_align: St.Align.END, expand: false, y_fill: false});
Shell.AppSystem.get_default().connect('installed-changed',
Lang.bind(this, this._appInstalledChanged));
@ -124,14 +125,19 @@ const DateMenuButton = new Lang.Class({
if (isOpen) {
let now = new Date();
this._calendar.setDate(now);
/* 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").
*/
let dateFormat = _("%A %B %e, %Y");
this._date.set_label(now.toLocaleFormat(dateFormat));
}
}));
// Done with hbox for calendar and event list
this._clock = new GnomeDesktop.WallClock();
this._clock.connect('notify::clock', Lang.bind(this, this._updateClockAndDate));
this._updateClockAndDate();
this._clock.bind_property('clock', this._clockDisplay, 'text', GObject.BindingFlags.SYNC_CREATE);
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
this._sessionUpdated();
@ -141,7 +147,7 @@ const DateMenuButton = new Lang.Class({
let now = new Date();
return now.getYear() == date.getYear() &&
now.getMonth() == date.getMonth() &&
now.getDay() == date.getDay();
now.getDate() == date.getDate();
},
_appInstalledChanged: function() {
@ -196,16 +202,6 @@ const DateMenuButton = new Lang.Class({
this._dateAndTimeSeparator.actor.visible = Main.sessionMode.allowSettings;
},
_updateClockAndDate: function() {
this._clockDisplay.set_text(this._clock.clock);
/* 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").
*/
let dateFormat = _("%A %B %e, %Y");
let displayDate = new Date();
this._date.set_label(displayDate.toLocaleFormat(dateFormat));
},
_getCalendarApp: function() {
if (this._calendarApp !== undefined)
return this._calendarApp;

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

@ -0,0 +1,84 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Signals = imports.signals;
const Meta = imports.gi.Meta;
const Clutter = imports.gi.Clutter;
const St = imports.gi.St;
const Main = imports.ui.main;
const EDGE_THRESHOLD = 20;
const DRAG_DISTANCE = 80;
const EdgeDragAction = new Lang.Class({
Name: 'EdgeDragAction',
Extends: Clutter.GestureAction,
_init : function(side, allowedModes) {
this.parent();
this._side = side;
this._allowedModes = allowedModes;
this.set_n_touch_points(1);
global.display.connect('grab-op-begin', Lang.bind(this, function() {
this.cancel();
}));
},
_getMonitorRect : function (x, y) {
let rect = new Meta.Rectangle({ x: x - 1, y: y - 1, width: 1, height: 1 });
let monitorIndex = global.screen.get_monitor_index_for_rect(rect);
return global.screen.get_monitor_geometry(monitorIndex);
},
vfunc_gesture_prepare : function(action, actor) {
if (this.get_n_current_points() == 0)
return false;
if (!(this._allowedModes & Main.keybindingMode))
return false;
let [x, y] = this.get_press_coords(0);
let monitorRect = this._getMonitorRect(x, y);
return ((this._side == St.Side.LEFT && x < monitorRect.x + EDGE_THRESHOLD) ||
(this._side == St.Side.RIGHT && x > monitorRect.x + monitorRect.width - EDGE_THRESHOLD) ||
(this._side == St.Side.TOP && y < monitorRect.y + EDGE_THRESHOLD) ||
(this._side == St.Side.BOTTOM && y > monitorRect.y + monitorRect.height - EDGE_THRESHOLD));
},
vfunc_gesture_progress : function (action, actor) {
let [startX, startY] = this.get_press_coords(0);
let [x, y] = this.get_motion_coords(0);
let offsetX = Math.abs (x - startX);
let offsetY = Math.abs (y - startY);
if (offsetX < EDGE_THRESHOLD && offsetY < EDGE_THRESHOLD)
return true;
if ((offsetX > offsetY &&
(this._side == St.Side.TOP || this._side == St.Side.BOTTOM)) ||
(offsetY > offsetX &&
(this._side == St.Side.LEFT || this._side == St.Side.RIGHT))) {
this.cancel();
return false;
}
return true;
},
vfunc_gesture_end : function (action, actor) {
let [startX, startY] = this.get_press_coords(0);
let [x, y] = this.get_motion_coords(0);
let monitorRect = this._getMonitorRect(startX, startY);
if ((this._side == St.Side.TOP && y > monitorRect.y + DRAG_DISTANCE) ||
(this._side == St.Side.BOTTOM && y < monitorRect.y + monitorRect.height - DRAG_DISTANCE) ||
(this._side == St.Side.LEFT && x > monitorRect.x + DRAG_DISTANCE) ||
(this._side == St.Side.RIGHT && x < monitorRect.x + monitorRect.width - DRAG_DISTANCE))
this.emit('activated');
}
});
Signals.addSignalMethods(EdgeDragAction.prototype);

View File

@ -38,8 +38,6 @@ const UserWidget = imports.ui.userWidget;
let _endSessionDialog = null;
const TRIGGER_OFFLINE_UPDATE = '/usr/libexec/pk-trigger-offline-update';
const _ITEM_ICON_SIZE = 48;
const _DIALOG_ICON_SIZE = 48;
@ -134,11 +132,18 @@ const restartInstallDialogContent = {
showOtherSessions: true,
};
const DialogType = {
LOGOUT: 0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */,
SHUTDOWN: 1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */,
RESTART: 2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */,
UPDATE_RESTART: 3
};
const DialogContent = {
0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */: logoutDialogContent,
1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */: shutdownDialogContent,
2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */: restartDialogContent,
3: restartInstallDialogContent
0 /* DialogType.LOGOUT */: logoutDialogContent,
1 /* DialogType.SHUTDOWN */: shutdownDialogContent,
2 /* DialogType.RESTART */: restartDialogContent,
3 /* DialogType.UPDATE_RESTART */: restartInstallDialogContent
};
const MAX_USERS_IN_SESSION_DIALOG = 5;
@ -155,6 +160,19 @@ const LogindSessionIface = '<node> \
const LogindSession = Gio.DBusProxy.makeProxyWrapper(LogindSessionIface);
const PkOfflineIface = '<node> \
<interface name="org.freedesktop.PackageKit.Offline"> \
<property name="UpdatePrepared" type="b" access="read"/> \
<property name="TriggerAction" type="s" access="read"/> \
<method name="Trigger"> \
<arg type="s" name="action" direction="in"/> \
</method> \
<method name="Cancel"/> \
</interface> \
</node>';
const PkOfflineProxy = Gio.DBusProxy.makeProxyWrapper(PkOfflineIface);
const UPowerIface = '<node> \
<interface name="org.freedesktop.UPower"> \
<property name="OnBattery" type="b" access="read"/> \
@ -245,9 +263,14 @@ const EndSessionDialog = new Lang.Class({
this._loginManager = LoginManager.getLoginManager();
this._userManager = AccountsService.UserManager.get_default();
this._user = this._userManager.get_user(GLib.get_user_name());
this._updatesFile = Gio.File.new_for_path('/system-update');
this._preparedUpdateFile = Gio.File.new_for_path('/var/lib/PackageKit/prepared-update');
this._pkOfflineProxy = new PkOfflineProxy(Gio.DBus.system,
'org.freedesktop.PackageKit',
'/org/freedesktop/PackageKit',
Lang.bind(this, function(proxy, error) {
if (error)
log(error.message);
}));
this._powerProxy = new UPowerProxy(Gio.DBus.system,
'org.freedesktop.UPower',
'/org/freedesktop/UPower',
@ -499,31 +522,29 @@ const EndSessionDialog = new Lang.Class({
},
_triggerOfflineUpdateReboot: function(callback) {
this._pkexecSpawn([TRIGGER_OFFLINE_UPDATE, 'reboot'], callback);
this._pkOfflineProxy.TriggerRemote('reboot',
function (result, error) {
if (error)
log(error.message);
callback();
});
},
_triggerOfflineUpdateShutdown: function(callback) {
this._pkexecSpawn([TRIGGER_OFFLINE_UPDATE, 'power-off'], callback);
this._pkOfflineProxy.TriggerRemote('power-off',
function (result, error) {
if (error)
log(error.message);
callback();
});
},
_triggerOfflineUpdateCancel: function(callback) {
this._pkexecSpawn([TRIGGER_OFFLINE_UPDATE, '--cancel'], callback);
},
_pkexecSpawn: function(argv, callback) {
let ret, pid;
try {
[ret, pid] = GLib.spawn_async(null, ['pkexec'].concat(argv), null,
GLib.SpawnFlags.DO_NOT_REAP_CHILD | GLib.SpawnFlags.SEARCH_PATH,
null);
} catch (e) {
log('Error spawning "pkexec %s": %s'.format(argv.join(' '), e.toString()));
callback();
return;
}
GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, function(pid, status) {
GLib.spawn_close_pid(pid);
this._pkOfflineProxy.CancelRemote(function (result, error) {
if (error)
log(error.message);
callback();
});
@ -677,8 +698,9 @@ const EndSessionDialog = new Lang.Class({
this._totalSecondsToStayOpen = totalSecondsToStayOpen;
this._type = type;
if (this._type == 2 && this._updatesFile.query_exists(null))
this._type = 3;
if (this._type == DialogType.RESTART &&
this._pkOfflineProxy.TriggerAction == 'reboot')
this._type = DialogType.UPDATE_RESTART;
this._applications = [];
this._applicationList.destroy_all_children();
@ -705,19 +727,19 @@ const EndSessionDialog = new Lang.Class({
if (dialogContent.showOtherSessions)
this._loadSessions();
let preparedUpdate = this._preparedUpdateFile.query_exists(null);
let updateAlreadyTriggered = this._updatesFile.query_exists(null);
let updateAlreadyTriggered = this._pkOfflineProxy.TriggerAction == 'power-off' || this._pkOfflineProxy.TriggerAction == 'reboot';
let updatePrepared = this._pkOfflineProxy.UpdatePrepared;
let updatesAllowed = this._updatesPermission && this._updatesPermission.allowed;
_setCheckBoxLabel(this._checkBox, dialogContent.checkBoxText);
this._checkBox.actor.visible = (dialogContent.checkBoxText && preparedUpdate && updatesAllowed);
this._checkBox.actor.checked = (preparedUpdate && updateAlreadyTriggered);
this._checkBox.actor.visible = (dialogContent.checkBoxText && updatePrepared && updatesAllowed);
this._checkBox.actor.checked = (updatePrepared && updateAlreadyTriggered);
// We show the warning either together with the checkbox, or when
// updates have already been triggered, but the user doesn't have
// enough permissions to cancel them.
this._batteryWarning.visible = (dialogContent.showBatteryWarning &&
(this._checkBox.actor.visible || preparedUpdate && updateAlreadyTriggered && !updatesAllowed));
(this._checkBox.actor.visible || updatePrepared && updateAlreadyTriggered && !updatesAllowed));
this._updateButtons();

View File

@ -271,10 +271,17 @@ function onEnabledExtensionsChanged() {
}
function _onVersionValidationChanged() {
// we want to reload all extensions, but only enable
// extensions when allowed by the sessionMode, so
// temporarily disable them all
enabledExtensions = [];
for (let uuid in ExtensionUtils.extensions)
reloadExtension(ExtensionUtils.extensions[uuid]);
enabledExtensions = getEnabledExtensions();
if (Main.sessionMode.allowExtensions) {
enabledExtensions.forEach(function(uuid) {
if (ExtensionUtils.extensions[uuid])
reloadExtension(ExtensionUtils.extensions[uuid]);
enableExtension(uuid);
});
}
}

View File

@ -56,7 +56,7 @@ const GrabHelper = new Lang.Class({
this._grabStack = [];
this._actors = [];
this._ignoreRelease = false;
this._ignoreUntilRelease = false;
this._modalCount = 0;
},
@ -215,7 +215,7 @@ const GrabHelper = new Lang.Class({
_popGrabHelper(this);
this._ignoreRelease = false;
this._ignoreUntilRelease = false;
Main.popModal(this._owner);
global.sync_pointer();
@ -228,7 +228,7 @@ const GrabHelper = new Lang.Class({
// like the ComboBoxMenu that go away on press, but need to eat
// the next release event.
ignoreRelease: function() {
this._ignoreRelease = true;
this._ignoreUntilRelease = true;
},
// ungrab:

View File

@ -10,12 +10,30 @@ const St = imports.gi.St;
const Lang = imports.lang;
const Params = imports.misc.params;
const Tweener = imports.ui.tweener;
const Main = imports.ui.main;
const ICON_SIZE = 96;
const MIN_ICON_SIZE = 16;
const EXTRA_SPACE_ANIMATION_TIME = 0.25;
const ANIMATION_TIME_IN = 0.350;
const ANIMATION_TIME_OUT = 1/2 * ANIMATION_TIME_IN;
const ANIMATION_MAX_DELAY_FOR_ITEM = 2/3 * ANIMATION_TIME_IN;
const ANIMATION_BASE_DELAY_FOR_ITEM = 1/4 * ANIMATION_MAX_DELAY_FOR_ITEM;
const ANIMATION_MAX_DELAY_OUT_FOR_ITEM = 2/3 * ANIMATION_TIME_OUT;
const ANIMATION_FADE_IN_TIME_FOR_ITEM = 1/4 * ANIMATION_TIME_IN;
const ANIMATION_BOUNCE_ICON_SCALE = 1.1;
const AnimationDirection = {
IN: 0,
OUT: 1
};
const APPICON_ANIMATION_OUT_SCALE = 3;
const APPICON_ANIMATION_OUT_TIME = 0.25;
const BaseIcon = new Lang.Class({
Name: 'BaseIcon',
@ -173,9 +191,55 @@ const BaseIcon = new Lang.Class({
_onIconThemeChanged: function() {
this._createIconTexture(this.iconSize);
},
animateZoomOut: function() {
// Animate only the child instead of the entire actor, so the
// styles like hover and running are not applied while
// animating.
zoomOutActor(this.actor.child);
}
});
function clamp(value, min, max) {
return Math.max(Math.min(value, max), min);
};
function zoomOutActor(actor) {
let actorClone = new Clutter.Clone({ source: actor,
reactive: false });
let [width, height] = actor.get_transformed_size();
let [x, y] = actor.get_transformed_position();
actorClone.set_size(width, height);
actorClone.set_position(x, y);
actorClone.opacity = 255;
actorClone.set_pivot_point(0.5, 0.5);
Main.uiGroup.add_actor(actorClone);
// Avoid monitor edges to not zoom outside the current monitor
let monitor = Main.layoutManager.findMonitorForActor(actor);
let scaledWidth = width * APPICON_ANIMATION_OUT_SCALE;
let scaledHeight = height * APPICON_ANIMATION_OUT_SCALE;
let scaledX = x - (scaledWidth - width) / 2;
let scaledY = y - (scaledHeight - height) / 2;
let containedX = clamp(scaledX, monitor.x, monitor.x + monitor.width - scaledWidth);
let containedY = clamp(scaledY, monitor.y, monitor.y + monitor.height - scaledHeight);
Tweener.addTween(actorClone,
{ time: APPICON_ANIMATION_OUT_TIME,
scale_x: APPICON_ANIMATION_OUT_SCALE,
scale_y: APPICON_ANIMATION_OUT_SCALE,
translation_x: containedX - scaledX,
translation_y: containedY - scaledY,
opacity: 0,
transition: 'easeOutQuad',
onComplete: function() {
actorClone.destroy();
}
});
}
const IconGrid = new Lang.Class({
Name: 'IconGrid',
@ -338,15 +402,202 @@ const IconGrid = new Lang.Class({
}
},
_calculateChildBox: function(child, x, y, box) {
let [childMinWidth, childMinHeight, childNaturalWidth, childNaturalHeight] =
child.get_preferred_size();
/**
* Intended to be override by subclasses if they need a different
* set of items to be animated.
*/
_getChildrenToAnimate: function() {
return this._getVisibleChildren();
},
_animationDone: function() {
this._animating = false;
this.emit('animation-done');
},
animatePulse: function(animationDirection) {
if (animationDirection != AnimationDirection.IN)
throw new Error("Pulse animation only implements 'in' animation direction");
if (this._animating)
return;
this._animating = true;
let actors = this._getChildrenToAnimate();
if (actors.length == 0) {
this._animationDone();
return;
}
// For few items the animation can be slow, so use a smaller
// delay when there are less than 4 items
// (ANIMATION_BASE_DELAY_FOR_ITEM = 1/4 *
// ANIMATION_MAX_DELAY_FOR_ITEM)
let maxDelay = Math.min(ANIMATION_BASE_DELAY_FOR_ITEM * actors.length,
ANIMATION_MAX_DELAY_FOR_ITEM);
for (let index = 0; index < actors.length; index++) {
let actor = actors[index];
actor.reactive = false;
actor.set_scale(0, 0);
actor.set_pivot_point(0.5, 0.5);
let delay = index / actors.length * maxDelay;
let bounceUpTime = ANIMATION_TIME_IN / 4;
let isLastItem = index == actors.length - 1;
Tweener.addTween(actor,
{ time: bounceUpTime,
transition: 'easeInOutQuad',
delay: delay,
scale_x: ANIMATION_BOUNCE_ICON_SCALE,
scale_y: ANIMATION_BOUNCE_ICON_SCALE,
onComplete: Lang.bind(this, function() {
Tweener.addTween(actor,
{ time: ANIMATION_TIME_IN - bounceUpTime,
transition: 'easeInOutQuad',
scale_x: 1,
scale_y: 1,
onComplete: Lang.bind(this, function() {
if (isLastItem)
this._animationDone();
actor.reactive = true;
})
});
})
});
}
},
animateSpring: function(animationDirection, sourceActor) {
if (this._animating)
return;
this._animating = true;
let actors = this._getChildrenToAnimate();
if (actors.length == 0) {
this._animationDone();
return;
}
let [sourceX, sourceY] = sourceActor.get_transformed_position();
let [sourceWidth, sourceHeight] = sourceActor.get_size();
// Get the center
let [sourceCenterX, sourceCenterY] = [sourceX + sourceWidth / 2, sourceY + sourceHeight / 2];
// Design decision, 1/2 of the source actor size.
let [sourceScaledWidth, sourceScaledHeight] = [sourceWidth / 2, sourceHeight / 2];
actors.forEach(function(actor) {
let [actorX, actorY] = actor._transformedPosition = actor.get_transformed_position();
let [x, y] = [actorX - sourceX, actorY - sourceY];
actor._distance = Math.sqrt(x * x + y * y);
});
let maxDist = actors.reduce(function(prev, cur) {
return Math.max(prev, cur._distance);
}, 0);
let minDist = actors.reduce(function(prev, cur) {
return Math.min(prev, cur._distance);
}, Infinity);
let normalization = maxDist - minDist;
for (let index = 0; index < actors.length; index++) {
let actor = actors[index];
actor.opacity = 0;
actor.reactive = false;
let actorClone = new Clutter.Clone({ source: actor });
Main.uiGroup.add_actor(actorClone);
let [width, height,,] = this._getAllocatedChildSizeAndSpacing(actor);
actorClone.set_size(width, height);
let scaleX = sourceScaledWidth / width;
let scaleY = sourceScaledHeight / height;
let [adjustedSourcePositionX, adjustedSourcePositionY] = [sourceCenterX - sourceScaledWidth / 2, sourceCenterY - sourceScaledHeight / 2];
let movementParams, fadeParams;
if (animationDirection == AnimationDirection.IN) {
let isLastItem = actor._distance == minDist;
actorClone.opacity = 0;
actorClone.set_scale(scaleX, scaleY);
actorClone.set_position(adjustedSourcePositionX, adjustedSourcePositionY);
let delay = (1 - (actor._distance - minDist) / normalization) * ANIMATION_MAX_DELAY_FOR_ITEM;
let [finalX, finalY] = actor._transformedPosition;
movementParams = { time: ANIMATION_TIME_IN,
transition: 'easeInOutQuad',
delay: delay,
x: finalX,
y: finalY,
scale_x: 1,
scale_y: 1,
onComplete: Lang.bind(this, function() {
if (isLastItem)
this._animationDone();
actor.opacity = 255;
actor.reactive = true;
actorClone.destroy();
})};
fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM,
transition: 'easeInOutQuad',
delay: delay,
opacity: 255 };
} else {
let isLastItem = actor._distance == maxDist;
let [startX, startY] = actor._transformedPosition;
actorClone.set_position(startX, startY);
let delay = (actor._distance - minDist) / normalization * ANIMATION_MAX_DELAY_OUT_FOR_ITEM;
movementParams = { time: ANIMATION_TIME_OUT,
transition: 'easeInOutQuad',
delay: delay,
x: adjustedSourcePositionX,
y: adjustedSourcePositionY,
scale_x: scaleX,
scale_y: scaleY,
onComplete: Lang.bind(this, function() {
if (isLastItem) {
this._animationDone();
this._restoreItemsOpacity();
}
actor.reactive = true;
actorClone.destroy();
})};
fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM,
transition: 'easeInOutQuad',
delay: ANIMATION_TIME_OUT + delay - ANIMATION_FADE_IN_TIME_FOR_ITEM,
opacity: 0 };
}
Tweener.addTween(actorClone, movementParams);
Tweener.addTween(actorClone, fadeParams);
}
},
_restoreItemsOpacity: function() {
for (let index = 0; index < this._items.length; index++) {
this._items[index].actor.opacity = 255;
}
},
_getAllocatedChildSizeAndSpacing: function(child) {
let [,, natWidth, natHeight] = child.get_preferred_size();
let width = Math.min(this._getHItemSize(), natWidth);
let xSpacing = Math.max(0, width - natWidth) / 2;
let height = Math.min(this._getVItemSize(), natHeight);
let ySpacing = Math.max(0, height - natHeight) / 2;
return [width, height, xSpacing, ySpacing];
},
_calculateChildBox: function(child, x, y, box) {
/* Center the item in its allocation horizontally */
let width = Math.min(this._getHItemSize(), childNaturalWidth);
let childXSpacing = Math.max(0, width - childNaturalWidth) / 2;
let height = Math.min(this._getVItemSize(), childNaturalHeight);
let childYSpacing = Math.max(0, height - childNaturalHeight) / 2;
let [width, height, childXSpacing, childYSpacing] =
this._getAllocatedChildSizeAndSpacing(child);
let childBox = new Clutter.ActorBox();
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
@ -546,6 +797,7 @@ const PaginatedIconGrid = new Lang.Class({
_init: function(params) {
this.parent(params);
this._nPages = 0;
this.currentPage = 0;
this._rowsPerPage = 0;
this._spaceBetweenPages = 0;
this._childrenPerPage = 0;
@ -609,6 +861,15 @@ const PaginatedIconGrid = new Lang.Class({
}
},
// Overriden from IconGrid
_getChildrenToAnimate: function() {
let children = this._getVisibleChildren();
let firstIndex = this._childrenPerPage * this.currentPage;
let lastIndex = firstIndex + this._childrenPerPage;
return children.slice(firstIndex, lastIndex);
},
_computePages: function (availWidthPerPage, availHeightPerPage) {
let [nColumns, usedWidth] = this._computeLayout(availWidthPerPage);
let nRows;

View File

@ -23,6 +23,12 @@ const KEYBOARD_TYPE = 'keyboard-type';
const A11Y_APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
const SHOW_KEYBOARD = 'screen-keyboard-enabled';
const CURSOR_BUS_NAME = 'org.gnome.SettingsDaemon.Cursor';
const CURSOR_OBJECT_PATH = '/org/gnome/SettingsDaemon/Cursor';
const CARIBOU_BUS_NAME = 'org.gnome.Caribou.Daemon';
const CARIBOU_OBJECT_PATH = '/org/gnome/Caribou/Daemon';
const CaribouKeyboardIface = '<node> \
<interface name="org.gnome.Caribou.Keyboard"> \
<method name="Show"> \
@ -47,12 +53,29 @@ const CaribouKeyboardIface = '<node> \
</interface> \
</node>';
const CaribouDaemonIface = '<node> \
<interface name="org.gnome.Caribou.Daemon"> \
<method name="Run" /> \
<method name="Quit" /> \
</interface> \
</node>';
const CursorManagerIface = '<node> \
<interface name="org.gnome.SettingsDaemon.Cursor"> \
<property name="ShowOSK" type="b" access="read" /> \
</interface> \
</node>';
const CaribouDaemonProxy = Gio.DBusProxy.makeProxyWrapper(CaribouDaemonIface);
const CursorManagerProxy = Gio.DBusProxy.makeProxyWrapper(CursorManagerIface);
const Key = new Lang.Class({
Name: 'Key',
_init : function(key) {
this._key = key;
this.actor = this._makeKey(key, GLib.markup_escape_text(key.label, -1));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._extended_keys = this._key.get_extended_keys();
this._extended_keyboard = null;
@ -75,6 +98,13 @@ const Key = new Lang.Class({
}
},
_onDestroy: function() {
if (this._boxPointer) {
this._boxPointer.actor.destroy();
this._boxPointer = null;
}
},
_makeKey: function (key, label) {
let button = new St.Button ({ label: label,
style_class: 'keyboard-key' });
@ -90,25 +120,6 @@ const Key = new Lang.Class({
key.release();
return Clutter.EVENT_PROPAGATE;
}));
button.connect('touch-event', Lang.bind(this,
function (actor, event) {
let device = event.get_device();
let sequence = event.get_event_sequence();
if (!this._touchPressed &&
event.type() == Clutter.EventType.TOUCH_BEGIN) {
device.sequence_grab(sequence, actor);
this._touchPressed = true;
key.press();
} else if (this._touchPressed &&
event.type() == Clutter.EventType.TOUCH_END &&
device.sequence_get_grabbed_actor(sequence) == actor) {
device.sequence_ungrab(sequence);
this._touchPressed = false;
key.release();
}
return Clutter.EVENT_PROPAGATE;
}));
return button;
},
@ -170,10 +181,32 @@ const Keyboard = new Lang.Class({
this._timestamp = global.display.get_current_time_roundtrip();
this._keyboardSettings = new Gio.Settings({ schema_id: KEYBOARD_SCHEMA });
this._keyboardSettings.connect('changed', Lang.bind(this, this._settingsChanged));
this._keyboardSettings.connect('changed', Lang.bind(this, this._sync));
this._a11yApplicationsSettings = new Gio.Settings({ schema_id: A11Y_APPLICATIONS_SCHEMA });
this._a11yApplicationsSettings.connect('changed', Lang.bind(this, this._settingsChanged));
this._settingsChanged();
this._a11yApplicationsSettings.connect('changed', Lang.bind(this, this._sync));
this._watchNameId = Gio.bus_watch_name(Gio.BusType.SESSION, CURSOR_BUS_NAME, 0,
Lang.bind(this, this._sync),
Lang.bind(this, this._sync));
this._daemonProxy = new CaribouDaemonProxy(Gio.DBus.session, CARIBOU_BUS_NAME,
CARIBOU_OBJECT_PATH,
Lang.bind(this, function(proxy, error) {
if (error) {
log(error.message);
return;
}
}));
this._cursorProxy = new CursorManagerProxy(Gio.DBus.session, CURSOR_BUS_NAME,
CURSOR_OBJECT_PATH,
Lang.bind(this, function(proxy, error) {
if (error) {
log(error.message);
return;
}
this._cursorProxy.connect('g-properties-changed',
Lang.bind(this, this._sync));
this._sync();
}));
this._sync();
this._showIdleId = 0;
this._subkeysBoxPointer = null;
@ -191,8 +224,9 @@ const Keyboard = new Lang.Class({
this._redraw();
},
_settingsChanged: function (settings, key) {
this._enableKeyboard = this._a11yApplicationsSettings.get_boolean(SHOW_KEYBOARD);
_sync: function () {
this._enableKeyboard = this._a11yApplicationsSettings.get_boolean(SHOW_KEYBOARD) ||
this._cursorProxy.ShowOSK;
if (!this._enableKeyboard && !this._keyboard)
return;
if (this._enableKeyboard && this._keyboard &&
@ -222,9 +256,22 @@ const Keyboard = new Lang.Class({
this.actor = null;
this._destroySource();
this._daemonProxy.QuitRemote(function (result, error) {
if (error) {
log(error.message);
return;
}
});
},
_setupKeyboard: function() {
this._daemonProxy.RunRemote(function (result, error) {
if (error) {
log(error.message);
return;
}
});
this.actor = new St.BoxLayout({ name: 'keyboard', vertical: true, reactive: true });
Main.layoutManager.keyboardBox.add_actor(this.actor);
Main.layoutManager.trackChrome(this.actor);
@ -563,7 +610,7 @@ const Keyboard = new Lang.Class({
_moveTemporarily: function () {
let currentWindow = global.screen.get_display().focus_window;
let rect = currentWindow.get_outer_rect();
let rect = currentWindow.get_frame_rect();
let newX = rect.x;
let newY = 3 * this.actor.height / 2;

View File

@ -20,7 +20,6 @@ const Tweener = imports.ui.tweener;
const STARTUP_ANIMATION_TIME = 0.5;
const KEYBOARD_ANIMATION_TIME = 0.15;
const BACKGROUND_FADE_ANIMATION_TIME = 1.0;
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
// The message tray takes this much pressure
// in the pressure barrier at once to release it.
@ -160,10 +159,10 @@ const LayoutManager = new Lang.Class({
this._isPopupWindowVisible = false;
this._startingUp = true;
// Normally, the stage is always covered so Clutter doesn't need to clear
// it; however it becomes visible during the startup animation
// See the comment below for a longer explanation
global.stage.background_color = DEFAULT_BACKGROUND_COLOR;
// We don't want to paint the stage background color because either
// the SystemBackground we create or the MetaBackgroundActor inside
// global.window_group covers the entirety of the screen.
global.stage.no_clear_hint = true;
// Set up stage hierarchy to group all UI actors under one container.
this.uiGroup = new Shell.GenericContainer({ name: 'uiGroup' });
@ -230,6 +229,10 @@ const LayoutManager = new Lang.Class({
global.stage.remove_actor(global.top_window_group);
this.uiGroup.add_actor(global.top_window_group);
let feedbackGroup = Meta.get_feedback_group_for_screen(global.screen);
global.stage.remove_actor(feedbackGroup);
this.uiGroup.add_actor(feedbackGroup);
this._backgroundGroup = new Meta.BackgroundGroup();
global.window_group.add_child(this._backgroundGroup);
this._backgroundGroup.lower_bottom();
@ -259,7 +262,6 @@ const LayoutManager = new Lang.Class({
this._inOverview = true;
this._updateVisibility();
this._updateRegions();
},
hideOverview: function() {
@ -267,7 +269,6 @@ const LayoutManager = new Lang.Class({
this._inOverview = false;
this._updateVisibility();
this._queueUpdateRegions();
},
_sessionUpdated: function() {
@ -361,7 +362,7 @@ const LayoutManager = new Lang.Class({
},
_addBackgroundMenu: function(bgManager) {
BackgroundMenu.addBackgroundMenu(bgManager.background.actor, this);
BackgroundMenu.addBackgroundMenu(bgManager.backgroundActor, this);
},
_createBackgroundManager: function(monitorIndex) {
@ -378,10 +379,10 @@ const LayoutManager = new Lang.Class({
_showSecondaryBackgrounds: function() {
for (let i = 0; i < this.monitors.length; i++) {
if (i != this.primaryIndex) {
let background = this._bgManagers[i].background;
background.actor.show();
background.actor.opacity = 0;
Tweener.addTween(background.actor,
let backgroundActor = this._bgManagers[i].backgroundActor;
backgroundActor.show();
backgroundActor.opacity = 0;
Tweener.addTween(backgroundActor,
{ opacity: 255,
time: BACKGROUND_FADE_ANIMATION_TIME,
transition: 'easeOutQuad' });
@ -404,7 +405,7 @@ const LayoutManager = new Lang.Class({
this._bgManagers.push(bgManager);
if (i != this.primaryIndex && this._startingUp)
bgManager.background.actor.hide();
bgManager.backgroundActor.hide();
}
},
@ -589,10 +590,6 @@ const LayoutManager = new Lang.Class({
//
// When starting a normal user session, we want to grow it out of the middle
// of the screen.
//
// Usually, we don't want to paint the stage background color because the
// MetaBackgroundActor inside global.window_group covers the entirety of the
// screen. So, we set no_clear_hint at the end of the animation.
_prepareStartupAnimation: function() {
// During the initial transition, add a simple actor to block all events,
@ -673,10 +670,6 @@ const LayoutManager = new Lang.Class({
},
_startupAnimationComplete: function() {
// At this point, the UI group is covering everything, so
// we no longer need to clear the stage
global.stage.no_clear_hint = true;
this._coverPane.destroy();
this._coverPane = null;
@ -915,9 +908,6 @@ const LayoutManager = new Lang.Class({
},
_queueUpdateRegions: function() {
if (Main.sessionMode.isGreeter)
return;
if (this._startingUp)
return;
@ -951,13 +941,16 @@ const LayoutManager = new Lang.Class({
},
_updateRegions: function() {
let rects = [], struts = [], i;
if (this._updateRegionIdle) {
Meta.later_remove(this._updateRegionIdle);
delete this._updateRegionIdle;
}
// No need to update when we have a modal.
if (Main.modalCount > 0)
return GLib.SOURCE_REMOVE;
let rects = [], struts = [], i;
let isPopupMenuVisible = global.top_window_group.get_children().some(isPopupMetaWindow);
let wantsInputRegion = !isPopupMenuVisible;
@ -1043,7 +1036,13 @@ const LayoutManager = new Lang.Class({
}
return GLib.SOURCE_REMOVE;
}
},
modalEnded: function() {
// We don't update the stage input region while in a modal,
// so queue an update now.
this._queueUpdateRegions();
},
});
Signals.addSignalMethods(LayoutManager.prototype);

View File

@ -1198,12 +1198,7 @@ const ZoomRegion = new Lang.Class({
// Add a background for when the magnified uiGroup is scrolled
// out of view (don't want to see desktop showing through).
this._background = new Clutter.Actor({ background_color: Main.DEFAULT_BACKGROUND_COLOR,
layout_manager: new Clutter.BinLayout(),
width: global.screen_width,
height: global.screen_height });
let noiseTexture = (new Background.SystemBackground()).actor;
this._background.add_actor(noiseTexture);
this._background = (new Background.SystemBackground()).actor;
mainGroup.add_actor(this._background);
// Clone the group that contains all of UI on the screen. This is the

View File

@ -40,8 +40,6 @@ const Magnifier = imports.ui.magnifier;
const XdndHandler = imports.ui.xdndHandler;
const Util = imports.misc.util;
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
const STICKY_KEYS_ENABLE = 'stickykeys-enable';
const GNOMESHELL_STARTED_MESSAGE_ID = 'f3ea493c22934e26811cd62abe8e203a';
@ -204,24 +202,24 @@ function _initializeUI() {
}
layoutManager.connect('startup-complete', function() {
if (keybindingMode == Shell.KeyBindingMode.NONE) {
keybindingMode = Shell.KeyBindingMode.NORMAL;
}
if (screenShield) {
screenShield.lockIfWasLocked();
}
if (LoginManager.haveSystemd() &&
sessionMode.currentMode != 'gdm' &&
sessionMode.currentMode != 'initial-setup') {
// Do not import globally to not depend
// on systemd on non-systemd systems.
let GSystem = imports.gi.GSystem;
GSystem.log_structured_print('GNOME Shell started at ' + _startDate,
['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]);
} else {
log('GNOME Shell started at ' + _startDate);
}
});
if (keybindingMode == Shell.KeyBindingMode.NONE) {
keybindingMode = Shell.KeyBindingMode.NORMAL;
}
if (screenShield) {
screenShield.lockIfWasLocked();
}
if (LoginManager.haveSystemd() &&
sessionMode.currentMode != 'gdm' &&
sessionMode.currentMode != 'initial-setup') {
// Do not import globally to not depend
// on systemd on non-systemd systems.
let GSystem = imports.gi.GSystem;
GSystem.log_structured_print('GNOME Shell started at ' + _startDate,
['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]);
} else {
log('GNOME Shell started at ' + _startDate);
}
});
}
function _loadDefaultStylesheet() {
@ -454,6 +452,7 @@ function popModal(actor, timestamp) {
if (modalCount > 0)
return;
layoutManager.modalEnded();
global.end_modal(timestamp);
Meta.enable_unredirect_for_screen(global.screen);
keybindingMode = Shell.KeyBindingMode.NORMAL;

View File

@ -15,6 +15,7 @@ const Signals = imports.signals;
const St = imports.gi.St;
const Tp = imports.gi.TelepathyGLib;
const EdgeDragAction = imports.ui.edgeDragAction;
const BoxPointer = imports.ui.boxpointer;
const CtrlAltTab = imports.ui.ctrlAltTab;
const GnomeSession = imports.misc.gnomeSession;
@ -26,6 +27,7 @@ const PopupMenu = imports.ui.popupMenu;
const Params = imports.misc.params;
const Tweener = imports.ui.tweener;
const Util = imports.misc.util;
const ViewSelector = imports.ui.viewSelector;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
@ -1157,6 +1159,7 @@ const SourceActor = new Lang.Class({
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this.actor.connect('allocate', Lang.bind(this, this._allocate));
this.actor.connect('destroy', Lang.bind(this, function() {
this._source.disconnect(this._iconUpdatedId);
this._actorDestroyed = true;
}));
this._actorDestroyed = false;
@ -1168,7 +1171,7 @@ const SourceActor = new Lang.Class({
this.actor.add_actor(this._iconBin);
this._source.connect('icon-updated', Lang.bind(this, this._updateIcon));
this._iconUpdatedId = this._source.connect('icon-updated', Lang.bind(this, this._updateIcon));
this._updateIcon();
},
@ -1226,8 +1229,12 @@ const SourceActorWithLabel = new Lang.Class({
this.actor.add_actor(this._counterBin);
this._source.connect('count-updated', Lang.bind(this, this._updateCount));
this._countUpdatedId = this._source.connect('count-updated', Lang.bind(this, this._updateCount));
this._updateCount();
this.actor.connect('destroy', function() {
this._source.disconnect(this._countUpdatedId);
});
},
_allocate: function(actor, box, flags) {
@ -1810,6 +1817,13 @@ const MessageTray = new Lang.Class({
y_expand: true });
this.actor.add_actor(this._summary);
this._focusTrap = new ViewSelector.FocusTrap({ can_focus: true });
this._focusTrap.connect('key-focus-in', Lang.bind(this,
function() {
this._messageTrayMenuButton.actor.grab_key_focus();
}));
this._summary.add_actor(this._focusTrap);
this._summaryMotionId = 0;
this._summaryBoxPointer = new BoxPointer.BoxPointer(St.Side.BOTTOM,
@ -1933,6 +1947,15 @@ const MessageTray = new Lang.Class({
this._messageTrayMenuButton = new MessageTrayMenuButton(this);
this.actor.add_actor(this._messageTrayMenuButton.actor);
this._messageTrayMenuButton.actor.connect('key-press-event',
Lang.bind(this, this._onTrayButtonKeyPress));
let gesture = new EdgeDragAction.EdgeDragAction(St.Side.BOTTOM,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW);
gesture.connect('activated', Lang.bind(this, this.toggle));
global.stage.add_action(gesture);
},
close: function() {
@ -2025,6 +2048,16 @@ const MessageTray = new Lang.Class({
return GLib.SOURCE_REMOVE;
},
_onTrayButtonKeyPress: function(actor, event) {
if (event.get_key_symbol() == Clutter.ISO_Left_Tab) {
this._focusTrap.can_focus = false;
this._summary.navigate_focus(null, Gtk.DirectionType.TAB_BACKWARD, false);
this._focusTrap.can_focus = true;
return Clutter.EVENT_STOP;
}
return Clutter.EVENT_PROPAGATE;
},
_onNotificationKeyRelease: function(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) {
this._expireNotification();
@ -2401,8 +2434,22 @@ const MessageTray = new Lang.Class({
if (shouldShowNotification && nextNotification) {
let limited = this._busy || Main.layoutManager.bottomMonitor.inFullscreen;
let showNextNotification = (!limited || nextNotification.forFeedback || nextNotification.urgency == Urgency.CRITICAL);
if (showNextNotification)
this._showNotification();
if (showNextNotification) {
let len = this._notificationQueue.length;
if (len > 1) {
this._notificationQueue.length = 0;
let source = new SystemNotificationSource();
this.add(source);
let notification = new Notification(source, ngettext("%d new message", "%d new messages", len).format(len));
notification.setTransient(true);
notification.connect('clicked', Lang.bind(this, function() {
this.openTray();
}));
source.notify(notification);
} else {
this._showNotification();
}
}
}
} else if (this._notificationState == State.SHOWN) {
let expired = (this._userActiveWhileNotificationShown &&

View File

@ -185,7 +185,7 @@ const Overview = new Lang.Class({
for (let i = 0; i < Main.layoutManager.monitors.length; i++) {
let bgManager = new Background.BackgroundManager({ container: this._backgroundGroup,
monitorIndex: i,
effects: Meta.BackgroundEffects.VIGNETTE });
vignette: true });
this._bgManagers.push(bgManager);
}
},
@ -193,11 +193,9 @@ const Overview = new Lang.Class({
_unshadeBackgrounds: function() {
let backgrounds = this._backgroundGroup.get_children();
for (let i = 0; i < backgrounds.length; i++) {
let background = backgrounds[i]._delegate;
Tweener.addTween(background,
Tweener.addTween(backgrounds[i],
{ brightness: 1.0,
vignetteSharpness: 0.0,
vignette_sharpness: 0.0,
time: SHADE_ANIMATION_TIME,
transition: 'easeOutQuad'
});
@ -207,11 +205,9 @@ const Overview = new Lang.Class({
_shadeBackgrounds: function() {
let backgrounds = this._backgroundGroup.get_children();
for (let i = 0; i < backgrounds.length; i++) {
let background = backgrounds[i]._delegate;
Tweener.addTween(background,
Tweener.addTween(backgrounds[i],
{ brightness: Lightbox.VIGNETTE_BRIGHTNESS,
vignetteSharpness: Lightbox.VIGNETTE_SHARPNESS,
vignette_sharpness: Lightbox.VIGNETTE_SHARPNESS,
time: SHADE_ANIMATION_TIME,
transition: 'easeOutQuad'
});
@ -439,17 +435,17 @@ const Overview = new Lang.Class({
this._inDrag = false;
},
beginWindowDrag: function(clone) {
this.emit('window-drag-begin', clone);
beginWindowDrag: function(window) {
this.emit('window-drag-begin', window);
this._inDrag = true;
},
cancelledWindowDrag: function(clone) {
this.emit('window-drag-cancelled', clone);
cancelledWindowDrag: function(window) {
this.emit('window-drag-cancelled', window);
},
endWindowDrag: function(clone) {
this.emit('window-drag-end', clone);
endWindowDrag: function(window) {
this.emit('window-drag-end', window);
this._inDrag = false;
},
@ -675,6 +671,10 @@ const Overview = new Lang.Class({
this.hide();
else
this.show();
},
getShowAppsButton: function() {
return this._dash.showAppsButton;
}
});
Signals.addSignalMethods(Overview.prototype);

View File

@ -36,7 +36,7 @@ const SlideLayout = new Lang.Class({
_init: function(params) {
this._slideX = 1;
this._translationX = 0;
this._translationX = undefined;
this._direction = SlideDirection.LEFT;
this.parent(params);
@ -64,7 +64,8 @@ const SlideLayout = new Lang.Class({
// flags only determine what to do if the allocated box is bigger
// than the actor's box.
let realDirection = getRtlSlideDirection(this._direction, child);
let alignX = (realDirection == SlideDirection.LEFT) ? (availWidth - natWidth) : 0;
let alignX = (realDirection == SlideDirection.LEFT) ? (availWidth - natWidth)
: (availWidth - natWidth * this._slideX);
let actorBox = new Clutter.ActorBox();
actorBox.x1 = box.x1 + alignX + this._translationX;
@ -161,7 +162,8 @@ const SlidingControl = new Lang.Class({
let translationEnd = 0;
let translation = this._getTranslation();
if (this._visible) {
let shouldShow = (this._getSlide() > 0);
if (shouldShow) {
translationStart = translation;
} else {
translationEnd = translation;
@ -177,8 +179,8 @@ const SlidingControl = new Lang.Class({
},
_onOverviewHiding: function() {
// We need to explicitily slideOut since showing pages
// doesn't implies to slide out, instead, hiding the overview does.
// We need to explicitly slideOut since showing pages
// doesn't imply sliding out, instead, hiding the overview does.
this.slideOut();
},
@ -192,7 +194,7 @@ const SlidingControl = new Lang.Class({
_onDragBegin: function() {
this._inDrag = true;
this.layout.translationX = 0;
this._updateTranslation();
this._updateSlide();
},
@ -217,7 +219,6 @@ const SlidingControl = new Lang.Class({
slideIn: function() {
this._visible = true;
this._updateTranslation();
// we will update slideX and the translation from pageEmpty
},

View File

@ -1019,7 +1019,7 @@ const Panel = new Lang.Class({
if (!dragWindow)
return Clutter.EVENT_PROPAGATE;
let rect = dragWindow.get_outer_rect();
let rect = dragWindow.get_frame_rect();
let [stageX, stageY] = event.get_coords();
let allowDrag = dragWindow.maximized_vertically &&

View File

@ -101,7 +101,6 @@ const Button = new Lang.Class({
accessible_role: Atk.Role.MENU });
this.actor.connect('event', Lang.bind(this, this._onEvent));
this.actor.connect('key-press-event', Lang.bind(this, this._onSourceKeyPress));
this.actor.connect('notify::visible', Lang.bind(this, this._onVisibilityChanged));
if (dontCreateMenu)
@ -140,26 +139,6 @@ const Button = new Lang.Class({
return Clutter.EVENT_PROPAGATE;
},
_onSourceKeyPress: function(actor, event) {
if (!this.menu)
return Clutter.EVENT_PROPAGATE;
let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) {
this.menu.toggle();
return Clutter.EVENT_STOP;
} else if (symbol == Clutter.KEY_Escape && this.menu.isOpen) {
this.menu.close();
return Clutter.EVENT_STOP;
} else if (symbol == Clutter.KEY_Down) {
if (!this.menu.isOpen)
this.menu.toggle();
this.menu.actor.navigate_focus(this.actor, Gtk.DirectionType.DOWN, false);
return Clutter.EVENT_STOP;
} else
return Clutter.EVENT_PROPAGATE;
},
_onVisibilityChanged: function() {
if (!this.menu)
return;

View File

@ -731,6 +731,10 @@ const PopupMenu = new Lang.Class({
global.focus_manager.add_group(this.actor);
this.actor.reactive = true;
if (this.sourceActor)
this._keyPressId = this.sourceActor.connect('key-press-event',
Lang.bind(this, this._onKeyPress));
this._openedSubMenu = null;
},
@ -741,6 +745,40 @@ const PopupMenu = new Lang.Class({
this._openedSubMenu = submenu;
},
_onKeyPress: function(actor, event) {
let navKey;
switch (this._boxPointer.arrowSide) {
case St.Side.TOP:
navKey = Clutter.KEY_Down;
break;
case St.Side.BOTTOM:
navKey = Clutter.KEY_Up;
break;
case St.Side.LEFT:
navKey = Clutter.KEY_Right;
break;
case St.Side.RIGHT:
navKey = Clutter.KEY_Left;
break;
}
let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) {
this.toggle();
return Clutter.EVENT_STOP;
} else if (symbol == Clutter.KEY_Escape && this.isOpen) {
this.close();
return Clutter.EVENT_STOP;
} else if (symbol == navKey) {
if (!this.isOpen)
this.toggle();
this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
return Clutter.EVENT_STOP;
} else
return Clutter.EVENT_PROPAGATE;
},
setArrowOrigin: function(origin) {
this._boxPointer.setArrowOrigin(origin);
},
@ -781,6 +819,12 @@ const PopupMenu = new Lang.Class({
this.isOpen = false;
this.emit('open-state-changed', false);
},
destroy: function() {
if (this._keyPressId)
this.sourceActor.disconnect(this._keyPressId);
this.parent();
}
});
@ -874,12 +918,14 @@ const PopupSubMenu = new Lang.Class({
if (animate && needsScrollbar)
animate = false;
let targetAngle = this.actor.text_direction == Clutter.TextDirection.RTL ? -90 : 90;
if (animate) {
let [minHeight, naturalHeight] = this.actor.get_preferred_height(-1);
this.actor.height = 0;
this.actor._arrowRotation = this._arrow.rotation_angle_z;
Tweener.addTween(this.actor,
{ _arrowRotation: this.actor._arrowRotation + 90,
{ _arrowRotation: targetAngle,
height: naturalHeight,
time: 0.25,
onUpdateScope: this,
@ -892,7 +938,7 @@ const PopupSubMenu = new Lang.Class({
}
});
} else {
this._arrow.rotation_angle_z = this.actor._arrowRotation + 90;
this._arrow.rotation_angle_z = targetAngle;
}
},
@ -912,7 +958,7 @@ const PopupSubMenu = new Lang.Class({
if (animate) {
this.actor._arrowRotation = this._arrow.rotation_angle_z;
Tweener.addTween(this.actor,
{ _arrowRotation: this.actor._arrowRotation - 90,
{ _arrowRotation: 0,
height: 0,
time: 0.25,
onUpdateScope: this,
@ -926,7 +972,7 @@ const PopupSubMenu = new Lang.Class({
},
});
} else {
this._arrow.rotation_angle_z = this.actor._arrowRotation - 90;
this._arrow.rotation_angle_z = 0;
this.actor.hide();
}
},
@ -1004,8 +1050,6 @@ const PopupSubMenuMenuItem = new Lang.Class({
this._triangleBin = new St.Widget({ y_expand: true,
y_align: Clutter.ActorAlign.CENTER });
this._triangleBin.add_child(this._triangle);
if (this._triangleBin.get_text_direction() == Clutter.TextDirection.RTL)
this._triangleBin.set_scale(-1.0, 1.0);
this.actor.add_child(this._triangleBin);
this.actor.add_accessible_state (Atk.StateType.EXPANDABLE);

View File

@ -687,10 +687,10 @@ const ScreenShield = new Lang.Class({
return Clutter.EVENT_PROPAGATE;
let delta = 0;
if (event.get_scroll_direction() == Clutter.ScrollDirection.UP)
if (event.get_scroll_direction() == Clutter.ScrollDirection.SMOOTH)
delta = Math.abs(event.get_scroll_delta()[0]);
else
delta = 5;
else if (event.get_scroll_direction() == Clutter.ScrollDirection.SMOOTH)
delta = Math.max(0, event.get_scroll_delta()[0]);
this._lockScreenScrollCounter += delta;
@ -919,6 +919,11 @@ const ScreenShield = new Lang.Class({
this._lockScreenState = MessageTray.State.HIDDEN;
this._lockScreenGroup.hide();
if (this._dialog) {
this._dialog.actor.grab_key_focus();
this._dialog.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
}
},
_hideLockScreen: function(animate, velocity) {

View File

@ -43,6 +43,8 @@ const ScreencastService = new Lang.Class({
this._recorders = new Map();
this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' });
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
},
@ -68,8 +70,8 @@ const ScreencastService = new Lang.Class({
if (Main.sessionMode.allowScreencast)
return;
this._recorders.clear();
this.emit('updated');
for (let sender of this._recorders.keys())
this._stopRecordingForSender(sender);
},
_onNameVanished: function(connection, name) {
@ -103,7 +105,8 @@ const ScreencastService = new Lang.Class({
ScreencastAsync: function(params, invocation) {
let returnValue = [false, ''];
if (!Main.sessionMode.allowScreencast) {
if (!Main.sessionMode.allowScreencast ||
this._lockdownSettings.get_boolean('disable-save-to-disk')) {
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
@ -117,6 +120,8 @@ const ScreencastService = new Lang.Class({
this._applyOptionalParameters(recorder, options);
let [success, fileName] = recorder.record();
returnValue = [success, fileName ? fileName : ''];
if (!success)
this._stopRecordingForSender(sender);
}
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
@ -124,7 +129,8 @@ const ScreencastService = new Lang.Class({
ScreencastAreaAsync: function(params, invocation) {
let returnValue = [false, ''];
if (!Main.sessionMode.allowScreencast) {
if (!Main.sessionMode.allowScreencast ||
this._lockdownSettings.get_boolean('disable-save-to-disk')) {
invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
@ -150,6 +156,8 @@ const ScreencastService = new Lang.Class({
this._applyOptionalParameters(recorder, options);
let [success, fileName] = recorder.record();
returnValue = [success, fileName ? fileName : ''];
if (!success)
this._stopRecordingForSender(sender);
}
invocation.return_value(GLib.Variant.new('(bs)', returnValue));

View File

@ -65,9 +65,44 @@ const ScreenshotService = new Lang.Class({
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenshotIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screenshot');
this._screenShooter = new Map();
this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' });
Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
},
_createScreenshot: function(invocation) {
let sender = invocation.get_sender();
if (this._screenShooter.has(sender) ||
this._lockdownSettings.get_boolean('disable-save-to-disk')) {
invocation.return_value(GLib.Variant.new('(bs)', [false, '']));
return null;
}
let shooter = new Shell.Screenshot();
shooter._watchNameId =
Gio.bus_watch_name(Gio.BusType.SESSION, sender, 0, null,
Lang.bind(this, this._onNameVanished));
this._screenShooter.set(sender, shooter);
return shooter;
},
_onNameVanished: function(connection, name) {
this._removeShooterForSender(name);
},
_removeShooterForSender: function(sender) {
let shooter = this._screenShooter.get(sender);
if (!shooter)
return;
Gio.bus_unwatch_name(shooter._watchNameId);
this._screenShooter.delete(sender);
},
_checkArea: function(x, y, width, height) {
return x >= 0 && y >= 0 &&
width > 0 && height > 0 &&
@ -76,9 +111,15 @@ const ScreenshotService = new Lang.Class({
},
_onScreenshotComplete: function(obj, result, area, filenameUsed, flash, invocation) {
if (flash && result) {
let flashspot = new Flashspot(area);
flashspot.fire();
if (result) {
if (flash) {
let flashspot = new Flashspot(area);
flashspot.fire(Lang.bind(this, function() {
this._removeShooterForSender(invocation.get_sender());
}));
}
else
this._removeShooterForSender(invocation.get_sender());
}
let retval = GLib.Variant.new('(bs)', [result, filenameUsed]);
@ -112,7 +153,9 @@ const ScreenshotService = new Lang.Class({
"Invalid params");
return;
}
let screenshot = new Shell.Screenshot();
let screenshot = this._createScreenshot(invocation);
if (!screenshot)
return;
screenshot.screenshot_area (x, y, width, height, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
@ -120,7 +163,9 @@ const ScreenshotService = new Lang.Class({
ScreenshotWindowAsync : function (params, invocation) {
let [include_frame, include_cursor, flash, filename] = params;
let screenshot = new Shell.Screenshot();
let screenshot = this._createScreenshot(invocation);
if (!screenshot)
return;
screenshot.screenshot_window (include_frame, include_cursor, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
@ -128,7 +173,9 @@ const ScreenshotService = new Lang.Class({
ScreenshotAsync : function (params, invocation) {
let [include_cursor, flash, filename] = params;
let screenshot = new Shell.Screenshot();
let screenshot = this._createScreenshot(invocation);
if (!screenshot)
return;
screenshot.screenshot(include_cursor, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
@ -302,7 +349,7 @@ const Flashspot = new Lang.Class({
this.actor.set_position(area.x, area.y);
},
fire: function() {
fire: function(doneCallback) {
this.actor.show();
this.actor.opacity = 255;
Tweener.addTween(this.actor,
@ -310,6 +357,8 @@ const Flashspot = new Lang.Class({
time: FLASHSPOT_ANIMATION_OUT_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
if (doneCallback)
doneCallback();
this.destroy();
})
});

View File

@ -2,10 +2,12 @@
const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Meta = imports.gi.Meta;
const Signals = imports.signals;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const Atk = imports.gi.Atk;
@ -23,108 +25,6 @@ const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers';
const MAX_LIST_SEARCH_RESULTS_ROWS = 3;
const MAX_GRID_SEARCH_RESULTS_ROWS = 1;
const SearchSystem = new Lang.Class({
Name: 'SearchSystem',
_init: function() {
this._providers = [];
this._registerProvider(new AppDisplay.AppSearchProvider());
this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA });
this._searchSettings.connect('changed::enabled', Lang.bind(this, this._reloadRemoteProviders));
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));
this._reloadRemoteProviders();
this._cancellable = new Gio.Cancellable();
},
addProvider: function(provider) {
this._providers.push(provider);
this.emit('providers-changed');
},
_reloadRemoteProviders: function() {
let remoteProviders = this._providers.filter(function(provider) {
return provider.isRemoteProvider;
});
remoteProviders.forEach(Lang.bind(this, function(provider) {
this._unregisterProvider(provider);
}));
RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, function(providers) {
providers.forEach(Lang.bind(this, this._registerProvider));
}));
this.emit('providers-changed');
},
_registerProvider: function (provider) {
this._providers.push(provider);
},
_unregisterProvider: function (provider) {
let index = this._providers.indexOf(provider);
this._providers.splice(index, 1);
if (provider.display)
provider.display.destroy();
},
getProviders: function() {
return this._providers;
},
getTerms: function() {
return this._terms;
},
reset: function() {
this._terms = [];
this._results = {};
},
_gotResults: function(results, provider) {
this._results[provider.id] = results;
this.emit('search-updated', provider, results);
},
setTerms: function(terms) {
this._cancellable.cancel();
this._cancellable.reset();
let previousResults = this._results;
let previousTerms = this._terms;
this.reset();
if (!terms)
return;
let searchString = terms.join(' ');
let previousSearchString = previousTerms.join(' ');
if (searchString == previousSearchString)
return;
let isSubSearch = false;
if (previousTerms.length > 0)
isSubSearch = searchString.indexOf(previousSearchString) == 0;
this._terms = terms;
this._providers.forEach(Lang.bind(this, function(provider) {
let previousProviderResults = previousResults[provider.id];
if (isSubSearch && previousProviderResults)
provider.getSubsearchResultSet(previousProviderResults, terms, Lang.bind(this, this._gotResults, provider), this._cancellable);
else
provider.getInitialResultSet(terms, Lang.bind(this, this._gotResults, provider), this._cancellable);
}));
}
});
Signals.addSignalMethods(SearchSystem.prototype);
const MaxWidthBin = new Lang.Class({
Name: 'MaxWidthBin',
Extends: St.Bin,
@ -164,13 +64,6 @@ const SearchResult = new Lang.Class({
activate: function() {
this.emit('activate', this.metaInfo.id);
},
setSelected: function(selected) {
if (selected)
this.actor.add_style_pseudo_class('selected');
else
this.actor.remove_style_pseudo_class('selected');
}
});
Signals.addSignalMethods(SearchResult.prototype);
@ -231,59 +124,11 @@ const GridSearchResult = new Lang.Class({
this.actor.style_class = 'grid-search-result';
let content = provider.createResultObject(metaInfo);
let dragSource = null;
if (content == null) {
let actor = new St.Bin();
let icon = new IconGrid.BaseIcon(this.metaInfo['name'],
{ createIcon: this.metaInfo['createIcon'] });
actor.set_child(icon.actor);
actor.label_actor = icon.label;
dragSource = icon.icon;
content = { actor: actor, icon: icon };
} else {
if (content.getDragActorSource)
dragSource = content.getDragActorSource();
}
this.actor.set_child(content.actor);
this.actor.label_actor = content.actor.label_actor;
this.icon = content.icon;
let draggable = DND.makeDraggable(this.actor);
draggable.connect('drag-begin',
Lang.bind(this, function() {
Main.overview.beginItemDrag(this);
}));
draggable.connect('drag-cancelled',
Lang.bind(this, function() {
Main.overview.cancelledItemDrag(this);
}));
draggable.connect('drag-end',
Lang.bind(this, function() {
Main.overview.endItemDrag(this);
}));
if (!dragSource)
// not exactly right, but alignment problems are hard to notice
dragSource = content.actor;
this._dragActorSource = dragSource;
},
getDragActorSource: function() {
return this._dragActorSource;
},
getDragActor: function() {
return this.metaInfo['createIcon'](Main.overview.dashIconSize);
},
shellWorkspaceLaunch: function(params) {
if (this.provider.dragActivateResult)
this.provider.dragActivateResult(this.metaInfo.id, params);
else
this.provider.activateResult(this.metaInfo.id, this.terms);
this.icon = new IconGrid.BaseIcon(this.metaInfo['name'],
{ createIcon: this.metaInfo['createIcon'] });
let content = new St.Bin({ child: this.icon.actor });
this.actor.set_child(content);
this.actor.label_actor = this.icon.label;
}
});
@ -315,7 +160,11 @@ const SearchResultsBase = new Lang.Class({
this._terms = [];
},
_clearResultDisplay: function() {
_createResultDisplay: function(meta) {
if (this.provider.createResultObject)
return this.provider.createResultObject(meta);
return null;
},
clear: function() {
@ -385,9 +234,10 @@ const SearchResultsBase = new Lang.Class({
let hasMoreResults = results.length < providerResults.length;
this._ensureResultActors(results, Lang.bind(this, function(successful) {
this._clearResultDisplay();
if (!successful)
if (!successful) {
this._clearResultDisplay();
return;
}
// To avoid CSS transitions causing flickering when
// the first search result stays the same, we hide the
@ -417,6 +267,7 @@ const ListSearchResults = new Lang.Class({
this.providerIcon.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this.providerIcon.connect('clicked', Lang.bind(this,
function() {
this.providerIcon.animateLaunch();
provider.launchSearch(this._terms);
Main.overview.toggle();
}));
@ -446,7 +297,7 @@ const ListSearchResults = new Lang.Class({
},
_createResultDisplay: function(meta) {
return new ListSearchResult(this.provider, meta);
return this.parent(meta) || new ListSearchResult(this.provider, meta);
},
_addItem: function(display) {
@ -494,7 +345,7 @@ const GridSearchResults = new Lang.Class({
},
_createResultDisplay: function(meta) {
return new GridSearchResult(this.provider, meta);
return this.parent(meta) || new GridSearchResult(this.provider, meta);
},
_addItem: function(display) {
@ -546,16 +397,136 @@ const SearchResults = new Lang.Class({
this._statusText = new St.Label({ style_class: 'search-statustext' });
this._statusBin = new St.Bin({ x_align: St.Align.MIDDLE,
y_align: St.Align.MIDDLE });
this._content.add(this._statusBin, { expand: true });
this.actor.add(this._statusBin, { expand: true });
this._statusBin.add_actor(this._statusText);
this._highlightDefault = false;
this._defaultResult = null;
this._startingSearch = false;
this._searchSystem = new SearchSystem();
this._searchSystem.connect('search-updated', Lang.bind(this, this._updateResults));
this._searchSystem.connect('providers-changed', Lang.bind(this, this._updateProviderDisplays));
this._updateProviderDisplays();
this._terms = [];
this._results = {};
this._providers = [];
this._searchSettings = new Gio.Settings({ schema_id: 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));
this._searchTimeoutId = 0;
this._cancellable = new Gio.Cancellable();
this._registerProvider(new AppDisplay.AppSearchProvider());
this._reloadRemoteProviders();
},
_reloadRemoteProviders: function() {
let remoteProviders = this._providers.filter(function(provider) {
return provider.isRemoteProvider;
});
remoteProviders.forEach(Lang.bind(this, function(provider) {
this._unregisterProvider(provider);
}));
RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, function(providers) {
providers.forEach(Lang.bind(this, this._registerProvider));
}));
},
_registerProvider: function (provider) {
this._providers.push(provider);
this._ensureProviderDisplay(provider);
},
_unregisterProvider: function (provider) {
let index = this._providers.indexOf(provider);
this._providers.splice(index, 1);
if (provider.display)
provider.display.destroy();
},
_gotResults: function(results, provider) {
this._results[provider.id] = results;
this._updateResults(provider, results);
},
_clearSearchTimeout: function() {
if (this._searchTimeoutId > 0) {
GLib.source_remove(this._searchTimeoutId);
this._searchTimeoutId = 0;
}
},
_reset: function() {
this._terms = [];
this._results = {};
this._clearDisplay();
this._clearSearchTimeout();
this._defaultResult = null;
this._startingSearch = false;
this._updateSearchProgress();
},
_doSearch: function() {
this._startingSearch = false;
let previousResults = this._results;
this._results = {};
this._providers.forEach(Lang.bind(this, function(provider) {
provider.searchInProgress = true;
let previousProviderResults = previousResults[provider.id];
if (this._isSubSearch && previousProviderResults)
provider.getSubsearchResultSet(previousProviderResults, this._terms, Lang.bind(this, this._gotResults, provider), this._cancellable);
else
provider.getInitialResultSet(this._terms, Lang.bind(this, this._gotResults, provider), this._cancellable);
}));
this._updateSearchProgress();
this._clearSearchTimeout();
},
_onSearchTimeout: function() {
this._searchTimeoutId = 0;
this._doSearch();
return GLib.SOURCE_REMOVE;
},
setTerms: function(terms) {
// Check for the case of making a duplicate previous search before
// setting state of the current search or cancelling the search.
// This will prevent incorrect state being as a result of a duplicate
// search while the previous search is still active.
let searchString = terms.join(' ');
let previousSearchString = this._terms.join(' ');
if (searchString == previousSearchString)
return;
this._startingSearch = true;
this._cancellable.cancel();
this._cancellable.reset();
if (terms.length == 0) {
this._reset();
return;
}
let isSubSearch = false;
if (this._terms.length > 0)
isSubSearch = searchString.indexOf(previousSearchString) == 0;
this._terms = terms;
this._isSubSearch = isSubSearch;
this._updateSearchProgress();
if (this._searchTimeoutId == 0)
this._searchTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 150, Lang.bind(this, this._onSearchTimeout));
},
_onPan: function(action) {
@ -577,44 +548,24 @@ const SearchResults = new Lang.Class({
if (provider.appInfo)
providerDisplay = new ListSearchResults(provider);
else
providerDisplay = new GridSearchResults(provider, this._content);
providerDisplay = new GridSearchResults(provider, this.actor);
providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
providerDisplay.actor.hide();
this._content.add(providerDisplay.actor);
provider.display = providerDisplay;
},
_updateProviderDisplays: function() {
this._searchSystem.getProviders().forEach(Lang.bind(this, this._ensureProviderDisplay));
},
_clearDisplay: function() {
this._searchSystem.getProviders().forEach(function(provider) {
this._providers.forEach(function(provider) {
provider.display.clear();
});
},
reset: function() {
this._searchSystem.reset();
this._statusBin.hide();
this._clearDisplay();
this._defaultResult = null;
},
startingSearch: function() {
this.reset();
this._statusText.set_text(_("Searching…"));
this._statusBin.show();
},
setTerms: function(terms) {
this._searchSystem.setTerms(terms);
},
_maybeSetInitialSelection: function() {
let newDefaultResult = null;
let providers = this._searchSystem.getProviders();
let providers = this._providers;
for (let i = 0; i < providers.length; i++) {
let provider = providers[i];
let display = provider.display;
@ -630,54 +581,64 @@ const SearchResults = new Lang.Class({
}
if (newDefaultResult != this._defaultResult) {
if (this._defaultResult)
this._defaultResult.setSelected(false);
if (newDefaultResult) {
newDefaultResult.setSelected(this._highlightDefault);
if (this._highlightDefault)
Util.ensureActorVisibleInScrollView(this._scrollView, newDefaultResult.actor);
}
this._setSelected(this._defaultResult, false);
this._setSelected(newDefaultResult, this._highlightDefault);
this._defaultResult = newDefaultResult;
}
},
_updateStatusText: function () {
let haveResults = this._searchSystem.getProviders().some(function(provider) {
get searchInProgress() {
if (this._startingSearch)
return true;
return this._providers.some(function(provider) {
return provider.searchInProgress;
});
},
_updateSearchProgress: function () {
let haveResults = this._providers.some(function(provider) {
let display = provider.display;
return (display.getFirstResult() != null);
});
this._scrollView.visible = haveResults;
this._statusBin.visible = !haveResults;
if (!haveResults) {
this._statusText.set_text(_("No results."));
this._statusBin.show();
} else {
this._statusBin.hide();
if (this.searchInProgress) {
this._statusText.set_text(_("Searching…"));
} else {
this._statusText.set_text(_("No results."));
}
}
},
_updateResults: function(searchSystem, provider, results) {
let terms = searchSystem.getTerms();
_updateResults: function(provider, results) {
let terms = this._terms;
let display = provider.display;
display.updateSearch(results, terms, Lang.bind(this, function() {
provider.searchInProgress = false;
this._maybeSetInitialSelection();
this._updateStatusText();
this._updateSearchProgress();
}));
},
activateDefault: function() {
// If we have a search queued up, force the search now.
if (this._searchTimeoutId > 0)
this._doSearch();
if (this._defaultResult)
this._defaultResult.activate();
},
highlightDefault: function(highlight) {
this._highlightDefault = highlight;
if (this._defaultResult) {
this._defaultResult.setSelected(highlight);
if (highlight)
Util.ensureActorVisibleInScrollView(this._scrollView, this._defaultResult.actor);
}
this._setSelected(this._defaultResult, highlight);
},
navigateFocus: function(direction) {
@ -692,6 +653,18 @@ const SearchResults = new Lang.Class({
let from = this._defaultResult ? this._defaultResult.actor : null;
this.actor.navigate_focus(from, direction, false);
},
_setSelected: function(result, selected) {
if (!result)
return;
if (selected) {
result.actor.add_style_pseudo_class('selected');
Util.ensureActorVisibleInScrollView(this._scrollView, result.actor);
} else {
result.actor.remove_style_pseudo_class('selected');
}
}
});
@ -725,5 +698,12 @@ const ProviderIcon = new Lang.Class({
gicon: provider.appInfo.get_icon() });
this._content.add_actor(icon);
this._content.add_actor(this.moreIcon);
},
animateLaunch: function() {
let appSys = Shell.AppSystem.get_default();
let app = appSys.lookup_app(this.provider.appInfo.get_id());
if (app.state == Shell.AppState.STOPPED)
IconGrid.zoomOutActor(this._content);
}
});

View File

@ -17,8 +17,6 @@ const EntryMenu = new Lang.Class({
_init: function(entry) {
this.parent(entry, 0, St.Side.TOP);
this.actor.add_style_class_name('entry-context-menu');
this._entry = entry;
this._clipboard = St.Clipboard.get_default();

View File

@ -2,8 +2,6 @@
const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const GnomeDesktop = imports.gi.GnomeDesktop;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
@ -11,16 +9,9 @@ const Signals = imports.signals;
const St = imports.gi.St;
const Gettext = imports.gettext;
try {
var IBus = imports.gi.IBus;
if (!('new_async' in IBus.Bus))
throw "IBus version is too old";
const IBusCandidatePopup = imports.ui.ibusCandidatePopup;
} catch (e) {
var IBus = null;
log(e);
}
const IBus = imports.misc.ibusManager.IBus;
const IBusManager = imports.misc.ibusManager;
const KeyboardManager = imports.misc.keyboardManager;
const Main = imports.ui.main;
const PopupMenu = imports.ui.popupMenu;
const PanelMenu = imports.ui.panelMenu;
@ -28,173 +19,12 @@ const SwitcherPopup = imports.ui.switcherPopup;
const Util = imports.misc.util;
const DESKTOP_INPUT_SOURCES_SCHEMA = 'org.gnome.desktop.input-sources';
const KEY_CURRENT_INPUT_SOURCE = 'current';
const KEY_INPUT_SOURCES = 'sources';
const KEY_KEYBOARD_OPTIONS = 'xkb-options';
const INPUT_SOURCE_TYPE_XKB = 'xkb';
const INPUT_SOURCE_TYPE_IBUS = 'ibus';
// This is the longest we'll keep the keyboard frozen until an input
// source is active.
const MAX_INPUT_SOURCE_ACTIVATION_TIME = 4000; // ms
const BUS_NAME = 'org.gnome.SettingsDaemon.Keyboard';
const OBJECT_PATH = '/org/gnome/SettingsDaemon/Keyboard';
const KeyboardManagerInterface = '<node> \
<interface name="org.gnome.SettingsDaemon.Keyboard"> \
<method name="SetInputSource"> \
<arg type="u" direction="in" /> \
</method> \
</interface> \
</node>';
const KeyboardManagerProxy = Gio.DBusProxy.makeProxyWrapper(KeyboardManagerInterface);
function releaseKeyboard() {
if (Main.modalCount > 0)
global.display.unfreeze_keyboard(global.get_current_time());
else
global.display.ungrab_keyboard(global.get_current_time());
}
function holdKeyboard() {
global.freeze_keyboard(global.get_current_time());
}
const IBusManager = new Lang.Class({
Name: 'IBusManager',
_init: function(readyCallback) {
if (!IBus)
return;
IBus.init();
this._readyCallback = readyCallback;
this._candidatePopup = new IBusCandidatePopup.CandidatePopup();
this._panelService = null;
this._engines = {};
this._ready = false;
this._registerPropertiesId = 0;
this._currentEngineName = null;
this._ibus = IBus.Bus.new_async();
this._ibus.connect('connected', Lang.bind(this, this._onConnected));
this._ibus.connect('disconnected', Lang.bind(this, this._clear));
// Need to set this to get 'global-engine-changed' emitions
this._ibus.set_watch_ibus_signal(true);
this._ibus.connect('global-engine-changed', Lang.bind(this, this._engineChanged));
},
_clear: function() {
if (this._panelService)
this._panelService.destroy();
this._panelService = null;
this._candidatePopup.setPanelService(null);
this._engines = {};
this._ready = false;
this._registerPropertiesId = 0;
this._currentEngineName = null;
if (this._readyCallback)
this._readyCallback(false);
},
_onConnected: function() {
this._ibus.list_engines_async(-1, null, Lang.bind(this, this._initEngines));
this._ibus.request_name_async(IBus.SERVICE_PANEL,
IBus.BusNameFlag.REPLACE_EXISTING,
-1, null,
Lang.bind(this, this._initPanelService));
},
_initEngines: function(ibus, result) {
let enginesList = this._ibus.list_engines_async_finish(result);
if (enginesList) {
for (let i = 0; i < enginesList.length; ++i) {
let name = enginesList[i].get_name();
this._engines[name] = enginesList[i];
}
this._updateReadiness();
} else {
this._clear();
}
},
_initPanelService: function(ibus, result) {
let success = this._ibus.request_name_async_finish(result);
if (success) {
this._panelService = new IBus.PanelService({ connection: this._ibus.get_connection(),
object_path: IBus.PATH_PANEL });
this._candidatePopup.setPanelService(this._panelService);
this._panelService.connect('update-property', Lang.bind(this, this._updateProperty));
// If an engine is already active we need to get its properties
this._ibus.get_global_engine_async(-1, null, Lang.bind(this, function(i, result) {
let engine;
try {
engine = this._ibus.get_global_engine_async_finish(result);
if (!engine)
return;
} catch(e) {
return;
}
this._engineChanged(this._ibus, engine.get_name());
}));
this._updateReadiness();
} else {
this._clear();
}
},
_updateReadiness: function() {
this._ready = (Object.keys(this._engines).length > 0 &&
this._panelService != null);
if (this._readyCallback)
this._readyCallback(this._ready);
},
_engineChanged: function(bus, engineName) {
if (!this._ready)
return;
this._currentEngineName = engineName;
if (this._registerPropertiesId != 0)
return;
this._registerPropertiesId =
this._panelService.connect('register-properties', Lang.bind(this, function(p, props) {
if (!props.get(0))
return;
this._panelService.disconnect(this._registerPropertiesId);
this._registerPropertiesId = 0;
this.emit('properties-registered', this._currentEngineName, props);
}));
},
_updateProperty: function(panel, prop) {
this.emit('property-updated', this._currentEngineName, prop);
},
activateProperty: function(key, state) {
this._panelService.property_activate(key, state);
},
getEngineDesc: function(id) {
if (!IBus || !this._ready)
return null;
return this._engines[id];
}
});
Signals.addSignalMethods(IBusManager.prototype);
const LayoutMenuItem = new Lang.Class({
Name: 'LayoutMenuItem',
Extends: PopupMenu.PopupBaseMenuItem,
@ -220,16 +50,9 @@ const InputSource = new Lang.Class({
this._shortName = shortName;
this.index = index;
this._menuItem = new LayoutMenuItem(this.displayName, this._shortName);
this._menuItem.connect('activate', Lang.bind(this, this.activate));
this._indicatorLabel = new St.Label({ text: this._shortName });
this.properties = null;
},
destroy: function() {
this._menuItem.destroy();
this._indicatorLabel.destroy();
this.xkbId = this._getXkbId();
},
get shortName() {
@ -238,21 +61,23 @@ const InputSource = new Lang.Class({
set shortName(v) {
this._shortName = v;
this._menuItem.indicator.set_text(v);
this._indicatorLabel.set_text(v);
},
get menuItem() {
return this._menuItem;
},
get indicatorLabel() {
return this._indicatorLabel;
this.emit('changed');
},
activate: function() {
this.emit('activate');
},
_getXkbId: function() {
let engineDesc = IBusManager.getIBusManager().getEngineDesc(this.id);
if (!engineDesc)
return this.id;
if (engineDesc.variant && engineDesc.variant.length > 0)
return engineDesc.layout + '+' + engineDesc.variant;
else
return engineDesc.layout;
}
});
Signals.addSignalMethods(InputSource.prototype);
@ -265,22 +90,8 @@ const InputSourcePopup = new Lang.Class({
this._action = action;
this._actionBackward = actionBackward;
},
_createSwitcher: function() {
this._switcherList = new InputSourceSwitcher(this._items);
return true;
},
_initialSelection: function(backward, binding) {
if (binding == 'switch-input-source') {
if (backward)
this._selectedIndex = this._items.length - 1;
} else if (binding == 'switch-input-source-backward') {
if (!backward)
this._selectedIndex = this._items.length - 1;
}
this._select(this._selectedIndex);
},
_keyPressHandler: function(keysym, action) {
@ -331,25 +142,10 @@ const InputSourceSwitcher = new Lang.Class({
}
});
const InputSourceIndicator = new Lang.Class({
Name: 'InputSourceIndicator',
Extends: PanelMenu.Button,
const InputSourceManager = new Lang.Class({
Name: 'InputSourceManager',
_init: function() {
this.parent(0.0, _("Keyboard"));
this._container = new Shell.GenericContainer();
this._container.connect('get-preferred-width', Lang.bind(this, this._containerGetPreferredWidth));
this._container.connect('get-preferred-height', Lang.bind(this, this._containerGetPreferredHeight));
this._container.connect('allocate', Lang.bind(this, this._containerAllocate));
this._hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
this._hbox.add_child(this._container);
this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
this.actor.add_child(this._hbox);
this.actor.add_style_class_name('panel-status-button');
// All valid input sources currently in the gsettings
// KEY_INPUT_SOURCES list indexed by their index there
this._inputSources = {};
@ -376,38 +172,20 @@ const InputSourceIndicator = new Lang.Class({
Shell.KeyBindingMode.ALL,
Lang.bind(this, this._switchInputSource));
this._settings = new Gio.Settings({ schema_id: DESKTOP_INPUT_SOURCES_SCHEMA });
this._settings.connect('changed::' + KEY_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged));
this._settings.connect('changed::' + KEY_INPUT_SOURCES, Lang.bind(this, this._inputSourcesChanged));
this._settings.connect('changed::' + KEY_KEYBOARD_OPTIONS, Lang.bind(this, this._keyboardOptionsChanged));
this._xkbInfo = new GnomeDesktop.XkbInfo();
this._propSeparator = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(this._propSeparator);
this._propSection = new PopupMenu.PopupMenuSection();
this.menu.addMenuItem(this._propSection);
this._propSection.actor.hide();
this._xkbInfo = KeyboardManager.getXkbInfo();
this._keyboardManager = KeyboardManager.getKeyboardManager();
this._ibusReady = false;
this._ibusManager = new IBusManager(Lang.bind(this, this._ibusReadyCallback));
this._ibusManager = IBusManager.getIBusManager();
this._ibusManager.connect('ready', Lang.bind(this, this._ibusReadyCallback));
this._ibusManager.connect('properties-registered', Lang.bind(this, this._ibusPropertiesRegistered));
this._ibusManager.connect('property-updated', Lang.bind(this, this._ibusPropertyUpdated));
this._inputSourcesChanged();
this._keyboardManager = new KeyboardManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
function(proxy, error) {
if (error)
log(error.message);
});
this._keyboardManager.g_default_timeout = MAX_INPUT_SOURCE_ACTIVATION_TIME;
global.display.connect('modifiers-accelerator-activated', Lang.bind(this, this._modifiersSwitcher));
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._showLayoutItem = this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, this._showLayout));
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
this._sessionUpdated();
this._sourcesPerWindow = false;
this._focusWindowNotifyId = 0;
this._overviewShowingId = 0;
@ -416,15 +194,12 @@ const InputSourceIndicator = new Lang.Class({
this._sourcesPerWindowChanged();
},
_sessionUpdated: function() {
// re-using "allowSettings" for the keyboard layout is a bit shady,
// but at least for now it is used as "allow popping up windows
// from shell menus"; we can always add a separate sessionMode
// option if need arises.
this._showLayoutItem.actor.visible = Main.sessionMode.allowSettings;
reload: function() {
this._keyboardManager.setKeyboardOptions(this._settings.get_strv(KEY_KEYBOARD_OPTIONS));
this._inputSourcesChanged();
},
_ibusReadyCallback: function(ready) {
_ibusReadyCallback: function(im, ready) {
if (this._ibusReady == ready)
return;
@ -436,7 +211,7 @@ const InputSourceIndicator = new Lang.Class({
_modifiersSwitcher: function() {
let sourceIndexes = Object.keys(this._inputSources);
if (sourceIndexes.length == 0) {
releaseKeyboard();
KeyboardManager.releaseKeyboard();
return true;
}
@ -471,42 +246,20 @@ const InputSourceIndicator = new Lang.Class({
}
let popup = new InputSourcePopup(this._mruSources, this._keybindingAction, this._keybindingActionBackward);
let modifiers = binding.get_modifiers();
if (!popup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
popup.destroy();
},
_currentInputSourceChanged: function() {
let nVisibleSources = Object.keys(this._inputSources).length;
let newSourceIndex = this._settings.get_uint(KEY_CURRENT_INPUT_SOURCE);
let newSource = this._inputSources[newSourceIndex];
_keyboardOptionsChanged: function() {
this._keyboardManager.setKeyboardOptions(this._settings.get_strv(KEY_KEYBOARD_OPTIONS));
this._keyboardManager.reapply();
},
_currentInputSourceChanged: function(newSource) {
let oldSource;
[oldSource, this._currentSource] = [this._currentSource, newSource];
if (oldSource) {
oldSource.menuItem.setOrnament(PopupMenu.Ornament.NONE);
oldSource.indicatorLabel.hide();
}
if (!newSource || (nVisibleSources < 2 && !newSource.properties)) {
// This source index might be invalid if we weren't able
// to build a menu item for it, so we hide ourselves since
// we can't fix it here. *shrug*
// We also hide if we have only one visible source unless
// it's an IBus source with properties.
this.menu.close();
this.actor.hide();
return;
}
this.actor.show();
newSource.menuItem.setOrnament(PopupMenu.Ornament.DOT);
newSource.indicatorLabel.show();
this._buildPropSection(newSource.properties);
this.emit('current-source-changed', oldSource);
for (let i = 1; i < this._mruSources.length; ++i)
if (this._mruSources[i] == newSource) {
@ -518,19 +271,34 @@ const InputSourceIndicator = new Lang.Class({
this._changePerWindowSource();
},
_activateInputSource: function(is) {
KeyboardManager.holdKeyboard();
this._keyboardManager.apply(is.xkbId);
// All the "xkb:..." IBus engines simply "echo" back symbols,
// despite their naming implying differently, so we always set
// one in order for XIM applications to work given that we set
// XMODIFIERS=@im=ibus in the first place so that they can
// work without restarting when/if the user adds an IBus input
// source.
let engine;
if (is.type == INPUT_SOURCE_TYPE_IBUS)
engine = is.id;
else
engine = 'xkb:us::eng';
this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard);
this._currentInputSourceChanged(is);
},
_inputSourcesChanged: function() {
let sources = this._settings.get_value(KEY_INPUT_SOURCES);
let nSources = sources.n_children();
for (let i in this._inputSources)
this._inputSources[i].destroy();
this._inputSources = {};
this._ibusSources = {};
this._currentSource = null;
let inputSourcesByShortName = {};
let infosList = [];
for (let i = 0; i < nSources; i++) {
let displayName;
let shortName;
@ -554,15 +322,25 @@ const InputSourceIndicator = new Lang.Class({
}
}
if (!exists)
continue;
if (exists)
infosList.push({ type: type, id: id, displayName: displayName, shortName: shortName });
}
let is = new InputSource(type, id, displayName, shortName, i);
if (infosList.length == 0) {
let type = INPUT_SOURCE_TYPE_XKB;
let id = KeyboardManager.DEFAULT_LAYOUT;
let [ , displayName, shortName, , ] = this._xkbInfo.get_layout_info(id);
infosList.push({ type: type, id: id, displayName: displayName, shortName: shortName });
}
is.connect('activate', Lang.bind(this, function() {
holdKeyboard();
this._keyboardManager.SetInputSourceRemote(is.index, releaseKeyboard);
}));
let inputSourcesByShortName = {};
for (let i = 0; i < infosList.length; i++) {
let is = new InputSource(infosList[i].type,
infosList[i].id,
infosList[i].displayName,
infosList[i].shortName,
i);
is.connect('activate', Lang.bind(this, this._activateInputSource));
if (!(is.shortName in inputSourcesByShortName))
inputSourcesByShortName[is.shortName] = [];
@ -574,24 +352,22 @@ const InputSourceIndicator = new Lang.Class({
this._ibusSources[is.id] = is;
}
let menuIndex = 0;
for (let i in this._inputSources) {
let is = this._inputSources[i];
if (inputSourcesByShortName[is.shortName].length > 1) {
let sub = inputSourcesByShortName[is.shortName].indexOf(is) + 1;
is.shortName += String.fromCharCode(0x2080 + sub);
}
this.menu.addMenuItem(is.menuItem, menuIndex++);
is.indicatorLabel.hide();
this._container.add_actor(is.indicatorLabel);
}
this.emit('sources-changed');
let sourcesList = [];
for (let i in this._inputSources)
sourcesList.push(this._inputSources[i]);
this._keyboardManager.setUserLayouts(sourcesList.map(function(x) { return x.xkbId; }));
let mruSources = [];
for (let i = 0; i < this._mruSources.length; i++) {
for (let j = 0; j < sourcesList.length; j++)
@ -603,34 +379,8 @@ const InputSourceIndicator = new Lang.Class({
}
this._mruSources = mruSources.concat(sourcesList);
this._currentInputSourceChanged();
},
_showLayout: function() {
Main.overview.hide();
let source = this._currentSource;
let xkbLayout = '';
let xkbVariant = '';
if (source.type == INPUT_SOURCE_TYPE_XKB) {
[, , , xkbLayout, xkbVariant] = this._xkbInfo.get_layout_info(source.id);
} else if (source.type == INPUT_SOURCE_TYPE_IBUS) {
let engineDesc = this._ibusManager.getEngineDesc(source.id);
if (engineDesc) {
xkbLayout = engineDesc.get_layout();
xkbVariant = '';
}
}
if (!xkbLayout || xkbLayout.length == 0)
return;
let description = xkbLayout;
if (xkbVariant.length > 0)
description = description + '\t' + xkbVariant;
Util.spawn(['gkbd-keyboard-display', '-l', description]);
if (this._mruSources.length > 0)
this._mruSources[0].activate();
},
_makeEngineShortName: function(engineDesc) {
@ -653,7 +403,7 @@ const InputSourceIndicator = new Lang.Class({
source.properties = props;
if (source == this._currentSource)
this._currentInputSourceChanged();
this.emit('current-source-changed', null);
},
_ibusPropertyUpdated: function(im, engineName, prop) {
@ -663,7 +413,7 @@ const InputSourceIndicator = new Lang.Class({
if (this._updateSubProperty(source.properties, prop) &&
source == this._currentSource)
this._currentInputSourceChanged();
this.emit('current-source-changed', null);
},
_updateSubProperty: function(props, prop) {
@ -683,116 +433,6 @@ const InputSourceIndicator = new Lang.Class({
return false;
},
_buildPropSection: function(properties) {
this._propSeparator.actor.hide();
this._propSection.actor.hide();
this._propSection.removeAll();
this._buildPropSubMenu(this._propSection, properties);
if (!this._propSection.isEmpty()) {
this._propSection.actor.show();
this._propSeparator.actor.show();
}
},
_buildPropSubMenu: function(menu, props) {
if (!props)
return;
let radioGroup = [];
let p;
for (let i = 0; (p = props.get(i)) != null; ++i) {
let prop = p;
if (!prop.get_visible())
continue;
if (prop.get_key() == 'InputMode') {
let text;
if (prop.get_symbol)
text = prop.get_symbol().get_text();
else
text = prop.get_label().get_text();
if (text && text.length > 0 && text.length < 3)
this._currentSource.indicatorLabel.set_text(text);
}
let item;
switch (prop.get_prop_type()) {
case IBus.PropType.MENU:
item = new PopupMenu.PopupSubMenuMenuItem(prop.get_label().get_text());
this._buildPropSubMenu(item.menu, prop.get_sub_props());
break;
case IBus.PropType.RADIO:
item = new PopupMenu.PopupMenuItem(prop.get_label().get_text());
item.prop = prop;
radioGroup.push(item);
item.radioGroup = radioGroup;
item.setOrnament(prop.get_state() == IBus.PropState.CHECKED ?
PopupMenu.Ornament.DOT : PopupMenu.Ornament.NONE);
item.connect('activate', Lang.bind(this, function() {
if (item.prop.get_state() == IBus.PropState.CHECKED)
return;
let group = item.radioGroup;
for (let i = 0; i < group.length; ++i) {
if (group[i] == item) {
item.setOrnament(PopupMenu.Ornament.DOT);
item.prop.set_state(IBus.PropState.CHECKED);
this._ibusManager.activateProperty(item.prop.get_key(),
IBus.PropState.CHECKED);
} else {
group[i].setOrnament(PopupMenu.Ornament.NONE);
group[i].prop.set_state(IBus.PropState.UNCHECKED);
this._ibusManager.activateProperty(group[i].prop.get_key(),
IBus.PropState.UNCHECKED);
}
}
}));
break;
case IBus.PropType.TOGGLE:
item = new PopupMenu.PopupSwitchMenuItem(prop.get_label().get_text(), prop.get_state() == IBus.PropState.CHECKED);
item.prop = prop;
item.connect('toggled', Lang.bind(this, function() {
if (item.state) {
item.prop.set_state(IBus.PropState.CHECKED);
this._ibusManager.activateProperty(item.prop.get_key(),
IBus.PropState.CHECKED);
} else {
item.prop.set_state(IBus.PropState.UNCHECKED);
this._ibusManager.activateProperty(item.prop.get_key(),
IBus.PropState.UNCHECKED);
}
}));
break;
case IBus.PropType.NORMAL:
item = new PopupMenu.PopupMenuItem(prop.get_label().get_text());
item.prop = prop;
item.connect('activate', Lang.bind(this, function() {
this._ibusManager.activateProperty(item.prop.get_key(),
item.prop.get_state());
}));
break;
case IBus.PropType.SEPARATOR:
item = new PopupMenu.PopupSeparatorMenuItem();
break;
default:
log ('IBus property %s has invalid type %d'.format(prop.get_key(), type));
continue;
}
item.setSensitive(prop.get_sensitive());
menu.addMenuItem(item);
}
},
_getNewInputSource: function(current) {
for (let i in this._inputSources) {
let is = this._inputSources[i];
@ -869,15 +509,279 @@ const InputSourceIndicator = new Lang.Class({
window._currentSource = this._currentSource;
},
get currentSource() {
return this._currentSource;
},
get inputSources() {
return this._inputSources;
},
});
Signals.addSignalMethods(InputSourceManager.prototype);
let _inputSourceManager = null;
function getInputSourceManager() {
if (_inputSourceManager == null)
_inputSourceManager = new InputSourceManager();
return _inputSourceManager;
}
const InputSourceIndicator = new Lang.Class({
Name: 'InputSourceIndicator',
Extends: PanelMenu.Button,
_init: function() {
this.parent(0.0, _("Keyboard"));
this._menuItems = {};
this._indicatorLabels = {};
this._container = new Shell.GenericContainer();
this._container.connect('get-preferred-width', Lang.bind(this, this._containerGetPreferredWidth));
this._container.connect('get-preferred-height', Lang.bind(this, this._containerGetPreferredHeight));
this._container.connect('allocate', Lang.bind(this, this._containerAllocate));
this._hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
this._hbox.add_child(this._container);
this._hbox.add_child(PopupMenu.arrowIcon(St.Side.BOTTOM));
this.actor.add_child(this._hbox);
this.actor.add_style_class_name('panel-status-button');
this._propSeparator = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(this._propSeparator);
this._propSection = new PopupMenu.PopupMenuSection();
this.menu.addMenuItem(this._propSection);
this._propSection.actor.hide();
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._showLayoutItem = this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, this._showLayout));
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
this._sessionUpdated();
this._inputSourceManager = getInputSourceManager();
this._inputSourceManager.connect('sources-changed', Lang.bind(this, this._sourcesChanged));
this._inputSourceManager.connect('current-source-changed', Lang.bind(this, this._currentSourceChanged));
this._inputSourceManager.reload();
},
_sessionUpdated: function() {
// re-using "allowSettings" for the keyboard layout is a bit shady,
// but at least for now it is used as "allow popping up windows
// from shell menus"; we can always add a separate sessionMode
// option if need arises.
this._showLayoutItem.actor.visible = Main.sessionMode.allowSettings;
},
_sourcesChanged: function() {
for (let i in this._menuItems)
this._menuItems[i].destroy();
for (let i in this._indicatorLabels)
this._indicatorLabels[i].destroy();
let menuIndex = 0;
for (let i in this._inputSourceManager.inputSources) {
let is = this._inputSourceManager.inputSources[i];
let menuItem = new LayoutMenuItem(is.displayName, is.shortName);
menuItem.connect('activate', Lang.bind(is, is.activate));
let indicatorLabel = new St.Label({ text: is.shortName,
visible: false });
this._menuItems[i] = menuItem;
this._indicatorLabels[i] = indicatorLabel;
is.connect('changed', function() {
menuItem.indicator.set_text(is.shortName);
indicatorLabel.set_text(is.shorName);
});
this.menu.addMenuItem(menuItem, menuIndex++);
this._container.add_actor(indicatorLabel);
}
},
_currentSourceChanged: function(manager, oldSource) {
let nVisibleSources = Object.keys(this._inputSourceManager.inputSources).length;
let newSource = this._inputSourceManager.currentSource;
if (oldSource) {
this._menuItems[oldSource.index].setOrnament(PopupMenu.Ornament.NONE);
this._indicatorLabels[oldSource.index].hide();
}
if (!newSource || (nVisibleSources < 2 && !newSource.properties)) {
// This source index might be invalid if we weren't able
// to build a menu item for it, so we hide ourselves since
// we can't fix it here. *shrug*
// We also hide if we have only one visible source unless
// it's an IBus source with properties.
this.menu.close();
this.actor.hide();
return;
}
this.actor.show();
this._buildPropSection(newSource.properties);
this._menuItems[newSource.index].setOrnament(PopupMenu.Ornament.DOT);
this._indicatorLabels[newSource.index].show();
},
_buildPropSection: function(properties) {
this._propSeparator.actor.hide();
this._propSection.actor.hide();
this._propSection.removeAll();
this._buildPropSubMenu(this._propSection, properties);
if (!this._propSection.isEmpty()) {
this._propSection.actor.show();
this._propSeparator.actor.show();
}
},
_buildPropSubMenu: function(menu, props) {
if (!props)
return;
let ibusManager = IBusManager.getIBusManager();
let radioGroup = [];
let p;
for (let i = 0; (p = props.get(i)) != null; ++i) {
let prop = p;
if (!prop.get_visible())
continue;
if (prop.get_key() == 'InputMode') {
let text;
if (prop.get_symbol)
text = prop.get_symbol().get_text();
else
text = prop.get_label().get_text();
let currentSource = this._inputSourceManager.currentSource;
if (currentSource) {
let indicatorLabel = this._indicatorLabels[currentSource.index];
if (text && text.length > 0 && text.length < 3)
indicatorLabel.set_text(text);
}
}
let item;
switch (prop.get_prop_type()) {
case IBus.PropType.MENU:
item = new PopupMenu.PopupSubMenuMenuItem(prop.get_label().get_text());
this._buildPropSubMenu(item.menu, prop.get_sub_props());
break;
case IBus.PropType.RADIO:
item = new PopupMenu.PopupMenuItem(prop.get_label().get_text());
item.prop = prop;
radioGroup.push(item);
item.radioGroup = radioGroup;
item.setOrnament(prop.get_state() == IBus.PropState.CHECKED ?
PopupMenu.Ornament.DOT : PopupMenu.Ornament.NONE);
item.connect('activate', Lang.bind(this, function() {
if (item.prop.get_state() == IBus.PropState.CHECKED)
return;
let group = item.radioGroup;
for (let i = 0; i < group.length; ++i) {
if (group[i] == item) {
item.setOrnament(PopupMenu.Ornament.DOT);
item.prop.set_state(IBus.PropState.CHECKED);
ibusManager.activateProperty(item.prop.get_key(),
IBus.PropState.CHECKED);
} else {
group[i].setOrnament(PopupMenu.Ornament.NONE);
group[i].prop.set_state(IBus.PropState.UNCHECKED);
ibusManager.activateProperty(group[i].prop.get_key(),
IBus.PropState.UNCHECKED);
}
}
}));
break;
case IBus.PropType.TOGGLE:
item = new PopupMenu.PopupSwitchMenuItem(prop.get_label().get_text(), prop.get_state() == IBus.PropState.CHECKED);
item.prop = prop;
item.connect('toggled', Lang.bind(this, function() {
if (item.state) {
item.prop.set_state(IBus.PropState.CHECKED);
ibusManager.activateProperty(item.prop.get_key(),
IBus.PropState.CHECKED);
} else {
item.prop.set_state(IBus.PropState.UNCHECKED);
ibusManager.activateProperty(item.prop.get_key(),
IBus.PropState.UNCHECKED);
}
}));
break;
case IBus.PropType.NORMAL:
item = new PopupMenu.PopupMenuItem(prop.get_label().get_text());
item.prop = prop;
item.connect('activate', Lang.bind(this, function() {
ibusManager.activateProperty(item.prop.get_key(),
item.prop.get_state());
}));
break;
case IBus.PropType.SEPARATOR:
item = new PopupMenu.PopupSeparatorMenuItem();
break;
default:
log ('IBus property %s has invalid type %d'.format(prop.get_key(), type));
continue;
}
item.setSensitive(prop.get_sensitive());
menu.addMenuItem(item);
}
},
_showLayout: function() {
Main.overview.hide();
let source = this._inputSourceManager.currentSource;
let xkbLayout = '';
let xkbVariant = '';
if (source.type == INPUT_SOURCE_TYPE_XKB) {
[, , , xkbLayout, xkbVariant] = KeyboardManager.getXkbInfo().get_layout_info(source.id);
} else if (source.type == INPUT_SOURCE_TYPE_IBUS) {
let engineDesc = IBusManager.getIBusManager().getEngineDesc(source.id);
if (engineDesc) {
xkbLayout = engineDesc.get_layout();
xkbVariant = engineDesc.get_layout_variant();
}
}
if (!xkbLayout || xkbLayout.length == 0)
return;
let description = xkbLayout;
if (xkbVariant.length > 0)
description = description + '\t' + xkbVariant;
Util.spawn(['gkbd-keyboard-display', '-l', description]);
},
_containerGetPreferredWidth: function(container, for_height, alloc) {
// Here, and in _containerGetPreferredHeight, we need to query
// for the height of all children, but we ignore the results
// for those we don't actually display.
let max_min_width = 0, max_natural_width = 0;
for (let i in this._inputSources) {
let is = this._inputSources[i];
let [min_width, natural_width] = is.indicatorLabel.get_preferred_width(for_height);
for (let i in this._inputSourceManager.inputSources) {
let label = this._indicatorLabels[i];
let [min_width, natural_width] = label.get_preferred_width(for_height);
max_min_width = Math.max(max_min_width, min_width);
max_natural_width = Math.max(max_natural_width, natural_width);
}
@ -889,9 +793,9 @@ const InputSourceIndicator = new Lang.Class({
_containerGetPreferredHeight: function(container, for_width, alloc) {
let max_min_height = 0, max_natural_height = 0;
for (let i in this._inputSources) {
let is = this._inputSources[i];
let [min_height, natural_height] = is.indicatorLabel.get_preferred_height(for_width);
for (let i in this._inputSourceManager.inputSources) {
let label = this._indicatorLabels[i];
let [min_height, natural_height] = label.get_preferred_height(for_width);
max_min_height = Math.max(max_min_height, min_height);
max_natural_height = Math.max(max_natural_height, natural_height);
}
@ -907,9 +811,9 @@ const InputSourceIndicator = new Lang.Class({
box.y2 -= box.y1;
box.y1 = 0;
for (let i in this._inputSources) {
let is = this._inputSources[i];
is.indicatorLabel.allocate_align_fill(box, 0.5, 0.5, false, false, flags);
for (let i in this._inputSourceManager.inputSources) {
let label = this._indicatorLabels[i];
label.allocate_align_fill(box, 0.5, 0.5, false, false, flags);
}
}
});

View File

@ -13,6 +13,15 @@ const LOCATION_SCHEMA = 'org.gnome.system.location';
const MAX_ACCURACY_LEVEL = 'max-accuracy-level';
const ENABLED = 'enabled';
const GeoclueAccuracyLevel = {
NONE: 0,
COUNTRY: 1,
CITY: 4,
NEIGHBORHOOD: 5,
STREET: 6,
EXACT: 8
};
var GeoclueIface = '<node> \
<interface name="org.freedesktop.GeoClue2.Manager"> \
<property name="InUse" type="b" access="read"/> \
@ -61,6 +70,7 @@ const Indicator = new Lang.Class({
this._item.status.text = _("Enabled");
this._onOffAction = this._item.menu.addAction(_("Disable"), Lang.bind(this, this._onOnOffAction));
this._item.menu.addSettingsAction(_("Privacy Settings"), 'gnome-privacy-panel.desktop');
this.menu.addMenuItem(this._item);
@ -181,10 +191,14 @@ const Indicator = new Lang.Class({
},
_getMaxAccuracyLevel: function() {
if (this._settings.get_boolean(ENABLED))
return this._settings.get_enum(MAX_ACCURACY_LEVEL);
else
return 0;
if (this._settings.get_boolean(ENABLED)) {
let level = this._settings.get_string(MAX_ACCURACY_LEVEL);
return GeoclueAccuracyLevel[level.toUpperCase()] ||
GeoclueAccuracyLevel.NONE;
} else {
return GeoclueAccuracyLevel.NONE;
}
},
_notifyMaxAccuracyLevel: function() {

View File

@ -1866,7 +1866,7 @@ const NMApplet = new Lang.Class({
_connectionRemoved: function(connection) {
let pos = this._connections.indexOf(connection);
if (pos != -1)
this._connections.splice(connection, 1);
this._connections.splice(pos, 1);
let section = connection._section;

View File

@ -102,16 +102,17 @@ const SwitcherPopup = new Lang.Class({
this._switcherList.actor.allocate(childBox, flags);
},
_createSwitcher: function() {
throw new Error('Not implemented');
},
_initialSelection: function(backward, binding) {
throw new Error('Not implemented');
if (backward)
this._select(this._items.length - 1);
else if (this._items.length == 1)
this._select(0);
else
this._select(1);
},
show: function(backward, binding, mask) {
if (!this._createSwitcher())
if (this._items.length == 0)
return false;
if (!Main.pushModal(this.actor)) {
@ -139,11 +140,6 @@ const SwitcherPopup = new Lang.Class({
this.actor.show();
this.actor.get_allocation_box();
if (this._items.length > 1)
this._selectedIndex = 1;
else
this._selectedIndex = 0;
this._initialSelection(backward, binding);
// There's a race condition; if the user released Alt before

View File

@ -28,11 +28,12 @@ const Avatar = new Lang.Class({
styleClass: 'framed-user-icon' });
this._iconSize = params.iconSize;
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this.actor = new St.Bin({ style_class: params.styleClass,
track_hover: params.reactive,
reactive: params.reactive,
width: this._iconSize,
height: this._iconSize });
width: this._iconSize * scaleFactor,
height: this._iconSize * scaleFactor });
},
setSensitive: function(sensitive) {

View File

@ -19,6 +19,8 @@ const Search = imports.ui.search;
const ShellEntry = imports.ui.shellEntry;
const Tweener = imports.ui.tweener;
const WorkspacesView = imports.ui.workspacesView;
const EdgeDragAction = imports.ui.edgeDragAction;
const IconGrid = imports.ui.iconGrid;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
@ -49,77 +51,6 @@ function getTermsForSearchString(searchString) {
return terms;
}
const EDGE_THRESHOLD = 20;
const DRAG_DISTANCE = 80;
const EdgeDragAction = new Lang.Class({
Name: 'EdgeDragAction',
Extends: Clutter.GestureAction,
_init : function(side) {
this.parent();
this._side = side;
this.set_n_touch_points(1);
global.display.connect('grab-op-begin', Lang.bind(this, function() {
this.cancel();
}));
},
_getMonitorRect : function (x, y) {
let rect = new Meta.Rectangle({ x: x - 1, y: y - 1, width: 1, height: 1 });
let monitorIndex = global.screen.get_monitor_index_for_rect(rect);
return global.screen.get_monitor_geometry(monitorIndex);
},
vfunc_gesture_prepare : function(action, actor) {
if (this.get_n_current_points() == 0)
return false;
let [x, y] = this.get_press_coords(0);
let monitorRect = this._getMonitorRect(x, y);
return ((this._side == St.Side.LEFT && x < monitorRect.x + EDGE_THRESHOLD) ||
(this._side == St.Side.RIGHT && x > monitorRect.x + monitorRect.width - EDGE_THRESHOLD) ||
(this._side == St.Side.TOP && y < monitorRect.y + EDGE_THRESHOLD) ||
(this._side == St.Side.BOTTOM && y > monitorRect.y + monitorRect.height - EDGE_THRESHOLD));
},
vfunc_gesture_progress : function (action, actor) {
let [startX, startY] = this.get_press_coords(0);
let [x, y] = this.get_motion_coords(0);
let offsetX = Math.abs (x - startX);
let offsetY = Math.abs (y - startY);
if (offsetX < EDGE_THRESHOLD && offsetY < EDGE_THRESHOLD)
return true;
if ((offsetX > offsetY &&
(this._side == St.Side.TOP || this._side == St.Side.BOTTOM)) ||
(offsetY > offsetX &&
(this._side == St.Side.LEFT || this._side == St.Side.RIGHT))) {
this.cancel();
return false;
}
return true;
},
vfunc_gesture_end : function (action, actor) {
let [startX, startY] = this.get_press_coords(0);
let [x, y] = this.get_motion_coords(0);
let monitorRect = this._getMonitorRect(startX, startY);
if ((this._side == St.Side.TOP && y > monitorRect.y + DRAG_DISTANCE) ||
(this._side == St.Side.BOTTOM && y < monitorRect.y + monitorRect.height - DRAG_DISTANCE) ||
(this._side == St.Side.LEFT && x > monitorRect.x + DRAG_DISTANCE) ||
(this._side == St.Side.RIGHT && x < monitorRect.x + monitorRect.width - DRAG_DISTANCE))
this.emit('activated');
}
});
Signals.addSignalMethods(EdgeDragAction.prototype);
const ShowOverviewAction = new Lang.Class({
Name: 'ShowOverviewAction',
Extends: Clutter.GestureAction,
@ -134,7 +65,8 @@ const ShowOverviewAction = new Lang.Class({
},
vfunc_gesture_prepare : function(action, actor) {
return this.get_n_current_points() == this.get_n_touch_points();
return Main.keybindingMode == Shell.KeyBindingMode.NORMAL &&
this.get_n_current_points() == this.get_n_touch_points();
},
_getBoundingRect : function(motion) {
@ -194,7 +126,6 @@ const ViewSelector = new Lang.Class({
this._activePage = null;
this._searchActive = false;
this._searchTimeoutId = 0;
this._entry = searchEntry;
ShellEntry.addContextMenu(this._entry);
@ -213,12 +144,8 @@ const ViewSelector = new Lang.Class({
this._entry.set_primary_icon(new St.Icon({ style_class: 'search-entry-icon',
icon_name: 'edit-find-symbolic' }));
if (this._entry.get_text_direction() == Clutter.TextDirection.RTL)
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
icon_name: 'edit-clear-symbolic-rtl' });
else
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
icon_name: 'edit-clear-symbolic-ltr' });
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
icon_name: 'edit-clear-symbolic' });
this._iconClickedId = 0;
this._capturedEventId = 0;
@ -267,8 +194,10 @@ const ViewSelector = new Lang.Class({
// the windows to animate, but now we no longer want to
// show it given that we are now on the apps page or
// search page.
if (this._activePage != this._workspacesPage)
if (this._activePage != this._workspacesPage) {
this._workspacesPage.opacity = 0;
this._workspacesPage.hide();
}
}));
Main.wm.addKeybinding('toggle-application-view',
@ -287,7 +216,8 @@ const ViewSelector = new Lang.Class({
let gesture;
gesture = new EdgeDragAction(St.Side.LEFT);
gesture = new EdgeDragAction.EdgeDragAction(St.Side.LEFT,
Shell.KeyBindingMode.NORMAL);
gesture.connect('activated', Lang.bind(this, function() {
if (Main.overview.visible)
Main.overview.hide();
@ -371,18 +301,55 @@ const ViewSelector = new Lang.Class({
return page;
},
_fadePageIn: function(oldPage) {
_fadePageIn: function() {
Tweener.addTween(this._activePage,
{ opacity: 255,
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME,
transition: 'easeOutQuad'
});
},
_fadePageOut: function(page) {
let oldPage = page;
Tweener.addTween(page,
{ opacity: 0,
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this._animateIn(oldPage);
})
});
},
_animateIn: function(oldPage) {
if (oldPage)
oldPage.hide();
this.emit('page-empty');
this._activePage.show();
Tweener.addTween(this._activePage,
{ opacity: 255,
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME,
transition: 'easeOutQuad'
});
if (this._activePage == this._appsPage && oldPage == this._workspacesPage) {
// Restore opacity, in case we animated via _fadePageOut
this._activePage.opacity = 255;
this.appDisplay.animate(IconGrid.AnimationDirection.IN);
} else {
this._fadePageIn();
}
},
_animateOut: function(page) {
let oldPage = page;
if (page == this._appsPage &&
this._activePage == this._workspacesPage &&
!Main.overview.animationInProgress) {
this.appDisplay.animate(IconGrid.AnimationDirection.OUT, Lang.bind(this,
function() {
this._animateIn(oldPage)
}));
} else {
this._fadePageOut(page);
}
},
_showPage: function(page) {
@ -397,17 +364,9 @@ const ViewSelector = new Lang.Class({
this.emit('page-changed');
if (oldPage)
Tweener.addTween(oldPage,
{ opacity: 0,
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
this._fadePageIn(oldPage);
})
});
this._animateOut(oldPage)
else
this._fadePageIn();
this._animateIn();
},
_a11yFocusPage: function(page) {
@ -529,36 +488,23 @@ const ViewSelector = new Lang.Class({
_onTextChanged: function (se, prop) {
let terms = getTermsForSearchString(this._entry.get_text());
let searchPreviouslyActive = this._searchActive;
this._searchActive = (terms.length > 0);
let startSearch = this._searchActive && !searchPreviouslyActive;
if (startSearch)
this._searchResults.startingSearch();
this._searchResults.setTerms(terms);
if (this._searchActive) {
this._showPage(this._searchPage);
this._entry.set_secondary_icon(this._clearIcon);
if (this._iconClickedId == 0)
this._iconClickedId = this._entry.connect('secondary-icon-clicked',
Lang.bind(this, this.reset));
if (this._searchTimeoutId == 0) {
this._searchTimeoutId = Mainloop.timeout_add(150,
Lang.bind(this, this._doSearch));
GLib.Source.set_name_by_id(this._searchTimeoutId, '[gnome-shell] this._doSearch');
}
} else {
if (this._iconClickedId > 0) {
this._entry.disconnect(this._iconClickedId);
this._iconClickedId = 0;
}
if (this._searchTimeoutId > 0) {
Mainloop.source_remove(this._searchTimeoutId);
this._searchTimeoutId = 0;
}
this._entry.set_secondary_icon(null);
this._searchCancelled();
}
@ -596,12 +542,6 @@ const ViewSelector = new Lang.Class({
this._searchResults.navigateFocus(nextDirection);
return Clutter.EVENT_STOP;
} else if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
// We can't connect to 'activate' here because search providers
// might want to do something with the modifiers in activateDefault.
if (this._searchTimeoutId > 0) {
Mainloop.source_remove(this._searchTimeoutId);
this._doSearch();
}
this._searchResults.activateDefault();
return Clutter.EVENT_STOP;
}
@ -624,17 +564,6 @@ const ViewSelector = new Lang.Class({
return Clutter.EVENT_PROPAGATE;
},
_doSearch: function () {
this._searchTimeoutId = 0;
let terms = getTermsForSearchString(this._entry.get_text());
this._searchResults.setTerms(terms);
this._showPage(this._searchPage);
return GLib.SOURCE_REMOVE;
},
getActivePage: function() {
if (this._activePage == this._workspacesPage)
return ViewPage.WINDOWS;

View File

@ -413,7 +413,7 @@ const TilePreview = new Lang.Class({
y: monitor.y,
width: monitor.width,
height: monitor.height });
let [, rect] = window.get_outer_rect().intersect(monitorRect);
let [, rect] = window.get_frame_rect().intersect(monitorRect);
this.actor.set_size(rect.width, rect.height);
this.actor.set_position(rect.x, rect.y);
this.actor.opacity = 0;
@ -478,7 +478,9 @@ const WorkspaceSwitchAction = new Lang.Class({
},
vfunc_gesture_prepare : function(action, actor) {
return this.get_n_current_points() == this.get_n_touch_points();
let allowedModes = Shell.KeyBindingMode.NORMAL | Shell.KeyBindingMode.OVERVIEW;
return this.get_n_current_points() == this.get_n_touch_points() &&
(allowedModes & Main.keybindingMode);
},
vfunc_gesture_end : function(action, actor) {
@ -526,6 +528,11 @@ const AppSwitchAction = new Lang.Class({
},
vfunc_gesture_prepare : function(action, actor) {
if (Main.keybindingMode != Shell.KeyBindingMode.NORMAL) {
this.cancel();
return false;
}
return this.get_n_current_points() <= 4;
},

View File

@ -75,7 +75,7 @@ const WindowMenu = new Lang.Class({
}));
if (window.is_above())
item.setOrnament(PopupMenu.Ornament.DOT);
if (window.get_maximized() ||
if (window.get_maximized() == Meta.MaximizeFlags.BOTH ||
type == Meta.WindowType.DOCK ||
type == Meta.WindowType.DESKTOP ||
type == Meta.WindowType.SPLASHSCREEN)

View File

@ -254,7 +254,7 @@ const WindowClone = new Lang.Class({
},
_computeBoundingBox: function() {
let rect = this.metaWindow.get_outer_rect();
let rect = this.metaWindow.get_frame_rect();
this.actor.get_children().forEach(function (child) {
let realWindow;
@ -264,7 +264,7 @@ const WindowClone = new Lang.Class({
realWindow = child.source;
let metaWindow = realWindow.meta_window;
rect = rect.union(metaWindow.get_outer_rect());
rect = rect.union(metaWindow.get_frame_rect());
}, this);
// Convert from a MetaRectangle to a native JS object
@ -1209,14 +1209,18 @@ const Workspace = new Lang.Class({
return this._windows.length == 0;
},
setReservedSlot: function(clone) {
if (this._reservedSlot == clone)
setReservedSlot: function(metaWindow) {
if (this._reservedSlotWindow == metaWindow)
return;
if (clone && this.containsMetaWindow(clone.metaWindow))
clone = null;
if (!metaWindow || this.containsMetaWindow(metaWindow)) {
this._reservedSlotWindow = null;
this._reservedSlot = null;
} else {
this._reservedSlotWindow = metaWindow;
this._reservedSlot = this._windows[this._lookupIndex(metaWindow)];
}
this._reservedSlot = clone;
this._recalculateWindowPositions(WindowPositionFlags.ANIMATE);
},
@ -1417,10 +1421,6 @@ const Workspace = new Lang.Class({
if (index == -1)
return;
// Check if window still should be here
if (win && this._isMyWindow(win))
return;
let clone = this._windows[index];
this._windows.splice(index, 1);
@ -1818,16 +1818,16 @@ const Workspace = new Lang.Class({
Lang.bind(this, this._onCloneSelected));
clone.connect('drag-begin',
Lang.bind(this, function() {
Main.overview.beginWindowDrag(clone);
Main.overview.beginWindowDrag(clone.metaWindow);
overlay.hide();
}));
clone.connect('drag-cancelled',
Lang.bind(this, function() {
Main.overview.cancelledWindowDrag(clone);
Main.overview.cancelledWindowDrag(clone.metaWindow);
}));
clone.connect('drag-end',
Lang.bind(this, function() {
Main.overview.endWindowDrag(clone);
Main.overview.endWindowDrag(clone.metaWindow);
overlay.show();
}));
clone.connect('size-changed',

View File

@ -161,14 +161,14 @@ const WindowClone = new Lang.Class({
_updateDialogPosition: function(realDialog, cloneDialog) {
let metaDialog = realDialog.meta_window;
let dialogRect = metaDialog.get_outer_rect();
let rect = this.metaWindow.get_outer_rect();
let dialogRect = metaDialog.get_frame_rect();
let rect = this.metaWindow.get_frame_rect();
cloneDialog.set_position(dialogRect.x - rect.x, dialogRect.y - rect.y);
},
_onPositionChanged: function() {
let rect = this.metaWindow.get_outer_rect();
let rect = this.metaWindow.get_frame_rect();
this.actor.set_position(this.realWindow.x, this.realWindow.y);
},
@ -306,7 +306,7 @@ const WorkspaceThumbnail = new Lang.Class({
_createBackground: function() {
this._bgManager = new Background.BackgroundManager({ monitorIndex: Main.layoutManager.primaryIndex,
container: this._contents,
effects: Meta.BackgroundEffects.NONE });
vignette: false });
},
setPorthole: function(x, y, width, height) {
@ -332,7 +332,7 @@ const WorkspaceThumbnail = new Lang.Class({
let clone = this._windows[i];
let metaWindow = clone.metaWindow;
if (i == 0) {
clone.setStackAbove(this._bgManager.background.actor);
clone.setStackAbove(this._bgManager.backgroundActor);
} else {
let previousClone = this._windows[i - 1];
clone.setStackAbove(previousClone.actor);
@ -367,10 +367,6 @@ const WorkspaceThumbnail = new Lang.Class({
if (index == -1)
return;
// Check if window still should be here
if (win && this._isMyWindow(win) && this._isOverviewWindow(win))
return;
let clone = this._windows[index];
this._windows.splice(index, 1);
@ -522,20 +518,20 @@ const WorkspaceThumbnail = new Lang.Class({
}));
clone.connect('drag-begin',
Lang.bind(this, function() {
Main.overview.beginWindowDrag(clone);
Main.overview.beginWindowDrag(clone.metaWindow);
}));
clone.connect('drag-cancelled',
Lang.bind(this, function() {
Main.overview.cancelledWindowDrag(clone);
Main.overview.cancelledWindowDrag(clone.metaWindow);
}));
clone.connect('drag-end',
Lang.bind(this, function() {
Main.overview.endWindowDrag(clone);
Main.overview.endWindowDrag(clone.metaWindow);
}));
this._contents.add_actor(clone.actor);
if (this._windows.length == 0)
clone.setStackAbove(this._bgManager.background.actor);
clone.setStackAbove(this._bgManager.backgroundActor);
else
clone.setStackAbove(this._windows[this._windows.length - 1].actor);

View File

@ -63,9 +63,9 @@ const WorkspacesViewBase = new Lang.Class({
}
},
_dragBegin: function(overview, clone) {
_dragBegin: function(overview, window) {
this._inDrag = true;
this._setReservedSlot(clone);
this._setReservedSlot(window);
},
_dragEnd: function() {
@ -127,9 +127,9 @@ const WorkspacesView = new Lang.Class({
Lang.bind(this, this._activeWorkspaceChanged));
},
_setReservedSlot: function(clone) {
_setReservedSlot: function(window) {
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setReservedSlot(clone);
this._workspaces[i].setReservedSlot(window);
},
_syncFullGeometry: function() {
@ -366,8 +366,8 @@ const ExtraWorkspaceView = new Lang.Class({
this.actor.add_actor(this._workspace.actor);
},
_setReservedSlot: function(clone) {
this._workspace.setReservedSlot(clone);
_setReservedSlot: function(window) {
this._workspace.setReservedSlot(window);
},
_syncFullGeometry: function() {

View File

@ -45,6 +45,7 @@ mk
mr
ms
nb
ne
nl
nn
or

1768
po/af.po

File diff suppressed because it is too large Load Diff

1047
po/ar.po

File diff suppressed because it is too large Load Diff

332
po/as.po
View File

@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-08-13 07:33+0000\n"
"PO-Revision-Date: 2014-08-13 17:32+0530\n"
"POT-Creation-Date: 2014-09-15 07:36+0000\n"
"PO-Revision-Date: 2014-09-15 14:59+0530\n"
"Last-Translator: Nilamdyuti Goswami <ngoswami@redhat.com>\n"
"Language-Team: Assamese <kde-i18n-doc@kde.org>\n"
"Language: as_IN\n"
@ -110,8 +110,9 @@ msgid ""
"load all extensions regardless of the versions they claim to support."
msgstr ""
"GNOME শ্বেলে কেৱল বৰ্তমান চলি থকা সংস্কৰণক সমৰ্থন কৰা সম্প্ৰসাৰনসমূহ ল'ড "
"কৰিব। এই বিকল্প সামৰ্থবান কৰিলে এই নিৰীক্ষণ অসামৰ্থবান কৰা হব আৰু সিহতে "
"মৰ্থন কৰা সংস্কৰণসমূহৰ নিৰপেক্ষে সকলো সম্প্ৰসাৰন ল'ড কৰিব।"
"কৰিব। এই "
"বিকল্প সামৰ্থবান কৰিলে এই নিৰক্ষণ অসামৰ্থবান কৰা হব আৰু সিহতে সমৰ্থন কৰা "
"সংস্কৰণসমূহৰ নিৰপেক্ষে সকলো সম্প্ৰসাৰন ল'ড কৰিব।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of desktop file IDs for favorite applications"
@ -157,8 +158,8 @@ msgstr ""
msgid ""
"Whether to remember password for mounting encrypted or remote filesystems"
msgstr ""
"ইনক্ৰিপ্টেড অথবা দূৰৱৰ্তী ফাইলচিস্টেমসমূহ মাউ্ট কৰাৰ বাবে পাছৱৰ্ড মনত ৰখা "
"হব নে"
"ইনক্ৰিপ্টেড অথবা দূৰৱৰ্তী ফাইলচিস্টেমসমূহ মাউ্ট কৰাৰ বাবে পাছৱৰ্ড মনত ৰখা হব "
"নে"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid ""
@ -169,10 +170,11 @@ msgid ""
msgstr ""
"শ্বেলে এটা পাছৱৰ্ড অনুৰোধ কৰিব যেতিয়া এটা ইনক্ৰিপ্টেড ডিভাইচ অথবা এটা "
"দূৰৱৰ্তী "
"ফাইলচিস্টেম মাউ্ট কৰা হয়। যদি পাছৱৰ্ডক ভৱিষ্যত ব্যৱহাৰৰ বাবে সংৰক্ষণ কৰিব "
"ফাইলচিস্টেম মাউ্ট কৰা হয়। যদি পাছৱৰ্ডক ভৱিষ্যত ব্যৱহাৰৰ বাবে সংৰক্ষণ কৰিব "
"পাৰি "
"তেন্তে এটা 'পাছৱৰ্ড মনত ৰাখক' চেকবাকচ উপস্থিত থাকিব। এই কি'য়ে চেকবাকচৰ "
"অবিকল্পিত অৱস্থা সংহতি কৰে।"
"অবিকল্পিত "
"অৱস্থা সংহতি কৰে।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Show the week date in the calendar"
@ -248,7 +250,8 @@ msgid ""
"shown in the switcher. Otherwise, all applications are included."
msgstr ""
"যদি সত্য, কেৱল বৰ্তমান কাৰ্য্যস্থানক উইন্ডো থকা এপ্লিকেচনসমূক চুইচাৰত দেখুৱা "
"হব। নহলে, সকলো এপ্লিকেচন অন্তৰ্ভুক্ত কৰা হয়।"
"হব। নহলে, "
"সকলো এপ্লিকেচন অন্তৰ্ভুক্ত কৰা হয়।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid "The application icon mode."
@ -271,7 +274,8 @@ msgid ""
"Otherwise, all windows are included."
msgstr ""
"যদি সত্য, কেৱল বৰ্তমান কাৰ্য্যস্থানৰ পৰা উইন্ডোসমূহক চুইচাৰত দেখুৱা হব। নহলে, "
"সকলো উইন্ডো অন্তৰ্ভুক্ত কৰা হব।"
"সকলো "
"উইন্ডো অন্তৰ্ভুক্ত কৰা হব।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "Attach modal dialog to the parent window"
@ -303,18 +307,17 @@ msgstr ""
msgid "Captive Portal"
msgstr "কেপটিভ পৰ্টেল"
#: ../js/extensionPrefs/main.js:127
#: ../js/extensionPrefs/main.js:123
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "%s ৰ বাবে পছন্দসমূহ ডাইলগ ল'ড কৰোতে এটা ত্ৰুটি হৈছিল:"
#: ../js/extensionPrefs/main.js:159
#| msgid "Configure GNOME Shell Extensions"
#: ../js/extensionPrefs/main.js:155
msgid "GNOME Shell Extensions"
msgstr "GNOME শ্বেল সম্প্ৰসাৰনসমূহ"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:915
msgid "Cancel"
@ -377,46 +380,44 @@ msgstr "কমান্ড বিশ্লেষন কৰিব নোৱাৰ
msgid "Execution of “%s” failed:"
msgstr "“%s” ৰ প্ৰেৰণ ব্যৰ্থ হল:"
#: ../js/portalHelper/main.js:84
#| msgid "Authentication Required"
#: ../js/portalHelper/main.js:85
msgid "Web Authentication Redirect"
msgstr "ৱেব প্ৰমাণীকৰণৰ পুনৰনিৰ্দেশ"
#: ../js/ui/appDisplay.js:659
#: ../js/ui/appDisplay.js:772
msgid "Frequently used applications will appear here"
msgstr "সঘনে ব্যৱহাৰ কৰা এপ্লিকেচনসমূহ ইয়াত উপস্থিত হব"
#: ../js/ui/appDisplay.js:770
#: ../js/ui/appDisplay.js:883
msgid "Frequent"
msgstr "সঘন"
#: ../js/ui/appDisplay.js:777
#: ../js/ui/appDisplay.js:890
msgid "All"
msgstr "সকলো"
#: ../js/ui/appDisplay.js:1649
#: ../js/ui/appDisplay.js:1789
msgid "New Window"
msgstr "নতুন উইন্ডো"
#: ../js/ui/appDisplay.js:1672 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1815 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "পছন্দৰ পৰা আতৰাওক"
#: ../js/ui/appDisplay.js:1678
#: ../js/ui/appDisplay.js:1821
msgid "Add to Favorites"
msgstr "পছন্দলে যোগ কৰক"
#: ../js/ui/appDisplay.js:1687
#| msgid "Show Text"
#: ../js/ui/appDisplay.js:1830
msgid "Show Details"
msgstr "বিৱৰণসমূহ দেখুৱাওক"
#: ../js/ui/appFavorites.js:122
#: ../js/ui/appFavorites.js:124
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s ক আপোনাৰ পছন্দলে যোগ কৰা হৈছে।"
#: ../js/ui/appFavorites.js:156
#: ../js/ui/appFavorites.js:158
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s ক আপোনাৰ পছন্দৰ পৰা আতৰোৱা হৈছে।"
@ -608,11 +609,11 @@ msgstr "%s ৰ সৈতে খোলক"
msgid "Eject"
msgstr "উলিৱাওক"
#: ../js/ui/components/keyring.js:93 ../js/ui/components/polkitAgent.js:285
#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285
msgid "Password:"
msgstr "পাছৱৰ্ড:"
#: ../js/ui/components/keyring.js:113
#: ../js/ui/components/keyring.js:120
msgid "Type again:"
msgstr "আকৌ টাইপ কৰক:"
@ -655,8 +656,7 @@ msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
msgstr ""
"বেতাঁৰ নেটৱৰ্ক “%s” অভিগম কৰিবলে পাছৱৰ্ডসমূহ অথবা ইনক্ৰিপষণ কি'সমূহৰ "
"প্ৰয়োজন।"
"বেতাঁৰ নেটৱৰ্ক “%s” অভিগম কৰিবলে পাছৱৰ্ডসমূহ অথবা ইনক্ৰিপষণ কি'সমূহৰ প্ৰয়োজন।"
#: ../js/ui/components/networkAgent.js:323
msgid "Wired 802.1X authentication"
@ -736,89 +736,77 @@ msgid "Mute"
msgstr "মোন কৰক"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:957
#| msgctxt "event list time"
#| msgid "%H%M"
#: ../js/ui/components/telepathyClient.js:953
msgid "%H%M"
msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/ui/components/telepathyClient.js:964
#| msgid "<b>Yesterday</b>, <b>%H:%M</b>"
#: ../js/ui/components/telepathyClient.js:960
msgid "Yesterday, %H%M"
msgstr "যোৱাকালী, %H%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/ui/components/telepathyClient.js:971
#| msgctxt "event list time"
#| msgid "%H%M"
#: ../js/ui/components/telepathyClient.js:967
msgid "%A, %H%M"
msgstr "%A, %H%M"
#. Translators: this is the month name and day number
#. followed by a time string in 24h format.
#. i.e. "May 25, 14:30" */
#: ../js/ui/components/telepathyClient.js:978
#| msgctxt "event list time"
#| msgid "%H%M"
#: ../js/ui/components/telepathyClient.js:974
msgid "%B %d, %H%M"
msgstr "%B %d, %H%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format.
#. i.e. "May 25 2012, 14:30" */
#: ../js/ui/components/telepathyClient.js:984
#: ../js/ui/components/telepathyClient.js:980
msgid "%B %d %Y, %H%M"
msgstr "%B %d %Y, %H%M"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:990
#| msgctxt "event list time"
#| msgid "%l%M%p"
#: ../js/ui/components/telepathyClient.js:986
msgid "%l%M %p"
msgstr "%l%M %p"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:997
#: ../js/ui/components/telepathyClient.js:993
msgid "Yesterday, %l%M %p"
msgstr "যোৱাকালী, %l%M %p"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1004
#| msgid "%a %l:%M %p"
#: ../js/ui/components/telepathyClient.js:1000
msgid "%A, %l%M %p"
msgstr "%A, %l%M %p"
#. Translators: this is the month name and day number
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1011
#| msgid "%a %b %e, %l:%M %p"
#: ../js/ui/components/telepathyClient.js:1007
msgid "%B %d, %l%M %p"
msgstr "%B %d, %l%M %p"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"*/
#: ../js/ui/components/telepathyClient.js:1017
#| msgid "%a %b %e, %l:%M %p"
#: ../js/ui/components/telepathyClient.js:1013
msgid "%B %d %Y, %l%M %p"
msgstr "%B %d %Y, %l%M %p"
#. Translators: this is the other person changing their old IM name to their new
#. IM name. */
#: ../js/ui/components/telepathyClient.js:1049
#: ../js/ui/components/telepathyClient.js:1045
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s এতিয়া %s হিচাপে জনাজাত"
#. translators: argument is a room name like
#. * room@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1153
#: ../js/ui/components/telepathyClient.js:1149
#, javascript-format
msgid "Invitation to %s"
msgstr "%s লে নিমন্ত্ৰণ"
@ -826,38 +814,38 @@ msgstr "%s লে নিমন্ত্ৰণ"
#. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. */
#: ../js/ui/components/telepathyClient.js:1161
#: ../js/ui/components/telepathyClient.js:1157
#, javascript-format
msgid "%s is inviting you to join %s"
msgstr "%s এ আপোনাক %s ত অংশগ্ৰহণ কৰিবলে আমন্ত্ৰণ জনাইছে"
#: ../js/ui/components/telepathyClient.js:1163
#: ../js/ui/components/telepathyClient.js:1198
#: ../js/ui/components/telepathyClient.js:1232
#: ../js/ui/components/telepathyClient.js:1290
#: ../js/ui/components/telepathyClient.js:1159
#: ../js/ui/components/telepathyClient.js:1194
#: ../js/ui/components/telepathyClient.js:1228
#: ../js/ui/components/telepathyClient.js:1286
msgid "Decline"
msgstr "নাকচ কৰক"
#: ../js/ui/components/telepathyClient.js:1169
#: ../js/ui/components/telepathyClient.js:1238
#: ../js/ui/components/telepathyClient.js:1295
#: ../js/ui/components/telepathyClient.js:1165
#: ../js/ui/components/telepathyClient.js:1234
#: ../js/ui/components/telepathyClient.js:1291
msgid "Accept"
msgstr "গ্ৰহন কৰক"
#. translators: argument is a contact name like Alice for example. */
#: ../js/ui/components/telepathyClient.js:1188
#: ../js/ui/components/telepathyClient.js:1184
#, javascript-format
msgid "Video call from %s"
msgstr "%s ৰ পৰা ভিডিঅ' কল"
#. translators: argument is a contact name like Alice for example. */
#: ../js/ui/components/telepathyClient.js:1191
#: ../js/ui/components/telepathyClient.js:1187
#, javascript-format
msgid "Call from %s"
msgstr "%s ৰ পৰা কল"
#. translators: this is a button label (verb), not a noun */
#: ../js/ui/components/telepathyClient.js:1205
#: ../js/ui/components/telepathyClient.js:1201
msgid "Answer"
msgstr "উত্তৰ দিয়ক"
@ -866,110 +854,110 @@ msgstr "উত্তৰ দিয়ক"
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#. */
#: ../js/ui/components/telepathyClient.js:1226
#: ../js/ui/components/telepathyClient.js:1222
#, javascript-format
msgid "%s is sending you %s"
msgstr "%s এ আপোনাক %s পঠাই আছে"
#. To translators: The parameter is the contact's alias */
#: ../js/ui/components/telepathyClient.js:1255
#: ../js/ui/components/telepathyClient.js:1251
#, javascript-format
msgid "%s would like permission to see when you are online"
msgstr "আপুনি কেতিয়া অনলাইন আছে চাবলে %s এ অনুমতি বিচাৰিব"
#: ../js/ui/components/telepathyClient.js:1341
#: ../js/ui/components/telepathyClient.js:1337
msgid "Network error"
msgstr "নেটৱৰ্ক ত্ৰুটি"
#: ../js/ui/components/telepathyClient.js:1343
#: ../js/ui/components/telepathyClient.js:1339
msgid "Authentication failed"
msgstr "প্ৰমাণীকৰণ ব্যৰ্থ"
#: ../js/ui/components/telepathyClient.js:1345
#: ../js/ui/components/telepathyClient.js:1341
msgid "Encryption error"
msgstr "ইনক্ৰিপষণ ত্ৰুটি"
#: ../js/ui/components/telepathyClient.js:1347
#: ../js/ui/components/telepathyClient.js:1343
msgid "Certificate not provided"
msgstr "প্ৰমাণপত্ৰ প্ৰদান কৰা হোৱা নাই"
#: ../js/ui/components/telepathyClient.js:1349
#: ../js/ui/components/telepathyClient.js:1345
msgid "Certificate untrusted"
msgstr "প্ৰমাণপত্ৰক ভৰষা কৰিব নোৱাৰি"
#: ../js/ui/components/telepathyClient.js:1351
#: ../js/ui/components/telepathyClient.js:1347
msgid "Certificate expired"
msgstr "প্ৰমাণপত্ৰৰ অৱসান ঘটিছে"
#: ../js/ui/components/telepathyClient.js:1353
#: ../js/ui/components/telepathyClient.js:1349
msgid "Certificate not activated"
msgstr "প্ৰমাণপত্ৰ সক্ৰিয় কৰা হোৱা নাই"
#: ../js/ui/components/telepathyClient.js:1355
#: ../js/ui/components/telepathyClient.js:1351
msgid "Certificate hostname mismatch"
msgstr "প্ৰমাণপত্ৰ হস্টনাম অমিল"
#: ../js/ui/components/telepathyClient.js:1357
#: ../js/ui/components/telepathyClient.js:1353
msgid "Certificate fingerprint mismatch"
msgstr "প্ৰমাণপত্ৰ ফিংগাৰপ্ৰি্ট অমিল"
msgstr "প্ৰমাণপত্ৰ ফিংগাৰপ্ৰি্ট অমিল"
#: ../js/ui/components/telepathyClient.js:1359
#: ../js/ui/components/telepathyClient.js:1355
msgid "Certificate self-signed"
msgstr "প্ৰমাণপত্ৰ স্ব-স্বাক্ষৰীত"
#: ../js/ui/components/telepathyClient.js:1361
#: ../js/ui/components/telepathyClient.js:1357
msgid "Status is set to offline"
msgstr "অৱস্থা অফলাইনলে সংহতি কৰা হৈছে"
#: ../js/ui/components/telepathyClient.js:1363
#: ../js/ui/components/telepathyClient.js:1359
msgid "Encryption is not available"
msgstr "ইনক্ৰিপষণ উপলব্ধ নহয়"
#: ../js/ui/components/telepathyClient.js:1365
#: ../js/ui/components/telepathyClient.js:1361
msgid "Certificate is invalid"
msgstr "প্ৰমাণপত্ৰ অবৈধ"
#: ../js/ui/components/telepathyClient.js:1367
#: ../js/ui/components/telepathyClient.js:1363
msgid "Connection has been refused"
msgstr "সংযোগ নাকচ কৰা হৈছে"
#: ../js/ui/components/telepathyClient.js:1369
#: ../js/ui/components/telepathyClient.js:1365
msgid "Connection can't be established"
msgstr "সংযোগ স্থাপন কৰিব নোৱাৰি"
#: ../js/ui/components/telepathyClient.js:1371
#: ../js/ui/components/telepathyClient.js:1367
msgid "Connection has been lost"
msgstr "সংযোগ হেৰাইছে"
#: ../js/ui/components/telepathyClient.js:1373
#: ../js/ui/components/telepathyClient.js:1369
msgid "This account is already connected to the server"
msgstr "এই একাও্ট ইতিমধ্যে চাৰ্ভাৰৰ সৈতে সংযোগিত"
msgstr "এই একাও্ট ইতিমধ্যে চাৰ্ভাৰৰ সৈতে সংযোগিত"
#: ../js/ui/components/telepathyClient.js:1375
#: ../js/ui/components/telepathyClient.js:1371
msgid ""
"Connection has been replaced by a new connection using the same resource"
msgstr "সংযোগক একে সম্পদ ব্যৱহাৰ কৰি এটা নতুন সংযোগৰে প্ৰতিস্থাপন কৰা হৈছে"
#: ../js/ui/components/telepathyClient.js:1377
#: ../js/ui/components/telepathyClient.js:1373
msgid "The account already exists on the server"
msgstr "একাও্ট ইতিমধ্যে চাৰ্ভাৰত উপস্থিত"
msgstr "একাও্ট ইতিমধ্যে চাৰ্ভাৰত উপস্থিত"
#: ../js/ui/components/telepathyClient.js:1379
#: ../js/ui/components/telepathyClient.js:1375
msgid "Server is currently too busy to handle the connection"
msgstr "চাৰ্ভাৰ সংযোগ ব্যৱস্থাপনা কৰিবলে বৰ্তমানে অতি ব্যস্ত"
#: ../js/ui/components/telepathyClient.js:1381
#: ../js/ui/components/telepathyClient.js:1377
msgid "Certificate has been revoked"
msgstr "প্ৰমাণপত্ৰ প্ৰত্যাহাৰ কৰা হৈছে"
#: ../js/ui/components/telepathyClient.js:1383
#: ../js/ui/components/telepathyClient.js:1379
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"প্ৰমাণপত্ৰয় এটা অসুৰক্ষিত চিফাৰ এলগৰিথম ব্যৱহাৰ কৰে অথবা ক্ৰিপ্টোগ্ৰাফিয়ভাৱে "
"দুৰ্বল"
#: ../js/ui/components/telepathyClient.js:1385
#: ../js/ui/components/telepathyClient.js:1381
msgid ""
"The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library"
@ -978,26 +966,26 @@ msgstr ""
"ক্ৰিপ্টোগ্ৰাফী "
"লাইব্ৰেৰীয়ে প্ৰণয়ন কৰা সীমাসমূহত অতিক্ৰম কৰে"
#: ../js/ui/components/telepathyClient.js:1387
#: ../js/ui/components/telepathyClient.js:1383
msgid "Internal error"
msgstr "অভ্যন্তৰীক ত্ৰুটি"
#. translators: argument is the account name, like
#. * name@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1397
#: ../js/ui/components/telepathyClient.js:1393
#, javascript-format
msgid "Unable to connect to %s"
msgstr "%s ৰ সৈতে সংযোগ কৰিবলে অক্ষম"
#: ../js/ui/components/telepathyClient.js:1402
#: ../js/ui/components/telepathyClient.js:1398
msgid "View account"
msgstr "একাও্ট দৰ্শন কৰক"
msgstr "একাও্ট দৰ্শন কৰক"
#: ../js/ui/components/telepathyClient.js:1439
#: ../js/ui/components/telepathyClient.js:1435
msgid "Unknown reason"
msgstr "অজ্ঞাত কাৰণ"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:228
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154
msgid "Windows"
msgstr "উইন্ডোসমূহ"
@ -1028,86 +1016,86 @@ msgstr "তাৰিখ আৰু সময সংহতিসমূহ"
msgid "%A %B %e, %Y"
msgstr "%A %B %e, %Y"
#: ../js/ui/endSessionDialog.js:66
#: ../js/ui/endSessionDialog.js:64
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "%s ক লগ আউট কৰক"
#: ../js/ui/endSessionDialog.js:67
#: ../js/ui/endSessionDialog.js:65
msgctxt "title"
msgid "Log Out"
msgstr "লগ আউট কৰক"
#: ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:67
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s স্বচালিতভাৱে %d ছেকেণ্ডৰ পিছত লগ আউট হৈ যাব।"
msgstr[1] "%s স্বচালিতভাৱে %d ছেকেণ্ডৰ পিছত লগ আউট হৈ যাব।"
#: ../js/ui/endSessionDialog.js:74
#: ../js/ui/endSessionDialog.js:72
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "আপুনি স্বচালিতভাৱে %d ছেকেণ্ড পিছত লগ আউট হৈ যাব।"
msgstr[1] "আপুনি স্বচালিতভাৱে %d ছেকেণ্ড পিছত লগ আউট হৈ যাব।"
#: ../js/ui/endSessionDialog.js:80
#: ../js/ui/endSessionDialog.js:78
msgctxt "button"
msgid "Log Out"
msgstr "লগ আউট কৰক"
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:84
msgctxt "title"
msgid "Power Off"
msgstr "বন্ধ কৰক"
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:85
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "আপডেইটসমূহ ইনস্টল কৰি চিস্টেম বন্ধ কৰক"
#: ../js/ui/endSessionDialog.js:89
#: ../js/ui/endSessionDialog.js:87
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "চিস্টেম %d ছেকেণ্ড পিছত স্বচালিতভাৱে বন্ধ কৰক হব। "
msgstr[1] "চিস্টেম %d ছেকেণ্ডৰ পিছত স্বচালিতভাৱে বন্ধ হব। "
#: ../js/ui/endSessionDialog.js:93
#: ../js/ui/endSessionDialog.js:91
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "বাকি থকা চফ্টৱেৰ আপডেইটসমূহ ইনস্টল কৰক"
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111
msgctxt "button"
msgid "Restart"
msgstr "পুনৰাম্ভ কৰক"
#: ../js/ui/endSessionDialog.js:98
#: ../js/ui/endSessionDialog.js:96
msgctxt "button"
msgid "Power Off"
msgstr "বন্ধ কৰক"
#: ../js/ui/endSessionDialog.js:105
#: ../js/ui/endSessionDialog.js:103
msgctxt "title"
msgid "Restart"
msgstr "পুনৰাম্ভ কৰক"
#: ../js/ui/endSessionDialog.js:107
#: ../js/ui/endSessionDialog.js:105
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "চিস্টেম %d ছেকেণ্ডত স্বচালিতভাৱে পুনৰাম্ভ হব।"
msgstr[1] "চিস্টেম %d ছেকেণ্ডত স্বচালিতভাৱে পুনৰাম্ভ হব।"
#: ../js/ui/endSessionDialog.js:121
#: ../js/ui/endSessionDialog.js:119
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "পুনাৰম্ভ কৰক আৰু আপডেইটসমূহ ইনস্টল কৰক"
#: ../js/ui/endSessionDialog.js:123
#: ../js/ui/endSessionDialog.js:121
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@ -1117,46 +1105,44 @@ msgstr[0] ""
msgstr[1] ""
"চিস্টেম %d ছেকেণ্ডত স্বচালিতভাৱে পুনৰাম্ভ হব আৰু আপডেইটসমূহ ইনস্টল কৰিব।"
#: ../js/ui/endSessionDialog.js:129
#| msgctxt "button"
#| msgid "Restart & Install"
#: ../js/ui/endSessionDialog.js:127
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "পুনৰাম্ভ কৰক &amp; ইনস্টল কৰক"
#: ../js/ui/endSessionDialog.js:130
#: ../js/ui/endSessionDialog.js:128
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "ইনস্টল কৰক &amp; চিস্টেম বন্ধ কৰক"
#: ../js/ui/endSessionDialog.js:131
#: ../js/ui/endSessionDialog.js:129
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "আপডেইটসমূহ ইনস্টল কৰাৰ পিছত চিস্টেম বন্ধ কৰক"
#: ../js/ui/endSessionDialog.js:315
#: ../js/ui/endSessionDialog.js:338
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"বেটাৰি শক্তিত চলি আছে: অনুগ্ৰহ কৰি আপডেইটসমূহ ইনস্টল কৰাৰ আগত চাৰ্জাৰ লগাওক।"
#: ../js/ui/endSessionDialog.js:332
#: ../js/ui/endSessionDialog.js:355
msgid "Some applications are busy or have unsaved work."
msgstr ""
"কিছুমান এপ্লিকেচন ব্যস্ত হব পাৰে অথবা সিহতৰ কিছুমান অসংৰক্ষিত কাৰ্য্য থাকিব "
"পাৰে।"
#: ../js/ui/endSessionDialog.js:339
#: ../js/ui/endSessionDialog.js:362
msgid "Other users are logged in."
msgstr "অন্য ব্যৱহাৰকাৰীসকল লগ্ড ইন আছে।"
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:619
#: ../js/ui/endSessionDialog.js:640
#, javascript-format
msgid "%s (remote)"
msgstr "%s (দূৰৱৰ্তী)"
#. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:622
#: ../js/ui/endSessionDialog.js:643
#, javascript-format
msgid "%s (console)"
msgstr "%s (কনচৌল)"
@ -1170,7 +1156,7 @@ msgstr "ইনস্টল কৰক"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "extensions.gnome.org ৰ পৰা “%s” ক ডাউনল'ড আৰু ইনস্টল কৰিব নে?"
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523
msgid "Keyboard"
msgstr "কিবৰ্ড"
@ -1192,8 +1178,8 @@ msgstr "ত্ৰুটিসমূহ লুকুৱাওক"
msgid "Show Errors"
msgstr "ত্ৰুটিসমূহ দেখুৱাওক"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:164
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71
#: ../js/ui/status/location.js:176
msgid "Enabled"
msgstr "সামৰ্থবান কৰা আছে"
@ -1201,7 +1187,7 @@ msgstr "সামৰ্থবান কৰা আছে"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:167
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "অসামৰ্থবান কৰা আছে"
@ -1226,39 +1212,39 @@ msgstr "উৎস দৰ্শন কৰক"
msgid "Web Page"
msgstr "ৱেব পৃষ্ঠা"
#: ../js/ui/messageTray.js:1325
#: ../js/ui/messageTray.js:1326
msgid "Open"
msgstr "খোলক"
#: ../js/ui/messageTray.js:1332
#: ../js/ui/messageTray.js:1333
msgid "Remove"
msgstr "আতৰাওক"
#: ../js/ui/messageTray.js:1629
#: ../js/ui/messageTray.js:1630
msgid "Notifications"
msgstr "অধিসূচনাসমূহ"
#: ../js/ui/messageTray.js:1636
#: ../js/ui/messageTray.js:1637
msgid "Clear Messages"
msgstr "বাৰ্তাসমূহ পৰিষ্কাৰ কৰক"
#: ../js/ui/messageTray.js:1655
#: ../js/ui/messageTray.js:1656
msgid "Notification Settings"
msgstr "অধিসূচনা সংহতিসমূহ"
#: ../js/ui/messageTray.js:1708
#: ../js/ui/messageTray.js:1709
msgid "Tray Menu"
msgstr "ট্ৰে মেনু"
#: ../js/ui/messageTray.js:1925
#: ../js/ui/messageTray.js:1926
msgid "No Messages"
msgstr "কোনো বাৰ্তা নাই"
#: ../js/ui/messageTray.js:1963
#: ../js/ui/messageTray.js:1968
msgid "Message Tray"
msgstr "বাৰ্তা ট্ৰে"
#: ../js/ui/messageTray.js:2966
#: ../js/ui/messageTray.js:2971
msgid "System Information"
msgstr "চিস্টেম তথ্য"
@ -1286,7 +1272,7 @@ msgstr "অভাৰভিউ"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:250
#: ../js/ui/overview.js:246
msgid "Type to search…"
msgstr "সন্ধান কৰিবলে টাইপ কৰক…"
@ -1304,7 +1290,7 @@ msgstr "কাৰ্য্যসমূহ"
msgid "Top Bar"
msgstr "উপৰৰ বাৰ"
#: ../js/ui/popupMenu.js:280
#: ../js/ui/popupMenu.js:269
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
@ -1316,8 +1302,7 @@ msgstr "এটা কমান্ড সুমুৱাওক"
msgid "Close"
msgstr "বন্ধ কৰক"
#: ../js/ui/runDialog.js:273
#| msgid "Estimating…"
#: ../js/ui/runDialog.js:277
msgid "Restarting…"
msgstr "পুনাৰম্ভ কৰা হৈছে…"
@ -1334,43 +1319,43 @@ msgid_plural "%d new notifications"
msgstr[0] "%d নতুন অধিসূচনা"
msgstr[1] "%d নতুন অধিসূচনাসমূহ"
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:345
#: ../js/ui/screenShield.js:472 ../js/ui/status/system.js:345
msgid "Lock"
msgstr "লক কৰক"
#: ../js/ui/screenShield.js:708
#: ../js/ui/screenShield.js:706
msgid "GNOME needs to lock the screen"
msgstr "GNOME এ পৰ্দা লক কৰিব লাগিব"
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1306
#: ../js/ui/screenShield.js:833 ../js/ui/screenShield.js:1304
msgid "Unable to lock"
msgstr "লক কৰিবলে অক্ষম"
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1307
#: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1305
msgid "Lock was blocked by an application"
msgstr "লক কাৰ্য্য এটা এপ্লিকেচন দ্বাৰা প্ৰতিৰোধ কৰা হৈছিল"
#: ../js/ui/search.js:614
#: ../js/ui/search.js:594
msgid "Searching…"
msgstr "সন্ধান কৰা হৈছে…"
#: ../js/ui/search.js:660
#: ../js/ui/search.js:596
msgid "No results."
msgstr "কোনো ফলাফল নাই।"
#: ../js/ui/shellEntry.js:27
#: ../js/ui/shellEntry.js:25
msgid "Copy"
msgstr "কপি কৰক"
#: ../js/ui/shellEntry.js:32
#: ../js/ui/shellEntry.js:30
msgid "Paste"
msgstr "পেইস্ট কৰক"
#: ../js/ui/shellEntry.js:99
#: ../js/ui/shellEntry.js:97
msgid "Show Text"
msgstr "লিখনি দেখুৱাওক"
#: ../js/ui/shellEntry.js:101
#: ../js/ui/shellEntry.js:99
msgid "Hide Text"
msgstr "লিখনি লুকুৱাওক"
@ -1456,26 +1441,28 @@ msgstr "সংযুক্ত নহয়"
msgid "Brightness"
msgstr "উজ্জ্বলতা"
#: ../js/ui/status/keyboard.js:407
#: ../js/ui/status/keyboard.js:547
msgid "Show Keyboard Layout"
msgstr "কিবৰ্ড বিন্যাস দেখুৱাওক"
#: ../js/ui/status/location.js:56
#| msgid "Notifications"
#: ../js/ui/status/location.js:65
msgid "Location"
msgstr "অবস্থান"
#: ../js/ui/status/location.js:63 ../js/ui/status/location.js:165
#| msgid "Disabled"
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177
msgid "Disable"
msgstr "অসামৰ্থবান কৰক"
#: ../js/ui/status/location.js:164
#: ../js/ui/status/location.js:73
#| msgid "Power Settings"
msgid "Privacy Settings"
msgstr "গোপনীয়তা সংহতিসমূহ"
#: ../js/ui/status/location.js:176
msgid "In Use"
msgstr "ব্যৱহৃত"
#: ../js/ui/status/location.js:168
#| msgid "Enabled"
#: ../js/ui/status/location.js:180
msgid "Enable"
msgstr "সামৰ্থবান কৰক"
@ -1489,37 +1476,31 @@ msgid "Off"
msgstr "অফ"
#: ../js/ui/status/network.js:459
#| msgid "Connect"
msgid "Connected"
msgstr "সংযুক্ত"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:463
#| msgid "unmanaged"
msgid "Unmanaged"
msgstr "অব্যৱস্থাপিত"
#: ../js/ui/status/network.js:465
#| msgid "disconnecting..."
msgid "Disconnecting"
msgstr "বিচ্ছিনিত কৰা হৈছে"
#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301
#| msgid "Connection"
msgid "Connecting"
msgstr "সংযোগ কৰা হৈছে"
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:474
#| msgid "authentication required"
msgid "Authentication required"
msgstr "প্ৰমাণীকৰণৰ প্ৰয়োজন"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */
#: ../js/ui/status/network.js:482
#| msgid "firmware missing"
msgid "Firmware missing"
msgstr "ফাৰ্মৱেৰ সন্ধানহীন"
@ -1623,7 +1604,6 @@ msgid "Network Settings"
msgstr "নেটৱৰ্ক সংহতিসমূহ"
#: ../js/ui/status/network.js:1482
#| msgid "Settings"
msgid "VPN Settings"
msgstr "VPN সংহতিসমূহ"
@ -1717,11 +1697,11 @@ msgstr "অন্য ব্যৱহাৰকাৰী হিচাপে লগ
msgid "Unlock Window"
msgstr "উইন্ডো আনলক কৰক"
#: ../js/ui/viewSelector.js:232
#: ../js/ui/viewSelector.js:158
msgid "Applications"
msgstr "এপ্লিকেচনসমূহ"
#: ../js/ui/viewSelector.js:236
#: ../js/ui/viewSelector.js:162
msgid "Search"
msgstr "সন্ধান কৰক"
@ -1818,19 +1798,19 @@ msgstr[1] "%u ইনপুটসমূহ"
msgid "System Sounds"
msgstr "চিস্টেম শব্দসমূহ"
#: ../src/main.c:371
#: ../src/main.c:373
msgid "Print version"
msgstr "প্ৰি্ট সংস্কৰণ"
msgstr "প্ৰি্ট সংস্কৰণ"
#: ../src/main.c:377
#: ../src/main.c:379
msgid "Mode used by GDM for login screen"
msgstr "লগিন স্ক্ৰিনৰ বাবে GDM দ্বাৰা ব্যৱহাৰ কৰা অৱস্থা"
#: ../src/main.c:383
#: ../src/main.c:385
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "লগিন পৰ্দাৰ বাবে এটা বিশেষ অৱস্থা, উদাহৰণস্বৰূপ \"gdm\" ব্যৱহাৰ কৰক"
#: ../src/main.c:389
#: ../src/main.c:391
msgid "List possible modes"
msgstr "সম্ভাব্য অৱস্থাসমূহ তালিকাভুক্ত কৰক"
@ -2034,7 +2014,7 @@ msgstr "প্ৰমাণীকৰণ ডাইলগ ব্যৱহাৰক
#~ "সংহিত, অবিকল্পিত পাইপলাইন ব্যৱহাৰ কৰা হব। এইটো বৰ্তমানত 'vp8enc "
#~ "min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads="
#~ "%T ! queue ! webmmux' আৰু VP8 কডেক ব্যৱহাৰ কৰি WEBM ত ৰেকৰ্ড কৰে। %T ক "
#~ "চিস্টেমত অনুকূলিত থ্ৰেড কাও্টত এটা অনুমানৰ প্লেইচহল্ডাৰ হিচাপে ব্যৱহাৰ কৰা হয়।"
#~ "চিস্টেমত অনুকূলিত থ্ৰেড কাও্টত এটা অনুমানৰ প্লেইচহল্ডাৰ হিচাপে ব্যৱহাৰ কৰা হয়।"
#~ msgid "File extension used for storing the screencast"
#~ msgstr "screencast সংৰক্ষণ কৰাৰ কাৰণে লথিপত্ৰ সম্প্ৰসাৰন"
@ -2317,7 +2297,7 @@ msgstr "প্ৰমাণীকৰণ ডাইলগ ব্যৱহাৰক
#~ msgstr "চিস্টেম সংহতিসমূহ"
#~ msgid "Failed to unmount '%s'"
#~ msgstr "'%s' আনমাউ্ট কৰিবলে ব্যৰ্থ"
#~ msgstr "'%s' আনমাউ্ট কৰিবলে ব্যৰ্থ"
#~ msgid "Retry"
#~ msgstr "পুনৰ চেষ্টা কৰক"
@ -2395,7 +2375,7 @@ msgstr "প্ৰমাণীকৰণ ডাইলগ ব্যৱহাৰক
#~ msgstr "বন্ধ কৰক"
#~ msgid "Online Accounts"
#~ msgstr "অনলাইন একাও্টসমূহ"
#~ msgstr "অনলাইন একাও্টসমূহ"
#~ msgid "Lock Screen"
#~ msgstr "পৰ্দা লক কৰক"

1761
po/bg.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

926
po/ca.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

652
po/cs.po

File diff suppressed because it is too large Load Diff

1220
po/da.po

File diff suppressed because it is too large Load Diff

498
po/de.po

File diff suppressed because it is too large Load Diff

408
po/el.po

File diff suppressed because it is too large Load Diff

420
po/es.po

File diff suppressed because it is too large Load Diff

1265
po/fa.po

File diff suppressed because it is too large Load Diff

921
po/fi.po

File diff suppressed because it is too large Load Diff

148
po/fr.po
View File

@ -19,7 +19,7 @@ msgstr ""
"Project-Id-Version: gnome-shell master fr\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-08-25 07:37+0000\n"
"POT-Creation-Date: 2014-09-12 17:00+0000\n"
"PO-Revision-Date: 2014-08-25 17:00+0200\n"
"Last-Translator: Alain Lojewski <allomervan@gmail.com>\n"
"Language-Team: français <gnomefr@traduc.org>\n"
@ -242,8 +242,8 @@ msgstr "Combinaison de touches pour donner le focus à la notification active."
msgid ""
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr ""
"Combinaison de touches pour stopper et fermer toutes les transitions à des fins "
"de débogage"
"Combinaison de touches pour stopper et fermer toutes les transitions à des "
"fins de débogage"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Which keyboard to use"
@ -322,19 +322,19 @@ msgstr ""
msgid "Captive Portal"
msgstr "Portail captif"
#: ../js/extensionPrefs/main.js:127
#: ../js/extensionPrefs/main.js:123
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr ""
"Une erreur s'est produite lors du chargement de la boîte de dialogue des "
"préférences de %s :"
#: ../js/extensionPrefs/main.js:159
#: ../js/extensionPrefs/main.js:155
msgid "GNOME Shell Extensions"
msgstr "Extensions GNOME Shell"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:915
msgid "Cancel"
@ -401,40 +401,40 @@ msgstr "Exécution de « %s » impossible :"
msgid "Web Authentication Redirect"
msgstr "Redirection de l'authentification Web"
#: ../js/ui/appDisplay.js:660
#: ../js/ui/appDisplay.js:772
msgid "Frequently used applications will appear here"
msgstr "Les applications fréquemment utilisées apparaîtront ici"
#: ../js/ui/appDisplay.js:771
#: ../js/ui/appDisplay.js:883
msgid "Frequent"
msgstr "Fréquemment utilisées"
#: ../js/ui/appDisplay.js:778
#: ../js/ui/appDisplay.js:890
msgid "All"
msgstr "Toutes"
#: ../js/ui/appDisplay.js:1650
#: ../js/ui/appDisplay.js:1789
msgid "New Window"
msgstr "Nouvelle fenêtre"
#: ../js/ui/appDisplay.js:1673 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1815 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Enlever des favoris"
#: ../js/ui/appDisplay.js:1679
#: ../js/ui/appDisplay.js:1821
msgid "Add to Favorites"
msgstr "Ajouter aux favoris"
#: ../js/ui/appDisplay.js:1688
#: ../js/ui/appDisplay.js:1830
msgid "Show Details"
msgstr "Afficher les détails"
#: ../js/ui/appFavorites.js:122
#: ../js/ui/appFavorites.js:124
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s a été ajouté à vos favoris."
#: ../js/ui/appFavorites.js:156
#: ../js/ui/appFavorites.js:158
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s a été supprimé de vos favoris."
@ -647,11 +647,11 @@ msgstr "Ouvrir avec %s"
msgid "Eject"
msgstr "Éjecter"
#: ../js/ui/components/keyring.js:93 ../js/ui/components/polkitAgent.js:285
#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285
msgid "Password:"
msgstr "Mot de passe :"
#: ../js/ui/components/keyring.js:113
#: ../js/ui/components/keyring.js:120
msgid "Type again:"
msgstr "Saisissez à nouveau :"
@ -1025,7 +1025,7 @@ msgstr "Afficher le compte"
msgid "Unknown reason"
msgstr "Raison inconnue"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:228
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154
msgid "Windows"
msgstr "Fenêtres"
@ -1062,86 +1062,86 @@ msgstr "Paramètres de date et heure"
msgid "%A %B %e, %Y"
msgstr "%A %e %B %Y"
#: ../js/ui/endSessionDialog.js:66
#: ../js/ui/endSessionDialog.js:64
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "Fermer la session de %s"
#: ../js/ui/endSessionDialog.js:67
#: ../js/ui/endSessionDialog.js:65
msgctxt "title"
msgid "Log Out"
msgstr "Fermer la session"
#: ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:67
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s sera déconnecté automatiquement dans %d seconde."
msgstr[1] "%s sera déconnecté automatiquement dans %d secondes."
#: ../js/ui/endSessionDialog.js:74
#: ../js/ui/endSessionDialog.js:72
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "Vous allez être déconnecté automatiquement dans %d seconde."
msgstr[1] "Vous allez être déconnecté automatiquement dans %d secondes."
#: ../js/ui/endSessionDialog.js:80
#: ../js/ui/endSessionDialog.js:78
msgctxt "button"
msgid "Log Out"
msgstr "Fermer la session"
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:84
msgctxt "title"
msgid "Power Off"
msgstr "Éteindre"
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:85
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "Installer les mises à jour et éteindre"
#: ../js/ui/endSessionDialog.js:89
#: ../js/ui/endSessionDialog.js:87
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "Cet ordinateur s'éteindra automatiquement dans %d seconde."
msgstr[1] "Cet ordinateur s'éteindra automatiquement dans %d secondes."
#: ../js/ui/endSessionDialog.js:93
#: ../js/ui/endSessionDialog.js:91
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "Installer les mises à jour logicielles en attente"
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111
msgctxt "button"
msgid "Restart"
msgstr "Redémarrer"
#: ../js/ui/endSessionDialog.js:98
#: ../js/ui/endSessionDialog.js:96
msgctxt "button"
msgid "Power Off"
msgstr "Éteindre"
#: ../js/ui/endSessionDialog.js:105
#: ../js/ui/endSessionDialog.js:103
msgctxt "title"
msgid "Restart"
msgstr "Redémarrer"
#: ../js/ui/endSessionDialog.js:107
#: ../js/ui/endSessionDialog.js:105
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "Cet ordinateur redémarrera automatiquement dans %d seconde."
msgstr[1] "Cet ordinateur redémarrera automatiquement dans %d secondes."
#: ../js/ui/endSessionDialog.js:121
#: ../js/ui/endSessionDialog.js:119
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "Redémarrer et installer les mises à jour"
#: ../js/ui/endSessionDialog.js:123
#: ../js/ui/endSessionDialog.js:121
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@ -1149,44 +1149,44 @@ msgid_plural ""
msgstr[0] "Le système redémarrera automatiquement dans %d seconde."
msgstr[1] "Le système redémarrera automatiquement dans %d secondes."
#: ../js/ui/endSessionDialog.js:129
#: ../js/ui/endSessionDialog.js:127
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "Redémarrer et installer"
#: ../js/ui/endSessionDialog.js:130
#: ../js/ui/endSessionDialog.js:128
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "Installer et éteindre"
#: ../js/ui/endSessionDialog.js:131
#: ../js/ui/endSessionDialog.js:129
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Éteindre après l'installation des mises à jour"
#: ../js/ui/endSessionDialog.js:315
#: ../js/ui/endSessionDialog.js:338
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"Fonctionnement sur batterie : veuillez vous brancher avant d'installer les "
"mises à jour."
#: ../js/ui/endSessionDialog.js:332
#: ../js/ui/endSessionDialog.js:355
msgid "Some applications are busy or have unsaved work."
msgstr ""
"Certaines applications sont occupées ou ont des travaux non-sauvegardés."
#: ../js/ui/endSessionDialog.js:339
#: ../js/ui/endSessionDialog.js:362
msgid "Other users are logged in."
msgstr "D'autres utilisateurs sont connectés."
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:619
#: ../js/ui/endSessionDialog.js:640
#, javascript-format
msgid "%s (remote)"
msgstr "%s (distant)"
#. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:622
#: ../js/ui/endSessionDialog.js:643
#, javascript-format
msgid "%s (console)"
msgstr "%s (console)"
@ -1200,7 +1200,7 @@ msgstr "Installer"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Télécharger et installer « %s » à partir de extensions.gnome.org ?"
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523
msgid "Keyboard"
msgstr "Clavier"
@ -1222,8 +1222,8 @@ msgstr "Masquer les erreurs"
msgid "Show Errors"
msgstr "Afficher les erreurs"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:166
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71
#: ../js/ui/status/location.js:176
msgid "Enabled"
msgstr "Activé"
@ -1231,7 +1231,7 @@ msgstr "Activé"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:169
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Désactivé"
@ -1256,39 +1256,39 @@ msgstr "Afficher la source"
msgid "Web Page"
msgstr "Page Web"
#: ../js/ui/messageTray.js:1325
#: ../js/ui/messageTray.js:1326
msgid "Open"
msgstr "Ouvrir"
#: ../js/ui/messageTray.js:1332
#: ../js/ui/messageTray.js:1333
msgid "Remove"
msgstr "Enlever"
#: ../js/ui/messageTray.js:1629
#: ../js/ui/messageTray.js:1630
msgid "Notifications"
msgstr "Notifications"
#: ../js/ui/messageTray.js:1636
#: ../js/ui/messageTray.js:1637
msgid "Clear Messages"
msgstr "Effacer les messages"
#: ../js/ui/messageTray.js:1655
#: ../js/ui/messageTray.js:1656
msgid "Notification Settings"
msgstr "Paramètres de notifications"
#: ../js/ui/messageTray.js:1708
#: ../js/ui/messageTray.js:1709
msgid "Tray Menu"
msgstr "Menu du tiroir de messagerie"
#: ../js/ui/messageTray.js:1925
#: ../js/ui/messageTray.js:1926
msgid "No Messages"
msgstr "Aucun message"
#: ../js/ui/messageTray.js:1963
#: ../js/ui/messageTray.js:1968
msgid "Message Tray"
msgstr "Tiroir de messagerie"
#: ../js/ui/messageTray.js:2966
#: ../js/ui/messageTray.js:2971
msgid "System Information"
msgstr "Informations du système"
@ -1316,7 +1316,7 @@ msgstr "Vue d'ensemble"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:250
#: ../js/ui/overview.js:246
msgid "Type to search…"
msgstr "Rechercher…"
@ -1379,27 +1379,27 @@ msgstr "Impossible de verrouiller"
msgid "Lock was blocked by an application"
msgstr "Le verrouillage a été bloqué par une application"
#: ../js/ui/search.js:606
#: ../js/ui/search.js:594
msgid "Searching…"
msgstr "Recherche en cours…"
#: ../js/ui/search.js:652
#: ../js/ui/search.js:596
msgid "No results."
msgstr "Aucun résultat."
#: ../js/ui/shellEntry.js:27
#: ../js/ui/shellEntry.js:25
msgid "Copy"
msgstr "Copier"
#: ../js/ui/shellEntry.js:32
#: ../js/ui/shellEntry.js:30
msgid "Paste"
msgstr "Coller"
#: ../js/ui/shellEntry.js:99
#: ../js/ui/shellEntry.js:97
msgid "Show Text"
msgstr "Afficher le texte"
#: ../js/ui/shellEntry.js:101
#: ../js/ui/shellEntry.js:99
msgid "Hide Text"
msgstr "Masquer le texte"
@ -1485,23 +1485,27 @@ msgstr "Non connecté"
msgid "Brightness"
msgstr "Luminosité"
#: ../js/ui/status/keyboard.js:406
#: ../js/ui/status/keyboard.js:547
msgid "Show Keyboard Layout"
msgstr "Afficher la disposition du clavier"
#: ../js/ui/status/location.js:56
#: ../js/ui/status/location.js:65
msgid "Location"
msgstr "Localisation"
#: ../js/ui/status/location.js:63 ../js/ui/status/location.js:167
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177
msgid "Disable"
msgstr "Désactiver"
#: ../js/ui/status/location.js:166
#: ../js/ui/status/location.js:73
msgid "Privacy Settings"
msgstr "Paramètres de confidentialité"
#: ../js/ui/status/location.js:176
msgid "In Use"
msgstr "En cours d'utilisation"
#: ../js/ui/status/location.js:170
#: ../js/ui/status/location.js:180
msgid "Enable"
msgstr "Activer"
@ -1736,11 +1740,11 @@ msgstr "Se connecter en tant qu'autre utilisateur"
msgid "Unlock Window"
msgstr "Fenêtre de déverrouillage"
#: ../js/ui/viewSelector.js:232
#: ../js/ui/viewSelector.js:158
msgid "Applications"
msgstr "Applications"
#: ../js/ui/viewSelector.js:236
#: ../js/ui/viewSelector.js:162
msgid "Search"
msgstr "Recherche"
@ -1837,20 +1841,20 @@ msgstr[1] "%u entrées"
msgid "System Sounds"
msgstr "Sons système"
#: ../src/main.c:371
#: ../src/main.c:373
msgid "Print version"
msgstr "Affiche la version"
#: ../src/main.c:377
#: ../src/main.c:379
msgid "Mode used by GDM for login screen"
msgstr "Mode utilisé par GDM pour l'écran de connexion"
#: ../src/main.c:383
#: ../src/main.c:385
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr ""
"Utiliser un mode particulier, par ex. « gdm » pour l'écran de connexion"
#: ../src/main.c:389
#: ../src/main.c:391
msgid "List possible modes"
msgstr "Lister les modes possibles"

308
po/gl.po
View File

@ -11,8 +11,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-08-25 23:06+0200\n"
"PO-Revision-Date: 2014-08-25 23:08+0200\n"
"POT-Creation-Date: 2014-09-23 01:50+0200\n"
"PO-Revision-Date: 2014-09-23 01:51+0200\n"
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
"Language-Team: gnome-l10n-gl@gnome.org\n"
"Language: gl\n"
@ -300,17 +300,17 @@ msgstr "Atrasar os cambios de foco no modo rato até que o punteiro se pare"
msgid "Captive Portal"
msgstr "Portal cautivo"
#: ../js/extensionPrefs/main.js:127
#: ../js/extensionPrefs/main.js:123
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Produciuse un erro ao cargar o diálogo de preferenzas para %s:"
#: ../js/extensionPrefs/main.js:159
#: ../js/extensionPrefs/main.js:155
msgid "GNOME Shell Extensions"
msgstr "Extensións de GNOME Shell"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:915
msgid "Cancel"
@ -334,15 +334,23 @@ msgstr "Iniciar sesión"
msgid "Choose Session"
msgstr "Escolla unha sesión"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:429
msgid "Not listed?"
msgstr "Non está na lista?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:614
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(p.ex., usuario ou %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:269
#: ../js/ui/components/networkAgent.js:287
msgid "Username: "
@ -356,6 +364,11 @@ msgstr "Xanela de inicio de sesión"
msgid "Authentication error"
msgstr "Erro de autenticación"
#. We don't show fingerprint messages directly since it's
#. not the main auth service. Instead we use the messages
#. as a cue to display our own message.
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:453
msgid "(or swipe finger)"
msgstr "(ou pase o dedo)"
@ -364,6 +377,8 @@ msgstr "(ou pase o dedo)"
msgid "Command not found"
msgstr "Orde non atopada"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:148
msgid "Could not parse command:"
msgstr "Non foi posíbel analizar a orde:"
@ -373,44 +388,46 @@ msgstr "Non foi posíbel analizar a orde:"
msgid "Execution of “%s” failed:"
msgstr "Produciuse un fallo na execución de «%s»:"
#. TRANSLATORS: this is the title of the wifi captive portal login
#. window, until we know the title of the actual login page
#: ../js/portalHelper/main.js:85
msgid "Web Authentication Redirect"
msgstr "Redirección web de autenticación"
#: ../js/ui/appDisplay.js:660
#: ../js/ui/appDisplay.js:772
msgid "Frequently used applications will appear here"
msgstr "Os aplicativos usados recentemente aparecerán aquí"
#: ../js/ui/appDisplay.js:771
#: ../js/ui/appDisplay.js:883
msgid "Frequent"
msgstr "Frecuentes"
#: ../js/ui/appDisplay.js:778
#: ../js/ui/appDisplay.js:890
msgid "All"
msgstr "Todos"
#: ../js/ui/appDisplay.js:1650
#: ../js/ui/appDisplay.js:1790
msgid "New Window"
msgstr "Xanela nova"
#: ../js/ui/appDisplay.js:1673 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1816 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "Retirar dos marcadores"
#: ../js/ui/appDisplay.js:1679
#: ../js/ui/appDisplay.js:1822
msgid "Add to Favorites"
msgstr "Engadir aos favoritos"
#: ../js/ui/appDisplay.js:1688
#: ../js/ui/appDisplay.js:1831
msgid "Show Details"
msgstr "Mostrar detalles"
#: ../js/ui/appFavorites.js:122
#: ../js/ui/appFavorites.js:132
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s foi engadido aos seus favoritos."
#: ../js/ui/appFavorites.js:156
#: ../js/ui/appFavorites.js:166
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s retirouse dos seus marcadores."
@ -426,14 +443,14 @@ msgstr "Cambiar fondo de escritorio…"
#. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters
#. */
#.
#: ../js/ui/calendar.js:67
msgctxt "event list time"
msgid "All Day"
msgstr "Todo o día"
#. Translators: Shown in calendar event list, if 24h format,
#. \u2236 is a ratio character, similar to : */
#. \u2236 is a ratio character, similar to :
#: ../js/ui/calendar.js:73
msgctxt "event list time"
msgid "%H%M"
@ -441,7 +458,7 @@ msgstr "%H%M"
#. Translators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space */
#. a thin space
#: ../js/ui/calendar.js:82
msgctxt "event list time"
msgid "%l%M%p"
@ -451,43 +468,43 @@ msgstr "%l%M%p"
#. *
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#. */
#.
#: ../js/ui/calendar.js:113
msgctxt "grid sunday"
msgid "S"
msgstr "D"
#. Translators: Calendar grid abbreviation for Monday */
#. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:115
msgctxt "grid monday"
msgid "M"
msgstr "L"
#. Translators: Calendar grid abbreviation for Tuesday */
#. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:117
msgctxt "grid tuesday"
msgid "T"
msgstr "M"
#. Translators: Calendar grid abbreviation for Wednesday */
#. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:119
msgctxt "grid wednesday"
msgid "W"
msgstr "W"
#. Translators: Calendar grid abbreviation for Thursday */
#. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:121
msgctxt "grid thursday"
msgid "T"
msgstr "X"
#. Translators: Calendar grid abbreviation for Friday */
#. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:123
msgctxt "grid friday"
msgid "F"
msgstr "V"
#. Translators: Calendar grid abbreviation for Saturday */
#. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:125
msgctxt "grid saturday"
msgid "S"
@ -498,43 +515,43 @@ msgstr "S"
#. * NOTE: These list abbreviations are normally not shown together
#. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T').
#. */
#.
#: ../js/ui/calendar.js:138
msgctxt "list sunday"
msgid "Su"
msgstr "Do"
#. Translators: Event list abbreviation for Monday */
#. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:140
msgctxt "list monday"
msgid "M"
msgstr "L"
#. Translators: Event list abbreviation for Tuesday */
#. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:142
msgctxt "list tuesday"
msgid "T"
msgstr "M"
#. Translators: Event list abbreviation for Wednesday */
#. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:144
msgctxt "list wednesday"
msgid "W"
msgstr "W"
#. Translators: Event list abbreviation for Thursday */
#. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:146
msgctxt "list thursday"
msgid "Th"
msgstr "X"
#. Translators: Event list abbreviation for Friday */
#. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:148
msgctxt "list friday"
msgid "F"
msgstr "V"
#. Translators: Event list abbreviation for Saturday */
#. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:150
msgctxt "list saturday"
msgid "S"
@ -548,18 +565,18 @@ msgstr "Anterior mes"
msgid "Next month"
msgstr "Seguinte mes"
#. Translators: Text to show if there are no events */
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:781
msgid "Nothing Scheduled"
msgstr "Nada programado"
#. Translators: Shown on calendar heading when selected day occurs on current year */
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:799
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %d de %B"
#. Translators: Shown on calendar heading when selected day occurs on different year */
#. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:802
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
@ -602,11 +619,11 @@ msgstr "Abrir con %s"
msgid "Eject"
msgstr "Expulsar"
#: ../js/ui/components/keyring.js:93 ../js/ui/components/polkitAgent.js:285
#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285
msgid "Password:"
msgstr "Contrasinal:"
#: ../js/ui/components/keyring.js:113
#: ../js/ui/components/keyring.js:120
msgid "Type again:"
msgstr "Escriba de novo:"
@ -615,6 +632,7 @@ msgstr "Escriba de novo:"
msgid "Connect"
msgstr "Conectar"
#. Cisco LEAP
#: ../js/ui/components/networkAgent.js:231
#: ../js/ui/components/networkAgent.js:243
#: ../js/ui/components/networkAgent.js:271
@ -623,6 +641,7 @@ msgstr "Conectar"
msgid "Password: "
msgstr "Contrasinal: "
#. static WEP
#: ../js/ui/components/networkAgent.js:236
msgid "Key: "
msgstr "Chave: "
@ -700,19 +719,23 @@ msgstr "Autenticar"
#. Translators: "that didn't work" refers to the fact that the
#. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password),
#. * for instance. */
#. * for instance.
#: ../js/ui/components/polkitAgent.js:271 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again."
msgstr "Desculpe, iso non funcionou. Ténteo de novo."
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does.
#: ../js/ui/components/telepathyClient.js:240
msgid "Invitation"
msgstr "Convite"
#. We got the TpContact
#: ../js/ui/components/telepathyClient.js:300
msgid "Call"
msgstr "Chamar"
#. We got the TpContact
#: ../js/ui/components/telepathyClient.js:316
msgid "File Transfer"
msgstr "Transferencia de ficheiro"
@ -729,77 +752,85 @@ msgstr "Desactivar silencio"
msgid "Mute"
msgstr "Silenciar"
#. Translators: Time in 24h format */
#. Translators: Time in 24h format
#: ../js/ui/components/telepathyClient.js:953
msgid "%H%M"
msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30" */
#. time string in 24h format. i.e. "Yesterday, 14:30"
#: ../js/ui/components/telepathyClient.js:960
#, no-c-format
msgid "Yesterday, %H%M"
msgstr "Onte, %H:%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#. string in 24h format. i.e. "Monday, 14:30"
#: ../js/ui/components/telepathyClient.js:967
#, no-c-format
msgid "%A, %H%M"
msgstr "%A ás %H:%M"
#. Translators: this is the month name and day number
#. followed by a time string in 24h format.
#. i.e. "May 25, 14:30" */
#. i.e. "May 25, 14:30"
#: ../js/ui/components/telepathyClient.js:974
#, no-c-format
msgid "%B %d, %H%M"
msgstr "%d de %B ás %H:%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format.
#. i.e. "May 25 2012, 14:30" */
#. i.e. "May 25 2012, 14:30"
#: ../js/ui/components/telepathyClient.js:980
#, no-c-format
msgid "%B %d %Y, %H%M"
msgstr "%d de %B de %Y ás %H:%M"
#. Translators: Time in 24h format */
#. Translators: Time in 24h format
#: ../js/ui/components/telepathyClient.js:986
msgid "%l%M %p"
msgstr "%l:%M %p"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */
#. time string in 12h format. i.e. "Yesterday, 2:30 pm"
#: ../js/ui/components/telepathyClient.js:993
#, no-c-format
msgid "Yesterday, %l%M %p"
msgstr "Onte, %H:%M"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#. string in 12h format. i.e. "Monday, 2:30 pm"
#: ../js/ui/components/telepathyClient.js:1000
#, no-c-format
msgid "%A, %l%M %p"
msgstr "%A, %l%M %p"
#. Translators: this is the month name and day number
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm" */
#. i.e. "May 25, 2:30 pm"
#: ../js/ui/components/telepathyClient.js:1007
#, no-c-format
msgid "%B %d, %l%M %p"
msgstr "%d de %B, %l%M %p"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"*/
#. i.e. "May 25 2012, 2:30 pm"
#: ../js/ui/components/telepathyClient.js:1013
#, no-c-format
msgid "%B %d %Y, %l%M %p"
msgstr "%d de %B de %Y, %l%M %p"
#. Translators: this is the other person changing their old IM name to their new
#. IM name. */
#. IM name.
#: ../js/ui/components/telepathyClient.js:1045
#, javascript-format
msgid "%s is now known as %s"
msgstr "Agora %s chámase %s"
#. translators: argument is a room name like
#. * room@jabber.org for example. */
#. * room@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1149
#, javascript-format
msgid "Invitation to %s"
@ -807,7 +838,7 @@ msgstr "Convite a %s"
#. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. */
#. * for example.
#: ../js/ui/components/telepathyClient.js:1157
#, javascript-format
msgid "%s is inviting you to join %s"
@ -826,19 +857,19 @@ msgstr "Rexeitar"
msgid "Accept"
msgstr "Aceptar"
#. translators: argument is a contact name like Alice for example. */
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1184
#, javascript-format
msgid "Video call from %s"
msgstr "Videochamada de %s"
#. translators: argument is a contact name like Alice for example. */
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1187
#, javascript-format
msgid "Call from %s"
msgstr "Chamada de %s"
#. translators: this is a button label (verb), not a noun */
#. translators: this is a button label (verb), not a noun
#: ../js/ui/components/telepathyClient.js:1201
msgid "Answer"
msgstr "Responder"
@ -847,13 +878,13 @@ msgstr "Responder"
#. * the contact's alias and the second one is the
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#. */
#.
#: ../js/ui/components/telepathyClient.js:1222
#, javascript-format
msgid "%s is sending you %s"
msgstr "%s esta enviándolle %s"
#. To translators: The parameter is the contact's alias */
#. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1251
#, javascript-format
msgid "%s would like permission to see when you are online"
@ -967,7 +998,7 @@ msgid "Internal error"
msgstr "Erro interno"
#. translators: argument is the account name, like
#. * name@jabber.org for example. */
#. * name@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1393
#, javascript-format
msgid "Unable to connect to %s"
@ -981,7 +1012,7 @@ msgstr "Ver conta"
msgid "Unknown reason"
msgstr "Razón descoñecida"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:228
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154
msgid "Windows"
msgstr "Xanelas"
@ -989,6 +1020,8 @@ msgstr "Xanelas"
msgid "Show Applications"
msgstr "Mostrar aplicativos"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/dash.js:445
msgid "Dash"
msgstr "Taboleiro"
@ -1007,91 +1040,91 @@ msgstr "Preferencias de data e hora"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. */
#.
#: ../js/ui/dateMenu.js:204
msgid "%A %B %e, %Y"
msgstr "%a, %e de %B, %Y"
#: ../js/ui/endSessionDialog.js:66
#: ../js/ui/endSessionDialog.js:64
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "Saír da sesión %s"
#: ../js/ui/endSessionDialog.js:67
#: ../js/ui/endSessionDialog.js:65
msgctxt "title"
msgid "Log Out"
msgstr "Saír da sesión"
#: ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:67
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "Vaise pechar a sesión de %s en %d segundo."
msgstr[1] "Vaise pechar a sesión de %s en %d segundos."
#: ../js/ui/endSessionDialog.js:74
#: ../js/ui/endSessionDialog.js:72
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "A súa sesión pecharase automaticamente en %d segundo."
msgstr[1] "A súa sesión pecharase automaticamente en %d segundos."
#: ../js/ui/endSessionDialog.js:80
#: ../js/ui/endSessionDialog.js:78
msgctxt "button"
msgid "Log Out"
msgstr "Saír da sesión"
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:84
msgctxt "title"
msgid "Power Off"
msgstr "Apagar"
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:85
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "Instalar anovacións e apagar"
#: ../js/ui/endSessionDialog.js:89
#: ../js/ui/endSessionDialog.js:87
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "O sistema apagarase automaticamente en %d segundo."
msgstr[1] "O sistema apagarase automaticamente en %d segundos."
#: ../js/ui/endSessionDialog.js:93
#: ../js/ui/endSessionDialog.js:91
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "Instalar anovacións de software pendentes"
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111
msgctxt "button"
msgid "Restart"
msgstr "Reiniciar"
#: ../js/ui/endSessionDialog.js:98
#: ../js/ui/endSessionDialog.js:96
msgctxt "button"
msgid "Power Off"
msgstr "Apagar"
#: ../js/ui/endSessionDialog.js:105
#: ../js/ui/endSessionDialog.js:103
msgctxt "title"
msgid "Restart"
msgstr "Reiniciar"
#: ../js/ui/endSessionDialog.js:107
#: ../js/ui/endSessionDialog.js:105
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "O sistema reiniciarase automaticamente en %d segundo."
msgstr[1] "O sistema reiniciarase automaticamente en %d segundos."
#: ../js/ui/endSessionDialog.js:121
#: ../js/ui/endSessionDialog.js:119
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "Reiniciar e instalar actualizacións"
#: ../js/ui/endSessionDialog.js:123
#: ../js/ui/endSessionDialog.js:121
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
@ -1103,41 +1136,41 @@ msgstr[1] ""
"O sistema reiniciarase automaticamente e instalará as actualizacións en %d "
"segundos."
#: ../js/ui/endSessionDialog.js:129
#: ../js/ui/endSessionDialog.js:127
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "Reiniciar e instalar"
#: ../js/ui/endSessionDialog.js:130
#: ../js/ui/endSessionDialog.js:128
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "Instalar e apagar"
#: ../js/ui/endSessionDialog.js:131
#: ../js/ui/endSessionDialog.js:129
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "Apagar despois de instalar as anovacións"
#: ../js/ui/endSessionDialog.js:315
#: ../js/ui/endSessionDialog.js:338
msgid "Running on battery power: please plug in before installing updates."
msgstr "Con enerxía da batería: enchufar antes de instalar anovacións."
#: ../js/ui/endSessionDialog.js:332
#: ../js/ui/endSessionDialog.js:355
msgid "Some applications are busy or have unsaved work."
msgstr "Algúns aplicativos están ocupados ou teñen traballo sen gardar."
#: ../js/ui/endSessionDialog.js:339
#: ../js/ui/endSessionDialog.js:362
msgid "Other users are logged in."
msgstr "Hai outros usuarios conectados."
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:619
#. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/endSessionDialog.js:640
#, javascript-format
msgid "%s (remote)"
msgstr "%s (remoto)"
#. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:622
#. Translators: Console here refers to a tty like a VT console
#: ../js/ui/endSessionDialog.js:643
#, javascript-format
msgid "%s (console)"
msgstr "%s (consola)"
@ -1151,7 +1184,7 @@ msgstr "Instalar"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Desexa descargar e instalar «%s» desde extensions.gnome.org?"
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523
msgid "Keyboard"
msgstr "Teclado"
@ -1159,7 +1192,7 @@ msgstr "Teclado"
msgid "No extensions installed"
msgstr "Non hai ningunha extensión instalada"
#. Translators: argument is an extension UUID. */
#. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:697
#, javascript-format
msgid "%s has not emitted any errors."
@ -1173,16 +1206,16 @@ msgstr "Ocultar erros"
msgid "Show Errors"
msgstr "Mostrar erros"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:166
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71
#: ../js/ui/status/location.js:176
msgid "Enabled"
msgstr "Activado"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode) */
#. because it's disabled by rfkill (airplane mode)
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:169
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Desactivado"
@ -1207,39 +1240,39 @@ msgstr "Ver fonte"
msgid "Web Page"
msgstr "Páxina web"
#: ../js/ui/messageTray.js:1325
#: ../js/ui/messageTray.js:1327
msgid "Open"
msgstr "Abrir"
#: ../js/ui/messageTray.js:1332
#: ../js/ui/messageTray.js:1334
msgid "Remove"
msgstr "Retirar"
#: ../js/ui/messageTray.js:1629
#: ../js/ui/messageTray.js:1631
msgid "Notifications"
msgstr "Notificacións"
#: ../js/ui/messageTray.js:1636
#: ../js/ui/messageTray.js:1638
msgid "Clear Messages"
msgstr "Limpar mensaxes"
#: ../js/ui/messageTray.js:1655
#: ../js/ui/messageTray.js:1657
msgid "Notification Settings"
msgstr "Preferencias das notificacións"
#: ../js/ui/messageTray.js:1708
#: ../js/ui/messageTray.js:1710
msgid "Tray Menu"
msgstr "Menú da bandexa do sistema"
#: ../js/ui/messageTray.js:1925
#: ../js/ui/messageTray.js:1934
msgid "No Messages"
msgstr "Non hai mensaxes"
#: ../js/ui/messageTray.js:1963
#: ../js/ui/messageTray.js:1979
msgid "Message Tray"
msgstr "Bandexa de mensaxes"
#: ../js/ui/messageTray.js:2966
#: ../js/ui/messageTray.js:2992
msgid "System Information"
msgstr "Información do sistema"
@ -1266,8 +1299,8 @@ msgstr "Vista xeral"
#. Translators: this is the text displayed
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:250
#. characters.
#: ../js/ui/overview.js:246
msgid "Type to search…"
msgstr "Escriba para buscar…"
@ -1276,7 +1309,7 @@ msgid "Quit"
msgstr "Saír"
#. 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:567
msgid "Activities"
msgstr "Actividades"
@ -1285,6 +1318,11 @@ msgstr "Actividades"
msgid "Top Bar"
msgstr "Barra superior"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:269
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -1302,7 +1340,7 @@ msgid "Restarting…"
msgstr "Restimando…"
#. Translators: This is a time format for a date in
#. long format */
#. long format
#: ../js/ui/screenShield.js:88
msgid "%A, %B %d"
msgstr "%A, %d de %B"
@ -1322,6 +1360,13 @@ msgstr "Bloquear"
msgid "GNOME needs to lock the screen"
msgstr "GNOME precisa bloquear a pantalla"
#. We could not become modal, so we can't activate the
#. screenshield. The user is probably very upset at this
#. point, but any application using global grabs is broken
#. Just tell him to stop using this app
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:833 ../js/ui/screenShield.js:1304
msgid "Unable to lock"
msgstr "Non foi posíbel bloquear"
@ -1330,27 +1375,27 @@ msgstr "Non foi posíbel bloquear"
msgid "Lock was blocked by an application"
msgstr "Un aplicativo impediu o bloqueo"
#: ../js/ui/search.js:606
#: ../js/ui/search.js:594
msgid "Searching…"
msgstr "Buscando…"
#: ../js/ui/search.js:652
#: ../js/ui/search.js:596
msgid "No results."
msgstr "Sen resultados."
#: ../js/ui/shellEntry.js:27
#: ../js/ui/shellEntry.js:25
msgid "Copy"
msgstr "Copiar"
#: ../js/ui/shellEntry.js:32
#: ../js/ui/shellEntry.js:30
msgid "Paste"
msgstr "Pegar"
#: ../js/ui/shellEntry.js:99
#: ../js/ui/shellEntry.js:97
msgid "Show Text"
msgstr "Mostrar texto"
#: ../js/ui/shellEntry.js:101
#: ../js/ui/shellEntry.js:99
msgid "Hide Text"
msgstr "Ocultar texto"
@ -1406,6 +1451,8 @@ msgstr "Contraste alto"
msgid "Large Text"
msgstr "Texto grande"
#. The Bluetooth menu only appears when Bluetooth is in use,
#. so just statically build it with a "Turn Off" menu item.
#: ../js/ui/status/bluetooth.js:49
msgid "Bluetooth"
msgstr "Bluetooth"
@ -1436,23 +1483,27 @@ msgstr "Non conectado"
msgid "Brightness"
msgstr "Brillo"
#: ../js/ui/status/keyboard.js:406
#: ../js/ui/status/keyboard.js:547
msgid "Show Keyboard Layout"
msgstr "Mostrar a distribución do teclado"
#: ../js/ui/status/location.js:56
#: ../js/ui/status/location.js:65
msgid "Location"
msgstr "Localización"
#: ../js/ui/status/location.js:63 ../js/ui/status/location.js:167
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177
msgid "Disable"
msgstr "Desactivar"
#: ../js/ui/status/location.js:166
#: ../js/ui/status/location.js:73
msgid "Privacy Settings"
msgstr "Preferencias da privacidade"
#: ../js/ui/status/location.js:176
msgid "In Use"
msgstr "En uso"
#: ../js/ui/status/location.js:170
#: ../js/ui/status/location.js:180
msgid "Enable"
msgstr "Activar"
@ -1470,7 +1521,7 @@ msgid "Connected"
msgstr "Conectado"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */
#. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:463
msgid "Unmanaged"
msgstr "Sen xestionar"
@ -1483,19 +1534,19 @@ msgstr "Desconectando…"
msgid "Connecting"
msgstr "Conectando"
#. 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:474
msgid "Authentication required"
msgstr "Requírese autenticación"
#. 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:482
msgid "Firmware missing"
msgstr "Falta o «firmware»"
#. 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:486
msgid "Unavailable"
msgstr "Non dispoñíbel"
@ -1580,7 +1631,7 @@ msgstr "Punto wifi activo"
msgid "connecting..."
msgstr "conectando…"
#. 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:1412
msgid "authentication required"
msgstr "requírese autenticación"
@ -1617,15 +1668,19 @@ msgstr "Preferencias de enerxía"
msgid "Fully Charged"
msgstr "Carga completa"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:72 ../js/ui/status/power.js:78
msgid "Estimating…"
msgstr "Estimando…"
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
#: ../js/ui/status/power.js:86
#, javascript-format
msgid "%d%02d Remaining (%d%%)"
msgstr "Faltan %d:%02d (%d%%)"
#. Translators: this is <hours>:<minutes> Until Full (<percentage>)
#: ../js/ui/status/power.js:91
#, javascript-format
msgid "%d%02d Until Full (%d%%)"
@ -1639,6 +1694,9 @@ msgstr "SAI"
msgid "Battery"
msgstr "Batería"
#. The menu only appears when airplane mode is on, so just
#. statically build it as if it was on, rather than dynamically
#. changing the menu contents.
#: ../js/ui/status/rfkill.js:83
msgid "Airplane Mode"
msgstr "Modo avión"
@ -1687,11 +1745,11 @@ msgstr "Iniciar sesión como outro usuario"
msgid "Unlock Window"
msgstr "Desbloquear xanela"
#: ../js/ui/viewSelector.js:232
#: ../js/ui/viewSelector.js:158
msgid "Applications"
msgstr "Aplicativos"
#: ../js/ui/viewSelector.js:236
#: ../js/ui/viewSelector.js:162
msgid "Search"
msgstr "Buscar"
@ -1706,7 +1764,7 @@ msgstr "Desexa manter estas preferencias de pantalla?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#. */
#.
#: ../js/ui/windowManager.js:84
msgid "Revert Settings"
msgstr "Reverter preferencias"
@ -1788,21 +1846,21 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sons do sistema"
#: ../src/main.c:371
#: ../src/main.c:373
msgid "Print version"
msgstr "Imprimir versión"
#: ../src/main.c:377
#: ../src/main.c:379
msgid "Mode used by GDM for login screen"
msgstr "Modo usado por GDM para a pantalla de inicio"
#: ../src/main.c:383
#: ../src/main.c:385
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr ""
"Usar un modo específico, por exemplo, «gdm» para a pantalla de inicio de "
"sesión"
#: ../src/main.c:389
#: ../src/main.c:391
msgid "List possible modes"
msgstr "Listar os modos posíbeis"

327
po/gu.po
View File

@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: gu\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
"cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-08-26 07:37+0000\n"
"PO-Revision-Date: 2014-08-26 16:19+0530\n"
"POT-Creation-Date: 2014-10-01 07:39+0000\n"
"PO-Revision-Date: 2014-10-01 15:51+0530\n"
"Last-Translator: \n"
"Language-Team: American English <kde-i18n-doc@kde.org>\n"
"Language: \n"
@ -63,7 +63,7 @@ msgstr "GNOME Shell ઍક્સટેન્શનને રૂપરેખા
#: ../data/gnome-shell-wayland.desktop.in.in.h:1
msgid "GNOME Shell (wayland compositor)"
msgstr ""
msgstr "GNOME Shell (વેલૅન્ડ કંપોઝીટર)"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2"
@ -76,12 +76,10 @@ msgid ""
msgstr "Alt-F2 સંવાદની મદદથી આંતરિક ડિબગીંગ અને મોનિટરીંગ સાધનોને વાપરવા પરવાનગી આપે છે."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
#| msgid "Uuids of extensions to enable"
msgid "UUIDs of extensions to enable"
msgstr "સક્રિય કરવા માટે એક્સટેન્શનનું UUIDs"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4
#, fuzzy
#| msgid ""
#| "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 "
@ -93,14 +91,14 @@ msgid ""
"list. You can also manipulate this list with the EnableExtension and "
"DisableExtension D-Bus methods on org.gnome.Shell."
msgstr ""
"GNOME Shell ઍક્સટેન્શન પાસે uuid ગુણધર્મ છે; આ કી ઍક્સટેન્શનની યાદી કરે છે કે જેને લાવેલ હોવુ "
"GNOME Shell ઍક્સટેન્શન પાસે UUID ગુણધર્મ છે; આ કી ઍક્સટેન્શનની યાદી કરે છે કે જેને લાવેલ હોવુ "
"જોઇએ. કોઇપણ ઍક્સટેન્શન કે જેને આ યાદીમાં લાવવાની જરૂર છે. તમે પણ org.gnome.Shell પર "
"EnableExtension અને DisableExtension DBus પદ્દતિઓ સાથે આ યાદીને કુશળતાપૂર્વક વાપરી "
"શકો છો."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Disables the validation of extension version compatibility"
msgstr ""
msgstr "ઍક્સટેન્શન આવૃત્તિ સુસંગતતાની માન્યતાને નિષ્ક્રિય કરે છે"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid ""
@ -108,6 +106,9 @@ msgid ""
"running version. Enabling this option will disable this check and try to "
"load all extensions regardless of the versions they claim to support."
msgstr ""
"GNOME Shell એ ફક્ત ઍક્સટેન્શનને લાવશે કે જે હાલની ચાલતી આવૃત્તિને આધાર આપવા માટે દાવો કરે છે. "
"આ વિકલ્પને સક્રિય કરવાનું આ ચકાસણીને નિષ્ક્રિય કરશે અને આવૃત્તિને બાદ કરતા બધા ઍક્સટેન્શનને "
"લાવવાનો પ્રયત્ન કરે છે જે તેઓ આધાર આપવા માટે દાવો કરે છે."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of desktop file IDs for favorite applications"
@ -121,11 +122,11 @@ msgstr "કાર્યક્રમો આ ઓળખકર્તાઓ સાથ
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
msgid "App Picker View"
msgstr ""
msgstr "કાર્યક્રમ પસંદકર્તા દૃશ્ય"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
msgid "Index of the currently selected view in the application picker."
msgstr ""
msgstr "કાર્યક્રમ પસંદકર્તામાં હાલમાં પસંદ થયેલ દૃશ્યની અનુક્રમણિકા."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
msgid "History for command (Alt-F2) dialog"
@ -136,13 +137,10 @@ msgid "History for the looking glass dialog"
msgstr "ગ્લાસ સંવાદને જોવા માટે ઇતિહાસ"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
#, fuzzy
#| msgid "Always show the 'Log out' menuitem in the user menu."
msgid "Always show the 'Log out' menu item in the user menu."
msgstr "હંમેશા વપરાશકર્તા મેનુમાં 'બહાર નીકળો' મેનુવસ્તુને બતાવે છે."
msgstr "વપરાશકર્તા મેનુમાં હંમેશા 'બહાર નીકળો' મેનુ વસ્તુને બતાવ."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
#, fuzzy
#| msgid ""
#| "This key overrides the automatic hiding of the 'Log out' menuitem in "
#| "single-user, single-session situations."
@ -150,7 +148,8 @@ msgid ""
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
"user, single-session situations."
msgstr ""
"આ કી એકજ વપરાશકર્તામાં 'બહાર નીકળો' મેનુવસ્તુને આપમેળે છુપાવવા આ કીને ઓવરરાઇડ કરવામાં "
"આ કી એકજ વપરાશકર્તા, એકજ-સત્ર પરિસ્થિતિઓમાં 'બહાર નીકળો' મેનુવસ્તુને આપમેળે છુપાવવા આ કીને "
"ઓવરરાઇડ કરવામાં "
"આવી છે."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
@ -193,16 +192,12 @@ msgid "Keybinding to open the \"Show Applications\" view of the Activities Overv
msgstr "પ્રવૃત્તિ ઝાંખીનાં \"કાર્યક્રમો બતાવો\" દૃશ્યને ખોલવા માટે કિબાઇન્ડીંગ."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
#, fuzzy
#| msgid "Keybinding to open the \"Show Applications\" view"
msgid "Keybinding to open the overview"
msgstr "\"કાર્યક્રમો બતાવો\" દૃશ્યને ખોલવા માટે કિબાઇન્ડીંગ"
msgstr "ઝાંખીને ખોલવા માટે કિબાઇન્ડીંગ"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
#, fuzzy
#| msgid "Keybinding to open the \"Show Applications\" view"
msgid "Keybinding to open the Activities Overview."
msgstr "\"કાર્યક્રમો બતાવો\" દૃશ્યને ખોલવા માટે કિબાઇન્ડીંગ"
msgstr "પ્રવૃત્તિ ઝાંખીને ખોલવા માટે કિબાઇન્ડીંગ"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Keybinding to toggle the visibility of the message tray"
@ -222,7 +217,7 @@ msgstr "સક્રિય સૂચના પર પ્રકાશ નાં
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr ""
msgstr "કીબાઇન્ડીંગ કે જે બધી ચાલતી ટ્વીનને અટકાવે છે અને પાછુ લાવે છે, ડિબગીંગ હેતુઓ માટે"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Which keyboard to use"
@ -234,13 +229,15 @@ msgstr "વાપરવા માટે કિબોર્ડનો પ્રક
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "Limit switcher to current workspace."
msgstr ""
msgstr "વર્તમાન કામ કરવાની જગ્યા માટે સ્વિચર મર્યાદિત કરી છે."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid ""
"If true, only applications that have windows on the current workspace are "
"shown in the switcher. Otherwise, all applications are included."
msgstr ""
"જો true હોય તો, ફક્ત કાર્યક્રમો કે જેની પાસે હાલની કાર્ય કરવાની જગ્યા પર વિન્ડો છે તે "
"સ્વીચરમાં બતાવેલ છે. નહિંતો, બધા કાર્યક્રમનો સમાવેલ છે."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid "The application icon mode."
@ -261,6 +258,8 @@ msgid ""
"If true, only windows from the current workspace are shown in the switcher. "
"Otherwise, all windows are included."
msgstr ""
"જો true હોય તો, હાલની કાર્ય કરવાની જગ્યામાંથી વિન્ડો સ્વીચરમાં બતાવેલ છે. નહિં તો, બધી "
"વિન્ડોને સમાવેલ છે."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "Attach modal dialog to the parent window"
@ -284,24 +283,23 @@ msgstr "ફક્ત પ્રાથમિક મોનિટર પર કા
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr ""
msgstr "માઉસ સ્થિતિમાં ફેરફારો કરવામાં વિલંબ જ્યાં સુધી પોઇંટર ખસેડવાનું બંધ થાય"
#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1
msgid "Captive Portal"
msgstr ""
msgstr "કૅપ્ટીવ પોર્ટલ"
#: ../js/extensionPrefs/main.js:127
#: ../js/extensionPrefs/main.js:123
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "ત્યાં %s માટે પસંદગી સંવાદને લાવવામાં ભૂલ હતી:"
#: ../js/extensionPrefs/main.js:159
#| msgid "Configure GNOME Shell Extensions"
#: ../js/extensionPrefs/main.js:155
msgid "GNOME Shell Extensions"
msgstr "GNOME Shell ઍક્સટેન્શન"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:915
msgid "Cancel"
@ -322,7 +320,6 @@ msgid "Sign In"
msgstr "પ્રવેશો"
#: ../js/gdm/loginDialog.js:269
#| msgid "Switch Session"
msgid "Choose Session"
msgstr "સત્ર પસંદ કરો"
@ -361,52 +358,48 @@ msgid "Could not parse command:"
msgstr "આદેશનું પદચ્છેદન કરી શક્યા નથી:"
#: ../js/misc/util.js:156
#, fuzzy, javascript-format
#| msgid "Execution of '%s' failed:"
#, javascript-format
msgid "Execution of “%s” failed:"
msgstr "'%s' ને અમલમાં મૂકવાનુ નિષ્ફળ:"
msgstr "%s ને અમલમાં મૂકવાનુ નિષ્ફળ:"
#: ../js/portalHelper/main.js:85
#, fuzzy
#| msgid "Authentication Required"
msgid "Web Authentication Redirect"
msgstr "સત્તાધિકરણ જરૂરી"
msgstr "વેબ સત્તાધિકરણ દિશામાન"
#: ../js/ui/appDisplay.js:660
#: ../js/ui/appDisplay.js:772
msgid "Frequently used applications will appear here"
msgstr ""
msgstr "વારંવાર વપરાતા કાર્યક્રમો અહિંયા દેખાશે"
#: ../js/ui/appDisplay.js:771
#: ../js/ui/appDisplay.js:883
msgid "Frequent"
msgstr "સામાન્ય"
#: ../js/ui/appDisplay.js:778
#: ../js/ui/appDisplay.js:890
msgid "All"
msgstr "બધા"
#: ../js/ui/appDisplay.js:1650
#: ../js/ui/appDisplay.js:1790
msgid "New Window"
msgstr "નવી વિન્ડો"
#: ../js/ui/appDisplay.js:1673 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1816 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "પસંદીદાઓ માંથી દૂર કરો"
#: ../js/ui/appDisplay.js:1679
#: ../js/ui/appDisplay.js:1822
msgid "Add to Favorites"
msgstr "પસંદીદાને ઉમેરો"
#: ../js/ui/appDisplay.js:1688
#| msgid "Show Text"
#: ../js/ui/appDisplay.js:1831
msgid "Show Details"
msgstr "વિગતો બતાવો"
#: ../js/ui/appFavorites.js:122
#: ../js/ui/appFavorites.js:132
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s ને તમારી પસંદીદામાં ઉમેરી દેવામાં આવ્યુ છે."
#: ../js/ui/appFavorites.js:156
#: ../js/ui/appFavorites.js:166
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s ને તમારી પસંદીદામાંથી દૂર કરી દેવામાં આવ્યુ છે."
@ -598,11 +591,11 @@ msgstr "%s સાથે ખોલો"
msgid "Eject"
msgstr "રદ કરો"
#: ../js/ui/components/keyring.js:93 ../js/ui/components/polkitAgent.js:285
#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285
msgid "Password:"
msgstr "પાસવર્ડ:"
#: ../js/ui/components/keyring.js:113
#: ../js/ui/components/keyring.js:120
msgid "Type again:"
msgstr "ફરીથી પ્રયત્ન કરો:"
@ -640,14 +633,11 @@ msgid "Authentication required by wireless network"
msgstr "વાયરલેસ નેટવર્ક દ્દારાસત્તાધિકરણ જરૂરી"
#: ../js/ui/components/networkAgent.js:319
#, fuzzy, javascript-format
#| msgid ""
#| "Passwords or encryption keys are required to access the wireless network "
#| "'%s'."
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
msgstr "પાસવર્ડ અથવા એનક્રિપ્શન કીઓને વાયરલેસ નેટવર્ક '%s' માં પ્રવેશની જરૂર છે."
msgstr "પાસવર્ડ અથવા એનક્રિપ્શન કીઓને વાયરલેસ નેટવર્ક %s માં પ્રવેશની જરૂર છે."
#: ../js/ui/components/networkAgent.js:323
msgid "Wired 802.1X authentication"
@ -679,7 +669,6 @@ msgstr "મોબાઇલ બ્રોડબેન્ડ નેટવર્ક
#: ../js/ui/components/networkAgent.js:346
#, javascript-format
#| msgid "A password is required to connect to '%s'."
msgid "A password is required to connect to “%s”."
msgstr "પાસવર્ડ “%s” સાથે જોડાવા માટે જરૂરી છે."
@ -735,14 +724,12 @@ msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/ui/components/telepathyClient.js:960
#| msgid "<b>Yesterday</b>, <b>%H:%M</b>"
msgid "Yesterday, %H%M"
msgstr "ગઇ કાલે, %H:%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/ui/components/telepathyClient.js:967
#| msgid "%A, %B %d"
msgid "%A, %H%M"
msgstr "%A, %H%M"
@ -762,8 +749,6 @@ msgstr "%B %d %Y, %H%M"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:986
#| msgctxt "event list time"
#| msgid "%l:%M %p"
msgid "%l%M %p"
msgstr "%l%M %p"
@ -776,7 +761,6 @@ msgstr "ગઈકાલે %l:%M %p"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1000
#| msgid "%a %l:%M %p"
msgid "%A, %l%M %p"
msgstr "%A, %l%M %p"
@ -784,7 +768,6 @@ msgstr "%A, %l%M %p"
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1007
#| msgid "%a %b %e, %l:%M %p"
msgid "%B %d, %l%M %p"
msgstr "%B %d, %l%M %p"
@ -792,7 +775,6 @@ msgstr "%B %d, %l%M %p"
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"*/
#: ../js/ui/components/telepathyClient.js:1013
#| msgid "%a %b %e, %l:%M %p"
msgid "%B %d %Y, %l%M %p"
msgstr "%B %d %Y, %l%M %p"
@ -979,7 +961,7 @@ msgstr "ખાતામાં જુઓ"
msgid "Unknown reason"
msgstr "અજ્ઞાત કારણ"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:228
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154
msgid "Windows"
msgstr "વિન્ડો"
@ -1010,132 +992,129 @@ msgstr "તારીખ અને સમય સુયોજનો"
msgid "%A %B %e, %Y"
msgstr "%A %B %e, %Y"
#: ../js/ui/endSessionDialog.js:66
#: ../js/ui/endSessionDialog.js:64
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "%s માંથી બહાર નીકળો"
#: ../js/ui/endSessionDialog.js:67
#: ../js/ui/endSessionDialog.js:65
msgctxt "title"
msgid "Log Out"
msgstr "બહાર નીકળો"
#: ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:67
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s એ %d સેકંડમાં આપમેળે બહાર નીકળી જશે."
msgstr[1] "%s એ %d સેકંડોમાં આપમેળે બહાર નીકળી જશે."
#: ../js/ui/endSessionDialog.js:74
#: ../js/ui/endSessionDialog.js:72
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "તમે %d સેકંડમાં આપમેળે બહાર નીકળી જશે."
msgstr[1] "તમે %d સેકંડોમાં આપમેળે બહાર નીકળી જશે."
#: ../js/ui/endSessionDialog.js:80
#: ../js/ui/endSessionDialog.js:78
msgctxt "button"
msgid "Log Out"
msgstr "બહાર નીકળો"
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:84
msgctxt "title"
msgid "Power Off"
msgstr "પાવર બંધ"
#: ../js/ui/endSessionDialog.js:87
#, fuzzy
#| msgid "Install Updates & Restart"
#: ../js/ui/endSessionDialog.js:85
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "સુધારા સ્થાપિત કરો અને પુન:શરૂ કરો"
msgstr "સુધારા સ્થાપિત કરો અને પાવર બંધ કરો"
#: ../js/ui/endSessionDialog.js:89
#: ../js/ui/endSessionDialog.js:87
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે પાવર બંધ થઇ જશે."
msgstr[1] "સિસ્ટમ %d સેકંડમાં આપમેળે પાવર બંધ થઇ જશે."
#: ../js/ui/endSessionDialog.js:93
#: ../js/ui/endSessionDialog.js:91
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr ""
msgstr "બાકી રહેલા સોફ્ટવેર સુધારાને સ્થાપિત કરો"
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111
msgctxt "button"
msgid "Restart"
msgstr "પુન:શરૂ કરો"
#: ../js/ui/endSessionDialog.js:98
#: ../js/ui/endSessionDialog.js:96
msgctxt "button"
msgid "Power Off"
msgstr "પાવર બંધ"
#: ../js/ui/endSessionDialog.js:105
#: ../js/ui/endSessionDialog.js:103
msgctxt "title"
msgid "Restart"
msgstr "પુન:શરૂ કરો"
#: ../js/ui/endSessionDialog.js:107
#: ../js/ui/endSessionDialog.js:105
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે પુન:શરૂ થઇ જશે."
msgstr[1] "સિસ્ટમ %d સેકંડોમાં આપમેળે પુન:શરૂ થઇ જશે."
#: ../js/ui/endSessionDialog.js:121
#| msgid "Install Updates & Restart"
#: ../js/ui/endSessionDialog.js:119
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "સુધારા સ્થાપિત કરો અને પુન:શરૂ કરો"
#: ../js/ui/endSessionDialog.js:123
#, fuzzy, javascript-format
#: ../js/ui/endSessionDialog.js:121
#, javascript-format
#| msgid "The system will restart automatically in %d second."
#| msgid_plural "The system will restart automatically in %d seconds."
msgid "The system will automatically restart and install updates in %d second."
msgid_plural "The system will automatically restart and install updates in %d seconds."
msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે પુન:શરૂ થઇ જશે."
msgstr[1] "સિસ્ટમ %d સેકંડોમાં આપમેળે પુન:શરૂ થઇ જશે."
msgstr[0] "સિસ્ટમ %d સેકંડમાં આપમેળે સુધારાઓને પુન:શરૂ અને સ્થાપિત કરશે."
msgstr[1] "સિસ્ટમ %d સેકંડોમાં આપમેળે સુધારાઓને પુન:શરૂ અને સ્થાપિત કરશે."
#: ../js/ui/endSessionDialog.js:129
#: ../js/ui/endSessionDialog.js:127
msgctxt "button"
msgid "Restart &amp; Install"
msgstr ""
msgstr "પુન:શરૂ કરો અને સ્થાપિત કરો"
#: ../js/ui/endSessionDialog.js:130
#: ../js/ui/endSessionDialog.js:128
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr ""
msgstr "સ્થાપિત કરો અને પાવર બંધ "
#: ../js/ui/endSessionDialog.js:131
#: ../js/ui/endSessionDialog.js:129
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr ""
msgstr "સુધારા સ્થાપિત થાય પછી પાવર બંધ કરો"
#: ../js/ui/endSessionDialog.js:315
#: ../js/ui/endSessionDialog.js:338
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
msgstr "બેટરી પાવર પર ચાલી રહ્યુ છે: મહેરબાની કરીને સુધારા સ્થાપિત કરતા પહેલાં પ્લગઇન કરો."
#: ../js/ui/endSessionDialog.js:332
#: ../js/ui/endSessionDialog.js:355
msgid "Some applications are busy or have unsaved work."
msgstr ""
msgstr "અમુક કાર્યક્રમો વ્યસ્ત છે અથવા તેની પાસે અસંગ્રહેલ કામ છે."
#: ../js/ui/endSessionDialog.js:339
#: ../js/ui/endSessionDialog.js:362
msgid "Other users are logged in."
msgstr "બીજા વપરાશકર્તાઓ પ્રવેશેલ છે."
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:619
#: ../js/ui/endSessionDialog.js:640
#, javascript-format
msgid "%s (remote)"
msgstr "%s (દૂરસ્થ)"
#. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:622
#: ../js/ui/endSessionDialog.js:643
#, javascript-format
msgid "%s (console)"
msgstr "%s (કન્સોલ)"
@ -1145,12 +1124,11 @@ msgid "Install"
msgstr "સ્થાપિત કરો"
#: ../js/ui/extensionDownloader.js:204
#, fuzzy, javascript-format
#| msgid "Download and install '%s' from extensions.gnome.org?"
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "extensions.gnome.org માંથી '%s' ને સ્થાપિત અને ડાઉનલોડ કરો?"
msgstr "extensions.gnome.org માંથી %s ને સ્થાપિત અને ડાઉનલોડ કરો?"
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
#: ../js/ui/keyboard.js:700 ../js/ui/status/keyboard.js:523
msgid "Keyboard"
msgstr "કિબોર્ડ"
@ -1172,8 +1150,8 @@ msgstr "ભૂલો છુપાડો"
msgid "Show Errors"
msgstr "ભૂલો બતાવો"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:166
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71
#: ../js/ui/status/location.js:176
msgid "Enabled"
msgstr "સક્રિય"
@ -1181,7 +1159,7 @@ msgstr "સક્રિય"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:169
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "નિષ્ક્રિય"
@ -1206,39 +1184,39 @@ msgstr "સ્ત્રોત દર્શાવો"
msgid "Web Page"
msgstr "વેબ પાનું"
#: ../js/ui/messageTray.js:1325
#: ../js/ui/messageTray.js:1327
msgid "Open"
msgstr "ખોલો"
#: ../js/ui/messageTray.js:1332
#: ../js/ui/messageTray.js:1334
msgid "Remove"
msgstr "દૂર કરો"
#: ../js/ui/messageTray.js:1629
#: ../js/ui/messageTray.js:1631
msgid "Notifications"
msgstr "સૂચનાઓ"
#: ../js/ui/messageTray.js:1636
#: ../js/ui/messageTray.js:1638
msgid "Clear Messages"
msgstr "સંદેશા સાફ કરો"
#: ../js/ui/messageTray.js:1655
#: ../js/ui/messageTray.js:1657
msgid "Notification Settings"
msgstr "સૂચના સુયોજનો"
#: ../js/ui/messageTray.js:1708
#: ../js/ui/messageTray.js:1710
msgid "Tray Menu"
msgstr ""
msgstr "ટ્રે મેનુ"
#: ../js/ui/messageTray.js:1925
#: ../js/ui/messageTray.js:1934
msgid "No Messages"
msgstr "સંદેશા નથી"
#: ../js/ui/messageTray.js:1963
#: ../js/ui/messageTray.js:1979
msgid "Message Tray"
msgstr "સંદેશો ટ્રે"
#: ../js/ui/messageTray.js:2966
#: ../js/ui/messageTray.js:2992
msgid "System Information"
msgstr "સિસ્ટમ જાણકારી"
@ -1266,7 +1244,7 @@ msgstr "ઝાંખી"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:250
#: ../js/ui/overview.js:246
msgid "Type to search…"
msgstr "શોધવા માટે ટાઇપ કરો..."
@ -1297,7 +1275,6 @@ msgid "Close"
msgstr "બંધ કરો"
#: ../js/ui/runDialog.js:277
#| msgid "Estimating…"
msgid "Restarting…"
msgstr "પુન:શરૂ કરી રહ્યા છે…"
@ -1330,27 +1307,27 @@ msgstr "તાળુ મારવામાં અસમર્થ"
msgid "Lock was blocked by an application"
msgstr "તાળુ કાર્યક્રમ દ્દારા બ્લોક થયેલ છે"
#: ../js/ui/search.js:606
#: ../js/ui/search.js:607
msgid "Searching…"
msgstr "શોધી રહ્યા છે..."
#: ../js/ui/search.js:652
#: ../js/ui/search.js:609
msgid "No results."
msgstr "પરિણામો નથી."
#: ../js/ui/shellEntry.js:27
#: ../js/ui/shellEntry.js:25
msgid "Copy"
msgstr "નકલ કરો"
#: ../js/ui/shellEntry.js:32
#: ../js/ui/shellEntry.js:30
msgid "Paste"
msgstr "ચોંટાડો"
#: ../js/ui/shellEntry.js:99
#: ../js/ui/shellEntry.js:97
msgid "Show Text"
msgstr "લખાણ બતાવો"
#: ../js/ui/shellEntry.js:101
#: ../js/ui/shellEntry.js:99
msgid "Hide Text"
msgstr "લખાણ છુપાડો"
@ -1422,15 +1399,13 @@ msgid "Bluetooth Settings"
msgstr "બ્લુટુથ સુયોજનો"
#: ../js/ui/status/bluetooth.js:104
#, fuzzy, javascript-format
#| msgid "Connected (private)"
#, javascript-format
msgid "%d Connected Device"
msgid_plural "%d Connected Devices"
msgstr[0] "જોડાયેલ (ખાનગી)"
msgstr[1] "જોડાયેલ (ખાનગી)"
msgstr[0] "%d જોડાયેલ ઉપકરણ"
msgstr[1] "%d જોડાયેલ ઉપકરણો"
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309
#| msgid "Connect"
msgid "Not Connected"
msgstr "જોડાયેલ નથી"
@ -1438,26 +1413,28 @@ msgstr "જોડાયેલ નથી"
msgid "Brightness"
msgstr "તેજસ્વિતા"
#: ../js/ui/status/keyboard.js:406
#: ../js/ui/status/keyboard.js:547
msgid "Show Keyboard Layout"
msgstr "કીબોર્ડ લેઆઉટને બતાવો"
#: ../js/ui/status/location.js:56
#| msgid "Notifications"
#: ../js/ui/status/location.js:65
msgid "Location"
msgstr "સ્થાન"
#: ../js/ui/status/location.js:63 ../js/ui/status/location.js:167
#| msgid "Disabled"
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177
msgid "Disable"
msgstr "નિષ્ક્રિય"
#: ../js/ui/status/location.js:166
#: ../js/ui/status/location.js:73
#| msgid "Power Settings"
msgid "Privacy Settings"
msgstr "ખાનગી સુયોજનો"
#: ../js/ui/status/location.js:176
msgid "In Use"
msgstr "વપરાશમાં"
#: ../js/ui/status/location.js:170
#| msgid "Enabled"
#: ../js/ui/status/location.js:180
msgid "Enable"
msgstr "સક્રિય"
@ -1467,42 +1444,35 @@ msgstr "<અજ્ઞાત>"
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307
#: ../js/ui/status/network.js:1511
#| msgid "Offline"
msgid "Off"
msgstr "બંધ"
#: ../js/ui/status/network.js:459
#| msgid "Connect"
msgid "Connected"
msgstr "જોડાયેલ"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:463
#| msgid "unmanaged"
msgid "Unmanaged"
msgstr "સંચાલિત થયેલ નથી"
#: ../js/ui/status/network.js:465
#| msgid "disconnecting..."
msgid "Disconnecting"
msgstr "જોડાઇ તૂટી રહ્યુ છે"
#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301
#| msgid "Connection"
msgid "Connecting"
msgstr "જોડાઇ રહ્યા છે"
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:474
#| msgid "authentication required"
msgid "Authentication required"
msgstr "સત્તાધિકરણ જરૂરી"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */
#: ../js/ui/status/network.js:482
#| msgid "firmware missing"
msgid "Firmware missing"
msgstr "ફર્મવેર ગેરહાજર"
@ -1517,36 +1487,32 @@ msgid "Connection failed"
msgstr "જોડાણ નિષ્ફળ"
#: ../js/ui/status/network.js:504
#, fuzzy
#| msgid "Settings"
msgid "Wired Settings"
msgstr "સુયોજનો"
msgstr "વાયર થયેલ સુયોજનો"
#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624
#| msgid "Mobile broadband"
msgid "Mobile Broadband Settings"
msgstr "મોબાઇલ બ્રોડબેન્ડ સુયોજનો"
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305
#| msgid "hardware disabled"
msgid "Hardware Disabled"
msgstr "હાર્ડવેર નિષ્ક્રિય"
#: ../js/ui/status/network.js:632
msgid "Use as Internet connection"
msgstr ""
msgstr "ઇન્ટરનેટ જોડાણ તરીકે વાપરો"
#: ../js/ui/status/network.js:813
msgid "Airplane Mode is On"
msgstr ""
msgstr "ઍરપ્લેન સ્થિતિ ચાલુ છે"
#: ../js/ui/status/network.js:814
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr ""
msgstr "Wi-Fi નિષ્ક્રિય થયેલ છે જ્યારે ઍરપ્લેન સ્થિતિ ચાલુ હોય."
#: ../js/ui/status/network.js:815
msgid "Turn Off Airplane Mode"
msgstr ""
msgstr "ઍરપ્લેન સ્થિતિને બંધ કરો"
#: ../js/ui/status/network.js:824
msgid "Wi-Fi is Off"
@ -1554,38 +1520,33 @@ msgstr "Wi-Fi બંધ છે"
#: ../js/ui/status/network.js:825
msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr ""
msgstr "નેટવર્કમાં જોડાવા માટે ક્રમમાં Wi-Fi ને ચાલુ કરવાની જરૂર છે."
#: ../js/ui/status/network.js:826
msgid "Turn On Wi-Fi"
msgstr ""
msgstr "Wi-Fi ચાલુ કરો"
#: ../js/ui/status/network.js:851
#| msgid "Network"
msgid "Wi-Fi Networks"
msgstr "Wi-Fi નેટવર્ક"
#: ../js/ui/status/network.js:853
#| msgid "Enable networking"
msgid "Select a network"
msgstr "નેટવર્ક પસંદ કરો"
#: ../js/ui/status/network.js:882
#| msgid "Network"
msgid "No Networks"
msgstr "નેટવર્ક નથી"
#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112
msgid "Use hardware switch to turn off"
msgstr ""
msgstr "બંધ કરવા માટે હાર્ડવેર સ્વીચને વાપરો"
#: ../js/ui/status/network.js:1173
#| msgid "Network"
msgid "Select Network"
msgstr "નેટવર્ક પસંદ કરો"
#: ../js/ui/status/network.js:1179
#| msgid "Settings"
msgid "Wi-Fi Settings"
msgstr "Wi-Fi સુયોજનો"
@ -1595,7 +1556,7 @@ msgstr "ચાલુ કરો"
#: ../js/ui/status/network.js:1298
msgid "Hotspot Active"
msgstr ""
msgstr "હૉટસ્પોટ સક્રિય"
#: ../js/ui/status/network.js:1409
msgid "connecting..."
@ -1615,7 +1576,6 @@ msgid "Network Settings"
msgstr "નેટવર્ક સુયોજનો"
#: ../js/ui/status/network.js:1482
#| msgid "Settings"
msgid "VPN Settings"
msgstr "VPN સુયોજનો"
@ -1646,12 +1606,12 @@ msgstr "અંદાજ કરી રહ્યા છે..."
#: ../js/ui/status/power.js:86
#, javascript-format
msgid "%d%02d Remaining (%d%%)"
msgstr ""
msgstr "%d%02d બાકી રહેલ છે (%d%%)"
#: ../js/ui/status/power.js:91
#, javascript-format
msgid "%d%02d Until Full (%d%%)"
msgstr ""
msgstr "%d%02d જ્યાં સુધી સંપૂર્ણ થાય (%d%%)"
#: ../js/ui/status/power.js:119
msgid "UPS"
@ -1663,10 +1623,9 @@ msgstr "બેટરી"
#: ../js/ui/status/rfkill.js:83
msgid "Airplane Mode"
msgstr ""
msgstr "ઍરપ્લેન સ્થિતિ"
#: ../js/ui/status/rfkill.js:85
#| msgid "Open"
msgid "On"
msgstr "ચાલુ"
@ -1680,7 +1639,7 @@ msgstr "બહાર નીકળો"
#: ../js/ui/status/system.js:341
msgid "Orientation Lock"
msgstr ""
msgstr "દિશા તાળુ"
#: ../js/ui/status/system.js:349
msgid "Suspend"
@ -1710,43 +1669,40 @@ msgstr "બીજા વપરાશકર્તા તરીકે પ્રવ
msgid "Unlock Window"
msgstr "વિન્ડોનું તાળુ ખોલો"
#: ../js/ui/viewSelector.js:232
#: ../js/ui/viewSelector.js:158
msgid "Applications"
msgstr "કાર્યક્રમો"
#: ../js/ui/viewSelector.js:236
#: ../js/ui/viewSelector.js:162
msgid "Search"
msgstr "શોધો"
#: ../js/ui/windowAttentionHandler.js:19
#, javascript-format
#| msgid "'%s' is ready"
msgid "“%s” is ready"
msgstr "“%s” તૈયાર છે"
#: ../js/ui/windowManager.js:65
msgid "Do you want to keep these display settings?"
msgstr ""
msgstr "શું તમને આ દર્શાવ સુયોજનોને રાખવા માંગો છો?ે"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#. */
#: ../js/ui/windowManager.js:84
#, fuzzy
#| msgid "Power Settings"
msgid "Revert Settings"
msgstr "પાવર સુયોજનો"
msgstr "સુયોજનોને પાછા લાવો"
#: ../js/ui/windowManager.js:88
msgid "Keep Changes"
msgstr ""
msgstr "ફેરફારો કરો"
#: ../js/ui/windowManager.js:107
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "સુયોજન ફેરફારો એ %d સેકંડમાં પાછા આવશે"
msgstr[1] "સુયોજન ફેરફારો એ %d સેકંડોમાં પાછા આવશે"
#: ../js/ui/windowMenu.js:34
msgid "Minimize"
@ -1770,7 +1726,7 @@ msgstr "માપ બદલો"
#: ../js/ui/windowMenu.js:65
msgid "Move Titlebar Onscreen"
msgstr ""
msgstr "શીર્ષકપટ્ટી ઓનસ્ક્રીનને ખસેડો"
#: ../js/ui/windowMenu.js:70
msgid "Always on Top"
@ -1778,15 +1734,15 @@ msgstr "હંમેશા ટોચ ઉપર"
#: ../js/ui/windowMenu.js:89
msgid "Always on Visible Workspace"
msgstr ""
msgstr "હંમેશા દૃશ્ય કામ કરવાની જગ્યા પર"
#: ../js/ui/windowMenu.js:106
msgid "Move to Workspace Up"
msgstr ""
msgstr "ઉપર કામ કરવાની જગ્યા પર ખસેડો"
#: ../js/ui/windowMenu.js:111
msgid "Move to Workspace Down"
msgstr ""
msgstr "નીચે કામ કરવાની જગ્યાએ ખસેડો"
#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1
msgid "Evolution Calendar"
@ -1814,25 +1770,24 @@ msgstr[1] "%u ઇનપુટો"
msgid "System Sounds"
msgstr "સિસ્ટમ અવાજો"
#: ../src/main.c:371
#: ../src/main.c:373
msgid "Print version"
msgstr "ા"
#: ../src/main.c:377
#: ../src/main.c:379
msgid "Mode used by GDM for login screen"
msgstr "લૉગિન સ્ક્રીન માટે GDM દ્દારા વાપરેલ સ્થિતિ"
#: ../src/main.c:383
#: ../src/main.c:385
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "ખાસ સ્થિતિને વાપરો, દા.ત. પ્રવેશ સ્ક્રીન માટે \"gdm\""
#: ../src/main.c:389
#: ../src/main.c:391
msgid "List possible modes"
msgstr "શક્ય સ્થિતિઓની યાદી કરો"
#: ../src/shell-app.c:666
#, c-format
#| msgid "Failed to launch '%s'"
msgid "Failed to launch “%s”"
msgstr "“%s” ને શરૂ કરવામાં નિષ્ફળતા"

436
po/he.po

File diff suppressed because it is too large Load Diff

2257
po/hi.po

File diff suppressed because it is too large Load Diff

589
po/hu.po

File diff suppressed because it is too large Load Diff

595
po/id.po

File diff suppressed because it is too large Load Diff

778
po/it.po

File diff suppressed because it is too large Load Diff

834
po/ja.po

File diff suppressed because it is too large Load Diff

984
po/kk.po

File diff suppressed because it is too large Load Diff

2251
po/kn.po

File diff suppressed because it is too large Load Diff

901
po/ko.po

File diff suppressed because it is too large Load Diff

390
po/lt.po

File diff suppressed because it is too large Load Diff

949
po/lv.po

File diff suppressed because it is too large Load Diff

2308
po/mr.po

File diff suppressed because it is too large Load Diff

2640
po/ms.po

File diff suppressed because it is too large Load Diff

390
po/nb.po

File diff suppressed because it is too large Load Diff

1835
po/ne.po Normal file

File diff suppressed because it is too large Load Diff

214
po/or.po
View File

@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-08-25 07:37+0000\n"
"PO-Revision-Date: 2014-08-26 16:26+0530\n"
"POT-Creation-Date: 2014-09-18 07:41+0000\n"
"PO-Revision-Date: 2014-09-18 17:43+0530\n"
"Last-Translator: Manoj Kumar Giri <mgiri@redhat.com>\n"
"Language-Team: Oriya <oriya-it@googlegroups.com>\n"
"Language: or\n"
@ -79,16 +79,10 @@ msgstr ""
"ଅନୁମତି ପ୍ରଦାନ କରନ୍ତୁ।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
#| msgid "Uuids of extensions to enable"
msgid "UUIDs of extensions to enable"
msgstr "ସକ୍ରିୟ କରିବା ପାଇଁ ଥିବା ଅନୁଲଗ୍ନଗୁଡ଼ିକର UUID ଗୁଡ଼ିକ"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4
#| msgid ""
#| "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 list. You can also manipulate this list with the EnableExtension "
#| "and DisableExtension DBus methods on org.gnome.Shell."
msgid ""
"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 "
@ -114,8 +108,8 @@ msgstr ""
"GNOME ସେଲ କେବଳ ଅନୁଲଗ୍ନଗୁଡ଼ିକୁ ଧାରଣ କରିବ ଯାହାକି ପ୍ରଚଳିତ ସଂସ୍କରଣକୁ ସହାୟତା ଦେବା "
"ପାଇଁ ଉଦ୍ଦିଷ୍ଟ।"
"ଏହି ବିକଳ୍ପକୁ ସକ୍ରିୟ କରିବା ଫଳରେ ତାହା ଏହି ଯାଞ୍ଚକୁ ନିଷ୍କ୍ରିୟ କରିବ ଏବଂ ସହାୟତା "
"ପାଇଁ ଉଦ୍ଦିଷ୍ଟ ସଂସ୍କରଣଗୁଡ଼ିକୁ ଅଦେଖା କରି "
"ସମସ୍ତ ଅନୁଲଗ୍ନଗୁଡ଼ିକୁ ଧାରଣ କରିବା ପାଇଁ ଚେଷ୍ଟା କରିବ।"
"ପାଇଁ ଉଦ୍ଦିଷ୍ଟ "
"ସଂସ୍କରଣଗୁଡ଼ିକୁ ଅଦେଖା କରି ସମସ୍ତ ଅନୁଲଗ୍ନଗୁଡ଼ିକୁ ଧାରଣ କରିବା ପାଇଁ ଚେଷ୍ଟା କରିବ।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of desktop file IDs for favorite applications"
@ -145,14 +139,10 @@ msgid "History for the looking glass dialog"
msgstr "କାଚ ସଂଳାପ ଦେଖିବା ପାଇଁ ପୁରୁଣା ତଥ୍ୟ"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
#| msgid "Always show the 'Log out' menuitem in the user menu."
msgid "Always show the 'Log out' menu item 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."
msgid ""
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
"user, single-session situations."
@ -208,12 +198,10 @@ msgstr ""
"କାର୍ଯ୍ୟକଳାପ ସମୀକ୍ଷାର \"ପ୍ରୟୋଗଗୁଡ଼ିକୁ ଦର୍ଶାନ୍ତୁ\" ଦୃଶ୍ୟକୁ ଖୋଲିବା ପାଇଁ କି ବନ୍ଧନ।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
#| msgid "Keybinding to open the \"Show Applications\" view"
msgid "Keybinding to open the overview"
msgstr "ସମୀକ୍ଷାକୁ ଖୋଲିବା ପାଇଁ କି ବନ୍ଧନ"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
#| msgid "Keybinding to open the \"Show Applications\" view"
msgid "Keybinding to open the Activities Overview."
msgstr "କାର୍ଯ୍ୟକଳାପ ସମୀକ୍ଷାକୁ ଖୋଲିବା ପାଇଁ କି ବନ୍ଧନ।"
@ -238,7 +226,8 @@ msgid ""
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr ""
"ଚାଲୁଥିବା ସମସ୍ତ ଟ୍ୱୀନଗୁଡ଼ିକୁ ସ୍ଥିର ରଖିବା ଏବଂ ପୁନଃଚାଳନ କରିବା ପାଇଁ ଥିବା କି "
"ବନ୍ଧନ, ତୃଟି ନିବାରଣ ଉଦ୍ଦେଶ୍ୟରେ"
"ବନ୍ଧନ, ତୃଟି ନିବାରଣ "
"ଉଦ୍ଦେଶ୍ୟରେ"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Which keyboard to use"
@ -283,8 +272,8 @@ msgid ""
"Otherwise, all windows are included."
msgstr ""
"ଯଦି true, ତେବେ କେବଳ ପ୍ରଚଳିତ କାର୍ଯ୍ୟକ୍ଷେତ୍ରରୁ ୱିଣ୍ଡୋଗୁଡ଼ିକ ପରିବର୍ତ୍ତକରେ "
"ଦର୍ଶାଯାଇଥାଏ।"
"ଅନ୍ୟଥା, ସମସ୍ତ ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରାଯାଇଥାଏ।"
"ଦର୍ଶାଯାଇଥାଏ।ଅନ୍ୟଥା, "
"ସମସ୍ତ ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ଅନ୍ତର୍ଭୁକ୍ତ କରାଯାଇଥାଏ।"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "Attach modal dialog to the parent window"
@ -319,18 +308,17 @@ msgstr ""
msgid "Captive Portal"
msgstr "କେପଟିଭ୍‌ ପୋର୍ଟାଲ"
#: ../js/extensionPrefs/main.js:127
#: ../js/extensionPrefs/main.js:123
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "%s ପାଇଁ ପସନ୍ଦ ସଂଳାପ ଧାରଣ କରିବା ସମୟରେ ତ୍ରୁଟି:"
#: ../js/extensionPrefs/main.js:159
#| msgid "Configure GNOME Shell Extensions"
#: ../js/extensionPrefs/main.js:155
msgid "GNOME Shell Extensions"
msgstr "GNOME ସେଲ ଅନୁଲଗ୍ନଗୁଡ଼ିକ"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:915
msgid "Cancel"
@ -351,7 +339,6 @@ msgid "Sign In"
msgstr "ସାଇନ ଇନ"
#: ../js/gdm/loginDialog.js:269
#| msgid "Switch Session"
msgid "Choose Session"
msgstr "ଅଧିବେଶନ ବାଛନ୍ତୁ"
@ -391,50 +378,47 @@ msgstr "ନିର୍ଦ୍ଦେଶ ବିଶ୍ଲେଷିତ କରିହେ
#: ../js/misc/util.js:156
#, javascript-format
#| msgid "Execution of '%s' failed:"
msgid "Execution of “%s” failed:"
msgstr "“%s” ର ନିଷ୍ପାଦନ ବିଫଳ ହୋଇଛି:"
#: ../js/portalHelper/main.js:85
#| msgid "Authentication Required"
msgid "Web Authentication Redirect"
msgstr "ୱେବ ବୈଧିକରଣ ଦିଗ ପରିବର୍ତ୍ତନ"
#: ../js/ui/appDisplay.js:660
#: ../js/ui/appDisplay.js:772
msgid "Frequently used applications will appear here"
msgstr "ବାରମ୍ବାର ବ୍ୟବହୃତ ପ୍ରୟୋଗଗୁଡ଼ିକ ଏଠାରେ ଦୃଶ୍ୟମାନ ହେବ"
#: ../js/ui/appDisplay.js:771
#: ../js/ui/appDisplay.js:883
msgid "Frequent"
msgstr "ବାରମ୍ବାର"
#: ../js/ui/appDisplay.js:778
#: ../js/ui/appDisplay.js:890
msgid "All"
msgstr "ସମସ୍ତ"
#: ../js/ui/appDisplay.js:1650
#: ../js/ui/appDisplay.js:1789
msgid "New Window"
msgstr "ନୂତନ ୱିଣ୍ଡୋ"
#: ../js/ui/appDisplay.js:1673 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1815 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "ମନପସନ୍ଦଗୁଡ଼ିକ ମଧ୍ଯରୁ କାଢ଼ନ୍ତୁ"
#: ../js/ui/appDisplay.js:1679
#: ../js/ui/appDisplay.js:1821
msgid "Add to Favorites"
msgstr "ମନପସନ୍ଦ ମଧ୍ଯରେ ଯୋଗକରନ୍ତୁ"
#: ../js/ui/appDisplay.js:1688
#| msgid "Show Text"
#: ../js/ui/appDisplay.js:1830
msgid "Show Details"
msgstr "ବିସ୍ତୃତ ବିବରଣୀ ଦର୍ଶାନ୍ତୁ"
#: ../js/ui/appFavorites.js:122
#: ../js/ui/appFavorites.js:132
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s କୁ ଆପଣଙ୍କର ମନପସନ୍ଦରେ ଯୋଗ କରାଯାଇଛି।"
#: ../js/ui/appFavorites.js:156
#: ../js/ui/appFavorites.js:166
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s କୁ ମନପସନ୍ଦରୁ ବାହାର କରିଦିଆଯାଇଛି।"
@ -626,11 +610,11 @@ msgstr "%s ସହିତ ଖୋଲନ୍ତୁ"
msgid "Eject"
msgstr "ବାହାର କରନ୍ତୁ"
#: ../js/ui/components/keyring.js:93 ../js/ui/components/polkitAgent.js:285
#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285
msgid "Password:"
msgstr "ପ୍ରବେଶ ସଙ୍କେତ:"
#: ../js/ui/components/keyring.js:113
#: ../js/ui/components/keyring.js:120
msgid "Type again:"
msgstr "ପୁଣିଥରେ ଲେଖନ୍ତୁ:"
@ -669,9 +653,6 @@ msgstr "ବେତାର ନେଟୱର୍କ ପାଇଁ ପ୍ରାଧିକ
#: ../js/ui/components/networkAgent.js:319
#, javascript-format
#| msgid ""
#| "Passwords or encryption keys are required to access the wireless network "
#| "'%s'."
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
@ -709,7 +690,6 @@ msgstr "ମୋବାଇଲ ବ୍ରୋଡ଼ବ୍ୟାଣ୍ଡ ନେଟୱ
#: ../js/ui/components/networkAgent.js:346
#, javascript-format
#| msgid "A password is required to connect to '%s'."
msgid "A password is required to connect to “%s”."
msgstr "“%s” ସହିତ ସଂଯୁକ୍ତ ହେବା ପାଇଁ ଗୋଟିଏ ପ୍ରବେଶ ସଂକେତ ଆବଶ୍ୟକ।"
@ -765,14 +745,12 @@ msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/ui/components/telepathyClient.js:960
#| msgid "<b>Yesterday</b>, <b>%H:%M</b>"
msgid "Yesterday, %H%M"
msgstr "ଗତକାଲି,%H:%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/ui/components/telepathyClient.js:967
#| msgid "%A, %B %d"
msgid "%A, %H%M"
msgstr "%A, %H%M"
@ -792,8 +770,6 @@ msgstr "%B %d %Y, %H%M"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:986
#| msgctxt "event list time"
#| msgid "%l:%M %p"
msgid "%l%M %p"
msgstr "%l%M %p"
@ -806,7 +782,6 @@ msgstr "ଗତକାଲି, %l:%M %p"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1000
#| msgid "%a %l:%M %p"
msgid "%A, %l%M %p"
msgstr "%A, %l%M %p"
@ -814,7 +789,6 @@ msgstr "%A, %l%M %p"
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1007
#| msgid "%a %b %e, %l:%M %p"
msgid "%B %d, %l%M %p"
msgstr "%B %d, %l%M %p"
@ -822,7 +796,6 @@ msgstr "%B %d, %l%M %p"
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"*/
#: ../js/ui/components/telepathyClient.js:1013
#| msgid "%a %b %e, %l:%M %p"
msgid "%B %d %Y, %l%M %p"
msgstr "%B %d %Y, %l%M %p"
@ -1016,7 +989,7 @@ msgstr "ଖାତା ଦେଖନ୍ତୁ"
msgid "Unknown reason"
msgstr "ଅଜ୍ଞାତ କାରଣ"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:228
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154
msgid "Windows"
msgstr "Windows"
@ -1047,91 +1020,87 @@ msgstr "ତାରିଖ ଏବଂ ସମୟ ସେଟିଙ୍ଗ"
msgid "%A %B %e, %Y"
msgstr "%A %B %e, %Y"
#: ../js/ui/endSessionDialog.js:66
#: ../js/ui/endSessionDialog.js:64
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "ଲଗଆଉଟ %s"
#: ../js/ui/endSessionDialog.js:67
#: ../js/ui/endSessionDialog.js:65
msgctxt "title"
msgid "Log Out"
msgstr "ଲଗ ଆଉଟ"
#: ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:67
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ଲଗ ଆଉଟ ହେବ।"
msgstr[1] "%s ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ଲଗ ଆଉଟ ହେବ।"
#: ../js/ui/endSessionDialog.js:74
#: ../js/ui/endSessionDialog.js:72
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "ଆପଣ ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ଲଗ ଆଉଟ ହେବ।"
msgstr[1] "ଆପଣ ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ଲଗ ଆଉଟ ହେବ।"
#: ../js/ui/endSessionDialog.js:80
#: ../js/ui/endSessionDialog.js:78
msgctxt "button"
msgid "Log Out"
msgstr "ଲଗଆଉଟ"
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:84
msgctxt "title"
msgid "Power Off"
msgstr "ବିଦ୍ୟୁତ ପ୍ରବାହ ବନ୍ଦ କରନ୍ତୁ"
#: ../js/ui/endSessionDialog.js:87
#| msgid "Install Updates & Restart"
#: ../js/ui/endSessionDialog.js:85
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "ଅଦ୍ୟତନଗୁଡ଼ିକୁ ସ୍ଥାପନ କରନ୍ତୁ ଏବଂ ଅଫ୍‌ କରନ୍ତୁ"
#: ../js/ui/endSessionDialog.js:89
#: ../js/ui/endSessionDialog.js:87
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "ତନ୍ତ୍ରଟି ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ବିଦ୍ୟୁତ ପ୍ରବାହ ବନ୍ଦ ହେବ।"
msgstr[1] "ତନ୍ତ୍ରଟି ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ବିଦ୍ୟୁତ ପ୍ରବାହ ବନ୍ଦ ହେବ।"
#: ../js/ui/endSessionDialog.js:93
#: ../js/ui/endSessionDialog.js:91
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "ବଳକା ସଫ୍ଟୱେର ଅଦ୍ୟତନଗୁଡ଼ିକୁ ସ୍ଥାପନ କରନ୍ତୁ"
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111
msgctxt "button"
msgid "Restart"
msgstr "ପୂନଃପ୍ରାରମ୍ଭ କରନ୍ତୁ"
#: ../js/ui/endSessionDialog.js:98
#: ../js/ui/endSessionDialog.js:96
msgctxt "button"
msgid "Power Off"
msgstr "ବିଦ୍ୟୁତ ପ୍ରବାହ ବନ୍ଦ କରନ୍ତୁ"
#: ../js/ui/endSessionDialog.js:105
#: ../js/ui/endSessionDialog.js:103
msgctxt "title"
msgid "Restart"
msgstr "ପୂନଃପ୍ରାରମ୍ଭ କରନ୍ତୁ"
#: ../js/ui/endSessionDialog.js:107
#: ../js/ui/endSessionDialog.js:105
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "ତନ୍ତ୍ର ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ପୁନଃପ୍ରାରମ୍ଭ ହେବ।"
msgstr[1] "ତନ୍ତ୍ର ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ପୁନଃପ୍ରାରମ୍ଭ ହେବ।"
#: ../js/ui/endSessionDialog.js:121
#| msgid "Install Updates & Restart"
#: ../js/ui/endSessionDialog.js:119
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "ପୁନଃଚାଳନ କରନ୍ତୁ ଏବଂ ଅଦ୍ୟତନଗୁଡ଼ିକୁ ସ୍ଥାପନ କରନ୍ତୁ"
#: ../js/ui/endSessionDialog.js:123
#: ../js/ui/endSessionDialog.js:121
#, javascript-format
#| msgid "The system will restart automatically in %d second."
#| msgid_plural "The system will restart automatically in %d seconds."
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
"The system will automatically restart and install updates in %d seconds."
@ -1142,42 +1111,42 @@ msgstr[1] ""
"ତନ୍ତ୍ର ସ୍ୱୟଂଚାଳିତ ଭାବରେ %d ସେକଣ୍ଡରେ ପୁନଃପ୍ରାରମ୍ଭ ହେବ ଏବଂ ଅଦ୍ୟତନଗୁଡ଼ିକୁ ସ୍ଥାପନ "
"କରିବ।"
#: ../js/ui/endSessionDialog.js:129
#: ../js/ui/endSessionDialog.js:127
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "ପୁନଃଚାଳନ କରନ୍ତୁ ଏବଂ ସ୍ଥାପନ କରନ୍ତୁ"
#: ../js/ui/endSessionDialog.js:130
#: ../js/ui/endSessionDialog.js:128
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "ସ୍ଥାପନ କରନ୍ତୁ ଏବଂ ଅଫ୍‌ କରନ୍ତୁ"
#: ../js/ui/endSessionDialog.js:131
#: ../js/ui/endSessionDialog.js:129
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "ଅଦ୍ୟତନଗୁଡ଼ିକ ସ୍ଥାପିତ ହୋଇସାରିବା ପରେ ଅଫ୍‌ କରନ୍ତୁ"
#: ../js/ui/endSessionDialog.js:315
#: ../js/ui/endSessionDialog.js:338
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"ବ୍ୟାଟେରୀରେ ଚାଲୁଅଛି: ଅଦ୍ୟତନଗୁଡ଼ିକୁ ସ୍ଥାପନ କରିବା ପୂର୍ବରୁ ପ୍ଲଗଇନ୍‌ କରନ୍ତୁ।"
#: ../js/ui/endSessionDialog.js:332
#: ../js/ui/endSessionDialog.js:355
msgid "Some applications are busy or have unsaved work."
msgstr "କିଛି ପ୍ରୟୋଗଗୁଡ଼ିକ ବ୍ୟସ୍ତ ଅଛି କିମ୍ବା ସେଥିରେ କିଛି କାମ ଅସଂରକ୍ଷିତ ଅଛି।"
#: ../js/ui/endSessionDialog.js:339
#: ../js/ui/endSessionDialog.js:362
msgid "Other users are logged in."
msgstr "ଅନ୍ୟ ବ୍ୟବହାରକାରୀମାନେ ଲଗଇନ ହୋଇଛନ୍ତି।"
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:619
#: ../js/ui/endSessionDialog.js:640
#, javascript-format
msgid "%s (remote)"
msgstr "%s (ଦୂରବର୍ତ୍ତୀ)"
#. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:622
#: ../js/ui/endSessionDialog.js:643
#, javascript-format
msgid "%s (console)"
msgstr "%s (କୋନସୋଲ)"
@ -1188,11 +1157,10 @@ msgstr "ସ୍ଥାପନ କରନ୍ତୁ"
#: ../js/ui/extensionDownloader.js:204
#, javascript-format
#| msgid "Download and install '%s' from extensions.gnome.org?"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "“%s” କୁ extensions.gnome.org ରୁ ଆହରଣ କରି ସ୍ଥାପନ କରିବେ କି?"
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523
msgid "Keyboard"
msgstr "କିବୋର୍ଡ"
@ -1214,8 +1182,8 @@ msgstr "ତୃଟିଗୁଡ଼ିକୁ ଲୁଚାନ୍ତୁ"
msgid "Show Errors"
msgstr "ତୃଟି ଗୁଡିକୁ ଦର୍ଶାନ୍ତୁ"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:166
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71
#: ../js/ui/status/location.js:176
msgid "Enabled"
msgstr "ସକ୍ରିୟ"
@ -1223,7 +1191,7 @@ msgstr "ସକ୍ରିୟ"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:169
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "ନିଷ୍କ୍ରିୟ"
@ -1248,39 +1216,39 @@ msgstr "ଉତ୍ସକୁ ଦେଖନ୍ତୁ"
msgid "Web Page"
msgstr "ୱେବ ପୃଷ୍ଠା"
#: ../js/ui/messageTray.js:1325
#: ../js/ui/messageTray.js:1327
msgid "Open"
msgstr "ଖୋଲନ୍ତୁ"
#: ../js/ui/messageTray.js:1332
#: ../js/ui/messageTray.js:1334
msgid "Remove"
msgstr "ବାହାର କରନ୍ତୁ"
#: ../js/ui/messageTray.js:1629
#: ../js/ui/messageTray.js:1631
msgid "Notifications"
msgstr "ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ"
#: ../js/ui/messageTray.js:1636
#: ../js/ui/messageTray.js:1638
msgid "Clear Messages"
msgstr "ସନ୍ଦେଶଗୁଡ଼ିକୁ ସଫାକରନ୍ତୁ"
#: ../js/ui/messageTray.js:1655
#: ../js/ui/messageTray.js:1657
msgid "Notification Settings"
msgstr "ବିଜ୍ଞପ୍ତି ବିନ୍ୟାସ"
#: ../js/ui/messageTray.js:1708
#: ../js/ui/messageTray.js:1710
msgid "Tray Menu"
msgstr "ଟ୍ରେ ତାଲିକା"
#: ../js/ui/messageTray.js:1925
#: ../js/ui/messageTray.js:1934
msgid "No Messages"
msgstr "କୌଣସି ସନ୍ଦେଶ ନାହିଁ"
#: ../js/ui/messageTray.js:1963
#: ../js/ui/messageTray.js:1979
msgid "Message Tray"
msgstr "ସନ୍ଦେଶ ଟ୍ରେ"
#: ../js/ui/messageTray.js:2966
#: ../js/ui/messageTray.js:2992
msgid "System Information"
msgstr "ତନ୍ତ୍ର ସୂଚନା"
@ -1308,7 +1276,7 @@ msgstr "ସମୀକ୍ଷା"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:250
#: ../js/ui/overview.js:246
msgid "Type to search…"
msgstr "ସନ୍ଧାନ କରିବା ପାଇଁ ଲେଖନ୍ତୁ…"
@ -1339,7 +1307,6 @@ msgid "Close"
msgstr "ବନ୍ଦକରନ୍ତୁ"
#: ../js/ui/runDialog.js:277
#| msgid "Estimating…"
msgid "Restarting…"
msgstr "ପୁନଃଚାଳନ କରୁଅଛି…"
@ -1372,27 +1339,27 @@ msgstr "ତାଲା ପକାଇବାରେ ଅସମର୍ଥ"
msgid "Lock was blocked by an application"
msgstr "ତାଲାଟି ଏକ ପ୍ରୟୋଗ ଦ୍ୱାରା ଅଟକ ହୋଇଛି"
#: ../js/ui/search.js:606
#: ../js/ui/search.js:594
msgid "Searching…"
msgstr "ସନ୍ଧାନ କରୁଅଛି…"
#: ../js/ui/search.js:652
#: ../js/ui/search.js:596
msgid "No results."
msgstr "କୌଣସି ଫଳାଫଳ ନାହିଁ।"
#: ../js/ui/shellEntry.js:27
#: ../js/ui/shellEntry.js:25
msgid "Copy"
msgstr "ନକଲ କରନ୍ତୁ"
#: ../js/ui/shellEntry.js:32
#: ../js/ui/shellEntry.js:30
msgid "Paste"
msgstr "ଲଗାନ୍ତୁ"
#: ../js/ui/shellEntry.js:99
#: ../js/ui/shellEntry.js:97
msgid "Show Text"
msgstr "ପାଠ୍ୟ ଦର୍ଶାନ୍ତୁ"
#: ../js/ui/shellEntry.js:101
#: ../js/ui/shellEntry.js:99
msgid "Hide Text"
msgstr "ପାଠ୍ଯ ଲୁଚାନ୍ତୁ"
@ -1465,14 +1432,12 @@ msgstr "ବ୍ଲୁଟୁଥ ସଂରଚନାଗୁଡ଼ିକ"
#: ../js/ui/status/bluetooth.js:104
#, javascript-format
#| msgid "Connected (private)"
msgid "%d Connected Device"
msgid_plural "%d Connected Devices"
msgstr[0] "%d ଟି ସଂଯୁକ୍ତ ଉପକରଣ"
msgstr[1] "%d ଟି ସଂଯୁକ୍ତ ଉପକରଣଗୁଡ଼ିକ"
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309
#| msgid "Connect"
msgid "Not Connected"
msgstr "ସଂଯୁକ୍ତ ହୋଇନାହିଁ"
@ -1480,26 +1445,28 @@ msgstr "ସଂଯୁକ୍ତ ହୋଇନାହିଁ"
msgid "Brightness"
msgstr "ଉଜ୍ଜ୍ବଳତା"
#: ../js/ui/status/keyboard.js:406
#: ../js/ui/status/keyboard.js:547
msgid "Show Keyboard Layout"
msgstr "କି-ବୋର୍ଡ ବିନ୍ଯାସ ଦର୍ଶାନ୍ତୁ"
#: ../js/ui/status/location.js:56
#| msgid "Notifications"
#: ../js/ui/status/location.js:65
msgid "Location"
msgstr "ଅବସ୍ଥାନ"
#: ../js/ui/status/location.js:63 ../js/ui/status/location.js:167
#| msgid "Disabled"
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177
msgid "Disable"
msgstr "ନିଷ୍କ୍ରିୟ"
#: ../js/ui/status/location.js:166
#: ../js/ui/status/location.js:73
#| msgid "Power Settings"
msgid "Privacy Settings"
msgstr "ଗୋପନୀୟତା ସେଟିଙ୍ଗ"
#: ../js/ui/status/location.js:176
msgid "In Use"
msgstr "ବ୍ଯବହୃତ ହେଉଅଛି"
#: ../js/ui/status/location.js:170
#| msgid "Enabled"
#: ../js/ui/status/location.js:180
msgid "Enable"
msgstr "ସକ୍ରିୟ"
@ -1509,42 +1476,35 @@ msgstr "<unknown>"
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307
#: ../js/ui/status/network.js:1511
#| msgid "Offline"
msgid "Off"
msgstr "ଅଫ"
#: ../js/ui/status/network.js:459
#| msgid "Connect"
msgid "Connected"
msgstr "ସଂଯୁକ୍ତ"
#. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:463
#| msgid "unmanaged"
msgid "Unmanaged"
msgstr "ଅପରିଚାଳିତ"
#: ../js/ui/status/network.js:465
#| msgid "disconnecting..."
msgid "Disconnecting"
msgstr "ସଂଯୋଗ ବିଚ୍ଛିନ୍ନ କରୁଅଛି"
#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301
#| msgid "Connection"
msgid "Connecting"
msgstr "ସଂଯୋଗ କରୁଅଛି"
#. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:474
#| msgid "authentication required"
msgid "Authentication required"
msgstr "ବୈଧିକରଣ ଆବଶ୍ଯକ"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */
#: ../js/ui/status/network.js:482
#| msgid "firmware missing"
msgid "Firmware missing"
msgstr "ଫର୍ମୱେର ଅନୁପସ୍ଥିତ ଅଛି"
@ -1559,17 +1519,14 @@ msgid "Connection failed"
msgstr "ସଂଯୋଗ ବିଫଳ ହୋଇଛି"
#: ../js/ui/status/network.js:504
#| msgid "Settings"
msgid "Wired Settings"
msgstr "ତାରମୟ ସଂରଚନା"
#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624
#| msgid "Mobile broadband"
msgid "Mobile Broadband Settings"
msgstr "ମୋବାଇଲ ବ୍ରୋଡ଼ବ୍ୟାଣ୍ଡ ସଂରଚନା"
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305
#| msgid "hardware disabled"
msgid "Hardware Disabled"
msgstr "ହାର୍ଡୱେର ନିଷ୍କ୍ରିୟ ଅଛି"
@ -1606,7 +1563,6 @@ msgid "Wi-Fi Networks"
msgstr "ୱାଇ-ଫାଇ ନେଟୱର୍କଗୁଡ଼ିକ"
#: ../js/ui/status/network.js:853
#| msgid "Enable networking"
msgid "Select a network"
msgstr "ଗୋଟିଏ ନେଟୱର୍କ ବାଛନ୍ତୁ"
@ -1623,7 +1579,6 @@ msgid "Select Network"
msgstr "ନେଟୱର୍କ ବାଛନ୍ତୁ"
#: ../js/ui/status/network.js:1179
#| msgid "Settings"
msgid "Wi-Fi Settings"
msgstr "ୱାଇ-ଫାଇ ସଂରଚନା"
@ -1653,7 +1608,6 @@ msgid "Network Settings"
msgstr "ନେଟୱର୍କ ସଂରଚନା"
#: ../js/ui/status/network.js:1482
#| msgid "Settings"
msgid "VPN Settings"
msgstr "VPN ସଂରଚନା"
@ -1704,7 +1658,6 @@ msgid "Airplane Mode"
msgstr "ବିମାନ ଧାରା"
#: ../js/ui/status/rfkill.js:85
#| msgid "Open"
msgid "On"
msgstr "ଅନ୍‌"
@ -1748,17 +1701,16 @@ msgstr "ଅନ୍ୟ ଏକ ଚାଳକ ଭାବରେ ଲଗଇନ କରନ
msgid "Unlock Window"
msgstr "ୱିଣ୍ଡୋକୁ ଖୋଲନ୍ତୁ"
#: ../js/ui/viewSelector.js:232
#: ../js/ui/viewSelector.js:158
msgid "Applications"
msgstr "ପ୍ରୟୋଗଗୁଡ଼ିକ"
#: ../js/ui/viewSelector.js:236
#: ../js/ui/viewSelector.js:162
msgid "Search"
msgstr "ସନ୍ଧାନ କରନ୍ତୁ"
#: ../js/ui/windowAttentionHandler.js:19
#, javascript-format
#| msgid "'%s' is ready"
msgid "“%s” is ready"
msgstr "“%s” ପ୍ରସ୍ତୁତ ଅଛି"
@ -1770,7 +1722,6 @@ msgstr "ଆପଣ ଏହି ପ୍ରଦର୍ଶନୀ ସଂରଚନାକୁ
#. to avoid ellipsizing the labels.
#. */
#: ../js/ui/windowManager.js:84
#| msgid "Power Settings"
msgid "Revert Settings"
msgstr "ସଂରଚନାକୁ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"
@ -1851,25 +1802,24 @@ msgstr[1] "%u ନିବେଶଗୁଡ଼ିକ"
msgid "System Sounds"
msgstr "ତନ୍ତ୍ର ଧ୍ୱନି"
#: ../src/main.c:371
#: ../src/main.c:373
msgid "Print version"
msgstr "ମୁଦ୍ରଣ ସଂସ୍କରଣ"
#: ../src/main.c:377
#: ../src/main.c:379
msgid "Mode used by GDM for login screen"
msgstr "ଲଗଇନ ପରଦା ପାଇଁ ବ୍ୟବହୃତ GDM"
#: ../src/main.c:383
#: ../src/main.c:385
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "ଏକ ନିର୍ଦ୍ଦିଷ୍ଟ ଧାରା ବ୍ୟବହାର କରନ୍ତୁ, ଯେପରିକି ଲଗଇନ ପରଦା ପାଇଁ \"gdm\""
#: ../src/main.c:389
#: ../src/main.c:391
msgid "List possible modes"
msgstr "ସମ୍ଭାବ୍ୟ ଧାରାଗୁଡ଼ିକୁ ତାଲିକାଭୁକ୍ତ କରନ୍ତୁ"
#: ../src/shell-app.c:666
#, c-format
#| msgid "Failed to launch '%s'"
msgid "Failed to launch “%s”"
msgstr "“%s” କୁ ଆରମ୍ଭ କରିବାରେ ବିଫଳ"

441
po/pa.po

File diff suppressed because it is too large Load Diff

1025
po/pl.po

File diff suppressed because it is too large Load Diff

902
po/pt.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

442
po/ru.po

File diff suppressed because it is too large Load Diff

832
po/sk.po

File diff suppressed because it is too large Load Diff

511
po/sl.po

File diff suppressed because it is too large Load Diff

962
po/sr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

644
po/sv.po

File diff suppressed because it is too large Load Diff

1445
po/ta.po

File diff suppressed because it is too large Load Diff

232
po/te.po
View File

@ -1,7 +1,7 @@
# Telugu translation for gnome-shell.
# Copyright (C) 2011, 2012 Swecha telugu translations team <localization@swecha.net>
# This file is distributed under the same license as the gnome-shell package.
# Krishnababu Krothapalli <kkrothap@redhat.com>, 2011, 2012, 2013.
# Krishnababu Krothapalli <kkrothap@redhat.com>, 2011, 2012, 2013, 2014.
# Hari Krishna <hari@swecha.net>, 2011.
# Sasi Bhushan Boddepalli <sasi@swecha.net>, 2012.
# Praveen Illa <mail2ipn@gmail.com>, 2011, 2012, 2013, 2014.
@ -10,16 +10,16 @@ msgstr ""
"Project-Id-Version: gnome-shell gnome-3-0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-08-26 19:34+0000\n"
"PO-Revision-Date: 2014-08-27 10:45+0530\n"
"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
"Language-Team: indlinux-telugu@lists.sourceforge.net\n"
"POT-Creation-Date: 2014-09-23 07:38+0000\n"
"PO-Revision-Date: 2014-09-23 15:55+0530\n"
"Last-Translator: Krishnababu Krothapalli <kkrothap@redhat.com>\n"
"Language-Team: American English <kde-i18n-doc@kde.org>\n"
"Language: te\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Virtaal 0.7.1\n"
"X-Generator: Lokalize 1.5\n"
"X-Project-Style: gnome\n"
#: ../data/50-gnome-shell-system.xml.in.h:1
@ -69,14 +69,16 @@ msgstr "గ్నోమ్ షెల్ (వేల్యాండ్ సృష
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr "అభివృద్ధికారులకు మరియు పరీక్షకులకు ఉపయోగపడే సాధనాలను Alt-F2 నుండి చేతనపరుచు"
msgstr ""
"అభివృద్ధికారులకు మరియు పరీక్షకులకు ఉపయోగపడే సాధనాలను Alt-F2 నుండి చేతనపరుచు"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:2
msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog."
msgstr ""
"Alt-F2 డైలాగుని వాడి అంతర్గత దోషశుద్ది మరియు సాధనాలను పర్యవేక్షించుటకు సౌలభ్యతను అనుమతిస్తుంది."
"Alt-F2 డైలాగుని వాడి అంతర్గత దోషశుద్ది మరియు సాధనాలను పర్యవేక్షించుటకు "
"సౌలభ్యతను అనుమతిస్తుంది."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
msgid "UUIDs of extensions to enable"
@ -89,8 +91,10 @@ msgid ""
"list. You can also manipulate this list with the EnableExtension and "
"DisableExtension D-Bus methods on org.gnome.Shell."
msgstr ""
"గ్నోమ్ షెల్ పొడిగింతలు ఒక UUID లక్షణాన్ని కలిగివున్నాయి; ఏ పొడిగింతలు లోడుచేయదగినవి కాదో ఈ కీ జాబితాచేయును. "
"ఏ పొడిగింత లోడవ్వాలో అది ఈ జాబితా నందు ఉండాలి. అంతేకాకుండా మీరు ఈ జాబితాను పాడిగింతను చేతనపరుచు లేదా "
"గ్నోమ్ షెల్ పొడిగింతలు ఒక UUID లక్షణాన్ని కలిగివున్నాయి; ఏ పొడిగింతలు "
"లోడుచేయదగినవి కాదో ఈ కీ జాబితాచేయును. "
"ఏ పొడిగింత లోడవ్వాలో అది ఈ జాబితా నందు ఉండాలి. అంతేకాకుండా మీరు ఈ జాబితాను "
"పాడిగింతను చేతనపరుచు లేదా "
"పొడిగింతను అచేతనపరుచు డిబస్ పద్ధతులలో గ్నోమ్ షెల్ నందు మార్చవచ్చును."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
@ -103,8 +107,10 @@ msgid ""
"running version. Enabling this option will disable this check and try to "
"load all extensions regardless of the versions they claim to support."
msgstr ""
"ప్రస్తుతం నడుస్తున్న రూపాంతరం తోడ్పాటుందని పేర్కొంటేనే గ్నోమ్ షెల్ పొడిగింతలను లోడు చేస్తుంది. ఈ "
"ఐచ్ఛికాన్ని చేతనం చేస్తే ఈ తనిఖీని అచేనించి, తోడ్పాటు ఉన్నాదా లేదా అనే విషయంతో సంబంధం లేకుండా అన్ని "
"ప్రస్తుతం నడుస్తున్న రూపాంతరం తోడ్పాటుందని పేర్కొంటేనే గ్నోమ్ షెల్ "
"పొడిగింతలను లోడు చేస్తుంది. ఈ "
"ఐచ్ఛికాన్ని చేతనం చేస్తే ఈ తనిఖీని అచేనించి, తోడ్పాటు ఉన్నాదా లేదా అనే "
"విషయంతో సంబంధం లేకుండా అన్ని "
"పొడిగింతలను నింపుటకు ప్రయత్నిస్తుంది"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
@ -115,7 +121,8 @@ msgstr "ప్రియమైన అనువర్తనాల కోసం డ
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr "ఈ గుర్తింపకాలకు అనుగుణమైన అనువర్తనాలు ప్రియమైన ప్రదేశములో ప్రదర్శించబడతాయి."
msgstr ""
"ఈ గుర్తింపకాలకు అనుగుణమైన అనువర్తనాలు ప్రియమైన ప్రదేశములో ప్రదర్శించబడతాయి."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
msgid "App Picker View"
@ -142,13 +149,16 @@ msgid ""
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
"user, single-session situations."
msgstr ""
"ఏక-వాడుకరి, ఏక-ఘట్టం పరిస్థితులలో 'నిష్క్రమించు' మెనూ అంశము స్వయంచాలకంగా దాగుటను ఈ మీట భర్తీ "
"ఏక-వాడుకరి, ఏక-ఘట్టం పరిస్థితులలో 'నిష్క్రమించు' మెనూ అంశము స్వయంచాలకంగా "
"దాగుటను ఈ మీట భర్తీ "
"చేస్తుంది."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid ""
"Whether to remember password for mounting encrypted or remote filesystems"
msgstr "ఎన్క్రిప్టెడ్ లేదా రిమోట్ దస్త్రవ్యవస్థల మౌంటు చేయుటకు సంకేతపదాలను గుర్తుంచుకోవాలా"
msgstr ""
"ఎన్క్రిప్టెడ్ లేదా రిమోట్ దస్త్రవ్యవస్థల మౌంటు చేయుటకు సంకేతపదాలను "
"గుర్తుంచుకోవాలా"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid ""
@ -157,8 +167,10 @@ msgid ""
"'Remember Password' checkbox will be present. This key sets the default "
"state of the checkbox."
msgstr ""
"ఎన్క్రిప్టెడ్ పరికరం లేదా రిమోట్ దస్త్రవ్యవస్థ మౌంటవునప్పుడు షెల్ సంకేతపదం కొరకు అభ్యర్ధించును. భవిష్య "
"వినియోగం కొరకు సంకేతపదం దాయగలిగితే 'సంకేతపదం గుర్తుంచు' చెక్‌బాక్స్ వస్తుంది. ఈ కీ చెక్‌బాక్స్ యొక్క "
"ఎన్క్రిప్టెడ్ పరికరం లేదా రిమోట్ దస్త్రవ్యవస్థ మౌంటవునప్పుడు షెల్ సంకేతపదం "
"కొరకు అభ్యర్ధించును. భవిష్య "
"వినియోగం కొరకు సంకేతపదం దాయగలిగితే 'సంకేతపదం గుర్తుంచు' చెక్‌బాక్స్ వస్తుంది. "
"ఈ కీ చెక్‌బాక్స్ యొక్క "
"అప్రమేయ స్థితిని అమర్చును."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
@ -184,7 +196,8 @@ msgstr "\"అనువర్తనములు చూపు\" దర్శనం
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "కార్యకలాపాల అవలోకనం యొక్క \"అనువర్తనములు చూపించు\" వీక్షణం తెరువుటకు కీ బందనం."
msgstr ""
"కార్యకలాపాల అవలోకనం యొక్క \"అనువర్తనములు చూపించు\" వీక్షణం తెరువుటకు కీ బందనం."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Keybinding to open the overview"
@ -214,8 +227,8 @@ msgstr "క్రియాశీల ప్రకటన ఫోకస్‌కు
msgid ""
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr ""
"దోషవిశ్లేషణ కోసం, కీబైండింగు నడుస్తున్న అన్ని ట్వీన్లను తిరిగి కొనసాగిస్తుంది"
" మరియు నిలిపివేస్తుంది."
"దోషవిశ్లేషణ కోసం, కీబైండింగు నడుస్తున్న అన్ని ట్వీన్లను తిరిగి కొనసాగిస్తుంది "
"మరియు నిలిపివేస్తుంది."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Which keyboard to use"
@ -235,7 +248,8 @@ msgid ""
"shown in the switcher. Otherwise, all applications are included."
msgstr ""
"ఒకవేళ నిజమైతే, ప్రస్తుత కార్యక్షేత్రంలో ఉన్న అనువర్తనాల కిటికీలు మాత్రమే "
"మార్పకంలో చూపించబడతాయి. లేదంటే, అన్ని అనువర్తనాలు ఉంచబడతాయి."
"మార్పకంలో చూపించబడతాయి. లేదంటే, "
"అన్ని అనువర్తనాలు ఉంచబడతాయి."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid "The application icon mode."
@ -247,8 +261,10 @@ msgid ""
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
msgstr ""
"స్విచర్ నందు కిటికీలు ఎలా చూపునో ఆకృతీకరించును. చెల్లునటువంటి సాధ్యాలు 'thumbnail-only' (విండో "
"థంబ్‌నెయిల్ చూపును), 'app-icon-only' (అనువర్తన ప్రతిమ మాత్రమే చూపును) లేదా 'both'."
"స్విచర్ నందు కిటికీలు ఎలా చూపునో ఆకృతీకరించును. చెల్లునటువంటి సాధ్యాలు "
"'thumbnail-only' (విండో "
"థంబ్‌నెయిల్ చూపును), 'app-icon-only' (అనువర్తన ప్రతిమ మాత్రమే చూపును) లేదా "
"'both'."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid ""
@ -256,7 +272,8 @@ msgid ""
"Otherwise, all windows are included."
msgstr ""
"ఒకవేళ నిజమైతే, ప్రస్తుత కార్యక్షేత్రంలో ఉన్న కిటికీలు మాత్రమే మార్పకంలో "
"చూపించబడతాయి. లేదంటే, అన్ని కిటికీలు ఉంచబడతాయి."
"చూపించబడతాయి. లేదంటే, అన్ని కిటికీలు "
"ఉంచబడతాయి."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "Attach modal dialog to the parent window"
@ -265,7 +282,9 @@ msgstr "పేరెంట్ కిటికీకు మోడల్ డైల
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "గ్నోమ్ షెల్ నందు నడుచునప్పుడు ఈ కీ org.gnome.mutter నందలి కీను వోవర్‌రైడ్ చేయును."
msgstr ""
"గ్నోమ్ షెల్ నందు నడుచునప్పుడు ఈ కీ org.gnome.mutter నందలి కీను వోవర్‌రైడ్ "
"చేయును."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid "Enable edge tiling when dropping windows on screen edges"
@ -287,17 +306,17 @@ msgstr "మౌసు రీతిలో కేంద్రీకరణ మార
msgid "Captive Portal"
msgstr "కాప్టివ్ పోర్టల్"
#: ../js/extensionPrefs/main.js:127
#: ../js/extensionPrefs/main.js:123
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "%s కొరకు ప్రాధాన్యతల సంభాషణను నింపుటలో అక్కడ ఒక దోషం ఉన్నది:"
#: ../js/extensionPrefs/main.js:159
#: ../js/extensionPrefs/main.js:155
msgid "GNOME Shell Extensions"
msgstr "గ్నోమ్ షెల్ పొడిగింతలు"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:452
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:915
msgid "Cancel"
@ -364,40 +383,40 @@ msgstr "“%s” అమలు విఫలమైంది:"
msgid "Web Authentication Redirect"
msgstr "జాల ధృవీకరణ దారిమార్పు"
#: ../js/ui/appDisplay.js:660
#: ../js/ui/appDisplay.js:772
msgid "Frequently used applications will appear here"
msgstr "తరచూ వాడే అనువర్తనాలు ఇక్కడ కనిపిస్తాయి"
#: ../js/ui/appDisplay.js:771
#: ../js/ui/appDisplay.js:883
msgid "Frequent"
msgstr "తరచు"
#: ../js/ui/appDisplay.js:778
#: ../js/ui/appDisplay.js:890
msgid "All"
msgstr "అన్ని"
#: ../js/ui/appDisplay.js:1650
#: ../js/ui/appDisplay.js:1790
msgid "New Window"
msgstr "కొత్త కిటికీ"
#: ../js/ui/appDisplay.js:1673 ../js/ui/dash.js:285
#: ../js/ui/appDisplay.js:1816 ../js/ui/dash.js:285
msgid "Remove from Favorites"
msgstr "ఇష్టాంశాల నుండి తొలగించు"
#: ../js/ui/appDisplay.js:1679
#: ../js/ui/appDisplay.js:1822
msgid "Add to Favorites"
msgstr "ఇష్టాంశాలకు జతచేయి"
#: ../js/ui/appDisplay.js:1688
#: ../js/ui/appDisplay.js:1831
msgid "Show Details"
msgstr "వివరాలను చూపించు"
#: ../js/ui/appFavorites.js:122
#: ../js/ui/appFavorites.js:132
#, javascript-format
msgid "%s has been added to your favorites."
msgstr "%s మీ ఇష్టాంశాలకు జతచేయబడింది."
#: ../js/ui/appFavorites.js:156
#: ../js/ui/appFavorites.js:166
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s మీ ఇష్టాంశాల నుండి తీసివేయబడింది."
@ -589,11 +608,11 @@ msgstr "%sతో తెరువు"
msgid "Eject"
msgstr "బయటకునెట్టు"
#: ../js/ui/components/keyring.js:93 ../js/ui/components/polkitAgent.js:285
#: ../js/ui/components/keyring.js:94 ../js/ui/components/polkitAgent.js:285
msgid "Password:"
msgstr "సంకేతపదం:"
#: ../js/ui/components/keyring.js:113
#: ../js/ui/components/keyring.js:120
msgid "Type again:"
msgstr "మళ్ళీ టంకించండి:"
@ -635,7 +654,9 @@ msgstr "వైర్‌లెస్ నెట్‌వర్క్ చేత ధ
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
msgstr "నిస్తంత్రి నెట్‌వర్కు “%s” ప్రాప్యించుటకు సంకేతపదాలు లేదా ఎన్క్రిప్షన్ మీటలు అవసరం."
msgstr ""
"నిస్తంత్రి నెట్‌వర్కు “%s” ప్రాప్యించుటకు సంకేతపదాలు లేదా ఎన్క్రిప్షన్ మీటలు "
"అవసరం."
#: ../js/ui/components/networkAgent.js:323
msgid "Wired 802.1X authentication"
@ -933,14 +954,16 @@ msgstr "ధృవీకరణపత్రం కొట్టివేయబడ
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"ధృవీకరణపత్రం సురక్షితం కాని సైఫర్ ఆల్గార్దెమ్ వుపయోగించుచున్నది లేదా క్రిప్టోగ్రఫీ పరంగా బలహీనంగా వుంది"
"ధృవీకరణపత్రం సురక్షితం కాని సైఫర్ ఆల్గార్దెమ్ వుపయోగించుచున్నది లేదా "
"క్రిప్టోగ్రఫీ పరంగా బలహీనంగా వుంది"
#: ../js/ui/components/telepathyClient.js:1381
msgid ""
"The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library"
msgstr ""
"సేవిక ధృవీకరణపత్రం యొక్క పొడవు, లేదా సేవిక ధృవీకరణపత్రం చైన్ యొక్క లోతు, క్రిప్టోగ్రఫీ లైబ్రరీ చేత "
"సేవిక ధృవీకరణపత్రం యొక్క పొడవు, లేదా సేవిక ధృవీకరణపత్రం చైన్ యొక్క లోతు, "
"క్రిప్టోగ్రఫీ లైబ్రరీ చేత "
"నిర్దేశితమైన పరిమితులను మించును"
#: ../js/ui/components/telepathyClient.js:1383
@ -962,7 +985,7 @@ msgstr "ఖాతాను చూడండి"
msgid "Unknown reason"
msgstr "తెలియని కారణం"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:228
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:154
msgid "Windows"
msgstr "కిటికీలు"
@ -993,128 +1016,132 @@ msgstr "తేదీ మరియు సమయం అమరికలు"
msgid "%A %B %e, %Y"
msgstr "%A %B %e, %Y"
#: ../js/ui/endSessionDialog.js:66
#: ../js/ui/endSessionDialog.js:64
#, javascript-format
msgctxt "title"
msgid "Log Out %s"
msgstr "%s నిష్క్రమించు"
#: ../js/ui/endSessionDialog.js:67
#: ../js/ui/endSessionDialog.js:65
msgctxt "title"
msgid "Log Out"
msgstr "నిష్క్రమించు"
#: ../js/ui/endSessionDialog.js:69
#: ../js/ui/endSessionDialog.js:67
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s స్వయంచాలకంగా %d సెకనులో నిష్క్రమించును."
msgstr[1] "%s స్వయంచాలకంగా %d సెకనులలో నిష్క్రమించును."
#: ../js/ui/endSessionDialog.js:74
#: ../js/ui/endSessionDialog.js:72
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "మీరు %d సెకనులో స్వయంచాలకంగా నిష్క్రమిస్తారు."
msgstr[1] "మీరు %d సెకనులలో స్వయంచాలకంగా నిష్క్రమిస్తారు."
#: ../js/ui/endSessionDialog.js:80
#: ../js/ui/endSessionDialog.js:78
msgctxt "button"
msgid "Log Out"
msgstr "నిష్క్రమించు"
#: ../js/ui/endSessionDialog.js:86
#: ../js/ui/endSessionDialog.js:84
msgctxt "title"
msgid "Power Off"
msgstr "విద్యుత్ ఆపు"
#: ../js/ui/endSessionDialog.js:87
#: ../js/ui/endSessionDialog.js:85
msgctxt "title"
msgid "Install Updates & Power Off"
msgstr "నవీకరణలను స్థాపించి, విద్యుత్ ఆపు"
#: ../js/ui/endSessionDialog.js:89
#: ../js/ui/endSessionDialog.js:87
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "%d సెకన్లలో వ్యవస్థ స్వయంచాలకంగా ఆపివేయబడుతుంది."
msgstr[1] "%d సెకన్లలో వ్యవస్థ స్వయంచాలకంగా ఆపివేయబడుతుంది."
#: ../js/ui/endSessionDialog.js:93
#: ../js/ui/endSessionDialog.js:91
msgctxt "checkbox"
msgid "Install pending software updates"
msgstr "పెండింగులో ఉన్న సాఫ్ట్‌వేర్ నవీకరణలను స్థాపించు"
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
#: ../js/ui/endSessionDialog.js:94 ../js/ui/endSessionDialog.js:111
msgctxt "button"
msgid "Restart"
msgstr "పునఃప్రారంభించు"
#: ../js/ui/endSessionDialog.js:98
#: ../js/ui/endSessionDialog.js:96
msgctxt "button"
msgid "Power Off"
msgstr "విద్యుత్ ఆపు"
#: ../js/ui/endSessionDialog.js:105
#: ../js/ui/endSessionDialog.js:103
msgctxt "title"
msgid "Restart"
msgstr "పునఃప్రారంభించు"
#: ../js/ui/endSessionDialog.js:107
#: ../js/ui/endSessionDialog.js:105
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "%d సెకనులో వ్యవస్థ స్వయంచాలకంగా పునఃప్రారంభించబడుతుంది."
msgstr[1] "%d సెకనులలో వ్యవస్థ స్వయంచాలకంగా పునఃప్రారంభించబడుతుంది."
#: ../js/ui/endSessionDialog.js:121
#: ../js/ui/endSessionDialog.js:119
msgctxt "title"
msgid "Restart & Install Updates"
msgstr "నవీకరణలను స్థాపించి, పునఃప్రారంభించు"
#: ../js/ui/endSessionDialog.js:123
#: ../js/ui/endSessionDialog.js:121
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
"The system will automatically restart and install updates in %d seconds."
msgstr[0] "%d క్షణాలలో నవీకరణలను స్థాపించి, వ్యవస్థ స్వయంచాలకంగా పునఃప్రారంభించబడుతుంది."
msgstr[1] "%d క్షణాలలో నవీకరణలను స్థాపించి, వ్యవస్థ స్వయంచాలకంగా పునఃప్రారంభించబడుతుంది."
msgstr[0] ""
"%d క్షణాలలో నవీకరణలను స్థాపించి, వ్యవస్థ స్వయంచాలకంగా పునఃప్రారంభించబడుతుంది."
msgstr[1] ""
"%d క్షణాలలో నవీకరణలను స్థాపించి, వ్యవస్థ స్వయంచాలకంగా పునఃప్రారంభించబడుతుంది."
#: ../js/ui/endSessionDialog.js:129
#: ../js/ui/endSessionDialog.js:127
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "పునఃప్రారంభించి &amp; స్థాపించు"
#: ../js/ui/endSessionDialog.js:130
#: ../js/ui/endSessionDialog.js:128
msgctxt "button"
msgid "Install &amp; Power Off"
msgstr "స్థాపించి &amp; విద్యుత్ ఆపు"
#: ../js/ui/endSessionDialog.js:131
#: ../js/ui/endSessionDialog.js:129
msgctxt "checkbox"
msgid "Power off after updates are installed"
msgstr "నవీకరణలు స్థాపించిన తరువాత విద్యుత్ ఆపు"
#: ../js/ui/endSessionDialog.js:315
#: ../js/ui/endSessionDialog.js:338
msgid "Running on battery power: please plug in before installing updates."
msgstr "బ్యాటరీ శక్తితో నడుస్తూంది: దయచేసి నవీకరణలు స్థాపించే ముందు విద్యుత్ అనుసంధానించండి."
msgstr ""
"బ్యాటరీ శక్తితో నడుస్తూంది: దయచేసి నవీకరణలు స్థాపించే ముందు విద్యుత్ "
"అనుసంధానించండి."
#: ../js/ui/endSessionDialog.js:332
#: ../js/ui/endSessionDialog.js:355
msgid "Some applications are busy or have unsaved work."
msgstr "కొన్ని అనువర్తనాలు బిజీగా ఉన్నాయి లేదా భద్రపరుచని పని ఉండిపోయింది."
#: ../js/ui/endSessionDialog.js:339
#: ../js/ui/endSessionDialog.js:362
msgid "Other users are logged in."
msgstr "వేరే వాడుకరులు లాగిన్ అయివున్నారు."
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:619
#: ../js/ui/endSessionDialog.js:640
#, javascript-format
msgid "%s (remote)"
msgstr "%s (రిమోట్)"
#. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:622
#: ../js/ui/endSessionDialog.js:643
#, javascript-format
msgid "%s (console)"
msgstr "%s (కన్సోల్)"
@ -1128,7 +1155,7 @@ msgstr "స్థాపించు"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "extensions.gnome.org నుండి “%s” దింపుకొని, స్థాపించాలా?"
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
#: ../js/ui/keyboard.js:692 ../js/ui/status/keyboard.js:523
msgid "Keyboard"
msgstr "కీబోర్డు"
@ -1150,8 +1177,8 @@ msgstr "దోషాలను దాయి"
msgid "Show Errors"
msgstr "దోషాలను చూపించు"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:166
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71
#: ../js/ui/status/location.js:176
msgid "Enabled"
msgstr "చేతనమైనది"
@ -1159,7 +1186,7 @@ msgstr "చేతనమైనది"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:169
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "అచేతనమైనది"
@ -1184,39 +1211,39 @@ msgstr "మూలాన్ని చూడు"
msgid "Web Page"
msgstr "జాల పుట"
#: ../js/ui/messageTray.js:1325
#: ../js/ui/messageTray.js:1327
msgid "Open"
msgstr "తెరువు"
#: ../js/ui/messageTray.js:1332
#: ../js/ui/messageTray.js:1334
msgid "Remove"
msgstr "తీసివేయి"
#: ../js/ui/messageTray.js:1629
#: ../js/ui/messageTray.js:1631
msgid "Notifications"
msgstr "ప్రకటనలు"
#: ../js/ui/messageTray.js:1636
#: ../js/ui/messageTray.js:1638
msgid "Clear Messages"
msgstr "సందేశాలు తుడిచివేయి"
#: ../js/ui/messageTray.js:1655
#: ../js/ui/messageTray.js:1657
msgid "Notification Settings"
msgstr "ప్రకటనల అమరికలు"
#: ../js/ui/messageTray.js:1708
#: ../js/ui/messageTray.js:1710
msgid "Tray Menu"
msgstr "పళ్ళెం జాబితా"
#: ../js/ui/messageTray.js:1925
#: ../js/ui/messageTray.js:1934
msgid "No Messages"
msgstr "సందేశాలు లేవు"
#: ../js/ui/messageTray.js:1963
#: ../js/ui/messageTray.js:1979
msgid "Message Tray"
msgstr "సందేశ పళ్ళెం"
#: ../js/ui/messageTray.js:2966
#: ../js/ui/messageTray.js:2992
msgid "System Information"
msgstr "వ్యవస్థ సమాచారం"
@ -1244,7 +1271,7 @@ msgstr "పర్యావలోకనం"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:250
#: ../js/ui/overview.js:246
msgid "Type to search…"
msgstr "వెతకడానికి టైపు చేయండి…"
@ -1307,27 +1334,27 @@ msgstr "తాళం వేయలేకపోతూంది"
msgid "Lock was blocked by an application"
msgstr "తాళం ఒక అనువర్తనం చేత నిరోధించబడింది"
#: ../js/ui/search.js:606
#: ../js/ui/search.js:594
msgid "Searching…"
msgstr "వెతుకుతోంది..."
#: ../js/ui/search.js:652
#: ../js/ui/search.js:596
msgid "No results."
msgstr "ఏ ఫలితాలు లేవు."
#: ../js/ui/shellEntry.js:27
#: ../js/ui/shellEntry.js:25
msgid "Copy"
msgstr "నకలించు"
#: ../js/ui/shellEntry.js:32
#: ../js/ui/shellEntry.js:30
msgid "Paste"
msgstr "అతికించు"
#: ../js/ui/shellEntry.js:99
#: ../js/ui/shellEntry.js:97
msgid "Show Text"
msgstr "పాఠం చూపించు"
#: ../js/ui/shellEntry.js:101
#: ../js/ui/shellEntry.js:99
msgid "Hide Text"
msgstr "పాఠ్యం దాయి"
@ -1413,23 +1440,28 @@ msgstr "అనుసంధానించబడలేదు"
msgid "Brightness"
msgstr "ప్రకాశత"
#: ../js/ui/status/keyboard.js:406
#: ../js/ui/status/keyboard.js:547
msgid "Show Keyboard Layout"
msgstr "కీబోర్డు నమూనాను చూపించు"
#: ../js/ui/status/location.js:56
#: ../js/ui/status/location.js:65
msgid "Location"
msgstr "స్థానం"
#: ../js/ui/status/location.js:63 ../js/ui/status/location.js:167
#: ../js/ui/status/location.js:72 ../js/ui/status/location.js:177
msgid "Disable"
msgstr "అచేతనించు"
#: ../js/ui/status/location.js:166
#: ../js/ui/status/location.js:73
#| msgid "Power Settings"
msgid "Privacy Settings"
msgstr "గోప్యతా అమరికలు"
#: ../js/ui/status/location.js:176
msgid "In Use"
msgstr "వాడుకలో వుంది"
#: ../js/ui/status/location.js:170
#: ../js/ui/status/location.js:180
msgid "Enable"
msgstr "చేతనించు"
@ -1664,11 +1696,11 @@ msgstr "వేరొక వాడుకరి వలె ప్రవేశిం
msgid "Unlock Window"
msgstr "కిటికీ తాళంతీయి"
#: ../js/ui/viewSelector.js:232
#: ../js/ui/viewSelector.js:158
msgid "Applications"
msgstr "అనువర్తనాలు"
#: ../js/ui/viewSelector.js:236
#: ../js/ui/viewSelector.js:162
msgid "Search"
msgstr "వెతుకు"
@ -1765,19 +1797,19 @@ msgstr[1] "%u ఇన్‌పుట్‌లు"
msgid "System Sounds"
msgstr "వ్యవస్థ శబ్దములు"
#: ../src/main.c:371
#: ../src/main.c:373
msgid "Print version"
msgstr "ముద్రిత రూపాంతరం"
#: ../src/main.c:377
#: ../src/main.c:379
msgid "Mode used by GDM for login screen"
msgstr "ప్రవేశ తెర కొరకు GDM చే ఉపయోగించబడిన రీతి"
#: ../src/main.c:383
#: ../src/main.c:385
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "ఒక నిర్దిష్ట రీతిని వాడు, ఉదా. ప్రవేశ తెర కొరకు \"gdm\""
#: ../src/main.c:389
#: ../src/main.c:391
msgid "List possible modes"
msgstr "సాధ్యమగు రీతులను జాబితాగా చేయి"

489
po/tr.po

File diff suppressed because it is too large Load Diff

1085
po/uk.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More